Wenn Sie ein Abonnement des Magazins 'Access im Unternehmen' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.
Formularinhalte speichern und wieder abrufen
Webbrowser kennen diese Funktion dank Add-Ons schon länger: Wenn Sie dort Daten in ein Formular eintragen, können Sie diese speichern und bei der nächsten Verwendung des Formulars per Mausklick erneut einfügen. Warum gibt es das unter Access eigentlich noch nicht? Wie auch immer: Dieser Beitrag zeigt, wie Sie die Inhalte eines Access-Formulars zwischenspeichern und bei Bedarf wieder abrufen. Das hilft sowohl dem Entwickler als auch dem Benutzer, denn sowohl bei der Entwicklung als auch bei der Anwendung der Datenbank kann dieses Feature sehr nützlich sein – wenn auch mit leicht unterschiedlichem Ansatz.
Wir wollen die Technik zum Speichern und Wiederherstellen eines Formularinhalts von zwei Seiten betrachten: Aus Entwicklersicht und aus Benutzersicht. Der Entwickler benötigt das Feature hauptsächlich, um beim Testen eines Formulars nicht die gleichen Daten immer wieder neu einzugeben, sondern diese gegebenenfalls per Mausklick zu speichern und wiederherzustellen. Für den Entwickler soll diese Funktion eher flexibel und für alle Formulare anwendbar sein – am besten also in Form eines Add-Ins, das die Inhalte mehrerer Formulare verwalten kann.
Für den Benutzer ist eine eingebaute Funktion sinnvoll, welche zum einen eine Schaltfläche zum Speichern der aktuellen Eingabe bietet, zum anderen eine Auswahlmöglichkeit für die bisher gespeicherten Daten.
Formularinhalte speichern für Benutzer
In diesem Beitrag schauen wir uns die Variante für Benutzer an. Dazu erstellen wir zunächst ein einfaches Formular, das die Daten der Tabelle tblArtikel in der Formularansicht anzeigt. Diesem fügen wir ein Kombinationsfeld namens cboVorlageAuswaehlen hinzu sowie eine Schaltlfäche mit der Beschriftung Speichern und dem Namen cboVorlageSpeichern. Im Entwurf sieht das Formular nun wie in Bild 1 aus.
Bild 1: Das Beispielformular in der EntwurfsansichtBevor wir uns nun an die Programmierung machen können, müssen wir uns ein paar Gedanken um die Speicherung selbst machen. Die erste Frage dabei lautet: Welche Inhalte sollen überhaupt gespeichert werden? Und die zweite: Wohin und wie speichern wir diese Inhalte?
Die erste Frage ist eigentlich einfach zu beantworten: Natürlich alle Daten, die der Benutzer in das Formular eingegeben hat! Nur müssen wir noch herausfinden, in welchen Steuerelementen sich diese Daten befinden. Aber wie erkennen wir, welche Steuerelemente die Daten enthalten, die in der zugrunde liegenden Datenherkunft gespeichert werden?
Und: Gibt es überhaupt immer eine Datenherkunft? Kann es nicht sein, dass ein Formular zur Eingabe von Daten dient, die noch nicht einmal in der Datenbank gespeichert werden? Dies könnte ja geschehen, wenn Sie etwa die Daten für eine Banküberweisung in ein Formular eingeben und die Überweisung anstoßen. Die Daten müssen nicht zwangsläufig gespeichert werden, denn wir können diese später nach erfolgter Überweisung vom Bankserver einlesen.
Allein die Bindung eines Steuerelements ein Feld der Datenherkunft liefert also kein Indiz dafür, dass der Inhalt des Steuerelements gespeichert und wiederhergestellt werden soll.
Also gestalten wir die Funktion so flexibel, dass wir sowohl einfach den Inhalt aller gebundenen Steuerelemente speichern können als auch speziell zum Speichern markierte Steuerelemente.
Tabelle zum Speichern der Daten
Die Tabelle zum Speichern der Inhalte der Steuerelemente soll ebenso flexibel sein. Wir möchten diese also nicht auf eine einzige Datenherkunft auslegen und somit nicht etwa die Artikeltabelle abbilden, sondern beliebig viele Felder für unterschiedliche Vorlagen in der Tabelle speichern.
Damit wir verschiedene Vorlagen für das gleiche Formular speichern können, benötigen wir ein Feld, das den Namen der Vorlage aufnimmt. Wenn wir die Vorlagen-Funktion für mehrere Formulare in der gleichen Datenbank verwenden möchten, müssen wir außerdem noch ein Feld vorsehen, das angibt, zu welchem Formular die Vorlage gehört.
Schließlich benötigen wir ein Feld für den Steuerelementnamen und eines für den Inhalt des Steuerelements. Welchen Datentyp soll das Feld zum Speichern der Inhalte haben? Da wir einfach nur die in den Steuerelementen enthaltenen Werte speichern wollen, die ja in verschiedenen Datentypen auftreten können, verwenden wir den Datentyp Text. Diesem können wir sowohl Texte also auch Zahlen, Datumsangaben oder Boolean-Werte zuweisen (0/-1).
Die Tabelle tblVorlagen sieht im Entwurf schließlich wie in Bild 2 aus. Dort erkennen Sie auch, dass es einen aus den drei Feldern Formularname, Vorlage und Steuerelementname zusammengesetzten, eindeutigen Index gibt.
Bild 2: Entwurf der Tabelle tblVorlagenSpeichern des Formularinhalts
Nun benötigen wir eine Prozedur, die durch das Ereignis Beim Klicken der Schaltfläche cmdVorlageSpeichern ausgelöst wird. Zuvor müssen wir noch festlegen, welche Felder gespeichert werden sollen. Wir wollen zwei Arten ermöglichen:
- Speichern aller Felder, die an ein Feld der Datenherkunft gebunden sind
- Speichern aller Felder, deren Tag-Eigenschaft einen bestimmten Wert enthält, zum Beispiel AlsVorlageSpeichern.
Die erste Variante ist für gebundene Formulare interessant, die zweite für gebundene und ungebundene Formulare. Welche Methode zum Einsatz kommt, legen wir durch eine Boolean-Variable fest, die beim Laden des Formulars auf den entsprechenden Wert eingestellt wird.
Werfen wir nun einen Blick auf die Schaltfläche cmdVorlageSpeichern. Diese löst beim Anklicken die Prozedur aus Listing 1 (Teil I) aus. Die Prozedur liest zunächst den Namen des aktuellen Formulars aus der Eigenschaft Name in die Variable strFormular ein. Dann prüft sie, ob aktuell im Kombinationsfeld cboVorlageAuswaehlen ein Eintrag ausgewählt ist. Falls ja, geht sie davon aus, dass die aktuellen Inhalte des Formulars unter dem Namen der ausgewählten Vorlage gespeichert werden sollen. Das bedeutet natürlich, dass die vorhandenen Daten überschrieben werden. Der Name der aktuell ausgewählten Vorlage landet dann zunächst in der Variablen strVorlage. Ist das Kombinationsfeld leer, trägt die Prozedur den Platzhalter [Neue Vorlage] in die Variable strVorlage ein.
Private Sub cmdVorlageSpeichern_Click()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim ctl As Control
Dim strName As String
Dim varWert As Variant
Dim strVorlage As String
Dim strFormular As String
Dim bolFeldSpeichern As Boolean
Dim strTest As String
strFormular = Me.Name
If Not IsNull(Me!cboVorlageAuswaehlen) Then
strVorlage = Me!cboVorlageAuswaehlen
Else
strVorlage = "[Neue Vorlage]"
End If
strVorlage = InputBox("Geben Sie eine Bezeichnung für die Vorlage ein.", _ "Vorlage speichern", strVorlage)
Set db = CurrentDb
db.Execute "DELETE FROM tblVorlagen WHERE Vorlage = '" & strVorlage _ & "' AND Formularname = '" & strFormular & "'", dbFailOnError
Set rst = db.OpenRecordset("SELECT * FROM tblVorlagen", dbOpenDynaset)
For Each ctl In Me.Controls
bolFeldSpeichern = False
Select Case bolGebundeneFelder
Case True
On Error Resume Next
strTest = ctl.ControlSource
If Err.Number = 0 Then
bolFeldSpeichern = True
End If
On Error GoTo 0
Case False
If ctl.Tag = "AlsVorlageSpeichern" Then
bolFeldSpeichern = True
End If
End Select
...
Listing 1: Speichern des aktuellen Formularinhalts als Vorlage, Teil I
Dieser Wert wird nun in einer InputBox angezeigt, die neben dem Text Geben Sie eine Bezeichnung für die Vorlage ein. den in strVorlage gespeicherten Wert als Standardwert verwendet (s. Bild 3). Anschließend löscht die Prozedur mit einer per Execute-Methode ausgeführten DELETE-Anweisung alle Datensätze aus der Tabelle tblVorlagen, deren Feld Vorlage den Wert aus strVorlage und deren Feld Formularname den Wert aus strFormular enthält.
Bild 3: Abfrage des Namens für die neue Vorlage
Danach öffnet die Prozedur ein Recordset auf Basis der Tabelle tblVorlagen und speichert den Verweis darauf in der Variablen rst. In einer For Each-Schleife durchläuft die Prozedur dann alle Steuerelemente des Formulars (Me.Controls) und speichert das aktuelle Steuerelement in der Variablen ctl.
Die folgenden Anweisungen ermitteln, ob der Inhalt des Steuerelements aus ctl gespeichert werden kann und soll. Zunächst geht die Prozedur vom Gegenteil aus und stellt die Variable bolFeldSpeichern, die letztlich darüber entscheidet, auf den Wert False ein.
Dann prüft die Prozedur den Wert der Variablen bolGebundeneFelder. Diese wird im Kopf des Klassenmoduls deklariert:
Dim bolGebundeneFelder As Boolean
Den Wert dieser Variablen legen wir in der Ereignisprozedur Beim Öffnen des Formulars fest – dazu später mehr. Hat die Variable den Wert True, sollen die Werte aller gebundenen Felder des Formulars in der Tabelle tblVorlagen gespeichert werden, sonst nur diejenigen Felder, deren Tag-Eigenschaft (im Eigenschaftsfenster unter Marke zu finden) den Wert AlsVorlageSpeichern enthält. Die Prozedur ermittelt den Wert der Variablen bolGebundeneFelder in einer Select Case-Bedingung und schlägt dort den entsprechenden Weg ein.
Im Fall der gebundenen Felder deaktiviert die Prozedur zunächst die Fehlerbehandlung und versucht dann, den Wert der Eigenschaft ControlSource des Steuerelements in die Variable strTest einzulesen. Dies führt zu einem Fehler, wenn das Steuerelement nicht über die Eigenschaft Steuerelementinhalt (ControlSource) verfügt, der aber zu einer Fehlermeldung führt. Stattdessen prüft die Prozedur im nächsten Schritt, ob Err.Number den Wert 0 enthält, was dafür spricht, dass bei der Zuweisung kein Fehler aufgetreten ist und die Eigenschaft Steuerelementinhalt somit gefüllt ist.
Es handelt sich also um ein gebundenes Feld, dessen Inhalt in der Vorlage gespeichert werden soll, also stellt die Prozedur die Variable bolFeldSpeichern auf den Wert True ein.
Sollte bolGebundeneFelder den Wert False enthalten, sollen nur speziell gekennzeichnete Felder in der Vorlage gespeichert werden.
Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.