Meldungen bei Datensatzänderungen

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.

Meldung beim manuellen Löschen aus der Datenblattansicht

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.

Meldung beim Löschen per Aktionsabfrage

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.

Meldung beim Löschen per DoCmd.RunSQL

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:

Meldung beim Abbrechen einer RunSQL-Anweisung

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:

Schreibe einen Kommentar