Löschen in Formularen: Ereignisse

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

Das Löschen von Datensätzen in einem Formular ist eigentlich kein großes Problem: Man markiert den Datensatz über den Datensatzmarkierer und klickt auf die Entfernen-Taste. Manch ein Benutzer verzweifelt vielleicht daran, den Datensatz über den Datensatzmarkierer zu selektieren, weshalb er ihn dann nicht löschen kann – dann baut man ihm halt eine Schaltfläche, die auch den Datensatz löscht, der aktuell den Fokus hat. Was aber, wenn wir noch Aktionen durchführen wollen, bevor der Datensatz gelöscht wird – beispielsweise das Archivieren des Datensatzes oder das Ausführen weiterer Aktionen nach dem Löschen Wie das funktioniert und was Sie beachten müssen, zeigt der vorliegende Beitrag.

Als Beispiel greifen wir die Datenbank aus dem Beitrag Reihenfolge einfach festlegen auf (www.access-im-unternehmen.de/1129). Hier verwenden wir ein Formular mit einem Unterformular, um die Daten der Tabelle tblArtikel in der Datenblattansicht anzuzeigen.

Ereignisse beim Löschen

Beim Löschen eines Datensatzes in einem Formular werden verschiedene Ereignisse ausgelöst. Wenn wir im Eigenschaftsfenster des Unterformulars zum Bereich Ereignis wechseln, finden wir einige Ereignisse, die möglicherweise in Zusammenhang mit dem Löschen eines Datensatzes ausgelöst werden. Genau das wollen wir untersuchen, also legen wir für die in Bild 1 mit dem Wert [Ereignisprozedur] versehenen Eigenschaften entsprechende Ereignisprozeduren an.

Ereignisse, die möglicherweise beim Löschen ausgelöst werden

Bild 1: Ereignisse, die möglicherweise beim Löschen ausgelöst werden

Die dadurch automatisch im Klassenmodul des entsprechenden Formulars angelegten Ereignisprozeduren statten wir mit jeweils einer Debug.Print-Anweisung aus, welche lediglich den Namen der Ereignisprozedur im Direktfenster ausgibt.

Die Prozeduren sehen dann wie folgt aus:

Private Sub Form_AfterDelConfirm(Status As Integer)
     Debug.Print "AfterDelConfirm"
End Sub
Private Sub Form_AfterUpdate()
     Debug.Print "AfterUpdate"
End Sub
Private Sub Form_BeforeDelConfirm(Cancel As Integer, _
         Response As Integer)
     Debug.Print "BeforeDelConfirm"
End Sub
Private Sub Form_BeforeUpdate(Cancel As Integer)
     Debug.Print "BeforeUpdate"
End Sub
Private Sub Form_Current()
     Debug.Print "Current"
End Sub
Private Sub Form_Delete(Cancel As Integer)
     Debug.Print "Delete"
End Sub

Wenn Sie nun einen Datensatz im Unterformular markieren und diesen mit der Entf-Taste oder dem entsprechenden Ribbon-Eintrag löschen, erscheint die Meldung aus Bild 2.

Meldung beim Löschen eines Datensatzes

Bild 2: Meldung beim Löschen eines Datensatzes

Diese Meldung besagt, dass das Löschen dieses Datensatzes das Löschen verknüpfter Datensätze (in diesem Fall aus der Tabelle tblBestelldetails) nach sich ziehen würde.

Wenn Sie einen neuen Datensatz in diesem Formular anlegen, der noch keine verknüpften Datensätze in der Tabelle tblBestelldetails aufweist und diesen löschen, erscheint eine andere Meldung – nämlich die aus Bild 3.

Meldung beim Löschen eines nicht mit anderen Datensätzen in Beziehung stehenden Datensatzes

Bild 3: Meldung beim Löschen eines nicht mit anderen Datensätzen in Beziehung stehenden Datensatzes

Zu diesem Zeitpunkt werfen wir auch einen Blick in den Direktbereich des VBA-Editors. Dieser sieht nun wie in Bild 4 aus. Wir merken uns den aktuellen Zustand und bestätigen die Löschmeldung mit einem Klick auf die Schaltfläche Ja.

Der Direktbereich mitten in einem Löschvorgang

Bild 4: Der Direktbereich mitten in einem Löschvorgang

Im Direktbereich sieht es dann wie folgt aus, wobei wir den Zeitpunkt der Anzeige der Löschmeldung hier durch einen entsprechenden Kommentar eingefügt haben:

