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 »

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: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag 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
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: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag 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:
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 »

okay, das ist auch meine vermutung. kann das upper da einen einfluss haben?
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von Jan »

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: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von Jan »

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: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag 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.
Herzlich,
Tom
Benutzeravatar
Muecke
1000 working lines a day
1000 working lines a day
Beiträge: 623
Registriert: Di, 24. Okt 2006 7:19
Wohnort: Samstagern CH
Hat sich bedankt: 3 Mal
Danksagung erhalten: 9 Mal
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von Muecke »

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: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von Tom »

@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: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag 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!
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 »

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: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag 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. :)
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 »

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: 21164
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: wie function string vergleich, was ist das ergebnis

Beitrag von Manfred »

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 Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag 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 :?:
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag 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
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag 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!
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: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag 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 ?
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag von Tom »

Nein, das ist durchaus aus der Hilfe zu SL1, Thema "= (Vergleichsoperator)".
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag 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 
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag 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:
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag 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
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: wie function string vergleich, was ist das ergebnis

Beitrag 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.
Herzlich,
Tom
Antworten