Löschereignisse und -optionen im Zusammenspiel

Formulare haben gleich drei Ereignisse, die sich rund um das Thema Löschen drehen. Welche davon ausgelöst werden, hängt auch von der Einstellung einer Access-Option ab. Um sicherzugehen, dass Aktionen, die nach dem Löschen eines Datensatzes über das Formular ausgeführt werden sollen, tatsächlich stattfinden, müssen Sie einige Dinge beachten. Dieser Beitrag stellt die drei betroffenen Ereignisprozeduren vor, erläutert die Access-Option, die sich auf die Ausführung dieser Ereignisprozeduren auswirkt und zeigt, wie Sie das alles so zusammenbringen, dass die gewünschten Folgeaktionen zuverlässig ausgeführt werden.

Formularereignisse

Formulare bieten so einige Ereignisse, die durch verschiedene Aktionen des Benutzers ausgelöst werden. Dazu gehören das Öffnen und Laden des Formulars sowie das Schließen und Entladen, außerdem gibt es Ereignisse, die beim Anzeigen, vor der Aktualisierung oder nach der Aktualisierung eines Datensatzes feuern.

Löschen-Ereignisse

In manchen Fällen kann es auch wichtig sein, die Ereignisse beim Löschen eines Datensatzes abzufangen. Und derer gibt es gleich drei.

Diese heißen folgendermaßen:

  • Beim Löschen
  • Vor Löschbestätigung
  • Nach Löschbestätigung

Beispielformular erstellen

Um mit diesen Ereignissen experimentieren zu können, haben wir ein Formular namens frmArtikelLoeschen erstellt, das die Tabelle tblArtikel als Datensatzquelle verwendet und der wir eine Schaltfläche namens cmdDatensatzLoeschen hinzugefügt haben (siehe Bild 1).

Beispielformular mit Löschen-Schaltfläche

Bild 1: Beispielformular mit Löschen-Schaltfläche

Die Schaltfläche löst die folgende Ereignisprozedur aus:

Private Sub cmdDatensatzLoeschen_Click()
     RunCommand acCmdDeleteRecord
End Sub

Der Befehl RunCommand acCmdDeleteRecord entspricht dem Löschen eines Datensatzes durch Markieren des Datensatzes über den Datensatzmarkierer auf der linken Seite und anschließendes Betätigen der Löschen– oder der Entf-Taste. Alternativ können Sie auch die Tastenkombination Strg + – nutzen. Später werden wir sehen, dass hier noch eine Fehlerbehandlung notwendig ist.

Löschen-Ereignisse implementieren

Als Nächstes wollen wir die drei Ereignisprozeduren für die Ereignisse Beim Löschen, Vor Löschbestätigung und Nach Löschbestätigung implementieren.

Das erledigen wir wie üblich über das Eigenschaftenblatt des Formulars im Bereich Ereignis. Hier wählen Sie für die drei Ereignisse jeweils den Wert [Ereignisprozedur] aus und klicken auf die Schaltfläche mit den drei Punkten () – siehe Bild 2.

Implementieren der Löschen-Ereignisse

Bild 2: Implementieren der Löschen-Ereignisse

Damit legen Sie im Klassenmodul Form_frmArtikelLoeschen drei Ereignisprozeduren an. Um diese analysieren zu können, fügen wir nun jeweils einen Haltepunkt hinzu und/oder eine Debug.Print-Anweisung, die den Namen der jeweiligen Prozedur im Direktbereich ausgibt – je nachdem, was für Sie praktischer erscheint (siehe Bild 3).

Die Löschen-Ereignisse im VBA-Editor

Bild 3: Die Löschen-Ereignisse im VBA-Editor

Reihenfolge der Ereignisprozeduren

Danach wechseln wir zur Formularansicht des Formulars frmArtikelLoeschen und löschen einen der Datensätze. Wie wir nun sehen, wird als Erstes die Ereignisprozedur Form_Delete (Beim Löschen) ausgelöst.

Zu diesem Zeitpunkt ist der Datensatz bereits aus dem Formular verschwunden. Dann wird das Ereignis Form_BeforeDelConfirm (Vor Löschbestätigung) ausgelöst. Danach gibt es einen Unterbrechung, in der die Meldung aus Bild 4 erscheint.

Meldung nach dem Ereignis Vor Löschbestätigung

Bild 4: Meldung nach dem Ereignis Vor Löschbestätigung

