Seite 1 von 1

wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 13:50
von stefu
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?

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 13:53
von Jan
Ö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

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 13:55
von Tom
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:

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 13:57
von stefu
okay, das ist auch meine vermutung. kann das upper da einen einfluss haben?

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 13:59
von Jan
Was ist denn ein Upper("0")? Immer noch 0. Im Prinzip ist das zumindest hierfür vollkommen belanglos.

Jan

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 14:00
von Jan
Tom hat geschrieben:Sieht nach Bullshitcode aus. :wink:
Tom, Du bist manchmal so herrlich direkt :D

Jan

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 14:03
von Tom
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.

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 14:13
von Muecke
kann es nicht sein das
var= absUBN..... 100000000000

Vielleicht darum Upper und den String vergleichen !

Gruss Thomas

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 14:31
von Tom
@Thomas: Wenn ich dann ausschließlich mit Ziffern vergleiche, spielt das Upper() keine Rolle. "asx000..." und "ASX000..." entsprechen sich in dieser Hinsicht.

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 14:46
von Tom
@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!

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 15:19
von stefu
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!

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 15:33
von Tom
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. :)

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 15:37
von stefu
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.

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 15:48
von Manfred
stefu hat geschrieben: Das ist nur meine Vermutung. Ich kann niemanden mehr fragen.
Hat es Dir die Sprache verschlagen? :lol:

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 16:26
von UliTs
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 :?:

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 17:57
von brandelh
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

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 18:03
von Tom
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!

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 18:09
von brandelh
Ich habe dort auch nachgesehen aber den Text kann ich in der SL1 nicht finden, habt ihr die Hilfe von 1.90.331 ?

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 18:09
von Tom
Nein, das ist durchaus aus der Hilfe zu SL1, Thema "= (Vergleichsoperator)".

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 18:14
von brandelh
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 

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 18:18
von brandelh
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:

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 20:58
von brandelh
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

Re: wie function string vergleich, was ist das ergebnis

Verfasst: Mi, 22. Aug 2012 21:52
von Tom
@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.