Rückgängig in Memofeldern

Seit Access 2007 bietet Access für Memofelder die Möglichkeit, die verschiedenen Versionen zu speichern. Wie aber können wir solche änderungen wieder rückgängig machen, ohne dass der Benutzer die eingebauten Funktionen dafür nutzen muss oder gar ein extra Formular, dass die bisher gespeicherten Versionen anzeigt Sondern einfach etwa mit zwei Schaltflächen, mit denen er zwischen den vorhandenen History-Einträgen hin- und herblättern kann Wie das gelingt, zeigen wir in diesem Beitrag.

Vorbereitungen

Wenn Sie ein Memofeld verwenden wollen, um verschiedene Versionsstände des enthaltenen Textes speichern zu können, brauchen Sie prinzipiell nur eine einzige Eigenschaft des Memofeldes zu ändern (in aktuelleren Versionen von Access heißt der Datentyp für längere Texte übrigens nicht mehr Memofeld, sondern Langer Text).

Diese Eigenschaft stellen Sie im Entwurf der Tabelle mit dem Memofeld ein, indem Sie dieses markieren und dann für die Eigenschaft Nur Anfügen den Wert Ja festlegen – wie für das Feld Inhalt in Bild 1.

Memofeld mit History-Funktion

Bild 1: Memofeld mit History-Funktion

Wenn Sie nun in die Datenblattansicht wechseln, können Sie wie gewohnt Texte in das Memofeld eingeben – etwa so wie in Bild 2.

Eingeben eines Textes

Bild 2: Eingeben eines Textes

Speichern Sie den Text nun, indem Sie das Feld verlassen, und fügen Sie dann weiteren Text hinzu – siehe Bild 3.

Eingeben eines weiteren Textes

Bild 3: Eingeben eines weiteren Textes

Die Datenblattansicht zeigt nun die neueste Version des Inhalts des Memofelds an.

Wie greifen wir nun auf die Historie zu Diese erhalten wir, indem wir aus dem Kontextmenü des Feldes in der Datenblattansicht den Eintrag Spaltenverlauf anzeigen… aufrufen (siehe Bild 4).

Aufruf der Historie

Bild 4: Aufruf der Historie

Danach erscheint der Dialog Verlauf für Inhalt, der in einem Textfeld alle änderungsdaten samt des zu diesem Zeitpunkt vorliegenden Inhalts anzeigt (siehe Bild 5).

Anzeige der Historie

Bild 5: Anzeige der Historie

Damit erhalten wir allerdings noch nicht die Gelegenheit, auf einen bestimmten Versionsstand zuzugreifen und diesen wiederherzustellen.

Versionsstände per VBA abfragen

Wenn wir versuchen, die Versionsstände per DLookup abzufragen, erhalten wir jeweils nur die aktuelle Version des Memofeld-Inhalts:

Debug.Print Dlookup("Inhalt", "tblMemofeld")
Beispieltext. Noch mehr Beispieltext.

Es gibt jedoch eine neue Methode des Application-Objekts namens ColumnHistory, welche auch den im Textfeld des Dialogs Verlauf für Inhalt angezeigten Text liefert. Diese erwartet drei Parameter:

  • TableName: Name der Tabelle, in der sich das Memo-feld befindet.
  • ColumnName: Name des Memofelds
  • queryString: Bedingung für den zu untersuchenden Datensatz. Hierbei handelt es sich im Gegensatz zu dem entsprechenden Parameter etwa bei der DLookup-Funktion um einen Pflichtparameter. Die Bedingung darf nur genau einen Datensatz zurückliefern!

Ein Aufruf könnte etwa wie folgt aussehen:

  Application.ColumnHistory("tblMemofeld", "Inhalt", "ID = 1")
[Version: 28.08.2019 11:34:20 ] Beispieltext.
[Version: 28.08.2019 11:34:48 ] Beispieltext. Noch mehr Beispieltext.

Wann wird der Versionsstand gespeichert

Das Hinzufügen eines neuen Versionsstandes erfolgt erst, wenn der Benutzer den Datensatz speichert. Das Verlassen des Feldes und somit der Fokusverlust reicht nicht aus.

Auf einzelne Einträge zugreifen

Damit können wir nun noch nicht auf die einzelnen Versionsstände des Textes des Memofelds zugreifen, was aber nötig ist, um komfortabel zwischen den verfügbaren Versionsständen hin- und herzuschalten.

Um dies zu realisieren, erstellen wir zunächst ein neues Formular, das über die Eigenschaft Datensatzquelle an die Tabelle tblMemofeld gebunden ist. Wir ziehen alle Felder aus der Feldliste in den Entwurf des Formulars.

Dann fügen wir drei Steuer-elemente zum Formular hinzu, die wir wie in Bild 6 neben dem Textfeld für das Memofeld platzieren. Die beiden Schaltflächen heißen cmdVorheriger und cmdNaechster. Das Textfeld soll die Bezeichnung txtVersion erhalten. Außerdem stellen wir die Eigenschaft Aktiviert auf Nein und Gesperrt auf Ja ein – so wird der Inhalt weiterhin angezeigt, kann aber vom Benutzer nicht geändert werden.

Steuer-elemente zum Navigieren in den Versionen

Bild 6: Steuer-elemente zum Navigieren in den Versionen

Für die nachfolgend hinzuzufügenden Prozeduren benötigen wir zwei allgemein deklarierte Variablen, die Sie wie folgt zum Klassenmodul des Formulars frmMemofelder hinzufügen:

DDim colVersions As Collection
Dim lngVersion As Long

Die Variable colVersions soll eine Collection aufnehmen, die wir mit den Texten der verschiedenen Versionen des Memofeldes füllen.

Versionsstände ermitteln und in Collection eintragen

Dies erledigen wir zu verschiedenen Gelegenheiten. Wichtig ist zunächst, dass wir die Prozedur erstellen, mit der die verschiedenen Versionsstände des Inhalts des Memofeldes für den aktuellen Datensatz ermittelt und in das Collection-Objekt eingetragen werden können. Diese Prozedur finden Sie in Listing 1. Sie deklariert zunächst einige Variablen und initialisiert dann die Objektvariable colVersions des Typs Collection.

Private Sub VersionAktualisieren()
     Dim strVersions As String
     Dim lngPosStart As Long
     Dim lngPosEnde As Long
     Dim strVersion As String
     Set colVersions = New Collection
     If Not IsNull(Me!ID) Then
         strVersions = Application.ColumnHistory("tblMemofeld", "Inhalt", "ID = " & Me!ID)
         lngPosStart = InStr(1, strVersions, "[Version: ")
         Do While Not lngPosStart = 0 And Not lngPosStart = Len(strVersions) + 3
             lngPosEnde = InStr(lngPosStart, strVersions, " ] ")
             lngPosStart = InStr(lngPosEnde, strVersions, "[Version: ")
             If lngPosStart = 0 Then
                 lngPosStart = Len(strVersions) + 3
             End If
             strVersion = Mid(strVersions, lngPosEnde + 3, lngPosStart - lngPosEnde - 5)
             colVersions.Add (strVersion)
         Loop
         lngVersion = colVersions.Count - 1
         If lngVersion = -1 Then
             lngVersion = 0
         End If
     Else
         lngVersion = 0
     End If
     SchaltflaechenAktivieren
End Sub

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access im Unternehmen:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 1.000 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar