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).
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.
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).
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.
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).
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.
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.
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