Access bietet einige Sicherheitsmaßnahmen, um den Benutzer vor unbewussten und nicht wiederherstellbaren änderungen von Daten zu schützen. Dabei erscheinen zu bestimmten Gelegenheiten wie etwa vor dem Löschen von Datensätzen entsprechende Warnmeldungen. Das kann auch geschehen, wenn der Benutzer Daten durch den Aufruf von VBA-Anweisungen löschen will oder dies per Aktionsabfrage erledigt. Dieser Artikel zeigt, wo Access eingreift und wie Sie das Verhalten für Ihre Zwecke anpassen können.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 1705_MeldungenBeiDatensatzaenderungen.accdb.
Wo tauchen Warnmeldungen auf
Als Erstes sehen wir uns an, wo überhaupt Warnmeldungen auftauchen, wenn der Benutzer Datensatzänderungen durchführt.
Dies bereits in der Datenblattansicht einer Tabelle der Fall. Versuchen Sie hier, einen Datensatz zu löschen, erscheint die Meldung aus Bild 1. Diese taucht auf, nachdem der zu löschende Datensatz bereits verschwunden ist. Klicken Sie hier auf Nein, wird der Datensatz wiederhergestellt.
Bild 1: Meldung beim manuellen Löschen aus der Datenblattansicht
Die gleiche Meldung erscheint auch bei allen weiteren Datenblattansichten, also etwa von Abfragen oder in Formularen.
Die zweite Gelegenheit zum Anzeigen von Meldungen ist das Ausführen von Aktionsabfragen wie zum Beispiel die Abfrage zum Löschen von Daten aus Bild 2. Auch hier bewirkt ein Klick auf Ja, dass die Abfrage tatsächlich ausgeführt wird und Nein, dass die Daten erhalten bleiben.
Bild 2: Meldung beim Löschen per Aktionsabfrage
Nächste Gelegenheit ist das Löschen von Datensätzen über DAO, und zwar mit der Delete-Methode für den aktuell im Recordset markierten Datensatz.
Folgende Prozedur öffnet ein Recordset auf Basis der Tabelle tblBestelldetails, bewegt den Datensatzzeiger zum ersten und wieder zum ersten Datensatz, damit rst.RecordCount die korrekte Anzahl Datensätze ausgibt, löscht dann den aktuellen Datensatz und gibt erneut die Anzahl der Datensätze aus:
Public Sub LoeschenMitDAO_I() Dim db As DAO.Database Dim rst As DAO.Recordset Set db = CurrentDb Set rst = db.OpenRecordset("SELECT * FROM tblBestelldetails", dbOpenDynaset) rst.MoveLast rst.MoveFirst Debug.Print rst.RecordCount If Not rst.EOF Then 'ersten Datensatz löschen rst.Delete End If Debug.Print rst.RecordCount End Sub
Im Direktbereich können Sie ablesen, dass genau ein Datensatz gelöscht wurde – wobei allerdings diesmal keine Meldung mit einer Rückfrage an den Benutzer ausgegeben wurde.
Aktionen im Recordset führen also direkt zum Löschen des Datensatzes.
Wie sieht es mit dem Löschen per Execute-Anweisung aus Schauen wir es uns anhand des folgenden Beispiels an:
Public Sub LoeschenMitDAO_II() Dim db As DAO.Database Set db = CurrentDb db.Execute "DELETE FROM tblBestelldetails WHERE BestellungID = 10250", dbFailOnError Debug.Print db.RecordsAffected End Sub
Hier haben wir die Execute-Methode des Database-Objekts mit einer DELETE-Anweisung aufgerufen. Es werden Datensätze gelöscht, aber auch hier gibt es keine Rückfrage an den Benutzer.
Hat der Benutzer gar keine Möglichkeit, bei Datenänderungen über VBA über die anstehenden änderungen informiert zu werden – außer gegebenenfalls über selbst programmierte Meldungen Doch, wenn Sie die Methode RunSQL des DoCmd-Objekts wie in Bild 3 aufrufen.
Bild 3: Meldung beim Löschen per DoCmd.RunSQL
Klicken Sie hier auf Ja, wird die Abfrage durchgeführt, Nein führt allerdings zu einem Laufzeitfehler (siehe Bild 4). In diesem Fall müssen Sie noch eine Fehlerbehandlung zum Code hinzufügen, die beispielsweise wie folgt aussieht:
Bild 4: Meldung beim Abbrechen einer RunSQL-Anweisung
On Error Resume Next DoCmd.RunSQL strSQL Select Case Err.Number Case 2501 Case 0 Case Else MsgBox "Fehler " & Err.Number & ", '" & Err.Description & "'" End Select On Error GoTo 0
Löschen per RunCommand acCmdDeleteRecord
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: