Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
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.
Die Property Set-Prozedur weist den Formularverweis zu und stellt die Ereigniseigenschaften ein:
Public Property Set Form(frm As Form) Set m_Form = frm With m_Form .BeforeUpdate = "[Event Procedure]" .AfterUpdate = "[Event Procedure]" .OnDelete = "[Event Procedure]" .OnTimer = "[Event Procedure]" End With End Property
Bevor uns wir um die passenden Ereignisprozeduren kümmern, schauen wir uns noch kurz die Property Let-Prozedur zum Erfassen des aktuellen Benutzers an:
Public Property Let BenutzerID(varBenutzerID As Variant) m_BenutzerID = varBenutzerID End Property
Diese speichert die ID des Benutzers schlicht in der Member-Variablen m_BenutzerID. Sollten Sie diese Lösung für eine Benutzertabelle verwenden, die ein Textfeld als Primärschlüsselfeld einsetzt, müssen Sie den Datentyp und den späteren Zugriff auf das Feld entsprechend anpassen.
Ausgeklammerte Formularereignisse
Die nachfolgend beschriebenen Ereignisprozeduren werden, wenn die Klasse ordnungsgemäß instanziert und ihre Variable m_Form mit einem Verweis auf das Formular versehen wurde, genau wie die Ereignisse im Klassenmodul des Formulars selbst ausgelöst.
Die Ereignisprozeduren haben wir gegebenüber dem oben genannten Beitrag ein wenig angepasst.
Beim Löschen eines Datensatzes wird als erstes das Ereignis Beim Löschen ausgelöst:
Private Sub m_Form_Delete(Cancel As Integer) m_Form!GeloeschtAm = Now bolDelete = True lngPosition = m_Form.Recordset.AbsolutePosition m_Form.Dirty = False Cancel = True End Sub
Diese stellt zunächst das Löschdatum ein – allerdings nur, damit der Datensatz eine änderung erfährt und die beiden Prozeduren Vor Aktualisiserung und Nach Aktualisierung im Anschluss ausgelöst werden.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
Testzugang
eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel
diesen und alle anderen Artikel mit dem Jahresabo