Die Geheimnisse von Null, Leere Zeichenkette, Nothing und Co.

Die Geheimnisse von Null, Leere Zeichenkette, Nothing und Co.

In Datenbanken gibt es einen entscheidenden Unterschied zwischen einem leeren Feld und einem Feld mit einer leeren Zeichenkette. Aber das ist noch nicht alles! Es gibt noch weitere interessante Dinge rund um dieses Thema, wie die Funktionen IsNull, Nz und andere VBA-Elemente, die sich mit ähnlichen Dingen befassen – zum Beispiel Nothing, Empty oder Missing. In diesem Beitrag werde ich euch diese VBA-Elemente erklären und die wichtigsten Unterschiede und Anwendungsfälle aufzeigen.

Wer hat sich beim Einstieg in die Welt der Datenbanken nicht schon einmal in die Nesseln gesetzt, als er versucht hat, ein leeres Textfeld mit dem Wert “” (für eine leere Zeichenkette) zu vergleichen? Aber lasst uns das anhand eines einfachen Beispiels genauer betrachten.

Ein einfaches Formular mit einem Textfeld

Stellen wir uns vor, wir haben ein Formular mit einem Textfeld, das mit einer Tabelle verknüpft ist. Wenn der Benutzer auf die Schaltfläche “Speichern” klickt, sollen die Felder validiert und der Datensatz gespeichert werden.

Um das zu erreichen, legen wir zunächst die Prozedur für die Schaltfläche “cmdSpeichern” an. Diese Prozedur speichert einfach Änderungen am Datensatz, falls welche vorhanden sind. Hier ist der Code:

Private Sub cmdSpeichern_Click()
    On Error Resume Next
    RunCommand acCmdSaveRecord
    Select Case Err.Number
        Case 0, 2501
        Case Else
            MsgBox "Fehler " & Err.Number & " " & Err.Description
    End Select
    On Error GoTo 0
End Sub

Wie ihr seht, habe ich auch eine Fehlerbehandlung hinzugefügt, da das Speichern des Datensatzes beim Abbrechen einen Fehler auslösen könnte. Die folgende Ereignisprozedur wird durch das Ereignis “Vor Aktualisierung” ausgelöst. Sie prüft, ob das Feld “Nachname” eine leere Zeichenkette enthält. Falls nicht, wird eine entsprechende Meldung angezeigt, das Textfeld erhält den Fokus und die Aktualisierung wird abgebrochen:

Private Sub Form_BeforeUpdate(Cancel As Integer)
    If Me!Nachname = "" Then
        MsgBox "Der Nachname ist eine leere Zeichenkette.", vbOKOnly
        Me!Nachname.SetFocus
        Cancel = True
    End If
End Sub

Wenn wir das ausprobieren, passiert… nichts! Obwohl das Textfeld leer ist! Warum? Weil das Textfeld tatsächlich leer ist und der Inhalt nicht einer leeren Zeichenkette entspricht.

LESEN  Kununu Bewertung lesen 2022 – Ein Leitfaden für Jobsuchende

Die Access IsNull()-Funktion

Um dies zu überprüfen, verwenden wir nicht “=” oder “Null”. Und das “Is”-Schlüsselwort hilft uns hier auch nicht weiter. Stattdessen gibt es zwei Möglichkeiten. Die erste besteht darin, neben dem Vergleich mit der leeren Zeichenkette auch die Funktion IsNull() zu verwenden:

...
If IsNull(Me!Nachname) Then
    MsgBox "Der Nachname ist Null.", vbOKOnly
    Me!Nachname.SetFocus
    Cancel = True
End If
...

Wenn wir den Datensatz jetzt speichern möchten, wird die gewünschte Meldung angezeigt. Die Bedingung “Me!Nachname = “” ” wird übrigens mit den Standardeinstellungen nicht zutreffen.

Um tatsächlich eine leere Zeichenkette in das Feld “Nachname” eingeben zu können, müssen zwei bestimmte Eigenschaften des Feldes im Tabellendesign spezielle Werte aufweisen. Die Eigenschaft “Eingabe erforderlich” muss den Wert “Ja” haben und die Eigenschaft “Leere Zeichenfolge” muss ebenfalls den Wert “Ja” haben. Erst dann können wir eine leere Zeichenfolge in das Feld eingeben.

Die Nz()-Funktion

Es geht jedoch noch eleganter! Die Funktion Nz() erwartet den zu prüfenden Ausdruck, zum Beispiel ein Textfeld. Wenn der Inhalt des Textfeldes “Null” ist, liefert die Funktion den Standardwert für diesen Datentyp zurück. Bei Textfeldern ist das eine leere Zeichenkette.

Ihr könnt jedoch auch explizit angeben, welcher Wert zurückgegeben werden soll, wenn der geprüfte Ausdruck den Wert “Null” liefert. In diesem Fall gebt ihr die leere Zeichenkette als zweiten Parameter an und prüft dann nur noch, ob die Funktion eine leere Zeichenkette zurückgeliefert hat:

...
If Nz(Me!Nachname, "") = "" Then
    MsgBox "Der Nachname ist Null oder eine leere Zeichenkette.", vbOKOnly
    Me!Nachname.SetFocus
    Cancel = True
End If
...

Bei einem Feld, das entweder den Wert “Null” oder den Wert “0” haben kann, wird es interessanter. Nehmen wir an, wir haben ein Kombinationsfeld, mit dem der Benutzer einen Wert aus einer anderen Tabelle auswählen kann. In diesem Fall möchten wir verhindern, dass der Benutzer den Wert “0” oder “Null” auswählt. Dafür fügen wir der Ereignisprozedur der Schaltfläche “cmdSpeichern” den folgenden Code hinzu:

...
Select Case Err.Number
    Case 2501, 3201
    ...
End Sub
...

Jetzt wisst ihr, wie ihr mit Null, leeren Zeichenketten und anderen VBA-Elementen umgehen könnt. Nutzt diese Informationen weise und vermeidet zukünftige Fehler in euren Datenbanken!

LESEN  Der Unterschied zwischen Garantie und Gewährleistung