{"id":55000958,"date":"2014-12-01T00:00:00","date_gmt":"2020-05-22T21:13:22","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=958"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Formularinhalte_speichern_und_wieder_abrufen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Formularinhalte_speichern_und_wieder_abrufen\/","title":{"rendered":"Formularinhalte speichern und wieder abrufen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/d5a0ffdfb61a4d17aeddbc7382a82424\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Webbrowser kennen diese Funktion dank Add-Ons schon l&auml;nger: Wenn Sie dort Daten in ein Formular eintragen, k&ouml;nnen Sie diese speichern und bei der n&auml;chsten Verwendung des Formulars per Mausklick erneut einf&uuml;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&uuml;tzlich sein &#8211; wenn auch mit leicht unterschiedlichem Ansatz.<\/b><\/p>\n<p>Wir wollen die Technik zum Speichern und Wiederherstellen eines Formularinhalts von zwei Seiten betrachten: Aus Entwicklersicht und aus Benutzersicht. Der Entwickler ben&ouml;tigt das Feature haupts&auml;chlich, um beim Testen eines Formulars nicht die gleichen Daten immer wieder neu einzugeben, sondern diese gegebenenfalls per Mausklick zu speichern und wiederherzustellen. F&uuml;r den Entwickler soll diese Funktion eher flexibel und f&uuml;r alle Formulare anwendbar sein &#8211; am besten also in Form eines Add-Ins, das die Inhalte mehrerer Formulare verwalten kann.<\/p>\n<p>F&uuml;r den Benutzer ist eine eingebaute Funktion sinnvoll, welche zum einen eine Schaltfl&auml;che zum Speichern der aktuellen Eingabe bietet, zum anderen eine Auswahlm&ouml;glichkeit f&uuml;r die bisher gespeicherten Daten.<\/p>\n<p><b>Formularinhalte speichern f&uuml;r Benutzer<\/b><\/p>\n<p>In diesem Beitrag schauen wir uns die Variante f&uuml;r Benutzer an. Dazu erstellen wir zun&auml;chst ein einfaches Formular, das die Daten der Tabelle <b>tblArtikel <\/b>in der Formularansicht anzeigt. Diesem f&uuml;gen wir ein Kombinationsfeld namens <b>cboVorlageAuswaehlen <\/b>hinzu sowie eine Schaltlf&auml;che mit der Beschriftung <b>Speichern<\/b> und dem Namen <b>cboVorlageSpeichern<\/b>. Im Entwurf sieht das Formular nun wie in Bild 1 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_06\/pic_958_001.png\" alt=\"Das Beispielformular in der Entwurfsansicht\" width=\"500\" height=\"447,7318\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Das Beispielformular in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Bevor wir uns nun an die Programmierung machen k&ouml;nnen, m&uuml;ssen wir uns ein paar Gedanken um die Speicherung selbst machen. Die erste Frage dabei lautet: Welche Inhalte sollen &uuml;berhaupt gespeichert werden Und die zweite: Wohin und wie speichern wir diese Inhalte<\/p>\n<p>Die erste Frage ist eigentlich einfach zu beantworten: Nat&uuml;rlich alle Daten, die der Benutzer in das Formular eingegeben hat! Nur m&uuml;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<\/p>\n<p>Und: Gibt es &uuml;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&ouml;nnte ja geschehen, wenn Sie etwa die Daten f&uuml;r eine Bank&uuml;berweisung in ein Formular eingeben und die &uuml;berweisung ansto&szlig;en. Die Daten m&uuml;ssen nicht zwangsl&auml;ufig gespeichert werden, denn wir k&ouml;nnen diese sp&auml;ter nach erfolgter &uuml;berweisung vom Bankserver einlesen.<\/p>\n<p>Allein die Bindung eines Steuerelements ein Feld der Datenherkunft liefert also kein Indiz daf&uuml;r, dass der Inhalt des Steuerelements gespeichert und wiederhergestellt werden soll.<\/p>\n<p>Also gestalten wir die Funktion so flexibel, dass wir sowohl einfach den Inhalt aller gebundenen Steuerelemente speichern k&ouml;nnen als auch speziell zum Speichern markierte Steuerelemente.<\/p>\n<p><b>Tabelle zum Speichern der Daten<\/b><\/p>\n<p>Die Tabelle zum Speichern der Inhalte der Steuerelemente soll ebenso flexibel sein. Wir m&ouml;chten diese also nicht auf eine einzige Datenherkunft auslegen und somit nicht etwa die Artikeltabelle abbilden, sondern beliebig viele Felder f&uuml;r unterschiedliche Vorlagen in der Tabelle speichern.<\/p>\n<p>Damit wir verschiedene Vorlagen f&uuml;r das gleiche Formular speichern k&ouml;nnen, ben&ouml;tigen wir ein Feld, das den Namen der Vorlage aufnimmt. Wenn wir die Vorlagen-Funktion f&uuml;r mehrere Formulare in der gleichen Datenbank verwenden m&ouml;chten, m&uuml;ssen wir au&szlig;erdem noch ein Feld vorsehen, das angibt, zu welchem Formular die Vorlage geh&ouml;rt.<\/p>\n<p>Schlie&szlig;lich ben&ouml;tigen wir ein Feld f&uuml;r den Steuerelementnamen und eines f&uuml;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&ouml;nnen, verwenden wir den Datentyp <b>Text<\/b>. Diesem k&ouml;nnen wir sowohl Texte also auch Zahlen, Datumsangaben oder <b>Boolean<\/b>-Werte zuweisen (<b>0<\/b>\/<b>-1<\/b>).<\/p>\n<p>Die Tabelle <b>tblVorlagen<\/b> sieht im Entwurf schlie&szlig;lich wie in Bild 2 aus. Dort erkennen Sie auch, dass es einen aus den drei Feldern <b>Formularname<\/b>, <b>Vorlage <\/b>und <b>Steuerelementname <\/b>zusammengesetzten, eindeutigen Index gibt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_06\/pic_958_002.png\" alt=\"Entwurf der Tabelle tblVorlagen\" width=\"650\" height=\"436,4154\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Entwurf der Tabelle tblVorlagen<\/span><\/b><\/p>\n<p><b>Speichern des Formularinhalts<\/b><\/p>\n<p>Nun ben&ouml;tigen wir eine Prozedur, die durch das Ereignis <b>Beim Klicken <\/b>der Schaltfl&auml;che <b>cmdVorlageSpeichern <\/b>ausgel&ouml;st wird. Zuvor m&uuml;ssen wir noch festlegen, welche Felder gespeichert werden sollen. Wir wollen zwei Arten erm&ouml;glichen:<\/p>\n<ul>\n<li>Speichern aller Felder, die an ein Feld der Datenherkunft gebunden sind<\/li>\n<li>Speichern aller Felder, deren <b>Tag<\/b>-Eigenschaft einen bestimmten Wert enth&auml;lt, zum Beispiel <b>AlsVorlage-Speichern<\/b>.<\/li>\n<\/ul>\n<p>Die erste Variante ist f&uuml;r gebundene Formulare interessant, die zweite f&uuml;r gebundene und ungebundene Formulare. Welche Methode zum Einsatz kommt, legen wir durch eine <b>Boolean<\/b>-Variable fest, die beim Laden des Formulars auf den entsprechenden Wert eingestellt wird.<\/p>\n<p>Werfen wir nun einen Blick auf die Schaltfl&auml;che <b>cmdVorlageSpeichern<\/b>. Diese l&ouml;st beim Anklicken die Prozedur aus Listing 1 (Teil I) aus. Die Prozedur liest zun&auml;chst den Namen des aktuellen Formulars aus der Eigenschaft <b>Name <\/b>in die Variable <b>strFormular <\/b>ein. Dann pr&uuml;ft sie, ob aktuell im Kombinationsfeld <b>cboVorlageAuswaehlen <\/b>ein Eintrag ausgew&auml;hlt ist. Falls ja, geht sie davon aus, dass die aktuellen Inhalte des Formulars unter dem Namen der ausgew&auml;hlten Vorlage gespeichert werden sollen. Das bedeutet nat&uuml;rlich, dass die vorhandenen Daten &uuml;berschrieben werden. Der Name der aktuell ausgew&auml;hlten Vorlage landet dann zun&auml;chst in der Variablen <b>strVorlage<\/b>. Ist das Kombinationsfeld leer, tr&auml;gt die Prozedur den Platzhalter <b>[Neue Vorlage] <\/b>in die Variable <b>strVorlage <\/b>ein.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdVorlageSpeichern_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>ctl<span style=\"color:blue;\"> As <\/span>Control\r\n     <span style=\"color:blue;\">Dim <\/span>strName<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>varWert<span style=\"color:blue;\"> As Variant<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strVorlage<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFormular<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolFeldSpeichern<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strTest<span style=\"color:blue;\"> As String<\/span>\r\n     strFormular = Me.Name\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me!cboVorlageAuswaehlen)<span style=\"color:blue;\"> Then<\/span>\r\n         strVorlage = Me!cboVorlageAuswaehlen\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strVorlage = \"[Neue Vorlage]\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strVorlage = InputBox(\"Geben Sie eine Bezeichnung f&uuml;r die Vorlage ein.\", _\r\n         \"Vorlage speichern\", strVorlage)\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     db.Execute \"DELETE FROM tblVorlagen WHERE Vorlage = ''\" & strVorlage _\r\n         & \"'' AND Formularname = ''\" & strFormular & \"''\", dbFailOnError\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblVorlagen\", dbOpenDynaset)\r\n     For Each ctl In Me.Controls\r\n         bolFeldSpeichern = <span style=\"color:blue;\">False<\/span>\r\n         Select Case bolGebundeneFelder\r\n             <span style=\"color:blue;\">Case <\/span><span style=\"color:blue;\">True<\/span>\r\n                 On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n                 strTest = ctl.ControlSource\r\n                 <span style=\"color:blue;\">If <\/span>Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n                     bolFeldSpeichern = <span style=\"color:blue;\">True<\/span>\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n                 <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n             <span style=\"color:blue;\">Case <\/span><span style=\"color:blue;\">False<\/span>\r\n                 <span style=\"color:blue;\">If <\/span>ctl.Tag = \"AlsVorlageSpeichern\"<span style=\"color:blue;\"> Then<\/span>\r\n                     bolFeldSpeichern = <span style=\"color:blue;\">True<\/span>\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n         ...<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Speichern des aktuellen Formularinhalts als Vorlage, Teil I<\/span><\/b><\/p>\n<p>Dieser Wert wird nun in einer <b>InputBox <\/b>angezeigt, die neben dem Text <b>Geben Sie eine Bezeichnung f&uuml;r die Vorlage ein. <\/b>den in <b>strVorlage <\/b>gespeicherten Wert als Standardwert verwendet (s. Bild 3). Anschlie&szlig;end l&ouml;scht die Prozedur mit einer per <b>Execute<\/b>-Methode ausgef&uuml;hrten <b>DELETE<\/b>-Anweisung alle Datens&auml;tze aus der Tabelle <b>tblVorlagen<\/b>, deren Feld <b>Vorlage <\/b>den Wert aus <b>strVorlage <\/b>und deren Feld <b>Formularname <\/b>den Wert aus <b>strFormular <\/b>enth&auml;lt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_06\/pic_958_003.png\" alt=\"Abfrage des Namens f&uuml;r die neue Vorlage\" width=\"500\" height=\"418,288\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Abfrage des Namens f&uuml;r die neue Vorlage<\/span><\/b><\/p>\n<p>Danach &ouml;ffnet die Prozedur ein Recordset auf Basis der Tabelle <b>tblVorlagen <\/b>und speichert den Verweis darauf in der Variablen <b>rst<\/b>. In einer <b>For Each<\/b>-Schleife durchl&auml;uft die Prozedur dann alle Steu-erelemente des Formulars (<b>Me.Controls<\/b>) und speichert das aktuelle Steuerelement in der Variablen <b>ctl<\/b>.<\/p>\n<p>Die folgenden Anweisungen ermitteln, ob der Inhalt des Steuerelements aus <b>ctl <\/b>gespeichert werden kann und soll. Zun&auml;chst geht die Prozedur vom Gegenteil aus und stellt die Variable <b>bolFeldSpeichern<\/b>, die letztlich dar&uuml;ber entscheidet, auf den Wert <b>False <\/b>ein.<\/p>\n<p>Dann pr&uuml;ft die Prozedur den Wert der Variablen <b>bolGebundeneFelder<\/b>. Diese wird im Kopf des Klassenmoduls deklariert:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>bolGebundeneFelder<span style=\"color:blue;\"> As Boolean<\/span><\/pre>\n<p>Den Wert dieser Variablen legen wir in der Ereignisprozedur <b>Beim &ouml;ffnen <\/b>des Formulars fest &#8211; dazu sp&auml;ter mehr. Hat die Variable den Wert <b>True<\/b>, sollen die Werte aller gebundenen Felder des Formulars in der Tabelle <b>tblVorlagen <\/b>gespeichert werden, sonst nur diejenigen Felder, deren <b>Tag<\/b>-Eigenschaft (im Eigenschaftsfenster unter <b>Marke <\/b>zu finden) den Wert <b>AlsVorlageSpeichern <\/b>enth&auml;lt. Die Prozedur ermittelt den Wert der Variablen <b>bolGebundeneFelder <\/b>in einer <b>Select Case<\/b>-Bedingung und schl&auml;gt dort den entsprechenden Weg ein.<\/p>\n<p>Im Fall der gebundenen Felder deaktiviert die Prozedur zun&auml;chst die Fehlerbehandlung und versucht dann, den Wert der Eigenschaft <b>ControlSource <\/b>des Steuerelements in die Variable <b>strTest <\/b>einzulesen. Dies f&uuml;hrt zu einem Fehler, wenn das Steuerelement nicht &uuml;ber die Eigenschaft <b>Steuerelementinhalt <\/b>(<b>ControlSource<\/b>) verf&uuml;gt, der aber zu einer Fehlermeldung f&uuml;hrt. Stattdessen pr&uuml;ft die Prozedur im n&auml;chsten Schritt, ob <b>Err.Number <\/b>den Wert <b>0 <\/b>enth&auml;lt, was daf&uuml;r spricht, dass bei der Zuweisung kein Fehler aufgetreten ist und die Eigenschaft <b>Steuerelementinhalt <\/b>somit gef&uuml;llt ist.<\/p>\n<p><!--30percent--><\/p>\n<p>Es handelt sich also um ein gebundenes Feld, dessen Inhalt in der Vorlage gespeichert werden soll, also stellt die Prozedur die Variable <b>bolFeldSpeichern <\/b>auf den Wert <b>True <\/b>ein.<\/p>\n<p>Sollte <b>bolGebundeneFelder <\/b>den Wert <b>False <\/b>enthalten, sollen nur speziell gekennzeichnete Felder in der Vorlage gespeichert werden.<\/p>\n<p>Die Prozedur pr&uuml;ft also f&uuml;r das aktuelle Steuerelement, ob die <b>Tag<\/b>-Eigenschaft den Wert <b>AlsVorlageSpeichern <\/b>aufweist. In diesem Fall erh&auml;lt <b>bolFeldSpeichern <\/b>wiederum den Wert <b>True<\/b> (anderenfalls bleibt er <b>False<\/b>).<\/p>\n<p>Da wir nun durch den Wert der Variablen <b>bolFeldSpeichern <\/b>wissen, ob der Inhalt des Steuerelements gespeichert werden soll, k&ouml;nnen wir die ben&ouml;tigen Werte ermitteln (s. Listing 2). Der Name des Steuerelements landet in <b>strName<\/b>, der Wert in <b>strWert<\/b>.<\/p>\n<pre>         ...\r\n         <span style=\"color:blue;\">If <\/span>bolFeldSpeichern = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             strName = ctl.Name\r\n             varWert = ctl.Value\r\n             Select Case strName\r\n                 <span style=\"color:blue;\">Case <\/span>\"cboVorlageAuswaehlen\", \"cmdVorlageSpeichern\"\r\n                 <span style=\"color:blue;\">Case Else<\/span>\r\n                     rst.Add<span style=\"color:blue;\">New<\/span>\r\n                     rst!Vorlage = strVorlage\r\n                     rst!Formularname = strFormular\r\n                     rst!Steuerelementname = strName\r\n                     rst!Steuerelementinhalt = varWert\r\n                     rst.Update\r\n             <span style=\"color:blue;\">End Select<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> ctl\r\n     Me!cboVorlageAuswaehlen.Requery\r\n     Me!cboVorlageAuswaehlen = strVorlage\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Speichern des aktuellen Formularinhalts als Vorlage, Teil II<\/span><\/b><\/p>\n<p>Wir pr&uuml;fen das Steuerelement noch dahingehend, ob es sich dabei um das Kombinationsfeld zur Auswahl der Vorlagen oder um die Schaltfl&auml;che <b>cmdVorlageSpeichern<\/b> handelt. Falls nicht, erfolgt der eigentliche Speichervorgang f&uuml;r dieses Steuerelement.<\/p>\n<p>Hier legen wir mit der <b>AddNew<\/b>-Methode einen neuen Datensatz in der Tabelle an und f&uuml;llen die Felder <b>Vorlage<\/b>, <b>Formularname<\/b>, <b>Steuerelementname <\/b>und <b>Steuerelementinhalt <\/b>mit den Werten der Variablen <b>strVorlage<\/b>, <b>strFormularname<\/b>, <b>strName <\/b>und <b>strWert<\/b>. Schlie&szlig;lich speichert die <b>Update<\/b>-Methode den Datensatz.<\/p>\n<p>Auf die gleiche Weise durchl&auml;uft die Prozedur alle Steuerelemente des Formulars und speichert die Inhalte der infrage kommenden Steuerelemente. Schlie&szlig;lich aktualisiert sie die Datensatzherkunft des Kombinationsfeldes <b>cboVorlageAuswaehlen <\/b>und stelle dieses auf die soeben gespeicherte Vorlage ein.<\/p>\n<p>Der Inhalt der Tabelle <b>tblVorlagen <\/b>sieht f&uuml;r eine Vorlage des Beispielformulars <b>frmArtikel <\/b>nun wie in Bild 4 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_06\/pic_958_004.png\" alt=\"Die Tabelle tblVorlagen mit einer Beispielvorlage\" width=\"575\" height=\"279,1348\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Die Tabelle tblVorlagen mit einer Beispielvorlage<\/span><\/b><\/p>\n<p><b>Kombinationsfeld zur Auswahl einer Vorlage<\/b><\/p>\n<p>Schauen wir uns nun das Kombinationsfeld <b>cboVorlageAuswaehlen <\/b>an. Es erh&auml;lt seine Datensatzherkunft beim &ouml;ffnen des Formulars durch die Ereignisprozedur, die durch das Ereignis <b>Beim &ouml;ffnen <\/b>ausgel&ouml;st wird (s. Listing 3). Dabei dient der Formularname als Filter f&uuml;r die anzuzeigenden Elemente. Damit jeder Vorlagenname nur einmal angezeigt wird, verwendet die Abfrage hinter <b>SELECT <\/b>das Schl&uuml;sselwort <b>DISTINCT<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Open(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     bolGebundeneFelder = <span style=\"color:blue;\">True<\/span>\r\n     Me!cboVorlageAuswaehlen.RowSource = _\r\n         \"SELECT DISTINCT Vorlage FROM tblVorlagen WHERE Formularname = ''\" _\r\n         & Me.Name & \"'' ORDER BY Vorlage;\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Diese Prozedur wird bei &ouml;ffnen des Formulars ausgel&ouml;st.<\/span><\/b><\/p>\n<p><b>Auswahl einer Vorlage<\/b><\/p>\n<p>Wenn der Benutzer einen der im Kombinationsfeld enthaltenen Eintr&auml;ge ausw&auml;hlt, l&ouml;st er damit die Prozedur aus Listing 4 aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboVorlageAuswaehlen_AfterUpdate()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblVorlagen WHERE Vorlage = ''\" _\r\n         & Me!cboVorlageAuswaehlen _\r\n         & \"'' AND Formularname = ''\" & Me.Name & \"''\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(rst!Steuerelementinhalt)<span style=\"color:blue;\"> Then<\/span>\r\n             On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n             Me.Controls(rst!Steuerelementname) = rst!Steuerelementinhalt\r\n             <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Prozedur, die nach dem Aktualisieren des Kombinationsfeldes ausgel&ouml;st wird<\/span><\/b><\/p>\n<p>Diese &ouml;ffnet ein Recordset auf Basis der Tabelle <b>tblVorlagen<\/b>, wobei als Filter der Name der Vorlage aus dem Kombinationsfeld sowie der Formularname verwendet werden. Anschlie&szlig;end durchl&auml;uft die Prozedur alle Datens&auml;tze der Tabelle und pr&uuml;ft dabei zun&auml;chst, ob das Feld <b>Steuerelementinhalt <\/b>nicht den Wert <b>Null <\/b>enth&auml;lt.<\/p>\n<p>Ist der Feldinhalt ungleich Null, tr&auml;gt die Prozedur den Wert des Feldes <b>Steu-er-elementinhalt <\/b>als Wert des mit dem Feld <b>Steuerelementname <\/b>angegebenen Steuerelements ein.<\/p>\n<p>Vor dem Zuweisen dieses Wertes deaktiviert die Prozedur die Fehlerbehandlung. Warum das Es gibt einige wenige F&auml;lle, bei denen die Zuweisung der Werte nicht gelingt. Der einzige, der beim Testen dieser Funktion aufgefallen ist, war der Fall eines Prim&auml;rschl&uuml;sselwertes mit Autowert. Ein Steuerelement mit einem Autowertfeld als Steuerelementinhalt kann nat&uuml;rlich nicht einfach durch Zuweisen eines Wertes gef&uuml;llt werden. Den dadurch ausgel&ouml;sten Fehler &uuml;bergeht die Prozedur jedoch durch die Deaktivierung der Fehlerbehandlung.<\/p>\n<p><b>Kombinationsfeld bei neuem Datensatz leeren<\/b><\/p>\n<p>Das Kombinationsfeld ist gef&uuml;llt, wenn der Benutzer soeben einen Eintrag ausgew&auml;hlt und das Formular mit den enthaltenen Daten gef&uuml;llt hat oder wenn der Benutzer soeben den aktuellen Inhalt des Formulars in der Tabelle <b>tblVorlagen <\/b>gespeichert hat. Wenn der Benutzer von hier aus zu einem anderen Datensatz wechselt, soll das Kombinationsfeld wieder geleert werden. Dies erledigt die folgende Ereignisprozedur, die durch das Ereignis <b>Beim Anzeigen <\/b>des Formulars ausgel&ouml;st wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     Me!cboVorlageAuswaehlen = Null\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Speichern bestimmter Felder testen<\/b><\/p>\n<p>Das Beispielformular <b>frmArtikel <\/b>verwendet den Wert <b>True <\/b>f&uuml;r die <b>Boolean<\/b>-Variable <b>bolGebundeneFelder<\/b>, was wie gew&uuml;nscht funktioniert. Nun m&ouml;chten wir allerdings auch noch testen, wie die andere Variante funktioniert.<\/p>\n<p>Hier wollen wir manuell festlegen, welche Felder in der Vorlage gespeichert werden sollen. Dazu erhalten alle Felder, die wir ber&uuml;cksichtigen wollen, den Wert <b>AlsVorlageSpeichern <\/b>f&uuml;r die Eigenschaft <b>Marke <\/b>(unter VBA: <b>Tag<\/b>).<\/p>\n<p>Um dies zu testen, erstellen wir eine Kopie des ersten Beispielformulars <b>frmArtikel <\/b>und speichern dieses unter dem Namen <b>frmArtikel_NachTag<\/b>.<\/p>\n<p>Dann markieren Sie alle Steuerelemente, die in der Vorlage gespeichert werden sollen &#8211; in diesem Fall die vier Steuer-elemente, welche die Felder <b>Artikelname<\/b>, <b>LieferantID<\/b>, <b>KategorieID <\/b>und <b>Liefereinheit <\/b>als <b>Steuerelementinhalt <\/b>verwenden. Dann tragen Sie f&uuml;r die Eigenschaft <b>Marke <\/b>den Wert <b>AlsVorlageSpeichern <\/b>ein (s. Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_06\/pic_958_005.png\" alt=\"Festlegen der Felder, die in der Vorlage gespeichert werden sollen\" width=\"500\" height=\"471,6814\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Festlegen der Felder, die in der Vorlage gespeichert werden sollen<\/span><\/b><\/p>\n<p>Schlie&szlig;lich fehlt noch ein letzter Schritt: Sie m&uuml;ssen den Wert der Variablen <b>bolGebundeneWerte <\/b>im Ereignis <b>Form_Open <\/b>auf den Wert <b>False <\/b>einstellen (s. Listing 5).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Open(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     bolGebundeneFelder = <span style=\"color:blue;\">False<\/span>\r\n     Me!cboVorlageAuswaehlen.RowSource = _\r\n         \"SELECT DISTINCT Vorlage FROM tblVorlagen WHERE Formularname = ''\" _\r\n         & Me.Name & \"'' ORDER BY Vorlage;\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Ge&auml;nderte Version der Prozedur, die beim &ouml;ffnen des Formulars ausgel&ouml;st wird<\/span><\/b><\/p>\n<p>Ein Test, ob dies funk-tioniert, gelingt auf Anhieb.<\/p>\n<p><b>Nachteil<\/b><\/p>\n<p>Der Nachteil dieser Funktionalit&auml;t ist, dass Sie f&uuml;r jedes Formular, das Sie damit ausstatten wollen, die entsprechenden Ereignisprozeduren anlegen und f&uuml;llen m&uuml;ssen.<\/p>\n<p>Wenn Ihnen dann sp&auml;ter einf&auml;llt, dass Sie den Code der Vorlagen-Funktion &auml;ndern m&ouml;chten, m&uuml;ssen Sie dies f&uuml;r alle Kopien der entsprechenden Prozeduren erledigen.<\/p>\n<p>Also werden wir, wie wir es schon &ouml;fter gemacht haben, den Code dieser L&ouml;sung in eine eigene Klasse auslagern.<\/p>\n<p>Sie brauchen dann nur noch die beiden Steuerelemente <b>cboVorlageAuswaeh-len <\/b>und <b>cboVorlageSpeichern <\/b>zu dem betroffenen Formular hinzuzuf&uuml;gen und ein paar Zeilen Code in die Ereignisprozedur einzutragen, die durch das Ereignis <b>Beim Laden <\/b>des Formulars ausgel&ouml;st wird.<\/p>\n<p><b>Formularvorlagen-Funktion als wiederverwendbare Klasse<\/b><\/p>\n<p>Wir zeigen hier einmal, wie Sie eine Funktion, die bislang komplett in einem Formular und seinem Klassenmodul verankert ist, in eine Klasse &uuml;berf&uuml;hren k&ouml;nnen und wie Sie die Funktionen dann nutzen.<\/p>\n<p>Als Erstes erstellen Sie ein neues Klassenmodul &uuml;ber den Men&uuml;befehl <b>Einf&uuml;gen|Klassenmodul <\/b>des VBA-Editors. Speichern Sie es unter dem Namen <b>clsFormularvorlagen<\/b>.<\/p>\n<p>Kopieren Sie nun alle f&uuml;r die Funktion ben&ouml;tigten Teile aus dem Klassenmodul des Formulars <b>frmArtikel <\/b>in dieses Klassenmodul. Kommentieren Sie vorerst alle Zeilen aus, wir holen diese gleich Schritt f&uuml;r Schritt zur&uuml;ck.<\/p>\n<p>Nun k&uuml;mmern wir uns um die Boolean-Variable <b>bolGebundeneFelder<\/b>. Diese soll nun nicht mehr als Variable gef&uuml;llt werden, sondern als Eigenschaft der Klasse.<\/p>\n<p>Daher &auml;ndern wir den Variablennamen zun&auml;chst in <b>m_GebundeneFelder <\/b>und &auml;ndern den G&uuml;ltigkeitsbereich auf <b>Private<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_GebundeneFelder<span style=\"color:blue;\"> As Boolean<\/span><\/pre>\n<p>Damit diese Variable vom Formular aus eingestellt werden kann, legen wir daf&uuml;r eine Public <b>Property Let<\/b>-Prozedur an:<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>GebundeneFelder( _\r\n         bolGebundeneFelder<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     m_GebundeneFelder = _\r\n         bolGebundeneFelder\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Wir ben&ouml;tigen noch einige weitere solcher Eigenschaften, um der Klasse mitzuteilen, welches Formular verwendet wird, welches Kombinationsfeld zur Auswahl der Vorlagen dienen soll und welche Schaltfl&auml;che zum Speichern der aktuellen Formularinhalte dienen soll.<\/p>\n<p>Die dazu ben&ouml;tigten Variablen sehen so aus und werden allesamt mit dem Schl&uuml;sselwort <b>WithEvents <\/b>ausgestattet:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>WithEvents m_frm <span style=\"color:blue;\"> As <\/span>Form\r\n<span style=\"color:blue;\">Private <\/span>WithEvents m_cbo <span style=\"color:blue;\"> As <\/span>ComboBox\r\n<span style=\"color:blue;\">Private <\/span>WithEvents m_cmd <span style=\"color:blue;\"> As <\/span>CommandButton<\/pre>\n<p>Um diese Variablen von au&szlig;en f&uuml;llen zu k&ouml;nnen, verwenden wir drei entsprechende <b>Public Property Set<\/b>-Prozeduren (s. Listing 6).<\/p>\n<pre><span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>Formular(frm<span style=\"color:blue;\"> As <\/span>Form)\r\n     <span style=\"color:blue;\">Set<\/span> m_frm = frm\r\n     <span style=\"color:blue;\">With<\/span> m_frm\r\n         .OnCurrent = \"[Event Procedure]\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>Combobox(cbo<span style=\"color:blue;\"> As <\/span>Combobox)\r\n     <span style=\"color:blue;\">Set<\/span> m_cbo = cbo\r\n     <span style=\"color:blue;\">With<\/span> m_cbo\r\n         .AfterUpdate = \"[Event Procedure]\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>Commandbutton(cmd<span style=\"color:blue;\"> As <\/span>Commandbutton)\r\n     <span style=\"color:blue;\">Set<\/span> m_cmd = cmd\r\n     <span style=\"color:blue;\">With<\/span> m_cmd\r\n         .OnClick = \"[Event Procedure]\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Prozeduren zur Entgegennahme der Property Set-Eigenschaften<\/span><\/b><\/p>\n<p>Die Prozeduren weisen das &uuml;bergebene Objekt jeweils den entsprechenden Objektvariablen zu. Au&szlig;erdem stellen Sie die Ereigniseigenschaften f&uuml;r alle auszuf&uuml;hrenden Ereignisse auf den Wert <b>[Event Procedure] <\/b>ein. Anschlie&szlig;end bauen wir Schritt f&uuml;r Schritt die zuvor im Formular verwendeten Ereignisprozeduren nach &#8211; mit dem Unterschied, dass wir diese nun nicht mehr im Klassenmodul des Formulars implementieren, sondern in dem neuen Klassenmodul <b>clsFormularvorlagen <\/b>f&uuml;r die dort deklarierten Objekte <b>m_frm<\/b>, <b>m_cbo <\/b>und <b>m_cmd<\/b>.<\/p>\n<p>Den Start macht die Prozedur, die durch Ereignis <b>Nach Aktualisierung <\/b>des Kombinationsfeldes ausgel&ouml;st wird. Um diese anzulegen, w&auml;hlen Sie im linken Kombinationsfeld oben im Codefenster des Klassenmoduls <b>clsFormularvorlagen <\/b>den Eintrag <b>m_cbo <\/b>aus und rechts den Eintrag <b>AfterUpdate<\/b> (s. Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_06\/pic_958_006.png\" alt=\"Anlegen von Ereignisprozeduren f&uuml;r Steuerelemente in einer externen Klasse\" width=\"650\" height=\"425,0951\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Anlegen von Ereignisprozeduren f&uuml;r Steuerelemente in einer externen Klasse<\/span><\/b><\/p>\n<p>Dies legt den Prozedurrumpf der Ereignisprozedur <b>m_cbo_AfterUpdate <\/b>an. Nun f&uuml;gen Sie dort den Code ein, der sich aktuell in der Prozedur <b>cboVorlageAuswaehlen_AfterUpdate <\/b>befindet.<\/p>\n<p>Nat&uuml;rlich sind hier ein paar kleinere Anpassungen durchzuf&uuml;hren &#8211; wir k&ouml;nnen ja von hier aus beispielsweise nicht &uuml;ber das Objekt <b>Me <\/b>auf das Formular zugreifen, und auch die Steuerelemente m&uuml;ssen wir anders ansprechen.<\/p>\n<p>Die erste &auml;nderung, die den Prozedurnamen betrifft, haben Sie durch das Neuanlegen der Prozedur im Kontext der Variablen <b>m_cbo <\/b>ja bereits erledigt.<\/p>\n<p>Es st&ouml;ren noch die beiden Bez&uuml;ge auf die Steuerelemente in der <b>SELECT<\/b>-Anweisung (<b>Me!cboVorlageAuswaehlen <\/b>und <b>Me.Name<\/b>). Diese ersetzen Sie durch <b>m_cbo <\/b>und <b>m_frm.Name<\/b>, also die entsprechenden Objekte des Klassenmoduls, die wiederum mit Verweisen auf die tats&auml;chlich im Formular vorhandenen Objekte gef&uuml;llt werden (s. Listing 7). Au&szlig;erdem ersetzen wir dort noch <b>Me.Controls <\/b>durch <b>m_frm.Controls<\/b> (alle &auml;nderungen sind im Listing fett abgedruckt).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_cbo_AfterUpdate()\r\n     ...\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblVorlagen WHERE Vorlage = ''\" _\r\n         & m_cbo & \"'' AND Formularname = ''\" _\r\n         & m_frm.Name & \"''\", dbOpenDynaset)\r\n             ...\r\n             m_frm.Controls(rst!Steuerelementname) = rst!Steuerelementinhalt\r\n...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Die Ereignisprozedur, die nach der Auswahl einer Vorlage ausgef&uuml;hrt wird<\/span><\/b><\/p>\n<p>Der n&auml;chste Kandidat ist die Ereignisprozedur <b>cmdVorlageSpeichern_Click<\/b>. Um diese zu ersetzen, legen Sie f&uuml;r das Objekt <b>m_cmd <\/b>ebenfalls die entsprechende Ereignisprozedur an, also <b>m_cmd_Click<\/b>.<\/p>\n<p>In Listing 8 haben wir eine verk&uuml;rzte Version der neuen Ereignisprozedur abgebildet, wobei alle ge&auml;nderten Elemente fett gedruckt sind.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_cmd_Click()\r\n     ...\r\n     strFormular = m_frm.Name\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(m_cbo)<span style=\"color:blue;\"> Then<\/span>\r\n         strVorlage = m_cbo\r\n     ...\r\n     db.Execute \"DELETE FROM tblVorlagen WHERE Vorlage = ''\" & strVorlage _\r\n         & \"'' AND Formularname = ''\" & m_frm.Name & \"''\", dbFailOnError\r\n     ...\r\n     For Each ctl In m_frm.Controls\r\n         bolFeldSpeichern = <span style=\"color:blue;\">False<\/span>\r\n         Select Case m_GebundeneFelder\r\n             ...\r\n     <span style=\"color:blue;\">Next<\/span> ctl\r\n     m_cbo.Requery\r\n     m_cbo.Value = strVorlage\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Neue Version der Ereignisprozedur zum Speichern einer Vorlage<\/span><\/b><\/p>\n<p><b>Kombinationsfeld f&uuml;llen und aktualisieren<\/b><\/p>\n<p>Das Kombinationsfeld wird im Originalformular in der Ereignisprozedur <b>Form_Open <\/b>gef&uuml;llt. Dies sparen wir uns, da wir zum Zuweisen auch die <b>Public Property Set<\/b>-Prozedur verwenden k&ouml;nnen, mit der wir der Klasse das betroffene Formular &uuml;bergeben. Diese erg&auml;nzen wir gegen&uuml;ber der vorherigen Version wie in Listing 9 um die Zuweisung der Eigenschaft <b>RowSource<\/b>. Au&szlig;erdem f&uuml;gen wir hier noch eine <b>If&#8230;Then<\/b>-Bedingung hinzu, mit der wir pr&uuml;fen, ob die Variable <b>m_cbo <\/b>schon gef&uuml;llt ist. Dies muss vor der Zuweisung der Eigenschaft <b>Formular <\/b>der Klasse geschehen, anderenfalls erscheint eine entsprechende Meldung.<\/p>\n<pre><span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>Formular(frm<span style=\"color:blue;\"> As <\/span>Form)\r\n     <span style=\"color:blue;\">Set<\/span> m_frm = frm\r\n     <span style=\"color:blue;\">With<\/span> m_frm\r\n         .OnCurrent = \"[Event Procedure]\"\r\n         <span style=\"color:blue;\">If <\/span>m_cbo Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Die Eigenschaft Combobox muss vor der Eigenschaft Formular gesetzt werden.\"\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             m_cbo.RowSource = \"SELECT DISTINCT Vorlage FROM tblVorlagen WHERE Formularname = ''\" _\r\n                 & m_frm.Name & \"'' ORDER BY Vorlage;\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Die Property Set-Prozedur Formular nimmt auch noch die Anweisung zum F&uuml;llen des Kombinationsfeldes auf.<\/span><\/b><\/p>\n<p>Fehlt nur noch die Prozedur, die beim Anzeigen eines neuen Datensatzes ausgel&ouml;st wird und die das Kombinationsfeld in diesem Fall leert. Bei diesem &auml;ndert sich nur der Prozedurname sowie der Verweis auf das Kombinationsfeld:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_frm_Current()\r\n     m_cbo.Value = Null\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit ist die Klasse fertiggestellt. Wir m&uuml;ssen diese nur noch in das Formular integrieren. Dazu legen wir ein neues Formular namens <b>frmArtikel_Klasse <\/b>an und f&uuml;gen diesem die Tabelle <b>tblArtikel <\/b>als Datenherkunft hinzu. Ziehen Sie wie bei den vorherigen Beispielen alle Felder der Datenherkunft in den Detailbereich der Entwurfsansicht. Legen Sie auch ein Kombinationsfeld namens <b>cboVorlageAuswaehlen <\/b>und daneben eine Schaltfl&auml;che namens <b>cmdVorlageSpeichern <\/b>hinzu.<\/p>\n<p>F&uuml;gen Sie dann eine Ereignisprozedur f&uuml;r das Ereignis <b>Beim Laden <\/b>des Formulars hinzu. Erg&auml;nzen Sie den Prozedurrumpf wie in Listing 10. Deklarieren Sie au&szlig;erdem die Variable f&uuml;r das Klassenmodul wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Set<\/span> objFormularvorlagen = <span style=\"color:blue;\">New<\/span> clsFormularvorlagen\r\n     <span style=\"color:blue;\">With<\/span> objFormularvorlagen\r\n         <span style=\"color:blue;\">Set<\/span> .Combobox = Me!cboVorlageAuswaehlen\r\n         <span style=\"color:blue;\">Set<\/span> .Formular = Me\r\n         <span style=\"color:blue;\">Set<\/span> .Commandbutton = Me!cmdVorlageSpeichern\r\n         .GebundeneFelder = <span style=\"color:blue;\">True<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 10: Diese Prozedur instanziert die Klasse clsFormularvorlagen und stellt die Eigenschaften ein.<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objFormularvorlagen<span style=\"color:blue;\"> As <\/span> clsFormularvorlagen<\/pre>\n<p>Die Prozedur instanziert zun&auml;chst die Klasse und speichert den Verweis auf das resultierende Objekt in der Variablen <b>objFormularvorlagen<\/b>. Dann weist es den einzelnen Eigenschaften die Verweise auf die entsprechenden Objekte zu und stellt die Eigenschaft <b>GebundeneFelder <\/b>auf den Wert <b>True <\/b>ein.<\/p>\n<p>Dadurch ber&uuml;cksichtigt die Klasse beim Speichern einer Vorlage alle Steuerelemente, die an ein Feld der Datenherkunft gebunden sind. Mit dem Wert <b>False <\/b>m&uuml;ssten Sie, wie weiter oben bereits beschrieben, die zu ber&uuml;cksichtigenden Steuerelemente mit dem Wert <b>AlsVorlageSpeichern<\/b> f&uuml;r die <b>Tag<\/b>-Eigenschaft best&uuml;cken.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>FormularinhalteSpeichernUndAbrufen.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{490F4C8C-4C8D-4FBF-B871-5DE01D00F98E}\/aiu_958.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Webbrowser kennen diese Funktion dank Add-Ons schon l&auml;nger: Wenn Sie dort Daten in ein Formular eintragen, k&ouml;nnen Sie diese speichern und bei der n&auml;chsten Verwendung des Formulars per Mausklick erneut einf&uuml;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&uuml;tzlich sein &#8211; wenn auch mit leicht unterschiedlichem Ansatz.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662014,66062014,44000023],"tags":[],"class_list":["post-55000958","post","type-post","status-publish","format-standard","hentry","category-662014","category-66062014","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Formularinhalte speichern und wieder abrufen - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Formularinhalte_speichern_und_wieder_abrufen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Formularinhalte speichern und wieder abrufen\" \/>\n<meta property=\"og:description\" content=\"Webbrowser kennen diese Funktion dank Add-Ons schon l&auml;nger: Wenn Sie dort Daten in ein Formular eintragen, k&ouml;nnen Sie diese speichern und bei der n&auml;chsten Verwendung des Formulars per Mausklick erneut einf&uuml;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&uuml;tzlich sein - wenn auch mit leicht unterschiedlichem Ansatz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Formularinhalte_speichern_und_wieder_abrufen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:13:22+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/d5a0ffdfb61a4d17aeddbc7382a82424\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"20\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularinhalte_speichern_und_wieder_abrufen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularinhalte_speichern_und_wieder_abrufen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Formularinhalte speichern und wieder abrufen\",\"datePublished\":\"2020-05-22T21:13:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularinhalte_speichern_und_wieder_abrufen\\\/\"},\"wordCount\":3383,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularinhalte_speichern_und_wieder_abrufen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/d5a0ffdfb61a4d17aeddbc7382a82424\",\"articleSection\":[\"2014\",\"6\\\/2014\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularinhalte_speichern_und_wieder_abrufen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularinhalte_speichern_und_wieder_abrufen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularinhalte_speichern_und_wieder_abrufen\\\/\",\"name\":\"Formularinhalte speichern und wieder abrufen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularinhalte_speichern_und_wieder_abrufen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularinhalte_speichern_und_wieder_abrufen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/d5a0ffdfb61a4d17aeddbc7382a82424\",\"datePublished\":\"2020-05-22T21:13:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularinhalte_speichern_und_wieder_abrufen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularinhalte_speichern_und_wieder_abrufen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularinhalte_speichern_und_wieder_abrufen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/d5a0ffdfb61a4d17aeddbc7382a82424\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/d5a0ffdfb61a4d17aeddbc7382a82424\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Formularinhalte_speichern_und_wieder_abrufen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Formularinhalte speichern und wieder abrufen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Formularinhalte speichern und wieder abrufen - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Formularinhalte_speichern_und_wieder_abrufen\/","og_locale":"de_DE","og_type":"article","og_title":"Formularinhalte speichern und wieder abrufen","og_description":"Webbrowser kennen diese Funktion dank Add-Ons schon l&auml;nger: Wenn Sie dort Daten in ein Formular eintragen, k&ouml;nnen Sie diese speichern und bei der n&auml;chsten Verwendung des Formulars per Mausklick erneut einf&uuml;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&uuml;tzlich sein - wenn auch mit leicht unterschiedlichem Ansatz.","og_url":"https:\/\/access-im-unternehmen.de\/Formularinhalte_speichern_und_wieder_abrufen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:13:22+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/d5a0ffdfb61a4d17aeddbc7382a82424","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"20\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Formularinhalte_speichern_und_wieder_abrufen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Formularinhalte_speichern_und_wieder_abrufen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Formularinhalte speichern und wieder abrufen","datePublished":"2020-05-22T21:13:22+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Formularinhalte_speichern_und_wieder_abrufen\/"},"wordCount":3383,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Formularinhalte_speichern_und_wieder_abrufen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/d5a0ffdfb61a4d17aeddbc7382a82424","articleSection":["2014","6\/2014","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Formularinhalte_speichern_und_wieder_abrufen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Formularinhalte_speichern_und_wieder_abrufen\/","url":"https:\/\/access-im-unternehmen.de\/Formularinhalte_speichern_und_wieder_abrufen\/","name":"Formularinhalte speichern und wieder abrufen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Formularinhalte_speichern_und_wieder_abrufen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Formularinhalte_speichern_und_wieder_abrufen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/d5a0ffdfb61a4d17aeddbc7382a82424","datePublished":"2020-05-22T21:13:22+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Formularinhalte_speichern_und_wieder_abrufen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Formularinhalte_speichern_und_wieder_abrufen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Formularinhalte_speichern_und_wieder_abrufen\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/d5a0ffdfb61a4d17aeddbc7382a82424","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/d5a0ffdfb61a4d17aeddbc7382a82424"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Formularinhalte_speichern_und_wieder_abrufen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Formularinhalte speichern und wieder abrufen"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000958","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000958"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000958\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000958"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000958"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000958"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}