Unabhängig davon, ob Sie die Schaltfläche Ja oder Nein betätigen, wird im Anschluss noch die Prozedur Form_AfterDelConfirm (Nach Löschbestätigung) aufgerufen. Allerdings wird im Falle von Ja der aktuell angezeigte Datensatz gelöscht und im Falle von Nein wird dieser beibehalten und auch im Formular wieder angezeigt. Und auch beim Aufruf des Ereignisses Nach Löschbestätigung gibt es einen Unterschied, wie wir gleich sehen werden.

Parameter der Ereignisprozeduren

Hier wird es interessant, denn die Parameter von Ereignisprozeduren liefern entweder wichtige Informationen oder Sie können diese nutzen, um bestimmte Informationen zu übergeben.

Beginnen wir mit der Prozedur Form_Delete:

Private Sub Form_Delete(Cancel As Integer)
     Debug.Print "Delete", Cancel
End Sub 

Diese enthält einen Parameter namens Cancel, der standardmäßig den Wert 0 enthält, was False entspricht. Das bedeutet: Standardmäßig hat Cancel den Wert False, was dazu führt, dass der Löschvorgang nicht abgebrochen wird.

Individuelle Rückfrage zum Löschvorgang

Um das auszuprobieren, erweitern wir die Prozedur wie folgt:

Private Sub Form_Delete(Cancel As Integer)
     Debug.Print "Delete", Cancel
     If MsgBox("Löschen abbrechen", vbYesNo) = vbYes Then
         Cancel = True
     End If
End Sub

Dies führt nun dazu, dass beim Löschen eine Meldung mit dem Text Löschen abbrechen angezeigt wird. Klicken Sie hier auf Ja, stellt die Prozedur den Parameter Cancel auf den Wert True ein. Das funktioniert ohne Probleme, wenn Sie den Datensatz mit der Tastenkombination Strg + – löschen oder durch Anklicken des Datensatzmarkierers und anschließendes Betätigen der Löschen– oder der Entf-Taste.

Wenn Sie allerdings die Schaltfläche cmdDatensatzLoeschen verwendet haben, löst dies einen Fehler aus, dessen Meldung wir uns in diesem Zusammenhang nicht erklären können (siehe Bild 5).

Fehler beim Abbruch von RunCommand acCmdDeleteRecord

Bild 5: Fehler beim Abbruch von RunCommand acCmdDeleteRecord

Bei der Gelegenheit zeigen wir auch direkt die Fehlermeldung, die erscheint, wenn Sie das Löschen mit RunCommand acCmdDeleteRecord initiieren und dann in der standardmäßigen Rückfrage den Löschvorgang abbrechen (siehe Bild 6). Das ist noch nachvollziehbar und dieser Fehler tritt auch auf, wenn Sie beispielsweise ein Formular mit DoCmd.OpenForm öffnen und den Vorgang durch Setzen von Cancel auf True in der Ereignisprozedur Form_Open abbrechen.

Fehler beim Abbruch von RunCommand acCmdDeleteRecord über die Standardrückfrage.

Bild 6: Fehler beim Abbruch von RunCommand acCmdDeleteRecord über die Standardrückfrage.

Also passen wir die Prozedur zum Löschen eines Eintrags mit der Schaltfläche an, indem wir eine On Error Resume Next-Anweisung zu dieser Prozedur hinzufügen:

Private Sub cmdDatensatzLoeschen_Click()
     On Error Resume Next
     RunCommand acCmdDeleteRecord
End Sub

Wenn wir den Löschen-Vorgang durch Zurückgeben des Wertes True für den Parameter Cancel abbrechen, werden die beiden Ereignisse Vor Löschbestätigung und Nach Löschbestätigung nicht mehr ausgeführt.

Parameter im Ereignis „Vor Löschbestätigung“

Die Prozedur Form_BeforeDelConfirm liefert gleich zwei Parameter. Mit dem Cancel-Parameter können wir wie beim gleichnamigen Parameter der Prozedur Form_Delete dafür sorgen, dass der Löschvorgang abgebrochen wird. Auch dieser hat standardmäßig den Wert 0 für False. Der zweite Parameter Response hat standardmäßig den Wert 1, wie das Auslösen der folgenden Prozedur zeigt:

Private Sub Form_BeforeDelConfirm(Cancel As Integer,  Response As Integer)
     Debug.Print "BeforeDelConfirm", Cancel, Response
End Sub

Auch wenn Response im Objektkatalog schlicht mit dem Typ Integer angegeben wird, so gibt es doch passende Konstanten für diesen Parameter. Diese sehen Sie in Bild 7. Der Standardwert 1 entspricht der Konstanten acDataErrDisplay. Was ist damit gemeint Das heißt schlicht und einfach: Zeige den eingebauten Dialog zu dieser Ereignisprozedur an.

Die Werte für den Parameter Response

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

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar