Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

Bitte teilen Sie uns Ihre Anrede, Ihren Namen und Ihre E-Mail-Adresse mit:

Anrede:
Vorname:
Nachname:
E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 3/2018.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Löschen in Formularen: Ereignisse

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

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

Bitte teilen Sie uns Ihre Anrede, Ihren Namen und Ihre E-Mail-Adresse mit:

Anrede:
Vorname:
Nachname:
E-Mail:

© 2003-2018 André Minhorst Alle Rechte vorbehalten.