Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 6/2017.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

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

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

© 2003-2015 André Minhorst Alle Rechte vorbehalten.