Üblicherweise müssen in einer Anwendung auch verschiedene Metadaten gespeichert werden. So ist es z. B. sinnvoll, die Programmversion zu speichern, damit man bei späteren Updates nachvollziehen kann, welche Version(en) gerade genutzt werden, oder man gibt dem User die Möglichkeit, individuelle Einstellungen vorzunehmen. Solche Informationen haben zunächst einmal nichts mit der eigentlichen Anwendung zu tun, müssen aber irgendwie gespeichert werden.
In Microsoft Access scheint es sich zunächst naheliegend, dafür eine eigene Tabelle zu erstellen, die mit der übrigen Datenbank nichts zu tun hat. Das ist in der Tat eine Möglichkeit, die allerdings etliche Fallstricke und Schwächen aufweist. Zur Verdeutlichung schauen wir uns so eine Tabelle einmal an:
tblMetadaten | ||
---|---|---|
IDMeta | txtSchlüssel | txtWert |
1 | Version | 2.0 |
2 | VersionsDatum | 28.01.2022 |
3 | Design | Dunkel |
4 | Nutzername | Sheldon |
5 | Berechtigung | Standard |
Man sieht, dass die Werte zwar unterschiedliche Datentypen haben, aber in einem Textfeld abgelegt werden müssen, weil es nur ein einziges Feld für die Werte gibt. Des weiteren muss die Tabelle zwingend eine exakte Anzahl von Datensätzen enthalten, nämlich einen für jeden erforderlichen Schlüssel. Außerdem besteht, zumindest theoretisch, die Gefahr, dass bei einer Änderung nicht der Wert, sondern die Schlüsselbezeichnung geändert wird und ein Eintrag somit nicht mehr verwendbar wäre. Die Auflistung der Probleme ist damit noch längst nicht abgeschlossen.
Gut, dass es zwei Alternativen gibt, die für Metadaten sinnvoller sind als eine Tabelle. Welche davon man verwenden sollte, oder beide in Kombination, hängt von der Art der Metadaten ab.
Auch Access selbst speichert verschiedene Metadaten, die man sich leicht anzeigen kann, indem man die folgende Prozedur ausführt:
Sub Eigenschaften() Dim prop As DAO.Property 'Die Fehlerbehandlung überspringt nicht ausdruckbare Eigenschaften On Error Resume Next For Each prop In CurrentDb.Properties Debug.Print prop.Name, prop.Value Next End Sub
Diese Eigenschaftenliste kann man um eigene Eigenschaften erweitern. Dabei kann
man auch den Datentyp einer jeden Eigenschaft festlegen. Das folgende Beispiel erstellt
eine Integereigenschaft namens „VersionsNr“ mit dem Wert 1
. Gleich darauf
wird der Wert auf 2
gesetzt.
CurrentDb.Properties.Append CurrentDb.CreateProperty("VersionsNr", dbInteger, 1) CurrentDb.Properties("VersionsNr") = 2
Properties werden in der Datei selbst gespeichert. Das ist sinnvoll für Werte, die auch tatsächlich die Datei selbst betreffen. Andererseits kann es auch Werte geben, die den aktuellen Nutzer betreffen. Die Versionsnummer betrifft beispielsweise die Datei, aber wenn der User individuelle Einstellungen vornehmen kann, wie etwa die Auswahl individueller Farbdesigns, sollten seine Einstellungen auch nach einem Update erhalten bleiben.
Dafür bietet VBA die Möglichkeit, Werte in die Registry zu schreiben. Mit den
Befehlen SaveSetting
, GetSetting
und GetAllSettings
können Einträge unter HKEY_CURRENT_USER\Software\VB and VBA Program Settings
vorgenommen werden. Sie sind auf den User bezogen und wenn sie nicht mit DeleteSetting
gelöscht werden, bleiben sie erhalten, selbst wenn die Accessanwendung gelöscht wird.
SaveSetting "MeineAccessApp", "Designs", "Design", "Dunkel" strDesign = GetSetting("MeineAccessApp", "Designs", "Design")