Bei der Erfassung von Datensätzen zeigt Access erst dann eine Fehlermeldung zur Primarschlüsselverletzung an, wenn der komplette Datensatz erfasst ist und dauerhaft gespeichert werden soll. Die Speicherung nimmt Access automatisch vor, wenn Sie den Datensatz wechseln oder eine Funktion über das Hauptmenü bzw. die Multifunktionsleiste oder eine Symbolleiste aktivieren.
Sinnvoller wäre natürlich eine Prüfung, bevor Sie mühsam und unter Umständen vergebens alle Felder des Datensatzes gefüllt haben.
Das lässt sich relativ einfach mit einer kleinen VBA-Routine erledigen, die aber nur in Formularen zum Einsatz kommen kann, da Access in Tabellen keine Ereignisprozeduren zur Verfügung stellt.
Dazu zunächst ein paar Hintergrundinformationen: Wenn Sie die Eingabe in einem Feld abschließen, ruft Access die Ereignisprozedur „Nach Aktualisierung“ auf. Haben Sie also beispielsweise den Nachnamen des Kunden eingegeben und drücken dann die Eingabe-, Tab- oder eine Cursor-Taste oder wechseln per Maus in ein anderes Feld, so werden die für die Ereignisprozedur „Nach Aktualisierung“ eingegebenen Anweisungen ausgeführt.
Diese Anweisungen könnten nun z. B. in der Tabelle „Kunden“ nachschlagen, ob zum gerade eingegebenen Nachnamen bereits ein Datensatz vorhanden ist, und dessen Details anzeigen. So ließe sich die mühsame komplette Erfassung aller Felder schon an dieser Stelle abbrechen. In der Beispieldatenbank zu diesem Beitrag finden Sie die Tabelle „Kunden“ und das gleichnamige Formular „Kunden“, in das wir eine solche „Vorabprüfung“ zu Demonstrationszwecken eingebaut haben.
Nach der Eingabe des Nachnamens erfolgt hier sofort eine Prüfung. Erkennen Sie anhand der Meldung, dass Sie einen bereits vorhandenen Kunden erneut anlegen wollen, drücken Sie einfach die Esc-Taste, um die Neuanlage abzubrechen.
So funktioniert die VBA-Routine
Beim Aufruf der Ereignisprozedur „Nach Aktualisierung“ des Feldes „Nachname“ werden die folgenden Anweisungen ausgeführt:
Private Sub Nachname_AfterUpdate()
Dim strNachname As String, strSQL As String, strMsg As String
Dim lngAnz As Long, I As Integer, db As DATABASE, rs As Recordset
On Error Resume Next
strNachname = Me.Nachname
If Err <> 0 Then
Beep
Exit Sub
End If
Hier lesen wir zunächst den eingegebenen Nachnamen aus dem Feld „Nachnamen“ aus und weisen ihn der Variablen „str Nachname“ zu.
Tritt dabei ein Fehler auf, so war das Feld leer. Es gibt demzufolge nichts zu überprüfen und die Routine wird mit einem akustischen Hinweis verlassen.
strSQL = „select * from Kunden where Nachname = ‚“ & strNachname & „‚“
Set db = CurrentDb()
Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
Andernfalls initialisieren wir ein Recordset, das alle Datensätze der Tabelle „Kunden“ beinhaltet, bei denen das Feld „Nachname“ den gleichen Inhalt wie der eingegebene Nachname hat.
Err = 0
rs.MoveLast
If Err <> 0 Then ‚OK, nichts gefunden…
rs.Close
Exit Sub
End If
lngAnz = rs.RecordCount
rs.MoveFirst
Dann prüfen wir, ob und, wenn ja, wie viele Datensätze gefunden wurden. „rs.Move- Last“ generiert eventuell einen Fehler, wenn das Recordset keine Datensätze beinhaltet, wenn also keine Datensätze zum betreffenden Nachnamen gefunden wurden. Wir schließen dann das Recordset und verlassen die Routine ohne weitere Aktionen, da eine Doppelerfassung nicht gegeben ist.
Andernfalls halten wir die Anzahl gefundener Datensätze gemäß „rs.RecordCount“ in der Variablen „lngAnz“ für die folgende Schleife fest.
strMsg = „Folgende Datensätz zu »“ + strNachname + „« existieren bereits:“ + vbCrLf + vbCrLf
For I = 1 To lngAnz
strMsg = strMsg & rs(„Nachname“) & „, “ & rs(„Vorname“) & “ in “ & rs(„Ort“) & vbCrLf
rs.MoveNext
Next I
rs.Close
Beep
MsgBox strMsg, vbOKOnly + vbInformation, „Hinweis:“
End Sub
Anschließend lesen wir in dieser Schleife alle Datensätze aus und halten Nachnamen, Vornamen und Ort in einer Variablen „strMsg“ für die Anzeige fest. Diese Anzeige erfolgt dann abschließend, nachdem das Recordset geschlossen und ein akustischer Hinweis ausgegeben wurde, über die „MsgBox“-Anweisung.
Individuelle Anpassungen vornehmen
Diese kleine Routine können Sie mit geringen Änderungen direkt in Ihre Datenbanken bzw. Formulare übernehmen. Ändern Sie dazu den Namen der abzufragenden Tabelle und des betreffenden Feldes sowie die Namen der Variablen in den folgenden Zeilen. Die vorzunehmenden Änderungen sind jeweils in rot dargestellt:
Dim strNachname
strNachname = Me.Nachname
strSQL = „select * from Kunden where Nachname = ‚“ & strNachname & „‚“
strMsg = strMsg & rs(„Nachname„) & „, “ & rs(„Vorname„) & “ in “ & rs(„Ort„) & vbCrLf
Wenn Sie beispielsweise in einer Artikelverwaltung die Artikelbezeichnung überprüfen möchten, könnten die Anpassungen wie folgt aussehen:
Dim strArtBezeichnung
strArtBezeichnung = Me.ArtBezeichnung
strSQL = „select * from Artikel where ArtBezeichnung = ‚“ & strArtBezeichnung & „‚“
strMsg = strMsg & rs („ArtBezeichnung„) & „, “ & rs(„ArtNummer„) & “ in “ & rs(„ArtPreis„) & vbCrLf
Hier würden dann alle Datensätze zur Artikelbezeichnung mit ihrer Artikelnummer und ihrem Preis als Anhaltspunkt angezeigt werden.