Mit Access 2007 hat Microsoft neben vielen anderen Neuerungen auch das Memofeld angepackt. So speichert dieses nun formatierte Texte und kann außerdem nach Wunsch alle änderungen an den enthaltenen Texten protokollieren. Dieser Beitrag zeigt, wie Sie ein Append-Only-Memofeld einrichten, wie es funktioniert und wie Sie die gespeicherten änderungen lesen können.
Protokollierung aktivieren
Um die Protokollierung der änderungen am Text eines Memofelds einzurichten, setzen Sie dessen Eigenschaft Nur Anfügen auf den Wert Ja. Diese Eigenschaft steht Ihnen jedoch nur zur Verfügung, wenn die Datenbank im 2007er-Dateiformat (.accdb) vorliegt.
Der Name dieser Eigenschaft ist irreführend. Besser wäre es gewesen, wenn die Eigenschaft den Namen „Protokollierung aktivieren“ erhalten hätte. Bei der Namensfindung haben sich die Entwickler von Access 2007 an SharePoint orientiert [1]. Dort gibt es die gleiche Funktion.
Um die Wirkung der Eigenschaft Nur Anfügen zu testen, legen Sie eine neue Tabelle in einer .accdb-Datei an, fügen zumindest ein Memofeld ein und ändern die Eigenschaft Nur anfügen auf Ja. Lassen Sie sich dabei nicht von Access ins Bockshorn jagen. Die genannte Eigenschaft finden Sie ganz am Ende der Liste der Eigenschaften. Access offenbart Ihnen diese Eigenschaft erst dann, wenn Sie die Bildlaufleiste der Eigenschaften nach unten verschieben (siehe Bild 1). Öffnen Sie jetzt die Tabelle in der Datenblattansicht und tragen Sie beliebigen Text in das Memofeld ein. Nachdem Sie den Datensatz gespeichert haben, ändern Sie den Wert des Memofeldes. Das Memofeld verhält sich wie ein normales Textfeld. Wenn Sie Daten ändern, werden diese gespeichert. Doch wo verbergen sich die gespeicherten änderungen Und wie kann man die änderungen wieder sichtbar machen
Bild 1: Um die Eigenschaft Nur Anfügen sichtbar zu machen, müssen Sie an das Ende der Liste der Eigenschaften scrollen.
Historie sichtbar machen
Jedes Mal, wenn Sie den Inhalt eines Append-Only-Memofeldes ändern, speichert Access neben dem neuen Inhalt auch einen Zeitstempel. Diese Daten werden jeweils an den Inhalt des Memofeldes angehängt. Access zeigt aber immer nur den zuletzt gespeicherten Inhalt an.
Die gespeicherten änderungen machen Sie auf einfache Art sichtbar. Dazu setzen Sie die Einfügemarke in das Memofeld und wählen aus dem Kontextmenü den Eintrag Spaltenverlauf anzeigen … aus. Access öffnet daraufhin ein Fenster mit der Historie der änderungen für dieses Feld (siehe Bild 2). Das Kontextmenü steht nicht nur in Tabellen, sondern auch in Formularen zur Verfügung.
Bild 2: Sie können sich alle gespeicherten änderungen für ein Memofeld anzeigen lassen.
Mit VBA auf die änderungen zugreifen
Die gespeicherten änderungen in einem Append-Only-Memofeld können Sie auch mit VBA auslesen, und zwar mit der neuen Methode ColumnHistory des Application-Objekts. Diese erwartet die folgenden Parameter und liefert einen String mit allen gespeicherten änderungen:
- Feldname
- Tabellenname
- Bedingung, die den Datensatz identifiziert
Leider liefert ColumnHistory keine aussagekräftigen Fehlermeldungen. Wenn sich in den Parametern ein Fehler eingeschlichen hat, erhalten Sie die Fehlermeldung mit dem Text Automatisierungsfehler und einer kryptischen Fehlernummer (siehe Bild 3). Ein Klick auf die Hilfe-Schaltfläche bringt Sie leider auch nicht weiter. Mit etwas Forschergeist finden Sie jedoch heraus, dass sich die Fehlernummern je nach Fehlerquelle unterscheiden. Fehlerhafte Tabellen- oder Feldnamen liefern Fehler mit unterschiedlichen Fehlernummern. Ein Fehler in der Bedingung löst wieder einen anderen Fehler aus.
Bild 3: Die Fehlermeldung zur Funktion ColumnHistory ist leider wenig aussagekräftig.
Das machen wir uns zunutze und schreiben eine eigene globale Funktion mit dem Namen ColumnHistory, die abhängig von der Fehlernummer eine aussagekräftige Fehlerbeschreibung ausgibt. Wie kann eine Funktion mit demselben Namen wie eine in Access eingebaute Funktion funktionieren Das ist schnell erklärt: Wenn VBA auf den Namen einer Funktion stößt, sucht es zuerst im eigenen Modul, dann in den anderen Modulen des VBA-Projekts, danach in den Verweisen in der Reihenfolge ihrer Priorität und zum Schluss wird in den eingebauten Verweisen (VBA und Access) gesucht. Details zu diesem Verhalten können Sie im Beitrag Defekte Verweise: Ursachen und Lösungen (Shortlink 572) nachlesen.
Sie finden die nachgebaute Funktion ColumnHistory im Modul mdl_MyApplication der Beispieldatenbank. Der Hauptzweck der Funktion ist das Aufrufen seines eingebauten Pendants und die Ausgabe aussagekräftiger Fehlermeldungen. Damit die Funktion sich dabei nicht selbst aufruft, stellen Sie dem Aufruf den Namen der Klasse Application voran. Da diese selbst geschriebene Funktion genau dieselben Parameter verwendet wie die Originalfunktion, können Sie das Modul ohne Probleme in jede Ihrer Datenbanken importieren. Zum Abschluss noch eine Bemerkung zum Parameter Bedingung. Sie können als Bedingung jede gültige Bedingung formulieren, die genau einen Datensatz zurückliefert. Wenn die Bedingung auf mehrere Datensätze zutrifft, quittiert Access dies mit einer Fehlermeldung. Am besten verwenden Sie eine Bedingung, die den Datensatz über das Primärschlüsselfeld identifiziert (etwa ID = 2).
Historie per VBA verarbeiten
Unter Umständen kann es Sinn machen, die änderungen am Memofeld in selbst gebauten Elementen der Benutzeroberfläche anzuzeigen – zum Beispiel dann, wenn das entsprechende Kontextmenü und damit auch der Befehl Spaltenverlauf anzeigen … deaktiviert ist. In professionellen Anwendungen werden Sie dies gelegentlich tun, um dem Benutzer gewisse Funktionen vorzuenthalten.
Eine einfache Möglichkeit ist die Anzeige der Historie in einem Meldungsfenster. Dieses hat jedoch zwei Nachteile: Bei einer Vielzahl von änderungen wird der angezeigte Text schnell unübersichtlich. Außerdem liegen die änderungen in der falschen Reihenfolge vor, weil der aktuellste Wert am Ende der MsgBox angezeigt wird. Auch die Verwendung der neuen DoCmd.Runcommand-Konstanten acCmdShowColumnHistory bringt keine Lösung, weil auch die Einträge in der falschen Reihenfolge erscheinen.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo