Im Beitrag änderungsdaten protokollieren (www.access-im-unternehmen.de/672) haben wir Techniken vorgestellt, welche die Verwaltung einer änderungshistorie stark erleichtert. Im vorliegenden Beitrag gehen wir noch weiter und vereinfachen die Geschichtsschreibung für Formulare. Dazu brauchen Sie dem Formular nur noch eine Klasse zuzuweisen – den Rest übernimmt unsere kleine Erweiterung.
Stellen Sie sich vor, Sie wollten die änderungen an den Datensätzen eines Formulars beim Anlegen und Löschen sowie bei der zuletzt erfolgten änderung in den entsprechenden Feldern der Tabelle speichern und bräuchten dazu nur ein paar immer gleiche Codezeilen im Formular unterzubringen.
Nicht möglich Aber sicher – Sie brauchen nur zuvor die Datenherkunft mit den Feldern zum Speichern der Historie-Daten auszustatten. Und wie das geht, haben Sie ja bereits im oben bereits erwähnten Beitrag änderungsdaten protokollieren erfahren.
Sie brauchen nur eine Tabelle, die mit den Zusatzfeldern wie in Bild 1 ausgestattet ist, eine Abfrage, die alle Datensätze daraus liefert außer solche, die als gelöscht markiert sind (siehe Bild 2) und ein Formular, das die Abfrage als Datenherkunft verwendet und unsere Klasse clsAenderungsprotokollierung einsetzt.
Bild 1: Die Tabelle mit Historie-Feldern
Bild 2: Diese Abfrage liefert alle nicht gelöschten Datensätze der obigen Tabelle
Um diese Klasse zu verwenden, erstellen Sie zunächst eine Objektvariable im Kopf des Klassenmoduls des Formulars (falls dieses noch nicht vorhanden ist: Eigenschaft Enthält Modul auf Ja einstellen und auf den Ribbon-Eintrag Entwurf|Tools|Code anzeigen klicken):
Dim objAenderungsprotokollierung As clsAenderungsprotokollierung
Danach fügen Sie der Eigenschaft Beim Laden den Wert [Ereignisprozedur] hinzu, klicken auf die Schaltfläche neben der Eigenschaft und ergänzen die noch leere Prozedur Form_Load wie folgt:
Private Sub Form_Load() Set objAenderungsprotokollierung = _ New clsAenderungsprotokollierung With objAenderungsprotokollierung Set .Form = Me .BenutzerID = GetCurrentUser End With End Sub
Diese Prozedur erzeugt ein neues Objekt auf Basis der Klasse clsAenderungsprotokollierung und weist seiner Eigenschaften einige Werte zu. Die Eigenschaft Form wird mit einem Verweis auf das aktuelle Formular versehen, und die Eigenschaft BenutzerID füllen wir mit dem Wert der Funktion GetCurrentUser. Diese Funktion ist hier noch ein Dummy, den Sie abhängig von der in Ihrer Anwendung eingesetzten Benutzerverwaltung noch anpassen müssen:
Public Function GetCurrentUser() As Long GetCurrentUser = 1 End Function
Der Dummy liefert schlicht den Wert 1 als ID des aktuellen Benutzers (später greifen Sie mit dieser Funktion beispielsweise auf eine Optionen-Tabelle zu, welche die ID des aktuellen Benutzers speichert).
Die Klasse clsAenderungsprotokollierung
Kommen wir zum Arbeitstier der Beispieldatenbank – der Klasse clsAenderungsprotokollierung. Diese deklariert zunächst die folgenden Variablen:
Private WithEvents m_Form As Form Private m_BenutzerID As Variant Private bolDelete As Boolean Private lngTimerIntervalOld As Long
m_Form bekommt über die öffentliche Set-Prozedur Form einen Verweis auf das aufrufende Formular zugewiesen.
Sie ist deshalb mit dem Schlüsselwort WithEvents deklariert worden, damit sie auf die Ereignisse des aufrufenden Formulars reagieren kann. Dazu sind drei Bedingungen zu erfüllen:
- Das aufrufende Formular besitzt ein Klassenmodul, was sicher der Fall ist, weil darin ja die Klasse clsAenderungsprotokollierung instanziert wird.
- Wir weisen der entsprechenden Ereigniseigenschaft des Objekts m_Form den Wert [Event Procedure] zu.
- Wir legen eine entsprechende Ereignisprozedur im Klassenmodul an.