Formulare: Datensatz wird nicht gespeichert

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

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

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar