wie function string vergleich, was ist das ergebnis

Still in use?

Moderator: Moderatoren

Antworten
stefu
Rookie
Rookie
Beiträge: 8
Registriert: Mo, 13. Aug 2012 8:40

wie function string vergleich, was ist das ergebnis

Beitrag von stefu » Mi, 22. Aug 2012 13:50

Hi,

ich habe folgende function gefunden und frage mich wieso wird das mit 11 0 verglichen. was ist das Ergebnis?

if upper(substr(var,95,10))="00000000000"
var_neu=" "
endif

kann mir jemand helfen?

Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 12876
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von Jan » Mi, 22. Aug 2012 13:53

Öhm... Es wird kontrolliert, ob die 10 Zeichen ab dem 95. Zeichen im String "var" = "0000000000" ist. Wenn ja, dann wird die Varibale var_neu mit einem Leerzeichen belegt. Was aber nie funktionieren kann. Denn der abgefragte Teilstring ist nur 10 Zeichen lang, der Vergleichsstring aber 11. Das kann niemals wahr sein.

War das die Frage, oder habe ich das mißverstanden?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7146
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von Tom » Mi, 22. Aug 2012 13:55

Wenn die zehn (!) Stellen von "var" ab Position 95 elf (!) Nullen sind, was niemals der Fall sein kann, wird "var_neu" geleert. Sieht nach Bullshitcode aus. :wink:
Herzlich,
Tom

stefu
Rookie
Rookie
Beiträge: 8
Registriert: Mo, 13. Aug 2012 8:40

Re: wie function string vergleich, was ist das ergebnis

Beitrag von stefu » Mi, 22. Aug 2012 13:57

okay, das ist auch meine vermutung. kann das upper da einen einfluss haben?

Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 12876
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von Jan » Mi, 22. Aug 2012 13:59

Was ist denn ein Upper("0")? Immer noch 0. Im Prinzip ist das zumindest hierfür vollkommen belanglos.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 12876
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von Jan » Mi, 22. Aug 2012 14:00

Tom hat geschrieben:Sieht nach Bullshitcode aus. :wink:
Tom, Du bist manchmal so herrlich direkt :D

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7146
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von Tom » Mi, 22. Aug 2012 14:03

Vielleicht hat es ja Sinn, aber der Sinn ist nie ausprobiert worden, weshalb der Tippfehler mit der elften Null nie bemerkt wurde. Eleganter wäre übrigens das hier:

Code: Alles auswählen

IF SubStr(var,95,10) = Replicate("0",10)
Immerhin würde das dann irgendwann feuern. Fragt sich, warum "var_neu" geleert werden soll, wenn "var" diese x Nullen enthält.
Herzlich,
Tom

Benutzeravatar
Muecke
1000 working lines a day
1000 working lines a day
Beiträge: 534
Registriert: Di, 24. Okt 2006 7:19
Wohnort: Samstagern CH
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von Muecke » Mi, 22. Aug 2012 14:13

kann es nicht sein das
var= absUBN..... 100000000000

Vielleicht darum Upper und den String vergleichen !

Gruss Thomas

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7146
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von Tom » Mi, 22. Aug 2012 14:31

@Thomas: Wenn ich dann ausschließlich mit Ziffern vergleiche, spielt das Upper() keine Rolle. "asx000..." und "ASX000..." entsprechen sich in dieser Hinsicht.
Herzlich,
Tom

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7146
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von Tom » Mi, 22. Aug 2012 14:46

@Jan:
Tom, Du bist manchmal so herrlich direkt
Manchmal? :badgrin:

Anyway, wahrscheinlich hat diese Funktion/Abfrage einen Sinn, aber der Tippfehler (elfte Null) ist nie bemerkt worden. Jetzt gilt es, danach zu forschen, warum "var_neu" geleert werden muss, wenn ab Stelle zwölftausendlangsam in "var" zehn Nullen enthalten sind. Viel Spaß dabei!
Herzlich,
Tom

stefu
Rookie
Rookie
Beiträge: 8
Registriert: Mo, 13. Aug 2012 8:40

Re: wie function string vergleich, was ist das ergebnis

Beitrag von stefu » Mi, 22. Aug 2012 15:19

Vielen Dank!

Es gibt 1 Erklärung: Die Abfrage hatte mal einen Sinn, aber mit einem anderen string als den 11 Nullen. Und um sie zu deaktivieren udn zu parken, hat man 11 Nullen darein geschrieben.

Trotzdem Euch vielen Dank!

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7146
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von Tom » Mi, 22. Aug 2012 15:33

Und um sie zu deaktivieren udn zu parken, hat man 11 Nullen darein geschrieben.
Hey, Profis am Werk! :wink: Falls Du noch einmal mit "man" sprichst, sag ihm, dass es eine fantastische Möglichkeit gibt, die sich "Kommentar" nennt. :)
Herzlich,
Tom

