NULL-Feld und gefülltes Feld immer gleich?

Hi!

Ich habe vor ein paar Tagen einen recht eigenartigen Fehler in einem Programm gefunden, der zu einer sehr umständlichen Prüfung führte.

Die Aufgabe besteht darin, einen Datensatz in einer Vergleichstabelle zu suchen und zu prüfen, ob sich der Satz in einem beliebigen Feld verändert hat.

Das sah ursprünglich so aus:

For lCount = 0 to tdTd.Fields.Count -1
If rsA.Fields(lCount) rsB.Fields(lCount) Then
[…]
End If
Next lCount

Interessanterweise war das Resultat der If-Abfrage immer True,
wenn eines der beiden geprüfen Felder NULL war, das andere aber einen Wert enthielt. Nun mußte ich diese absolut umständliche ISNULL-Prüfung einbauen:

If rsA.Fields(lCount) rsB.Fields(lCount) or (IsNull(rsA.Fields(lCount) and Not IsNull(rsB.Fields(lCount)) or (Not IsNull(rsA.Fields(lCount) and IsNull(rsB.Fields(lCount)) Then

Kennt jemand einen besseren Programmierweg?

Gruß
Siegfried

Hi auch,

Ich habe vor ein paar Tagen einen recht eigenartigen Fehler in
einem Programm gefunden,

Das ist nicht eigenartig, das ist genau so definiert. Ein Vergleichsoperator auf Null angewendet ergibt immer false:
a null ist false,
a = null ist false

Die Angabe „Null“ kann also interpretiert werden als: ich kenne den Wert nicht.
Lustigerweise behandelt VB den Ungleichheitsoperator als die Negation des Gleichheitsoperators, was zwar im allgemeinen OK ist, aber bei Nullwerten ganz schlecht ist - auch die Prüfung a null müßte eigentlich false ergeben.

Das sah ursprünglich so aus:

For lCount = 0 to tdTd.Fields.Count -1
If rsA.Fields(lCount) rsB.Fields(lCount) Then
[…]
End If
Next lCount

Interessanterweise war das Resultat der If-Abfrage immer True,
wenn eines der beiden geprüfen Felder NULL war, das andere
aber einen Wert enthielt.

s.o.

If rsA.Fields(lCount) rsB.Fields(lCount) or
(IsNull(rsA.Fields(lCount) and Not IsNull(rsB.Fields(lCount))
or (Not IsNull(rsA.Fields(lCount) and
IsNull(rsB.Fields(lCount)) Then

Ich hätte das so formuliert:

if not (isnull(rsA.Fields(lCount)) or isnull(rsB.Fields(lCount))) then
 if rsA.Fields(lCount) rsB.Fields(lCount) then
 ...
 end if
end if

Das heißt, die Prüfung hat nur wirklich Sinn, wenn ich Nicht-Null-Werte vergleiche.

Gruß

J.

Hi José!

Danke für deine Hinweise!
Ich werde also um eine explizite ISNULL-Prüfung wohl nicht herumkommen…
Na ja, man kann nicht alles haben. :wink:

Gruß
Siegfried

Hallihallo,
was mir hinterher noch eingefallen ist - Du kannst die Prüfung im voraus vornehmen lassen, nämlich in der Where-Klausel deiner Abfrage. Dann kannst Du getrost nach Deiner ursprünglichen Methode vorgehen. Das dürfte um einiges schneller gehen!

Viel Spaß noch

J.