Eingaben mit Gültigkeitsregeln überprüfen

Betrifft: Access ab Version 95, Beispiele für Gültigkeitsregeln

Zu den wichtigen Aufgaben einer Datenbank gehört, fehlerhafte Daten zurückzuweisen, um nur zuverlässige Informationen zu speichern. Wer einmal mit Hand ausgefüllte Formulare geprüft hat, weiß mit welcher kreativen Freiheit die Benutzer manchmal Eingaben machen.

Access hat mehrere Möglichkeiten, Eingaben zu prüfen, die unterste Ebene stellen dabei die Gültigkeitsregeln dar. Dabei gibt es mehrere Möglichkeiten, Gültigkeitsregeln anzuwenden:

Speziell bei Formularen betreffen die hier beispielhaft vorgestellten Gültigkeitsregeln vor allem Text- und Kombinationsfelder.

Bei Tabellen und Formularen finden sich bei der Felddefinition bzw. in den Steuerelemeteigenschaften die beiden Eigenschaften 'Gültigkeitsregel' und 'Gültigkeitsmeldung'. Die Tabelle eignet sich dabei aus mehreren Gründen besonders, um Gültigkeitsregeln zu hinterlegen:

Die Syntax für die Gültigkeitsregel ist die gleiche, wie man sie in der QBE-Ansicht für die Erstellung von Abfragen verwendet. Leider hat dies auch einige Nachteile:

Beim Aufstellen von Gültigkeitsregeln sollte man auf diese Punkte achten:

Nicht immer wird sich eine Gültigkeitsregel finden, die genau alle falschen Eingaben zurückweist. Aber besser eine Gültigkeitsregel, die einige Fehler erkennt, als gar keine Gültigkeitsregel.

Beispiele für Gültigkeitsregeln

Bestände
Gültigkeitsregeln im Tabellenentwurf

Wenn man die (Lager-)Bestände in einer Tabelle verwaltet, kann die Menge eines Artikels im Lager nur 0 oder positiv sein. Die Gültigkeitsregel lautet daher ganz einfach:

>=0

Hier ist es außerdem zweckmäßig, den Standardwert auf 0 einzustellen, damit kein Feld mit NULL gefüllt wird. Wenn dagegen die NULL zugelassen werden soll, lautet die Gültigkeitsregel

>=0 Oder Ist Null

Telefonnummern

Telefonnummern bestehen zwar aus Zahlen, dürfen üblicherweise aber auch einige Zeichen enthalten, insbesondere + ( ) - / und das Leerzeichen als Trennzeichen. Die zugehörige Gültigkeitsregel lautet:

Nicht Wie "*[!0-9()/ +-]*" Oder Ist Null

Vorsicht: Das - hat innerhalb von [ ] eine besondere Funktion, nämlich einen Bereich anzugeben (z.B. 0-9). Wenn es nicht als Bereichsangabe interpretiert werden soll, muss es ans Ende gestellt werden !

Bankleitzahlen

Deutsche Bankleitzahlen sind laut Bundesbank vom Standort des Kreditinstituts abhängig und müssen zwischen 10000000 und 89999999 liegen:

Zwischen 10000000 und 89999999 Oder Ist Null

Die Regel lässt entweder ein leeres Feld zu (Ist Null) oder die BLZ muss im richtigen Bereich liegen.

Kontonummern

Kontonummern sind maximal 10-stellig, sie müssen zwischen 0 und 9999999999 liegen:

Zwischen 0 Und 9999999999 Oder Ist Null

Speziell im Fall der Kontonummer reicht der Datentyp 'Long' nicht mehr aus, um alle möglichen Kontonummern darzustellen. Es empfiehlt sich beispielsweise der Datentyp 'Währung', wobei allerdings die Formatierung des Feldes im Tabellenentwurf auf Festkommazahl ohne Nachkommastellen geändert werden muss, da sonst das Währungssymbol an die Kontonummer angehängt wird.

Datum I

Bei Datumsangaben, wie z.B. Geburtsdaten empfiehlt sich zu prüfen, ob das Datum in der Vergangenheit liegt:

< Datum() Oder Ist Null

Die Funktion Datum() liefert das Systemdatum, dieses ist also korrekt einzustellen.

Datum II

Die Julianische Tageszählung im militärischen Bereich gibt das Datum als vierstellige Zahl der Form JTTT an. Die erste Ziffer (J) entspricht der letzten Ziffer des Jahres und die übrigen Ziffern (TTT) sind die fortlaufende Zählung der Tage im Jahr. So wird der 5.01.1996 als 6005 geschrieben, der 31.12.99 wird als 9365 geschrieben.
Die Gültigkeitsregel steht im Feld '[JulDat]' und sie bezieht sich auch auf dieses Feld. Bei Änderung des Feldnamens muss also auch die Gültigkeitsregel geändert werden:

Zwischen 0 Und 9365 Und ([JulDat] Mod 1000)<(367-([JulDat]\1000) Mod 2) Oder Ist Null