stefu
Rookie
Rookie
Beiträge: 8
Registriert: Mo, 13. Aug 2012 8:40

Re: wie function string vergleich, was ist das ergebnis

Beitrag von stefu » Mi, 22. Aug 2012 15:37

Tom hat geschrieben:
Und um sie zu deaktivieren udn zu parken, hat man 11 Nullen darein geschrieben.
Hey, Profis am Werk! :wink: Falls Du noch einmal mit "man" sprichst, sag ihm, dass es eine fantastische Möglichkeit gibt, die sich "Kommentar" nennt. :)
Das ist nur meine Vermutung. Ich kann niemanden mehr fragen.

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 17820
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel

Re: wie function string vergleich, was ist das ergebnis

Beitrag von Manfred » Mi, 22. Aug 2012 15:48

stefu hat geschrieben: Das ist nur meine Vermutung. Ich kann niemanden mehr fragen.
Hat es Dir die Sprache verschlagen? :lol:
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite

UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2527
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von UliTs » Mi, 22. Aug 2012 16:26

Also, laut Dokumentation wird bei

Code: Alles auswählen

SET EXACT ON
bis zur Länge der linken Zeichenkette verglichen. In diesem Fall könnte also trotzdem TRUE herauskommen, oder :?:
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14400
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von brandelh » Mi, 22. Aug 2012 17:57

Hallo Uli,

nein ...
wenn exact off ist, darf rechts ein kürzerer String stehen als links.
bei exact on müssen beide gleich lang sein.
wenn links länger ist als rechts, wird es immer false geben.

PS: dein Hinweis auf die Doku hat mich jetzt etwas unsicher gemacht, daher habe ich es nochmal nachgesehen:
Wenn SET EXACT auf ON gesetzt ist, liefert der Vergleich zweier Zeichenketten durch die Vergleichsoperatoren (=, >, <, => und =<) dann den Wert .T. (wahr), wenn deren Zeichen mit Ausnahme endständiger Leerzeichen übereinstimmen.
das mit den Leerzeichen (Blanks) am Ende erscheint mir seltsam, besonders nach dem Beispiel unter exact off ...
aber es ging oben nicht um Blanks.
Ich habe bisher immer == genutzt und nach dem Hinweis ist das auch wirklich sinnvoll :D
Gruß
Hubert

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7146
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von Tom » Mi, 22. Aug 2012 18:03

Hallo, Hubert.

You're wrong. Das hier steht in der Doku zum Vergleichsoperator "=" bei Zeichenketten:

Bei SET EXACT OFF erfolgt der Zeichenvergleich bis zur Länge der rechten Zeichenkette <Expression2> . Wenn SET EXACT ON gesetzt ist, erfolgt der Vergleich bis zur Länge der linken Zeichenkette.

Mit EXACT ON würde die oben gezeigte Abfrage also tatsächlich feuern. Uli hat recht.

Edit: Besonders bei Vergleichsoperationen mit Zeichenketten ist also, wenn man exakte Ergebnisse benötigt, dringend angeraten, mit "==" zu arbeiten!
Zuletzt geändert von Tom am Mi, 22. Aug 2012 18:09, insgesamt 1-mal geändert.
Herzlich,
Tom

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14400
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von brandelh » Mi, 22. Aug 2012 18:09

Ich habe dort auch nachgesehen aber den Text kann ich in der SL1 nicht finden, habt ihr die Hilfe von 1.90.331 ?
Gruß
Hubert

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7146
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von Tom » Mi, 22. Aug 2012 18:09

Nein, das ist durchaus aus der Hilfe zu SL1, Thema "= (Vergleichsoperator)".
Herzlich,
Tom

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14400
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von brandelh » Mi, 22. Aug 2012 18:14

da steht das Gleiche, wo seht ihr nach (ich im index nach SET EXACT) ...

Code: Alles auswählen

 Syntax 