Delete
Current
BeforeDelConfirm
''''Meldung
AfterDelConfirm

Beim Löschen werden also vier Ereignisse ausgelöst:

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

Wenn wir beim Erscheinen des Meldungsfensters nicht auf Ja, sondern auf Nein klicken, löst dies noch ein Ereignis mehr aus:

Delete
Current
BeforeDelConfirm
Current
AfterDelConfirm

Das Current-Ereignis (Beim Anzeigen) wird hier ausgelöst, weil der Datensatzzeiger wieder auf den zu löschenden Datensatz eingestellt wird.

Löschbestätigung deaktivieren

Aber gab es da nicht die Möglichkeit, die Löschbestätigung zu deaktivieren und Datensätze direkt zu löschen, wenn man auf die Entf-Taste klickt Ja, die gibt es.

Dazu öffnen Sie den Optionen-Dialog von Access und wechseln dort zum Bereich Clienteinstellungen. Hier finden Sie unter Bestätigen drei Optionen: Datensatzänderungen, Löschen von Dokumenten und Aktionsabfragen (siehe Bild 5). In unserem Fall benötigen wir die Option Datensatzänderungen, die wir deaktivieren.

Einstellungen für verschiedene änderungen

Bild 5: Einstellungen für verschiedene änderungen

Was geschieht nun im Direktbereich, wenn wir einen Datensatz löschen Es werden nur noch die folgenden beiden Ereignisse ausgelöst:

Delete
Current

Wann immer wir die Ereignisse mit Prozeduren versehen möchten, müssen wir also bei Vor Löschbestätigung und Nach Löschbestätigung berücksichtigen, dass diese bei deaktivierter Option Datensatzänderungen auf dem Client-Rechner nicht ausgeführt werden.

Warnungen per VBA ausschalten

Wenn Sie die Warnmeldungen unabhängig von den Einstellungen auf dem Clientrechner abschalten wollen, etwa um keine Meldung anzuzeigen, können Sie die Meldungen auch per VBA deaktivieren.

Dazu rufen Sie einfach die Methode SetWarnings des DoCmd-Objekts mit dem Parameter False auf:

DoCmd.SetWarnings False

Danach können Sie beispielsweise per VBA den Datensatz löschen und anschließend die Warnmeldungen wieder aktivieren:

DoCmd.SetWarnings True

Diese Einstellung hat keinen direkten Einfluss auf die Option Datensatzänderung; das heißt, sie ändert nicht den Wert dieser Option. Sie sorgt vielmehr dafür, dass Access zum Beispiel beim Durchführen von änderungen wie auch beim Löschen von Daten so tut, als ob der Benutzer für alle angezeigten Warnmeldungen einfach die Eingabetaste betätigt. Es wird also jeweils die standardmäßige Aktion für die Warnmeldung ausgeführt. Beim Löschen eines Datensatzes handelt es sich also beispielsweise die als Standard markierte Schaltfläche Ja betätigt.

Dies wirkt sich übrigens auf alle Aktionen aus, die mit einer Meldung reagieren, die lediglich Schaltflächen als Reaktionsmöglichkeit anbieten. Wenn Sie also etwa eine Parameterabfrage nutzen wollen, werden ihre Inputboxen auch bei abgeschalteten Meldungen angezeigt.

Option per VBA ändern

Sie können die Option Datensatzänderungen auch per VBA ändern. Und noch besser: Sie können diese sogar abfragen! Dies schauen wir uns zuerst an. Die Methode zum Abfragen vieler der Einstellungen aus dem Optionen-Dialog lautet GetOption. Sie erwartet den Namen der englischen Option als Parameter. Für die Option Datensatzänderungen heißt der Parameter beispielsweise Confirm Record Changes. Sie können den Wert mit der Debug.Print-Methode im Direktbereich des VBA-Editors ausgeben:

Debug.Print GetOption ("Confirm Record Changes")
-1 

Dies liefert bei aktivierter Option beispielsweise den Wert -1, also True. Nun wollen wir die Option deaktivieren, zunächst über die Benutzeroberfläche. Dazu entfernen Sie den Haken von der Option Datensatzänderungen und schließen den Optionen-Dialog wieder. Anschließend fragen wir den Wert der Option erneut über den Direktbereich ab:

Debug.Print GetOption ("Confirm Record Changes")
  0 

Es gelingt – wir konnten die änderung erfolgreich per VBA abfragen. Nun wollen wir die Option per VBA wieder aktivieren. Dazu nutzen wir die Anweisung SetOption, wieder mit dem Namen der Option als ersten Parameter. Als zweiten Parameter geben wir den festzulegenden Wert an, in diesem Fall True:

SetOption "Confirm Record Changes", True

Wenn wir nun erneut den Optionen-Dialog öffnen, erhalten wir das Ergebnis aus Bild 6 – die Option wurde erfolgreich eingestellt. Zum Deaktivieren der Option nutzen wir wieder die folgende Anweisung:

Erfolgreich per VBA geänderte Option

Bild 6: Erfolgreich per VBA geänderte Option

SetOption "Confirm Record Changes", False

Wenn der Benutzer nun für seine eigenen Anwendungen die Option Datensatzänderungen auf True eingestellt haben, Sie aber möchten, dass diese Option für einen besseren ergonomischen Ablauf bei der Benutzung Ihrer eigenen Anwendung deaktiviert wird, können Sie wie folgt vorgehen:

Legen Sie für die Ereignisprozedur Beim Laden eine Prozedur an, welche die Option Confirm Record Changes prüft, den Wert in einer Variablen speichert und die Option dann gegebenenfalls auf den Wert False einstellt.

Der Benutzer kann dann Datensatzänderungen durchführen, ohne dass die lästigen Meldungen angezeigt werden. Beim Schließen des Formulars wird das Ereignis Beim Entladen ausgelöst.

Für dieses legen Sie eine weitere Prozedur an, welche den Wert der Option Confirm Record Changes wieder auf den beim öffnen vorgefundenen Wert einstellt.

Als Erstes benötigen wir dazu eine Boolean-Variable, in der wir den Zustand der Option Datensatzänderungen beim öffnen des Formulars speichern. Diese deklarieren wir oben im allgemeinen Teil des Klassenmoduls:

Dim bolConfirmRecordChanges As Boolean

Die Ereignisprozedur, die durch das Ereignis Beim Laden ausgelöst wird, sieht wie folgt aus:

Private Sub Form_Load()
     bolConfirmRecordChanges = _
         GetOption("Confirm Record Changes")
     If bolConfirmRecordChanges = True Then
         SetOption "Confirm Record Changes", False
     End If
End Sub

Sie speichert zunächst den Wert der Option Confirm Record Changes in der Variablen bolConfirmRecordChanges. Hat diese dann den Wert True, stellt sie die Option mit der SetOption-Anweisung auf den Wert False ein.

In der Prozedur, die durch das Ereignis Beim Entladen ausgelöst wird, stellen wir die Option dann einfach wieder auf den Wert der Variablen bolConfirmRecordChanges ein, den wir beim öffnen ermittelt haben, und stellen so den Ausgangszustand wieder her:

Private Sub Form_Unload(Cancel As Integer)
     SetOption "Confirm Record Changes", _
         bolConfirmRecordChanges
End Sub

Standardmeldung durch eigene Meldung ersetzen

Wenn Sie die Anzeige einer Warnmeldung vor dem Löschen von Datensätzen beibehalten wollen, aber die standardmäßig angezeigte Meldung ersetzen möchten, können Sie dies auch tun.

Dazu hinterlegen wir eine Prozedur für das Ereignis Vor Löschbestätigung, die wie in Listing 1 aussieht. Die Prozedur fragt den Benutzer mit einer eigenen Meldung, ob dieser den Datensatz wirklich löschen will.

Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer)
     Dim intResult As VbMsgBoxResult
     intResult = MsgBox("Möchten Sie den Datensatz wirklich löschen", vbCritical + vbYesNo, "Datensatz löschen")
     If intResult = vbNo Then
         Cancel = True
     End If
     Response = acDataErrContinue
End Sub

Listing 1: Anzeigen einer alternativen Meldung beim Löschen eines Datensatzes

Lautet das Ergebnis nein (vbNo), stellt die Prozedur den Wert des Parameters Cancel auf den Wert True ein. Dadurch wird der Lösch-Vorgang abgebrochen. Damit die eingebaute Standardmeldung unterdrückt wird, legen wir außerdem für den Parameter Response den Wert acDataErrContinue fest. Das Ergebnis sieht nun wie in Bild 7 aus.

Eigene Meldung beim Löschen eines 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