Formularinhalte speichern und wieder abrufen

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.

Das Beispielformular in der Entwurfsansicht

Bild 1: Das Beispielformular in der Entwurfsansicht

Bevor 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.

Entwurf der Tabelle tblVorlagen

Bild 2: Entwurf der Tabelle tblVorlagen

Speichern 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 AlsVorlage­Speichern.

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.

Abfrage des Namens für die neue Vorlage

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 Steu­erelemente 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.

Bitte geben Sie die Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Ich habe die Datenschutzbestimmungen zur Kenntnis genommen.