Ein ungerades Jahr kann keinen Schalttag haben, daher darf es höchstens 365 Tage haben. Bei geraden Jahren ist dies nicht sicher, ohne Kenntnis der ganzen Jahreszahl kann man aber nicht bestimmen, ob das gerade Jahr 365 oder 366 Tage hat. Immerhin sichert diese Gültigkeitsregel gegen die meisten Fehler ab.

Alter

Wenn nur Personen ab 18 Jahren in die Datenbank eingetragen werden dürfen, dann müssen sie mindestens 18 Jahre × 365 Tage + 4 Schalttage = 6574 Tage alt sein:

<=(Datum()-6574) Oder Ist Null

Hierbei wurde die Anzahl der Schalttage innerhalb von 18 Jahren einfach mit 4 angenommen, obwohl einige 18-jährige auch 5 Schalttage erlebt haben. Doch dies reicht für einfache Zwecke sicher aus. Wenn aber das Datum auf den Tag genau überprüft werden muss, weil es z.B. um das Mindestalter für den Führerschein oder die Geschäftsfähigkeit geht, dann muss die Gültigkeitsregel exakt definiert werden:

<=DatSeriell(Jahr(Datum())-18;Monat(Datum());Tag(Datum())) Oder Ist Null

eMail-Adressen

eMail-Adressen dürfen nur Zeichen a…z, A…Z und 0…9 und die drei Sonderzeichen . _ - enthalten. Außerdem muss eine eMail Adresse immer ein @ enthalten. Dies berücksichtigt man durch die Bedingung Nicht Wie "*[!0-9A-Z_@.-]*". Der fortgeschrittene Anwender wird sofort erkennen, dass durch ! und Nicht hier eine doppelte Verneinung vorliegt. Dies ist notwendig, weil wir die nicht-richtigen Zeichen suchen, die nicht in der Eingabe vorhanden sein dürfen.

Nach dem @ kommt der Name einer Domain und einer Topleveldomain, die durch einen Punkt getrennt werden. Dies wird durch Wie "*@*.*" berücksichtigt - allerdings würde dann schon die eMail-Adresse @. reichen, um die Gültigkeitsregel zu erfüllen. Mit dem ? erzwingt man ein Zeichen in der eMail-Adresse, so dass beispielsweise die Topleveldomain mindestens zwei Buchstaben haben muss ("*@*.??*"), dass die Domain mindestens zwei Buchstaben haben muss ("*@??*.*") oder dass der eMail-Name mindestens zwei Buchstaben haben muss ("*??@*.*").
Zusammengesetzt ergibt sich folgender Ausdruck für die Gültigkeitsregel:

Wie "*??@??*.??*" Und Nicht Wie "*[!0-9A-Z_@.-]*" Oder Ist Null

Warnung 1: Access hat ein massives Problem mit dem deutschen ß. Das ß wird als ss erkannt, so dass der Ausschluß von ß auch den Eintrag von eMail-Adressen mit ss verhindern würde.

Da eMail-Adressen weltweit eindeutig sind, empfiehlt es sich u.U. einen eindeutigen Index auf das Feld zu legen, damit nicht der gleiche eMail-Name zwei Empfängern zugeordnet wird. Dies ist besonders wichtig, wenn man allgemeine Post (= Newsletter, Werbung) via eMail verschicken will, damit ein Empfänger nicht mit mehreren eMails belästigt wird.

Warnung 2: Als Datentyp für die eMail-Adresse wird ein Textfeld vorausgesetzt. Hyperlink-Felder können so nicht abgeprüft werden, da hier die Adressen aus mehreren Bestandteilen aufgebaut sein können, die nicht das Format einer eMail-Adresse haben müssen.

Datensatzprüfung auf Tabellenebene
Tabelleneigenschaften zur Einstellung von Gültigkeitsregeln auf Datensatzebene

Das folgende Beispiel zeigt eine Gültigkeitsregel auf Tabellenebene, d.h. sie wird erst geprüft, wenn der Datensatz als Ganzes gespeichert werden soll. Dies hat den Vorteil, dass nun alle Felder belegt sind und gegeneinander geprüft werden können.
Die entsprechenden Einstellungen nimmt man in den Tabelleneigenschaften vor (siehe Bild).

Als Beispiel soll eine Tabelle von Vereinsmitgliedern dienen, welche die Eintritts- und Austrittsdaten je Mitglied speichert. Hier darf das Austrittsdatum natürlich nicht vor dem Eintrittsdatum liegen.

Wenn die Felder [Eintritt] und [Austritt] heißen und vom Typ Datum sind, dann lautet die Gültigkeitsregel

[Eintritt]<[Austritt]

Nullwerte in den Feldern [Eintritt] und [Austritt] werden bei dieser Regel nicht beanstandet. Dies macht deshalb Sinn, weil bei ungekündigten Mitgliedern kein Austrittsdatum angegeben wird. Wenn das Eintrittsdatum angegeben werden muß, hat man zwei Möglichkeiten: Erstens diese Gültigkeitsregel auf Tabellenebene erweitern oder zweitens die Eigenschaft des Tabellenfeldes [Eintritt] auf 'Eingabe erforderlich' setzen - dies ist die bessere Wahl.