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