Änderungsprotokoll mit Klasse

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.

pic001.png

Bild 1: Die Tabelle mit Historie-Feldern

pic002.png

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

Schreibe einen Kommentar