![]() |
Wo liegt mein Denkfehler ...
Hab jetzt endlich meinen Fehler in folgenden Zeilen ausgebessert - mir ist aber nicht ganz klar wieso der ERSTE Versuch NICHT funktioniert:
FAIL if (UniMainModule.d6.FieldByName('archiv').asstring <> '') OR UniMainModule.d6.FieldByName('archiv').IsNull = false) then begin Feld_leer:=false; FUNZT if (UniMainModule.d6.FieldByName('archiv').asstring = '') OR (UniMainModule.d6.FieldByName('archiv').IsNull) then begin Feld_leer:=true; PS.. das mySQL Feld ist ein varchar(40) utf8mb4_general_ci "NULL" .. hat mir viel Zeit gekostet ;-) Danke für Hinweise und liebe Grüße Erich |
AW: Wo liegt mein Denkfehler ...
//entfernt
|
AW: Wo liegt mein Denkfehler ...
ich wollte nur ins Feld "archiv" schreiben, wenn noch nix drinnen steht ..
"wenn was drinnen steht - schreibe ich NICHT" .. funktioniert nicht "wenn nix drinnen steht - schreibe ich " .. funktioniert |
AW: Wo liegt mein Denkfehler ...
Ich glaube ich würde es so machen:
schreibe nicht wenn feld belegt ist
Delphi-Quellcode:
if ((UniMainModule.d6.FieldByName('archiv').asstring <> '') AND (NOT UniMainModule.d6.FieldByName('archiv').IsNull)) then
schreibe wenn feld noch frei ist
Delphi-Quellcode:
if ((UniMainModule.d6.FieldByName('archiv').asstring = '') AND UniMainModule.d6.FieldByName('archiv').IsNull) then
|
AW: Wo liegt mein Denkfehler ...
und was macht dashier?
Delphi-Quellcode:
if (UniMainModule.d6.FieldByName('archiv').asstring <> '') OR (not UniMainModule.d6.FieldByName('archiv').IsNull) then begin ...
Bei der von Dir geposteten Variante für FAIL passt die Klammersetzung nicht? Copy&Paste-Fehler? Und müsste es dann nicht eher heißen:
Delphi-Quellcode:
Wobei der Vergleich
if (UniMainModule.d6.FieldByName('archiv').asstring <> '')
and (UniMainModule.d6.FieldByName('archiv').IsNull = false) then begin
Delphi-Quellcode:
eher als
UniMainModule.d6.FieldByName('archiv').IsNull = false
Delphi-Quellcode:
formuliert werden sollte.
not UniMainModule.d6.FieldByName('archiv').IsNull
Bei Deiner ersten Variante führt .AsString <> '' dazu, dass alle Sätze, die irgendwas, außer einem Leerstring, enthalten, gefunden werden, .IsNull = false führt zum Finden aller Sätze, die irgendwas enthalten, also auch die mit einem Leerstring. Das Or sorgt dafür, dass beides gefunden wird. Die zweite Variante liefert alle Sätze, die entweder einen Leersting enthalten oder Null sind. 1. Variante -> nicht Leer oder nicht Null 2. Variante -> Leer oder Null Irgendwie sind das zwei absolut unterschiedliche Ergebnismengen. Welche davon hättest Du denn gerne? |
AW: Wo liegt mein Denkfehler ...
Dass man sowas wie
Delphi-Quellcode:
niemals machen sollte, sollte langsam mal jeder wissen.
if TheBoolean {Variable/Funktion} = True {Konstante}
Es wird ja oft genug drauf rumgehackt und der Grund genannt. (siehe tausende Threads hier)
Delphi-Quellcode:
Grund:
{FAIL}
//if (FieldByName('archiv').AsString <> '') or (FieldByName('archiv').IsNull = False) then if (FieldByName('archiv').AsString <> '') or not FieldByName('archiv').IsNull then if (FieldByName('archiv').AsString <> '') or not (FieldByName('archiv').AsString = '') then // für den Fall NULL das IsNull gegen AsString ersetzt ('' wird durch das erste AsString behandelt) if (FieldByName('archiv').AsString <> '') or (FieldByName('archiv').AsString <> '') then // ein bissl boolesche Mathematik if FieldByName('archiv').AsString <> '' then // Gleiches gekürzt Feld_leer := False; {FUNZT} if (FieldByName('archiv').AsString = '') or FieldByName('archiv').IsNull then if FieldByName('archiv').AsString = '' then // IsNull entfernt, weil im AsString enthalten Feld_leer := True; {KURZ} Feld_leer := FieldByName('archiv').AsString = ''; ![]() AsString gibt bei NULL ein '' aus AsInteger bei NULL ein 0 Was genau ist leer für dich? Bzw. was erwartest du wann? (NULL, '' oder 'abc') Ich seh keinen FAIL Fehler, aber kann es zufällig sein, dass dein Compiler irgendwas von nicht-initialisierten Variablen schwafelt und niemand drauf hört? |
AW: Wo liegt mein Denkfehler ...
Hallo Leute.. vielen Dank :-)
"Was genau ist leer für dich?" Mein Denkfehler: Ich dachte immer - ein Datenbankfeld, das nur erstellt wurde (und noch nie beschrieben wurde) ist "Null" und nicht ''.. Ich war es immer gewohnt bei "Select * from .. WHERE archiv = '' OR archiv IS NULL.." zu schreiben.. ich denke DA gibt es einen Unterschied? Ich vermute ich mische da 2 Dinge zusammen .. beim SQL-Statement brauch ich dieses "Null" ... beim "FieldByName('archiv').AsString" brauche ich kein "isNull" .. Ist das korrekt? LiGrü Erich |
AW: Wo liegt mein Denkfehler ...
Das Hauptproblem ist wie Du deine Abfrage stellst. "OR" versus "AND"
"OR" = kann sich auf immens vieles bzw zufälliges beziehen "AND" = die auswahl wird auf ein minimum reduziert |
AW: Wo liegt mein Denkfehler ...
Zitat:
|
AW: Wo liegt mein Denkfehler ...
Der Fehler war:
Die ersten Zeilen ergaben - das anscheinen etwas im Feld "archiv" steht (obwohl es leer war) - und dadurch nichts (im else begin ..end Block) geschrieben wurde.. ****** so funktionierts nicht ****** if (archiv <> '') or (archiv.isnull = false) then begin // nicht schreiben end else begin // schreiben end; ****** so funktionierts ****** if (archiv = '') or (archiv.isnull) then begin // schreiben end else begin // nicht schreiben end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz