Null, leere Zeichenkette, Nothing und Co.

In Datenbanken wie Microsoft Access gibt es einen entscheidenden Unterschied zwischen einem leeren Feld und einem Feld mit einer leeren Zeichenkette. Und es gibt noch mehr interessante Dinge rund um dieses Thema, zum Beispiel die Funktion IsNull, die Funktion Nz und weitere VBA-Elemente, die sich mit ähnlichen Dingen befassen – wie etwa Nothing, Empty oder Missing. Dieser Beitrag erläutert diese VBA-Elemente und zeigt die wichtigsten Unterschiede und Einsatzzwecke auf.

Wer hat sich beim Einstieg in die Access-Welt nicht mindestens einmal in die Nesseln gesetzt, als er versucht hat, ein leeres Textfeld mit dem Wert „“ (für eine leere Zeichenkette) zu vergleichen

Schauen wir uns ein einfaches Szenario an: Das Formular aus Bild 1 ist an eine Tabelle mit einem Primärschlüsselfeld und den beiden Textfeldern Vorname und Nachname gebunden. Wenn der Benutzer auf die Schaltfläche Speichern klickt, sollen die Felder validiert werden. Verläuft die Validierung erfolgreich, wird der Datensatz gespeichert.

Ein einfaches Formular mit einem Textfeld

Bild 1: Ein einfaches Formular mit einem Textfeld

Dazu legen wir zunächst die Prozedur für die Schaltfläche cmdSpeichern an, welche schlicht eventuell vorhandene änderungen am Datensatz speichert:

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

Die Fehlerbehandlung haben wir hinzufügt, weil der Versuch, den Datensatz zu speichern, beim Abbrechen mit der nachfolgend vorgestellten Prozedur einen Fehler auslösen würde. Die folgende Ereignisprozedur wird durch das Ereignis Vor Aktualisierung ausgelöst. Es prüft, ob das Feld Nachname eine leere Zeichenkette enthält. Ist das nicht der Fall, soll eine entsprechende Meldung erscheinen, das Textfeld den Fokus erhalten und die Aktualisierung durch Setzen des Parameters Cancel auf den Wert True abgebrochen werden:

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 dies ausprobieren, geschieht – nichts! Obwohl doch das Textfeld leer ist! Warum Weil das Textfeld tatsächlich leer ist und der Inhalt genau nicht einer leeren Zeichenkette entspricht.

Die IsNull()-Funktion

Diesen Sachverhalt prüfen wir nicht mit =““, und auch nicht mit = Null. Und auch das Is-Schlüsselwort kommt hier nicht zum Einsatz, Is Null hilft also auch nicht. Hier gibt es vielmehr zwei Möglichkeiten. Die erste ist, zusätzlich zum Vergleich mit der leeren Zeichenkette auch noch die Funktion IsNull einzusetzen:

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

Wenn wir den Datensatz nun speichern wollen, erscheint die gewünschte Meldung (s. Bild 2). Die Bedingung Me!Nachname = „“ wird übrigens mit den Standardeinstellungen nicht eintreten.

Es wurde ein Textfeld mit dem Inhalt Null erkannt.

Bild 2: Es wurde ein Textfeld mit dem Inhalt Null erkannt.

Dies erreichen Sie erst, wenn zwei bestimmte Eigenschaften des Feldes im Tabellenentwurf spezielle Werte aufweisen. Die Eigenschaft Eingabe erforderlich muss dabei den Wert Ja aufweisen, die Eigenschaft Leere Zeichenfolge ebenfalls den Wert Ja (s. Bild 3).

Einstellung für leere Zeichenketten

Bild 3: Einstellung für leere Zeichenketten

Erst dann können Sie tatsächlich eine leere Zeichenfolge in das Feld Nachname eingeben – siehe Bild 4. Um auf Nummer Sicher zu gehen, was die zugrunde liegende Tabelle angeht, können Sie auch einfach eine Kombination der beiden Bedingungen nutzen:

Eingabe einer leeren Zeichenkette

Bild 4: Eingabe einer leeren Zeichenkette

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

Die Nz()-Funktion

Und es geht noch eine Nummer eleganter: Die Funktion Nz() erwartet den zu prüfenden Ausdruck, also beispielsweise ein Textfeld wie in unserem Beispiel. Wenn der Inhalt des Textfeldes Null ist, liefert die Funktion den Wert zurück, der standardmäßig für diesen Datentyp verwendet wird. Bei Textfeldern ist das eine leere Zeichenkette.

Sie können allerdings auch explizit angeben, welcher Wert zurückgegeben werden soll, wenn der geprüfte Ausdruck den Wert Null liefert. In diesem Fall geben Sie als zweiten Parameter etwa die leere Zeichenkette an und prüfen 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 aufweisen darf, wird es interessanter. Dazu fügen wir der Tabelle ein Fremdschlüsselfeld namens AnredeID hinzu, mit der der Benutzer einen der Datensätze der Tabelle tblAnreden auswählen können soll. Für das Kombinationsfeld, mit dem wir dies erledigen wollen, hinterlegen wir die folgende Datensatzherkunft:

SELECT 0, "<Auswählen>" 
FROM tblAnreden 
UNION 
SELECT [tblAnreden].[AnredeID], [tblAnreden].[Anrede] 
FROM tblAnreden;

Dies liefert, wenn wir als Standardwert den Wert 0 einstellen, die Auswahl aus Bild 5 für einen neuen Datensatz. Wenn wir die beiden Textfelder ausfüllen und das Kombinationsfeld so beibehalten, gibt es Fehler 3201 (Der Datensatz kann nicht hinzugefügt oder geändert werden, da ein Datensatz in der Tabelle “tblAnreden“ mit diesem Datensatz in Beziehung stehen muss.). Diesen wollen wir natürlich verhindern, und zwar mit einer passenden Validierung. Damit der Fehler nicht ausgelöst wird, nehmen wir diesen zunächst in die Ereignisprozedur der Schaltfläche cmdSpeichern hinzu:

Ein Kombinationsfeld, das nicht den Wert 0 oder Null liefern soll

Bild 5: Ein Kombinationsfeld, das nicht den Wert 0 oder Null liefern soll

Private Sub cmdSpeichern_Click()
     ...
     Select Case Err.Number
         Case 2501, 3201
     ...
End Sub

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access im Unternehmen:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 1.000 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar