AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wo liegt mein Denkfehler ...

Ein Thema von erich.wanker · begonnen am 13. Aug 2020 · letzter Beitrag vom 13. Aug 2020
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#11

AW: Wo liegt mein Denkfehler ...

  Alt 13. Aug 2020, 14:58
Stell es dir im Delphi etwa so vor
Delphi-Quellcode:
function TStringField.AsString: string;
begin
  if IsNull then
    Result := ''
  else
    Result := Data;
end;

if field.AsString = 'then
und datenbankseitig wäre es dann ein
SQL-Code:
WHERE coalesce(field, '') = ''

-- oder andersrum
WHERE nullif(field, '') IS NULL





Dein Problem ist also, dass du dich mehr mit Boolescher Algebra beschäftigen solltest.
Wenn du die Operatoren umdrehst, dann ALLE.

if (archiv = '') or archiv.isnull then

ist invertiert
Delphi-Quellcode:
if not ((archiv = '') or archiv.isnull) then
// oder
if (not (archiv = '') and not archiv.isnull) then
// bzw.
if (archiv <> '') and not archiv.isnull then
aber ist nicht
Delphi-Quellcode:
if (archiv <> '') or not archiv.isnull then
//if (archiv <> '') or (archiv.isnull = false) then

Ich kenn auch Leute die drehen es außerhalb um, weil sie es innerhalb nicht können, oder es der Dokumentation/CodeSuche wegen nicht wollen.
Delphi-Quellcode:
if true then
  ...;

if false then
else
  ...;

if not (false) then // wobei man den eigentlichen Code ja nicht umformen muss ... umgeben geht auch
  ...;
$2B or not $2B

Geändert von himitsu (13. Aug 2020 um 15:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
461 Beiträge
 
Delphi XE4 Professional
 
#12

AW: Wo liegt mein Denkfehler ...

  Alt 13. Aug 2020, 15:19
"Dein Problem ist also, dass du dich mehr mit Boolescher Algebra beschäftigen solltest"

OOOHHH jaaa.. puhh ... bin ein bisserl planlos wenn ich mir deine Variationen anschaue ...

ZB: OR -> Ich dachte immer - wenn ich was in klammern setze und eine der Fragestellungen (die in klammern gesetzt wurden) - trifft zu, dann ist das If -THEN erfüllt und es geht los..

und: ich versteh nicht den Unterschied zwischen "not archiv.isnull" und "archiv.isnull = false" .. für mich sind das zwei gleiche Dinge - nur anders geschrieben.

Aber vielen Dank für all die Antworten und Erklärungen
Erich Wanker - for life:=1971 to lebensende do begin ..
O
/H\
/ \
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#13

AW: Wo liegt mein Denkfehler ...

  Alt 13. Aug 2020, 15:26
Es gibt die Konstanten TRUE und FALSE, aber es gibt auch die logischen Auswertungen TRUE und FALSE.

False ist 0
und True ist alles Andere.

Boolean hat 256 Werte (Byte) und LongBool sogar 4 Milliarden (Integer), aber jeweils nur Einer ist FALSE.

Im Delphi ist die True-Konstante = 1 ($01),
aber in WinAPI/C++ ist die Konstante meistent -1 ($FFFFFFFF bzw $FF)

Delphi-Quellcode:
B := True;
if B then OK;
if not B then NEE;
if B = True then OK;
if B = False then NEE;

B := Boolean(2); // Boolean kommt aus einer Funktion und wurde z.B. "berechnet"
if B then OK;
if not B then NEE;
if B = True then OK; // Falsch: if Byte(B) = Byte(True) then ... if 2 = 1 then
if B = False then NEE;
Ist im Prinzip das Gleiche, wie man auch Fließkommazahlen niemals auf Gleichheit prüft.
$2B or not $2B

Geändert von himitsu (13. Aug 2020 um 15:38 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#14

AW: Wo liegt mein Denkfehler ...

  Alt 13. Aug 2020, 15:40
Delphi-Quellcode:
if
(
  (UniMainModule.d6.FieldByName('archiv').AsString = '')
or
  (UniMainModule.d6.FieldByName('archiv').IsNull)
)
then begin
  Feld_leer := true;
und
Delphi-Quellcode:
if not
(
  (UniMainModule.d6.FieldByName('archiv').AsString = '')
or
  (UniMainModule.d6.FieldByName('archiv').IsNull)
)
then begin
  Feld_leer := false;
oder
Delphi-Quellcode:
  Feld_leer := (UniMainModule.d6.FieldByName('archiv').AsString = '')
            or (UniMainModule.d6.FieldByName('archiv').IsNull)
Da himitsu weiter oben bereits erläuterte, dass aus Null in der DB bei .AsString gleich '' wird, kann man das auf
  Feld_leer := (UniMainModule.d6.FieldByName('archiv').AsString = '')
verkürzen.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#15

AW: Wo liegt mein Denkfehler ...

  Alt 13. Aug 2020, 15:56
FAIL if (UniMainModule.d6.FieldByName('archiv').asstring <> '') OR
UniMainModule.d6.FieldByName('archiv').IsNull = false) then begin
Feld_leer:=false;
Damit dieser Code auch wirklich dazu führt, zu schreiben wenn keine Daten da sind, sollte man vorher Feld_leer := True setzen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#16

AW: Wo liegt mein Denkfehler ...

  Alt 13. Aug 2020, 16:18
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?
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz