Formulare: Datensatz wird nicht gespeichert

Es gibt seit vielen Jahren einen Bug in Access-Formularen, der möglicherweise Entwickler und Benutzer in den Wahnsinn treibt. Dabei geht es darum, dass neue oder geänderte Datensätze beim Schließen des Formulars nicht automatisch gespeichert werden. Stattdessen findet man neue Datensätze einfach nicht in der entsprechenden Tabelle vor und bei vermeintlich geänderten Datensätzen wurde die Änderung nicht übernommen. Dies geschieht, wenn man das Formular auf eine bestimmte Art schließt und Restriktionen in der zugrunde liegenden Tabelle dafür sorgen, dass der Datensatz nicht gespeichert werden kann. Wird zum Beispiel ein Pflichtfeld nicht gefüllt und das Formular geschlossen, verwirft Access den neuen Datensatz einfach, anstatt eine entsprechende Meldung zu liefern. Dieser Beitrag dokumentiert das Fehlverhalten und zeigt, welche Möglichkeiten wir zum Umgehen dieses Problems haben.

Tabelle mit Restriktionen

Voraussetzung für das beschriebene Verhalten ist, dass das Formular eine Tabelle anzeigt, für die es eine Restriktion gibt, die beim Speichern nicht erfüllt wurde. Schauen wir uns zum Beispiel die Tabelle tblMitglieder an, bei der wir für die beiden Felder Vorname und Nachname die Eigenschaft Eingabe erforderlich auf den Wert Ja eingestellt haben (siehe Bild 1).

Tabelle mit Restriktion für das Feld Vorname

Bild 1: Tabelle mit Restriktion für das Feld Vorname

Schon in der Datenblattansicht führt der Versuch, den Datensatz zu speichern, ohne einen Wert in das Feld Vorname einzutragen, zu einer Fehlermeldung (siehe Bild 2). Der Datensatz kann nicht gespeichert werden, ohne dass dieses Feld gefüllt wird.

Meldung beim Verletzen der Restriktion

Bild 2: Meldung beim Verletzen der Restriktion

Tabelle mit Restriktionen im Formular

Schauen wir uns nun das Formular frmMitgliederDetails an, das die Daten der Tabelle tblMitglieder anzeigt.

Legen wir hier einen neuen Datensatz an, ohne das Feld Vorname auszufüllen, und versuchen, das Formular über die Schließen-Schaltfläche zu schließen, erscheint die gleiche Meldung, die wir bereits aus der Datenblattansicht der Tabelle kennen (siehe Bild 3).

Meldung auch im Formular beim Schließen mit der Taste X

Bild 3: Meldung auch im Formular beim Schließen mit der Taste X

Anschließend zeigt Access noch eine weitere Meldung an, die uns die Möglichkeit bietet, das Formular ohne Speichern der Änderung zu schließen oder die Eingabe fortzusetzen (siehe Bild 4).

Folgemeldung nach dem Hinweis auf die Verletzung der Restriktion

Bild 4: Folgemeldung nach dem Hinweis auf die Verletzung der Restriktion

Problem beim Schließen mit DoCmd.Close

Was also ist das Problem? Dieses tritt auf, wenn wir eine Schaltfläche wie cmdOK dazu nutzen, das Formular mit der folgenden Prozedur zu schließen:

Private Sub cmdOK_Click()
     DoCmd.Close acForm, Me.Name
End Sub

Das Formular wird geschlossen, ohne das eine Fehlermeldung wegen der Verletzung der Restriktion angezeigt wird – allerdings finden wir anschließend auch keinen neuen Datensatz in der zugrunde liegenden Tabelle. Das Problem wird also durch die Kombination aus DoCmd.Close und der Verletzung einer Restriktion ausgelöst.

Auch wenn wir die Methode DoCmd.Close von außen aufrufen, wird das Formular ohne Meldung und ohne Anzeige einer Meldung geschlossen – und auch hier wird der Datensatz einfach verworfen:

DoCmd.Close acForm, "frmMitgliederDetails"

Immerhin finden wir mittlerweile einen entsprechenden Hinweis auf der Seite zum DoCmd.Close-Befehl von Microsoft (siehe Bild 5).

Hinweistext in der Microsoft-Dokumentation

Bild 5: Hinweistext in der Microsoft-Dokumentation

Hier wird auch ein Workaround vorgeschlagen. Man soll die Methode RunCommand des Application-Objekts mit dem Parameter acCmdSaveRecord aufrufen, um den Datensatz zu speichern und so den Fehler zu provozieren. Erst danach soll man das Formular mit DoCmd.Close schließen:

RunCommand acCmdSaveRecord
DoCmd.Close acForm, Me.Name

Dies löst tatsächlich einen Laufzeitfehler aus. Mit einem Klick auf die Debuggen-Schaltflächen sehen wir, dass die Anweisung RunCommand acCmdSaveRecord diesen ausgelöst hat (siehe Bild 6).

Laufzeitfehler beim Speichern des Datensatzes


Nur für Abonnenten

Ab hier wird’s wirklich spannend – der Rest ist exklusiv für Abonnenten.

Mit dem Abo von Access im Unternehmen bekommst du den kompletten Artikel – inklusive vollständigem Code, Beispieldatenbank und Schritt-für-Schritt-Erklärung.

So sparst du dir stundenlanges Herumprobieren, vermeidest teure Fehler in deiner Access-Anwendung und kannst Lösungen direkt in deinem Unternehmen einsetzen, statt nur darüber zu lesen.

Teste Access im Unternehmen jetzt 4 Wochen lang kostenlos: Voller Zugriff auf alle Artikel, Downloads und Beispieldatenbanken. Kein Risiko – wenn es für dich nicht passt, kündigst du einfach innerhalb der ersten vier Wochen.

Bereits Abonnent? Hier einloggen


Kostenlos & unverbindlich

Oder hast Du eine konkrete Frage zu Deiner eigenen Access-Anwendung?

Vielleicht stellt Deine Anwendung Dich vor eine Herausforderung, zu der Du bisher keine Lösung findest. Schlechte Performance, kein ausreichender Zugriffsschutz, Du bist unsicher über Dein Datenmodell oder Dein Code liefert unerklärliche Fehler?

In unserem kostenlosen Access-Audit schaut sich André Minhorst persönlich gemeinsam mit Dir Deine Lösung per Zoom an – und zeigt Dir, wo Datenmodell, VBA-Code, Ergonomie und Sicherheit Optimierungspotenzial bieten.

Jetzt kostenloses Access-Audit anfordern →

Schreibe einen Kommentar