änderungen protokollieren, Teil I

Textfelder sind das Hauptwerkzeug zur Eingabe von Daten. Sie können diese an die Felder der Datenherkunft eines Formulars binden oder diese ungebunden einsetzen. So intuitiv Textfelder zu benutzen sind, soviele Möglichkeiten und Fallstricke bieten sie auch. Dieser Artikel zeigt, was alles bei der Eingabe von Daten mit Textfeldern geschieht und wann welche Texte wo gespeichert werden.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1304_AenderungenProtokollieren.mdb.

Warum protokollieren

änderungen an Datensätzen sind in der Regel unumkehrbar, wenn der Datensatz einmal gespeichert ist. Solange dies noch nicht geschehen ist und Sie einfach nur die Werte eines oder mehrerer Felder aktualisiert haben, lässt sich dies noch rückgängig machen – beispielsweise durch Betätigen der Escape-Taste.

Anderenfalls können Sie nach einer Fehleingabe nur hoffen, dass Sie den vorherigen Zustand des Datensatzes wiederherstellen können – oder dass eine Sicherungskopie noch den gewünschten Stand enthält. Wenn Sie dem vorbeugen möchten, können Sie die änderungen an Datensätzen auch protokollieren. Dabei gibt es zwei Varianten:

  • Sie speichern die änderung eines jeden Feldes als eigenen Datensatz in einer Tabelle, welche den Namen der betroffenen Tabelle und des Feldes, den alten und den neuen Wert, den betroffenen Datensatz sowie das änderungsdatum und gegebenenfalls den ausführenden Benutzer speichert.
  • Sie legen für jede Tabelle, für die Sie änderungen protokollieren möchten, eine Kopie an. Vor einer änderung übertragen Sie den vorherigen Zustand in diese Tabelle – auch hier wieder mit dem Datum der änderung und dem Namen der ausführenden Person.

In diesem Artikel schauen wir uns beide Varianten an.

Formularereignisse als Ausgangspunkt

Während es etwa unter dem SQL Server Trigger gibt, denen Sie Code zum Protokollieren von änderungen zuweisen können, müssen Sie in reinen Access-Datenbanken (also solchen, die ihre Daten wiederum in einer Access-Datenbank speichern – egal, ob in einer einzigen Datei oder aufgeteilt in Frontend und Backend) entsprechende Ereignisprozeduren zu den Formularen hinzufügen, in welchen die änderungen durchgeführt werden.

In den meisten Fällen werden Sie die änderungen beim Speichern des Datensatzes protokollieren. Der richtige Zeitpunkt ist das Ereignis Vor Aktualisierung des Formulars. Es wird unmittelbar vor dem Speichern ausgelöst – und vor dem Ereignis Nach Aktualisierung.

Der Vorteil des Ereignisses Vor Aktualisierung ist: Sie können zu diesem Zeitpunkt sowohl auf den vorherigen als auch auf den aktuellen Wert eines Feldes der Datenherkunft zugreifen – und zwar über die Eigenschaften OldValue und Value (weitere Informationen hierzu finden Sie im Artikel Textfelder: Value, OldValue und Text.

Was soll protokolliert werden

Die Protokollierung soll so erfolgen, dass alle zur Kontrolle und sogar zur Wiederherstellung der geänderten Daten notwendigen Informationen gespeichert weden. Dazu legen Sie eine Tabelle namens tblAenderungen an, die im Entwurf wie in Bild 1 aussieht.

Die Tabelle tblAenderungen in der Entwurfsansicht

Bild 1: Die Tabelle tblAenderungen in der Entwurfsansicht

Dabei kommen die folgenden Felder zum Einsatz:

  • AenderungID: Primärschlüsselfeld der Tabelle
  • Tabelle: Name der Tabelle, deren Datensatz geändert wurde
  • Aktion: Wir wollen nicht nur änderungen, sondern auch das Anlegen oder Löschen von Datensätzen dokumentieren. Dieses Feld soll die Werte New, Edit und Delete aufnehmen.
  • Feld: Name des geänderten Feldes
  • PKName: Name des Primärschlüsselfeldes der betroffenen Tabelle
  • PKWert: Wert des Primärschlüsselfeldes des geänderten Datenatzes
  • Zeit: Datum und Uhrzeit der änderung
  • Benutzer: Aktueller Benutzer zum Zeitpunkt der änderung
  • AlterWert: Wert des Feldes vor der änderung
  • NeuerWert: Wert des Feldes nach der änderung

Diese Art der Protokollierung erzeugt natürlich eine Menge Daten: Es wird tatsächlich zu jedem geänderten Feld ein eigener Datensatz in der Tabelle tblAenderungen angelegt.

Wenn wir nun im Formular frmArtikel beispielsweise den Wert des Feldes Artikelname von Chai in Chai (Tee) ändern, soll die Tabelle einen Datensatz wie in Bild 2 erhalten.

Die Tabelle tblAenderungen mit einer ersten änderung

Bild 2: Die Tabelle tblAenderungen mit einer ersten änderung

Nun benötigen wir nur noch eine Ereignisprozedur, die genau dies erledigt.

änderung in Tabelle schreiben

Wir gehen zunächst vereinfachend davon aus, dass wir nur änderungen am Feld Artikelname in der Tabelle speichern möchten. Dazu legen Sie für das Ereignis Vor Aktualisierung des Formulars die folgende Ereignisprozedur an:

Private Sub Form_BeforeUpdate(Cancel As Integer)
     Dim db As DAO.Database
     Dim rst As DAO.Recordset
     Set db = CurrentDb
     Set rst = db.OpenRecordset("SELECT * FROM          tblAenderungen WHERE 1 = 2", dbOpenDynaset)
     If Not Me!txtArtikelname.Value = _
             Me!txtArtikelname.OldValue Then
         rst.AddNew
         rst!Tabelle = "tblArtikel"
         rst!Aktion = "Edit"
         rst!Feld = "Artikelname"
         rst!PKName = "ArtikelID"
         rst!PKWert = Me!ArtikelID
         rst!Zeit = Now
         rst!Benutzer = CurrentUser
         rst!AlterWert = Me!txtArtikelname.OldValue
         rst!NeuerWert = Me!txtArtikelname.Value
         rst.Update
     End If
     Set db = Nothing
End Sub

Diese Ereignisprozedur erstellt ein Recordset auf Basis der Tabelle tblAenderungen, das allerdings wegen des Kriteriums (1=2) keinen einzigen Datensatz enthält. Dies ist auch nicht nötig, denn wir wollen ja nur einen neuen Datensatz hinzufügen.

Der übersichtlichkeit halber legen wir diesen Datensatz zunächst mit der AddNew-Methode an und weisen alle Feldwerte einzeln zu. Die meisten Zuweisungen sind selbsterklärend. Die Zeit wird mit der Funktion Now ermittelt, der aktuelle Access-Benutzer mit CurrentUser (hier könnte man noch den aktuellen Windows-Benutzer referenzieren – zumindest da Access seit der Version 2007 das Sicherheitssystem nicht mehr unterstützt). Den alten und den neuen Wert des gebundenen Steuerelements erhalten wir mit den Eigenschaften OldValue und Value.

Alle Felder protokollieren

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