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 zu tblKunde.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

  1. eindeutige Indizes setzen:
CurrentDb.Execute "CREATE UNIQUE INDEX ix_Kunde_NameGebDatum ON tblKunde(Name, Geburtsdatum)"
  1. 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.

Categories:

Tags:

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert