Home > Artikel > Ausgabe 5/2012 > Null-Werte und wie man damit umgeht

Null-Werte und wie man damit umgeht

  PDF ansehen

  Download PDF und Beispieldatenbank

Null ist nicht 0 ist nicht "". Das sind die grundlegenden Weisheiten, die man als Access-Entwickler verinnerlichen muss. Was ist aber dann Null? Und wie erkenne ich die Unterschiede etwa zu 0 oder einer leeren Zeichenfolge? In diesem Artikel erfahren Sie mehr zu diesem Thema und lernen den Umgang mit Null-Werten samt der dazu notwendigen Funktionen wie IsNull oder Nz kennen.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1205_NullWerte.mdb.

Null, 0 und die leere Zeichenfolge

Wenn Sie auf die Daten einer Tabelle zugreifen – beispielsweise über eine Domänenfunktion wie DLookup – erhalten Sie verschiedenste Werte. Im Optimalfall finden Sie den gesuchten Wert wie etwa den Vornamen eines Kunden vor. Vielleicht wurde aber gar kein Vorname in den entsprechenden Datensatz eingetragen – dann ist das Feld leer und DLookup liefert den Wert Null zurück (Wir gehen an dieser Stelle davon aus, dass es einen Datensatz mit dem Wert 1 im Feld KundeID gibt – anderenfalls würde DLookup auch den Wert Null zurückliefern, aber diesmal, weil überhaupt kein passender Datensatz gefunden wurde).

Das können Sie prüfen, indem Sie im Direktbereich des VBA-Editors (zu öffnen mit Strg + G) die folgenden Anweisung absetzen:

  DLookup("Vorname", "tblKunden", "KundeID = 1")

    Null

Wenn Sie das Ergebnis dieses Aufrufs von DLookup nun innerhalb einer kleinen Prozedur in eine Variable des Datentyps String eintragen möchten, führt dies zu einem Fehler (siehe Bild 1): Unzulässige Verwendung von Null. Null ist also zumindest schon einmal nichts, was man einer String-Variablen als Inhalt zuweisen kann.

Fehler beim Versuch, einer String-Variablen einen NULL-Wert zuzuweisen

Bild 1: Fehler beim Versuch, einer String-Variablen einen NULL-Wert zuzuweisen

Was tun? Wahrscheinlich möchten Sie der Variablen an dieser Stelle schlicht und einfach eine leere Zeichenkette zuweisen, also den Ausdruck "".

Die IsNull-Funktion

Um dies zu erledigen, können Sie vorab prüfen, ob das Feld den Wert Null enthält und in diesem Fall die leere Zeichenkette übergeben.

Dieses Unterfangen hat bereits vielen Access-Entwicklern Kopfzerbrechen bereitet. Die folgende If...Then-Bedingung prüft, ob der Vorname des Kunden mit dem Wert 1 im Feld KundeID vorhanden ist:

If DLookup("Vorname", "tblKunden", "KundeID = 1") = Null Then

     MsgBox "Vorname nicht vorhanden"

Else

     MsgBox "Vorname vorhanden"

End If

Wieder erwarten liefert der Code ein Meldungsfenster, wonach der Kunde vorhanden ist. Was läuft hier schief? Nun: Der Vergleich mit dem Wert Null liefert immer den Ausdruck Null. Das bestätigt auch die folgende Anweisung im Direktfenster:

  IsNull(Dlookup("Vorname", "tblKunden", "KundeID = 1") = NULL)

    Wahr

Die Prüfung eines Ausdrucks auf den Wert Null führen Sie mit der Funktion IsNull durch. Diese erwartet als Parameter den zu prüfenden Ausdruck und liefert den Wert True oder False zurück:

IsNull()

Bei der Prüfung eines Feldwertes setzen Sie die Funktion etwa so ein:

Public Sub AufNullPruefen()

     Dim strVorname As String

     If IsNull(DLookup("Vorname", "tblKunden", "KundeID = 1")) = True Then

         strVorname = ""

     Else

         strVorname = DLookup("Vorname", "tblKunden", "KundeID = 1")

     End If

     Debug.Print strVorname

End Sub

IsNull und IIf

Nun ist das schon ein recht umfangreiches Konstrukt, nur um mal eben den Wert eines Feldes in eine Variable zu schreiben. Sie können dies auch mit einer einzigen Zeile erledigen, wenn Sie die IIf-Funktion hinzunehmen:

strVorname = IIf(IsNull(DLookup("Vorname", "tblKunden", "KundeID = 1")), "", _

DLookup("Vorname", "tblKunden", "KundeID = 1"))

Der erste Parameter der IIf-Funktion enthält dabei den zu prüfenden Ausdruck, der zweite das Ergebnis für den Fall, dass der Ausdruck True ist und der dritte das Ergebnis für den Fall, dass der Ausdruck False ist.

Die Nz-Funktion

Die Zeile ist immer noch recht lang und unübersichtlich. Zum Glück gibt es für diesen Fall eine spezielle Funktion namens Nz. Diese erwartet mindestens einen Parameter, und zwar den zu prüfenden Ausdruck. Liefert dieser Ausdruck nicht den Wert Null, gibt Nz einfach den Ausdruck zurück.

