Ziel: Saubere Daten, auf die Du Dich verlassen kannst
Access lässt viel durch.
Wenn Du nicht aufpasst, hast Du am Ende Dubletten, Nullwerte, Verwaistes und Inkonsistenz pur.
Du musst selbst Grenzen setzen – in Tabelle, Formular und Code.
Variante 1: Felder mit sinnvollen Typen und Regeln definieren
Beispiel tblKunde
:
KundenID
→ Autowert (Primärschlüssel)Name
→ Text (Pflichtfeld,Required = True
)Email
→ Text, mit Gültigkeitsregel:Like "*@*.*"
ErstelltAm
→ Datum, Standardwert=Now()
In der Tabelle:
CurrentDb.Execute "ALTER TABLE tblKunde ADD CONSTRAINT chk_Email CHECK (Email Like '*@*.*')"
So hast Du schon mal eine erste Linie gezogen.
Variante 2: Beziehungen setzen und schützen
tblAuftrag.KundenID
→ Fremdschlüssel zutblKunde.KundenID
- referenzielle Integrität aktivieren
- optional: Löschweitergabe aktivieren – aber nur, wenn es fachlich Sinn ergibt
Access verhindert damit automatisch:
- verwaiste Zeilen
- ungültige Verknüpfungen
Variante 3: Formulare mit Validierung im BeforeUpdate
Private Sub Form_BeforeUpdate(Cancel As Integer)
If Nz(Me.Name, "") = "" Then
MsgBox "Name darf nicht leer sein.", vbExclamation
Cancel = True
Me.Name.SetFocus
End If
If Not IstGueltigeEmailAdresse(Me.Email) Then
MsgBox "Ungültige E-Mail-Adresse.", vbExclamation
Cancel = True
Me.Email.SetFocus
End If
End Sub
Und Funktion dazu:
Public Function IstGueltigeEmailAdresse(email As String) As Boolean
Dim regEx As Object
Set regEx = CreateObject("VBScript.RegExp")
regEx.Pattern = "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$"
regEx.IgnoreCase = True
IstGueltigeEmailAdresse = regEx.Test(email)
End Function
Variante 4: Unzulässige Eingaben bei Importen blockieren
CSV-Import? Vor dem Speichern prüfen:
If Not IsDate(rs!Geburtstag) Then
LogFehler "Ungültiges Datum: " & rs!Geburtstag
GoTo Nächster
End If
Oder importierte Daten erst in tblImportStaging
, dann prüfen, dann übernehmen.
Variante 5: Doppelte Datensätze verhindern
- eindeutige Indizes setzen:
CurrentDb.Execute "CREATE UNIQUE INDEX ix_Kunde_NameGebDatum ON tblKunde(Name, Geburtsdatum)"
- bei der Eingabe prüfen:
If DCount("*", "tblKunde", "Name='" & Me.Name & "' AND Geburtsdatum=#" & Format(Me.Geburtsdatum, "yyyy-mm-dd") & "#") > 0 Then
MsgBox "Datensatz existiert bereits.", vbExclamation
Cancel = True
End If
Variante 6: Pflichtfelder bei Navigation abfangen
Private Sub Form_BeforeInsert(Cancel As Integer)
If Len(Nz(Me.Name, "")) = 0 Then
MsgBox "Name ist erforderlich."
Cancel = True
End If
End Sub
Oder im BeforeUpdate
wie oben.
Variante 7: Anomalien regelmäßig prüfen
Query qryDublette_Kunden
:
SELECT Name, COUNT(*) FROM tblKunde GROUP BY Name HAVING COUNT(*) > 1
Query qryKunden_ohne_Auftrag
:
SELECT * FROM tblKunde
WHERE KundenID NOT IN (SELECT KundenID FROM tblAuftrag)
Diese Queries als Makros oder Prozedur laufen lassen – z. B. wöchentlich.
Variante 8: Änderungslog schreiben
Public Sub LogAenderung(tbl As String, feld As String, alt As Variant, neu As Variant)
CurrentDb.Execute "INSERT INTO tblAenderungsLog (Tabelle, Feld, Altwert, Neuwert, Zeitpunkt) " & _
"VALUES ('" & tbl & "', '" & feld & "', '" & alt & "', '" & neu & "', Now())"
End Sub
Dann im Formular:
If Me.Name_OldValue <> Me.Name Then
LogAenderung "tblKunde", "Name", Me.Name_OldValue, Me.Name
End If
Best Practices
- keine Pflichtfeldprüfung nur auf UI-Ebene
- keine Kombifelder ohne Datensatzprüfung
- keine direkten SQL-Imports ohne Validierung
- keine Löschorgien ohne Absicherung
- keine Tabellen ohne PK
- kein Vertrauen in „der Benutzer weiß schon, was er tut“
Fazit für Entwickler
Datenintegrität ist nichts, was Access für Dich übernimmt.
Du musst jede Lücke selbst schließen – mit Typen, Beziehungen, Validierung, Logging.
No responses yet