SET EXACT on | OFF | <lToggle> 
Gültigkeit: Thread-lokal 
Parameter 
<lToggle>
<lToggle> ist ein logischer Ausdruck, der in ()-Klammern stehen muß. Anstelle des logischen Ausdrucks kann die Option ON für den Wert .T. (wahr) oder OFF für den Wert .F. (falsch) angegeben werden. Wenn .T. oder ON angegeben ist, erfolgt der Vergleich zweier Zeichenketten unter Berücksichtigung der Länge beider Zeichenketten. 
Beschreibung 
Der Befehl SET EXACT existiert aus Gründen der Kompatibilität und sollte nicht mehr verwendet werden. Der Befehl SET LEXICAL eignet sich wesentlich besser, wenn ein ungefährer Vergleich bei zwei Zeichenketten durchgeführt werden soll. 
SET EXACT definiert die Regeln für den ungefähren Vergleich zweier Zeichenketten durch die Vergleichsoperatoren (=, >, <, => und =<). Wenn SET EXACT auf OFF gesetzt ist, wird der Ausdruck cLeftString = cRightString nach folgenden Regeln ausgewertet: 
 	Wenn cRightString ein Null-Zeichen ("") enthält, liefert der Ausdruck den Wert .T. (wahr). 
 	Wenn cRightString mehr Zeichen enthält als cLeftString , liefert der Ausdruck den Wert .F. (falsch). 
 	In allen anderen Fällen liefert der Ausdruck den Wert .T. (wahr), falls die Zeichen in cRightString mit den Zeichen in cLeftString übereinstimmen, sonst .F. (falsch). 
Wenn SET EXACT auf ON gesetzt ist, liefert der Vergleich zweier Zeichenketten durch die Vergleichsoperatoren (=, >, <, => und =<) dann den Wert .T. (wahr), wenn deren Zeichen mit Ausnahme endständiger Leerzeichen übereinstimmen. 
Der exakte Gleichheitsoperator == berücksichtigt auch die endständigen Leerzeichen bei einem Zeichenkettenvergleich. 
Die Einstellung SET LEXICAL ON hat Vorrang vor der Einstellung SET EXACT ON. Falls lexikalische Vergleichsregeln mit SetLexRule() definiert sind, werden sie erst gemäß diesen Regeln umgeformt, bevor ein Vergleich in Abhängigkeit von SET EXACT erfolgt. 
Beispiel 
// SET EXACT Beispiel 
// Das Beispiel zeigt die Wirkung von SET EXACT bei dem Vergleich 
// von Zeichenketten durch den einfachen Gleichheitsoperator. 
   PROCEDURE Main 
      SET EXACT OFF 
      ? "Abc"   = "Abcde"           // Ergebnis: .F. 
      ? "Abcde" = "Abc"             // Ergebnis: .T. 
      ? "Abc"   = ""                // Ergebnis: .T. 
      ? ""      = "Abc"             // Ergebnis: .F. 
      ? "Abc"   = "Abc  "           // Ergebnis: .F. 
      SET EXACT ON 
      ? "Abc"   = "Abcde"           // Ergebnis: .F. 
      ? "Abcde" = "Abc"             // Ergebnis: .F. 
      ? "Abc"   = ""                // Ergebnis: .F. 
      ? ""      = "Abc"             // Ergebnis: .F. 
      ? "Abc"   = "Abc  "           // Ergebnis: .T. 
// Exakter Gleichheitsoperator 
      ? "Abc"  == "Abc  "           // Ergebnis: .F. 
   RETURN 
Gruß
Hubert

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14400
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von brandelh » Mi, 22. Aug 2012 18:18

ja dort steht das, nun wie geschrieben, ich nutze das nie.
Die Erklärung in der Hilfe läßt Spielraum für Spekulationen, hilft nur ausprobieren.

Ich bin im Urlaub, das dürft ihr erledigen :badgrin:
Gruß
Hubert

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14400
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von brandelh » Mi, 22. Aug 2012 20:58

Hi,

so nach dem Essen hatte ich doch noch Lust ...

Code: Alles auswählen

proc main
  local cT1, cT2
  cls
  cT1 := replicate("0",10)
  cT2 := replicate("0",11)
  ? cT1, "len()=",len(cT1)
  ? cT1, "len()=",len(cT2)
  set exact off
  ? "OFF: cT1=cT2 ",cT1=cT2
  ? "OFF: cT2=cT1 ",cT2=cT1
  set exact on
  ? "ON:  cT1=cT2 ",cT1=cT2
  ? "ON:  cT2=cT1 ",cT2=cT1
  wait

return

ERGEBNIS:

0000000000 len()=         10
0000000000 len()=         11
OFF: cT1=cT2  N
OFF: cT2=cT1  J
ON:  cT1=cT2  N
ON:  cT2=cT1  N
Press any key to continue...
und die Moral von der Geschicht, glaube der Hilfe nicht (immer) :D
Gruß
Hubert

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7146
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von Tom » Mi, 22. Aug 2012 21:52

@Hubert: Ja, ich hatte spaßenshalber auch rumprobiert. Die Doku ist hier nicht eindeutig - die Aussagen im Hinblick auf die Länge sind zwar prinzipiell richtig, aber es fehlt die Klarstellung, dass es bei etwaigen Längenunterschieden rechts vs. links lediglich um nachfolgende Leerzeichen geht.
Herzlich,
Tom

Antworten