Ist der Ausdruck aber Null, hängt der Rückgabewert von verschiedenen Faktoren ab:

  • Wenn Sie einen Ausdruck oder ein Literal als zweiten Parameter angegeben haben, liefert Nz den Wert des zweiten Parameters zurück.
  • Wenn der zweite Parameter leer ist und das Ergebnis beispielsweise als Ausdruck innerhalb einer Abfrage zum Einsatz kommt, liefert die Funktion eine leere Zeichenkette zurück ("").
  • Wenn der zweite Parameter leer ist und Sie weisen das Ergebnis einer Variablen zu, wird das Ergebnis in Abhängigkeit vom Datentyp der Variablen ermittelt. Wenn Sie eine Zahlen-Variable verwenden, liefert Nz den Wert 0, sonst eine leere Zeichenkette ("").

Dies verdeutlichen die folgenden Beispiele. Im ersten Fall weisen wir das Ergebnis einer Variablen zu, deren Datentyp eine Zahl erwartet:

Dim intTest As Integer

intTest = Nz(DLookup("Vorname", "tblKunden", "KundeID = 1"))

intTest enthält anschließend den Wert 0. Beim zweiten Beispiel verwenden wir eine String-Variable als Ziel:

Dim strTest As String

strTest = Nz(DLookup("Vorname", "tblKunden", "KundeID = 1"))

strTest ist nachher mit einer leeren Zeichenkette gefüllt. Wenn Sie sichergehen wollen, dass Nz auf jeden Fall eine leere Zeichenkette liefert, wenn der Ausdruck den Wert Null ergibt, geben Sie als zweiten Parameter eine leere Zeichenkette an:

strTest = Nz(DLookup("Vorname", "tblKunden", "KundeID = 1"), "")

Gleiches gilt für den Fall, dass statt dem Wert Null die Zahl 0 zurückgeliefert werden soll:

Nz(DLookup("KundeID", "tblKunden", "Vorname = 'xyz'"), 0)

Alternative Werte zurückgeben

Der zweite Parameter kann jedoch auch mit beliebigen Werten gefüllt werden, also auch mit anderen Zahlen als 0 oder mit Zeichenketten.

Null-Wert speichern

Wenn Sie damit rechnen, dass eine Funktion oder ein Ausdruck den Wert Null zurückliefert, kann es natürlich auch sein, dass Sie genau mit diesem Wert weiterarbeiten möchten. Aber weder Zahlen- noch Textvariablen speichern diesen Wert – stattdessen liefert der Versuch, dies zu tun, einen Fehler.

Wie also soll man einen Null-Wert speichern? Kein Problem: Dies gelingt mit dem Datentyp Variant, was die folgenden Zeilen belegen:

Dim varNull As Variant

varNull = DLookup("Vorname", "tblKunden", "KundeID = 1")

Debug.Print "varNull: " & IsNull(varNull)

Aus Null mach leere Zeichenkette

Es gibt noch eine weitere Methode, aus dem Null-Wert eine leere Zeichenkette zu machen. Dazu hängen Sie einfach eine leere Zeichenkette an den Null-Wert an, und zwar mit dem &-Operator:

DLookup("Vorname", "tblKunden", "KundeID = 1") & ""

Einer Null, alle Null

Manchmal ist es hilfreich, wenn ein Ausdruck den Wert Null zurückgibt. Das ist beispielsweise beim Zusammensetzen von Adressdaten zu einer Adresszeile interessant.

Angenommen, Sie möchten die einzelnen Felder eines Kundendatensatzes zu einem Ausdruck zusammenfassen, also beispielsweise zu Klaus Müller, Teststraße 1, 12345 Musterhausen. Dies sieht etwa so aus:

Dim db As DAO.Database

Dim rst As DAO.Recordset

Set db = CurrentDb

Set rst = db.OpenRecordset("SELECT * FROM tblKunden", dbOpenDynaset)

Do While Not rst.EOF

     Debug.Print rst!Vorname & " " & rst!Nachname & ", " & rst!Straße & ", " & rst!PLZ & " " & rst!Ort

     rst.MoveNext

Loop

Set db = Nothing

Wenn hier nun beispielsweise keine Straße angegeben wurde, sieht das Ergebnis so aus:

Madleine Glas, , 86159 Augsburg

Das doppelte Komma sieht nicht besonders schön aus. Wie aber sorgen wir dafür, dass eines der beiden Kommata weggelassen wird, wenn das Feld Strasse für diesen Kunden leer ist?

Es ist einfacher, als Sie denken. Sie müssen lediglich alle Literale und Ausdrücke, die zusammen mit einem Feld angezeigt werden sollen, das leer sein könnte, über den Operator + mit dem Feld verbinden:

rst!Vorname & " " & rst!Nachname & ", " + rst!Straße & ", " & rst!PLZ & " " & rst!Ort

Der Operator + liefert den Wert Null, wenn einer der beiden zu verknüpfenden Ausdrücke Null ist.

Null in Abfragen

Selbst in Abfragen und SQL-Ausdrücken muss man beim Umgang mit Null-Werten aufpassen. Die Abfrage aus Bild 2 soll alle Kunden liefern, bei denen der Vorname fehlt, das Feld also den Wert Null enthält.

Vergleich mit Null in einer Abfrage

Bild 2: Vergleich mit Null in einer Abfrage

Wenn Sie in die Datenblattansicht wechseln, zeigt die Abfrage allerdings keinen Datensatz an – obwohl der Datensatz mit dem Wert 1 im Feld KundeID nachweislich keinen Vornamen enthält.

Der Grund ist ähnlich wie in VBA gelagert. Nur benötigen Sie hier keine IsNull-Funktion, sondern müssen nur den Vergleichswert auf Is Null einstellen – was die deutschsprachige Version von Access auf Ist Null ändert.