{"id":55000837,"date":"2012-06-01T00:00:00","date_gmt":"2020-05-22T21:54:48","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=837"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"FormularImporter","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/FormularImporter\/","title":{"rendered":"Formular-Importer"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/4f33936f284b45a6a58266be53fdb04f\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Beim Fertigstellen einer jeden Ausgabe von Access im Unternehmen sind auch einige Beispieldatenbanken anzupassen. Manchmal sind einige Schritte n&ouml;tig, um diese rund zu machen, mindestens aber muss das Startformular mit dem Hinweis auf die Herkunft der Datenbank hinzugef&uuml;gt werden. Und jedes Mal nehmen die notwendigen Schritte einige Zeit in Anspruch. Zeit, ein Access-Add-In zu entwickeln, das einem diese Arbeit abnimmt. Dieser Beitrag zeigt, wie Sie solche Aufgaben viel einfacher erledigen.<\/b><\/p>\n<p><b>Ziel des Add-Ins<\/b><\/p>\n<p>Was genau soll der Formular-Importer erledigen In dem Fall, der zum Erstellen dieses Add-Ins f&uuml;hrte, sollen einige Beispieldatenbanken immer mit dem gleichen Startformular ausgestattet werden, die sich lediglich durch einige Kleinigkeiten unterscheiden &#8211; beispielsweise den Titeltext, die Ausgabe oder das Objekt, das nach dem Schlie&szlig;en des Formulars aufgerufen werden soll. Dabei kann es sich um ein Formular oder einen Bericht handeln, aber auch um ein VBA-Modul, eine Tabelle, eine Abfrage oder gar das Beziehungsfenster.<\/p>\n<p>Au&szlig;erdem soll das Formular beim Start der Anwendung angezeigt werden. Dazu m&uuml;ssen Sie normalerweise einen manuellen Eintrag in den Access-Optionen beziehungsweise in den Start-Optionen (Access 2003 und &auml;lter) durchf&uuml;hren.<\/p>\n<p>Das Add-In soll als Men&uuml;-Add-In implementiert werden. Bei Auswahl des Add-Ins soll dieses eine kleine Benutzeroberfl&auml;che anbieten, mit der die variablen Anteile des Formulars ge&auml;ndert werden. Au&szlig;erdem soll es eine Option geben, mit der Sie festlegen k&ouml;nnen, ob das Formular als Startformular angezeigt werden soll.<\/p>\n<p>Bislang habe ich immer ein Startformular von Anwendung zu Anwendung vererbt, indem ich es von der aktuell bearbeiteten Access-Datenbank aus importiert, angepasst und als Startformular festgelegt habe. Kein Problem, wenn man das nur einmal durchf&uuml;hrt, aber wenn diese Aufgabe acht- bis zehnmal hintereinander erledigt werden muss &#8230;<\/p>\n<p><b>Wohin soll es gehen<\/b><\/p>\n<p>Die Grundanforderungen sind definiert. Die Frage ist: Gibt es weitere Anwendungsf&auml;lle f&uuml;r das Formular Sollte man es beispielsweise als globalen Formular-Container verwenden, mit dem man nicht nur eines, sondern gleich alle m&ouml;glichen Formulare verwaltet, die man vielleicht mal in mehr als einer Anwendung ben&ouml;tigt Nein. In diesem Fall halten wir die L&ouml;sung m&ouml;glichst klein und arbeiten auf das Ziel hin. Dabei werden wir einige interessante Techniken entdecken, die Grundlagen f&uuml;r eine gr&ouml;&szlig;ere L&ouml;sung sein k&ouml;nnen.<\/p>\n<p><b>Technische Hintergr&uuml;nde<\/b><\/p>\n<p>Ein Formular soll gespeichert und nach Bedarf in die aktuell ge&ouml;ffnete Anwendung importiert werden. Wie kommt die Formularvorlage in das Add-In Wo speichern wir es Und wie bekommen wir es am einfachsten in die Zielanwendung Diese Fragen kl&auml;ren wir, bevor wir mit der Entwicklung beginnen. Vielleicht kennen Sie bereits die beiden Befehle <b>SaveAsText <\/b>und <b>LoadFromText<\/b>, mit denen Sie Access-Objekte (mit Ausnahme von Tabellen) als Textdatei speichern und wieder einlesen k&ouml;nnen. Diese k&ouml;nnen die Arbeit beim Einlesen und Wiederherstellen von Formularen erheblich erleichtern. Theoretisch ist es nat&uuml;rlich auch m&ouml;glich, das Formular auf Basis der Vorlage komplett neu anzulegen und Steuerelement f&uuml;r Steuerelement, Eigenschaft f&uuml;r Eigenschaft aufzubauen. Theoretisch sollte sich dies sogar innerhalb einiger Schleifen &uuml;ber Steuerelemente und Eigenschaft realisieren lassen, aber die Methode mit der Textdatei als Zwischenstation ist doch etwas leichtg&auml;ngiger.<\/p>\n<p>Wir starten mit dem Import, der logischerweise bei ge&ouml;ffneter Quelldatei erfolgt. Hier soll das Formular, ausgestattet mit entsprechenden Platzhaltern, die durch eckige Klammern markiert werden, in das Add-In eingelesen werden. Dazu wird das Formular per <b>SaveAsText <\/b>als Textdatei gespeichert und mit den herk&ouml;mmlichen Anweisungen zum Einlesen von Textdateien in eine Tabelle der Add-In-Datenbank geschrieben.<\/p>\n<p>Wenn Platzhalter verwendet werden sollen, m&uuml;ssen diese vor dem Importieren in die Add-In-Datenbank eingebaut werden. Dies gilt sowohl f&uuml;r Eigenschaften von Steuerelementen als auch f&uuml;r Codezeilen &#8211; mehr dazu sp&auml;ter.<\/p>\n<p>Nach dem &Ouml;ffnen der Zieldatei wird diese Vorlage nach Eingabe der Texte f&uuml;r die Platzhalter aus der Tabelle ins Dateisystem gespeichert und mit der Methode <b>LoadFromText <\/b>in die Zieldatenbank importiert.<\/p>\n<p><b>Add-In vorbereiten<\/b><\/p>\n<p>Als Add-In-Datenbank verwenden wir eine herk&ouml;mmliche Datenbankdatei, die wir um einige Elemente erweitern. Vergeben Sie f&uuml;r die Add-In-Datenbank die Dateiendung <b>.mda <\/b>beziehungsweise <b>.accda<\/b>, damit der Add-In-Manager diese Datenbanken gleich als Add-In-Datenbanken erkennt.<\/p>\n<p>Legen Sie dann eine Tabelle namens <b>USysRegInfo <\/b>an, die beim Installieren des Add-Ins mit dem Add-In-Manager einige Eintr&auml;ge zur die Registry hinzuf&uuml;gt. Dadurch wird die Datenbank beim Start von Access in die Liste der verf&uuml;gbaren Add-Ins aufgenommen und gemeinsam mit den &uuml;brigen Men&uuml;-Add-Ins angezeigt. Die Tabelle sieht wie in Bild 1 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_03\/FormularImporter-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Die Tabelle USysRegInfo enth&auml;lt Informationen, die beim Installieren des Add-Ins in die Registry eingetragen werden.<\/span><\/b><\/p>\n<p>F&uuml;gen Sie au&szlig;erdem ein Standardmodul namens <b>mdlAddIn <\/b>zur Datenbank hinzu (Sie k&ouml;nnen diesem auch einen anderen Namen geben). Tragen Sie dort die folgende Funktion ein:<\/p>\n<pre>Public Function Autostart()\r\n    DoCmd.OpenForm &quot;frmFormularImporter&quot;, WindowMode:=acDialog\r\nEnd Function<\/pre>\n<p>Diese &ouml;ffnet beim Ausw&auml;hlen des Men&uuml;-Add-Ins das angegebene Formular. Dieses m&uuml;ssen Sie nat&uuml;rlich auch noch anlegen. F&uuml;r den Anfang m&ouml;chten wir einfach nur Formulardefinitionen in einer Tabelle der Add-In-Datenbank speichern, wozu ein Kombinationsfeld und eine <b>OK<\/b>-Schaltfl&auml;che ausreichen.<\/p>\n<p><b>Formular im Add-In speichern<\/b><\/p>\n<p>Die Formulardefinitionen sollen in einer Tabelle namens <b>frmFormulare<\/b> gespeichert werden. Diese Tabelle ist wie in Bild 2 aufgebaut. Sie enth&auml;lt zwei Felder zum Speichern des Formularnamens und des Formularcodes.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_03\/FormularImporter-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Tabelle zum Speichern der Formulardefinitionen<\/span><\/b><\/p>\n<p>Wie aber gelangen die Formulardefinitionen in diese Tabelle Dazu benutzen wir die bereits erw&auml;hnten beiden Steuerelemente im Formular <b>frmFormularImporter<\/b> (s. Bild 3). Das Kombinationsfeld <b>frmFormulare<\/b> soll alle Formulare der Datenbank anzeigen, von der aus Sie das Add-In ge&ouml;ffnet haben. Dazu k&ouml;nnen wir nicht einfach eine Abfrage auf Basis der Tabelle <b>MSysObjects <\/b>als Datenherkunft verwenden, die ja auch alle Formulare enth&auml;lt &#8211; Sie w&uuml;rden dann auf die Tabelle <b>MSysObjects <\/b>der Add-In-Datenbank zugreifen und deren Formulare anzeigen. Also definieren wir eine Tabelle namens <b>tblFormulareTemp<\/b>, die nur ein Feld namens <b>Formular <\/b>enth&auml;lt, und f&uuml;llen diese in einer Schleife &uuml;ber alle Elemente der Auflistung <b>AllForms <\/b>der Host-Datenbank mit den jeweiligen Formularnamen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_03\/FormularImporter-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Formular mit den ersten Steuerelementen zum Importieren der Formulardefinitionen<\/span><\/b><\/p>\n<p>Diese Tabelle wird anschlie&szlig;end, sortiert nach den Formularnamen, als Datensatzherkunft des Kombinationsfeldes festgelegt. Wie aber unterscheiden wir zwischen der Host- und der Add-In-Datenbank Dies gelingt mithilfe der Varianten zweier Funktionen, die den Zugriff auf die beiden Instanzen erlauben. Mit <b>CodeDB <\/b>und <b>CodeProject <\/b>greifen Sie auf die Add-In-Datenbank zu, mit <b>CurrentDB <\/b>und <b>CurrentProject <\/b>auf die Host-Datenbank. Deshalb greifen wir mit <b>CurrentProject <\/b>auf die <b>AllForms<\/b>-Auflistung zu und schreiben diese dann &uuml;ber das mit der Funktion <b>CodeDB <\/b>gewonnene <b>Database<\/b>-Objekt in die entsprechende Tabelle der Add-In-Datenbank (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-52-anchor\">Listing 1<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 1: Anzeigen aller Formulare der Host-Tabelle im Kombinationsfeld<\/p>\n<pre>Private Sub Form_Load()\r\n    Dim db As dao.Database\r\n    Dim rst As dao.Recordset\r\n    Dim i As Integer\r\n    Set db = CodeDb\r\n    db.Execute &quot;DELETE FROM tblFormulareTemp&quot;, dbFailOnError\r\n    Set rst = db.OpenRecordset(&quot;tblFormulareTemp&quot;, dbOpenDynaset)\r\n    For i = 0 To CurrentProject.AllForms.Count - 1\r\n        rst.AddNew\r\n        rst!Formular = CurrentProject.AllForms(i).Name\r\n        rst.Update\r\n    Next i\r\n    Me!cboFormulare.RowSource = &quot;SELECT * FROM tblFormulareTemp ORDER BY Formular&quot;\r\nEnd Sub<\/pre>\n<p>Damit kann der Benutzer nun zumindest schon einmal die in der Host-Datenbank enthaltenen Formulare anzeigen und das zu importierende Formular ausw&auml;hlen.<\/p>\n<p><b>Formulardefinition einlesen<\/b><\/p>\n<p>Nach der Auswahl soll ein Klick auf die <b>Speichern<\/b>-Taste die Formular-Definition in die Tabelle <b>tblFormulare <\/b>schreiben. Die entsprechende Ereignisprozedur speichert die Formulardefinition zun&auml;chst mit der <b>SaveAsText<\/b>-Methode in eine Textdatei namens <b>frmXXX.txt<\/b>, und zwar im gleichen Verzeichnis wie die Add-In-Datei (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-65-anchor\">Listing 2<\/a><\/span>). Dann verwendet sie die <b>Open<\/b>-, <b>Input$<\/b>&#8211; und <b>Close<\/b>-Methode, um den Inhalt der Textdatei in eine <b>String<\/b>-Variable zu schreiben. Der Formularcode wird dann per <b>AddNew<\/b>, Zuweisen der Feldwerte und <b>Update <\/b>in ein Recordset auf Basis der Tabelle <b>tblFormulare<\/b> geschrieben &#8211; das aber nur, wenn noch kein gleichnamiges Formular gespeichert wurde. Falls doch, kann der Benutzer einen alternativen Namen angeben oder das vorhandene Formular &uuml;berschreiben. Gibt der Benutzer keinen neuen Namen ein, wird der vorhandene Datensatz gel&ouml;scht. Danach ermittelt die Prozedur den Wert des Prim&auml;rschl&uuml;sselfeldes des soeben neu angelegten Datensatzes. Mit diesem ruft sie die Prozedur <b>PlatzhalterSpeichern <\/b>auf &#8211; dazu sp&auml;ter mehr. <\/p>\n<p class=\"listingueberschrift\">Listing 2: Einlesen einer Formulardefinition in die Add-In-Datenbank<\/p>\n<pre>Private Sub cmdSpeichern_Click()\r\n    Dim strForm As String\r\n    Dim strFormname As String\r\n    Dim dbc As dao.Database\r\n    Dim rst As dao.Recordset\r\n    Dim lngFormularID As Long\r\n    Set dbc = CodeDb\r\n    SaveAsText acForm, Me!cboFormulare, CodeProject.Path &amp; &quot;\\frmXXX.txt&quot;\r\n    Open CodeProject.Path &amp; &quot;\\frmXXX.txt&quot; For Input As #1\r\n    strForm = Input$(LOF(1), #1)\r\n    strFormname = Me!cboFormulare\r\n    If Not dbc.OpenRecordset(&quot;SELECT * FROM tblFormulare WHERE Formularname = ''&quot; &amp; strFormname &amp; &quot;''&quot;).EOF Then\r\n        strFormname = InputBox(&quot;Es ist bereits ein Formular namens ''&quot; &amp; strFormname _\r\n            &amp; &quot;'' vorhanden. Geben Sie einen anderen Namen ein, anderenfalls wird das vorhandene &quot; _\r\n            &amp; &quot;Formular gel&ouml;scht.&quot;, &quot;Formular schon vorhanden&quot;, strFormname)\r\n    End If\r\n    dbc.Execute &quot;DELETE FROM tblFormulare WHERE Formularname = ''&quot; &amp; strFormname &amp; &quot;''&quot;, dbFailOnError\r\n    Set rst = dbc.OpenRecordset(&quot;SELECT * FROM tblFormulare WHERE 1=2&quot;, dbOpenDynaset)\r\n    rst.AddNew\r\n    rst!Formularname = strFormname\r\n    rst!Formularcode = strForm\r\n    lngFormularID = rst!FormularID\r\n    rst.Update\r\n    PlatzhalterSpeichern strForm, lngFormularID\r\n    Close #1\r\n    Kill CodeProject.Path &amp; &quot;\\frmXXX.txt&quot;\r\n    Me!lstFormulare.Requery\r\n    Me!lstFormulare = lngFormularID\r\n    PlatzhalterAktualisieren\r\nEnd Sub<\/pre>\n<p><!--30percent--><\/p>\n<p>Schlie&szlig;lich l&ouml;scht die <b>Kill<\/b>-Methode die tempor&auml;r gespeicherte Textdatei wieder und weitere Steuerelemente werden aktualisiert &#8211; auch auf diese kommen wir sp&auml;ter zur&uuml;ck. Der erste Teil w&auml;re somit geschafft &#8211; Sie k&ouml;nnen den Code kompletter Formulare in eine Tabelle der Add-In-Datenbank schreiben.<\/p>\n<p><b>Platzhalter verwalten<\/b><\/p>\n<p>Wie bereits erw&auml;hnt, wollen wir einen gewissen flexiben Anteil beim Erstellen eines neuen Formulars auf Basis eines im Add-In gespeicherten Formulars erhalten. Deshalb k&ouml;nnen Sie in den Eigenschaften und im Code des zu speichernden Formulars Platzhalter unterbringen, die in eckigen Klammern eingefasst sein m&uuml;ssen. Diese werden gleich beim Einlesen des Formulars in eine weitere Tabelle namens <b>tblPlatzhalter <\/b>geschrieben (s. Bild 4).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_03\/FormularImporter-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Diese Tabelle speichert Platzhalter und ihre Standardwerte.<\/span><\/b><\/p>\n<p>Diese Aufgabe f&uuml;hrt die Prozedur <b>PlatzhalterSpeichern<\/b> aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-55-anchor\">Listing 3<\/a><\/span> durch. Sie erwartet den Code des Formulars sowie die ID des Datensatzes in der Tabelle <b>tblFormulare<\/b> als Parameter. Die Prozedur ermittelt mit der <b>InStr<\/b>-Funktion zun&auml;chst die Position der ersten &ouml;ffnenden eckigen Klammer (<b>[<\/b>). Liefert dies einen Wert gr&ouml;&szlig;er <b>0<\/b>, sucht die Prozedur auch noch nach der passenden schlie&szlig;enden Klammer. Der Ausdruck dazwischen k&ouml;nnte ein Platzhalter sein, aber auch die Zuweisung des Wertes <b>[Event Procedure] <\/b>zu einer Ereigniseigenschaft des Formulars. Diese sollen nat&uuml;rlich nicht als Platzhalter erkannt werden, daher &uuml;bergeht die Prozedur diese. In allen anderen F&auml;llen schreibt die Prozedur den Namen des Platzhalters in die Tabelle <b>tblPlatzhalter<\/b>. Dieser Vorgang wird so lange wiederholt, bis keine &ouml;ffnende Klammer mehr gefunden wird.<\/p>\n<p class=\"listingueberschrift\">Listing 3: Speichern der in einem Formular enthaltenen Platzhalter<\/p>\n<pre>Private Sub PlatzhalterSpeichern(strForm As String, lngFormularID As Long)\r\n    Dim dbc As dao.Database\r\n    Dim lngStart As Long\r\n    Dim lngStop As Long\r\n    Dim strPlatzhalter As String\r\n    Set dbc = CodeDb\r\n    lngStart = InStr(1, strForm, &quot;[&quot;)\r\n    Do While lngStart &gt; 0\r\n        lngStop = InStr(lngStart + 1, strForm, &quot;]&quot;)\r\n        strPlatzhalter = Mid(strForm, lngStart + 1, lngStop - lngStart - 1)\r\n        Select Case strPlatzhalter\r\n            Case &quot;Event Procedure&quot;\r\n            Case Else\r\n                dbc.Execute &quot;INSERT INTO tblPlatzhalter(Platzhalter, FormularID) VALUES(''&quot; _\r\n                    &amp; strPlatzhalter &amp; &quot;'', &quot; &amp; lngFormularID &amp; &quot;)&quot;, dbFailOnError\r\n        End Select\r\n        lngStart = InStr(lngStop + 1, strForm, &quot;[&quot;)\r\n    Loop\r\nEnd Sub<\/pre>\n<p><b>Unterformular zur Anzeige der Platzhalter<\/b><\/p>\n<p>Die Platzhalter werden in einem Unterformular namens <b>sfmPlatzhalter <\/b>verwaltet. Dieses verwendet die Tabelle <b>tblPlatzhalter <\/b>als Basis-Datenherkunft. Diese wird jedoch gelegentlich aktualisiert &#8211; beispielsweise, wenn soeben ein neues Formular samt Platzhalter-Datens&auml;tzen eingelesen wurde.<\/p>\n<p>Dies f&uuml;hrt die folgende Prozedur durch:<\/p>\n<pre>Private Sub PlatzhalterAktualisieren()\r\n    If Me!lstFormulare.ListCount &gt; 0 Then\r\n        Me!sfmPlatzhalter.Form.RecordSource = &quot;SELECT * FROM tblPlatzhalter WHERE &quot; _\r\n            &amp; &quot;FormularID = &quot; &amp; Me!lstFormulare\r\n    Else\r\n        Me!sfmPlatzhalter.Form.RecordSource = &quot;SELET * FROM tblPlatzhalter&quot;\r\n    End If\r\nEnd Sub<\/pre>\n<p>Wie dieses Formular in das Hauptformular <b>frmFormularimporter <\/b>eingef&uuml;gt wird, beschreiben wir weiter unten.<\/p>\n<p><b>Gespeicherte Formulare anzeigen<\/b><\/p>\n<p>Da Sie mit dem <b>FormularImporter<\/b> mehr als nur ein Formular speichern und in andere Datenbanken einf&uuml;gen k&ouml;nnen, soll das Formular <b>frmFormularImporter <\/b>diese in einem Listenfeld anzeigen. Von dort aus k&ouml;nnen Formularvorlagen zum Einf&uuml;gen in die aktuelle Datenbank oder zum L&ouml;schen ausgew&auml;hlt werden. Mit den entsprechenden Schaltfl&auml;chen und mit integriertem Unterformular sieht das Formular <b>frmFormularImporter <\/b>im Entwurf nun wie in Bild 5 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_03\/FormularImporter-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Das vollst&auml;ndige Hauptformular in der Entwurfsansicht<\/span><\/b><\/p>\n<p><b>L&ouml;schen einer Formulardefinition<\/b><\/p>\n<p>Die Schaltfl&auml;che <b>cmdLoeschen <\/b>soll eine in der Tabelle <b>tblFormulare <\/b>gespeicherte Formulardefinition nach der Auswahl des entsprechenden Eintrags im Listenfeld <b>lstFormulare <\/b>l&ouml;schen. Die durch diese Schaltfl&auml;che ausgel&ouml;ste Prozedur sieht so aus:<\/p>\n<pre>Private Sub cmdLoeschen_Click()\r\n    Dim dbc As dao.Database\r\n    Set dbc = CodeDb\r\n    dbc.Execute &quot;DELETE FROM tblFormulare WHERE FormularID = &quot; &amp; Me!lstFormulare\r\n    Me!lstFormulare.Requery\r\n    Me!lstFormulare = Me!lstFormulare.ItemData(0)\r\n    PlatzhalterAktualisieren\r\nEnd Sub<\/pre>\n<p>Die Prozedur l&ouml;scht den angegebenen Datensatz, aktualisiert dann das Listenfeld und aktiviert den ersten Eintrag. Anschlie&szlig;end wird die Prozedur <b>PlatzhalterAktualisieren <\/b>aufgerufen, damit das Unterformular die zur aktuell ausgew&auml;hlten Formularvorlage passenden Platzhalter anzeigt.<\/p>\n<p><b>Anlegen von Formularen<\/b><\/p>\n<p>Kommen wir zu der Funktion, die aus dem in der Tabelle <b>tblFormulare <\/b>gespeicherten Formularcode ein neues Formular in der Zieltabelle erstellt. Die beim Mausklick auf die Schaltfl&auml;che <b>Erstellen <\/b>ausgel&ouml;ste Prozedur finden Sie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-57-anchor\">Listing 4<\/a><\/span>.<\/p>\n<p class=\"listingueberschrift\">Listing 4: Anlegen eines neuen Formulars auf Basis einer gespeicherten Formulardefinition<\/p>\n<pre>Private Sub cmdErstellen_Click()\r\n    Dim dbc As dao.Database\r\n    Dim rst As dao.Recordset\r\n    Dim strForm As String\r\n    Dim strFormularname As String\r\n    Dim strDateiname As String\r\n    Set dbc = CodeDb\r\n    If Not IsNull(Me!lstFormulare) Then\r\n        Set rst = dbc.OpenRecordset(&quot;SELECT * FROM tblFormulare WHERE FormularID = &quot; _\r\n            &amp; Me!lstFormulare)\r\n        strForm = rst!Formularcode\r\n        strFormularname = rst!Formularname\r\n        strForm = PlatzhalterErsetzen(strForm, Me!lstFormulare)\r\n        strForm = Replace(strForm, &quot;NoSaveCTIWhenDisabled =1&quot;, &quot;&quot;)\r\n        strDateiname = CodeProject.Path &amp; &quot;\\frmXXX.txt&quot;\r\n        Open strDateiname For Output As #1\r\n        Print #1, strForm\r\n        Close #1\r\n        If FormularVorhanden(strFormularname) Then\r\n            MsgBox &quot;Es ist bereits ein Formular gleichen Namens vorhanden. &quot; _\r\n                &amp; &quot;Das Formular wurde nicht angelegt.&quot;\r\n        Else\r\n            LoadFromText acForm, strFormularname, strDateiname\r\n            If Me!chkStandardformular Then\r\n                SetProperty &quot;StartupForm&quot;, dbText, strFormularname\r\n            End If\r\n        End If\r\n    End If\r\nEnd Sub<\/pre>\n<p>Die Prozedur pr&uuml;ft zun&auml;chst, ob der Benutzer &uuml;berhaupt einen Eintrag des Listenfeldes <b>lstFormulare <\/b>ausgew&auml;hlt hat (s. Bild 6). Dies ist eigentlich immer der Fall &#8211; au&szlig;er, wenn das Listenfeld &uuml;berhaupt keinen Eintrag enth&auml;lt.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_03\/FormularImporter-web-images\/pic006.png\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Das fertige Formular zum Hinzuf&uuml;gen gespeicherter Formulare zur aktuell ge&ouml;ffneten Datenbank<\/span><\/b><\/p>\n<p>Wurde eine Formulardefinition ausgew&auml;hlt, &ouml;ffnet die Prozedur zun&auml;chst eine Datensatzgruppe auf Basis der Tabelle <b>tblFormulare<\/b>, die genau den ausgew&auml;hlten Datensatz enth&auml;lt. Die Variablen <b>strForm <\/b>und <b>strFormularname <\/b>nehmen den Code des Formulars sowie den in der Tabelle gespeicherten Namen auf.<\/p>\n<p>Der Formularcode wird direkt im Anschluss durch die Funktion <b>PlatzhalterErsetzen <\/b>gejagt, die sich darum k&uuml;mmert, die Platzhalter durch die in der Tabelle <b>tblPlatzhalter <\/b>gespeicherten Werte zu ersetzen. Details zu dieser Funktion finden Sie weiter unten. Das Extrakt wird nochmal um eine Zeichenkette erleichtert, die eine Eigenschaft von Formularen unter neueren Access-Versionen repr&auml;sentiert und die beim Einlesen in &auml;lteren Versionen mit der Methode <b>LoadFromText <\/b>Fehler verursacht.<\/p>\n<p>Dann speichert die Prozedur den Formularcode unter dem Namen <b>frmXXX.txt <\/b>im Verzeichnis der Add-In-Datenbank. Bevor die entstandene Datei mit der Methode <b>LoadFromText <\/b>zur Zieldatenbank hinzugef&uuml;gt wird, pr&uuml;ft die Prozedur noch, ob gegebenenfalls bereits ein Formular mit gleichem Namen wie das Ausgangsformular in der Datenbank vorhanden ist. Ist dies der Fall, wird das Importieren des Formulars mit einer entsprechenden Meldung abgebrochen.<\/p>\n<p>Anderenfalls liest die Methode <b>LoadFromText <\/b>den Formularcode in Form eines neuen Formulars in die Zieldatenbank ein.<\/p>\n<p>Einen Schritt sp&auml;ter pr&uuml;ft die Prozedur noch, ob das Kontrollk&auml;stchen <b>chkStandardformular <\/b>im Formular <b>frmFormularImporter <\/b>aktiviert ist.<\/p>\n<p>In diesem Fall soll das frisch importierte Formular als Startformular der Zieldatenbank festgelegt werden. Dies erledigt die Funktion <b>SetProperty<\/b>, die ebenfalls im Anschluss erl&auml;utert wird. Fertig &#8211; das gew&uuml;nschte Formular ist nun einsatzbereit und wird nach Wunsch gleich beim &Ouml;ffnen der Anwendung eingeblendet!<\/p>\n<p><b>Formular als Standardformular festlegen<\/b><\/p>\n<p>Die Funktion <b>SetProperty <\/b>aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-61-anchor\">Listing 5<\/a><\/span> stellt die &uuml;bergebene Eigenschaft auf den angegebenen Wert ein. Wichtig ist dabei, dass eine Datenbank gegebenenfalls noch &uuml;ber keine entsprechende Eigenschaft verf&uuml;gt und diese erst noch angelegt werden muss. Auch dies f&uuml;hrt die Prozedur durch.<\/p>\n<p class=\"listingueberschrift\">Listing 5: Diese Funktion stellt eine Formular-Eigenschaft ein.<\/p>\n<pre>Function SetProperty(strProperty As String, varType As Variant, varValue As Variant) As Boolean\r\n    Dim db As dao.Database\r\n    Dim prp As dao.Property\r\n    On Error GoTo Fehler\r\n    Set db = CurrentDb\r\n    db.Properties(strProperty) = varValue\r\n    SetProperty = True\r\nEnde:\r\n    On Error Resume Next\r\n    ''Hier finale Anweisungen\r\n    Exit Function\r\nFehler:\r\n    Select Case Err.Number\r\n        Case 3270\r\n            Set prp = db.CreateProperty(strProperty, varType, varValue)\r\n            db.Properties.Append prp\r\n        Case 0\r\n        Case Else\r\n            SetProperty = False\r\n            Resume Ende\r\n    End Select\r\nEnd Function<\/pre>\n<p><b>Pr&uuml;fen, ob ein Formular vorhanden ist<\/b><\/p>\n<p>Im Gegensatz zu der Funktion, die oft eingesetzt wird, um zu pr&uuml;fen, ob ein Formular mit dem angegebenen Namen ge&ouml;ffnet ist, verwendet die Prozedur <b>FormularVorhanden <\/b>einen etwas anderen Ansatz (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-60-anchor\">Listing 6<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 6: Pr&uuml;fen, ob ein Formular bereits in einer Datenbank vorliegt<\/p>\n<pre>Private Function FormularVorhanden(strFormular As String) As Boolean\r\n    Dim i As Integer\r\n    For i = 0 To CurrentProject.AllForms.Count - 1\r\n        If CurrentProject.AllForms(i).Name = strFormular Then\r\n            FormularVorhanden = True\r\n            Exit Function\r\n        End If\r\n    Next i\r\nEnd Function<\/pre>\n<p>Sie durchl&auml;uft alle Eintr&auml;ge der Auflistung <b>AllForms <\/b>und liefert den Wert <b>True<\/b>, sobald es ein Formular mit dem angegebenen Namen findet. Anderenfalls gibt sie den Wert <b>False <\/b>zur&uuml;ck.<\/p>\n<p><b>Platzhalter ersetzen<\/b><\/p>\n<p>Das Ersetzen der Platzhalter erledigt die Prozedur aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-59-anchor\">Listing 7<\/a><\/span>. Sie &ouml;ffnet ein Recordset auf Basis der Tabelle <b>tblPlatzhalter<\/b>, wobei nur die Datens&auml;tze ermittelt werden, deren <b>FormularID <\/b>dem zu importierenden Formular entsprechen. In einer <b>Do While<\/b>-Schleife werden dann alle Platzhalter durch die in der Tabelle gespeicherten Werte ersetzt.<\/p>\n<p class=\"listingueberschrift\">Listing 7: Ersetzen der Platzhalter durch die tats&auml;chlichen Werte<\/p>\n<pre>Private Function PlatzhalterErsetzen(strForm As String, lngFormularID As Long) As String\r\n    Dim dbc As dao.Database\r\n    Dim rst As dao.Recordset\r\n    Set dbc = CodeDb\r\n    Set rst = dbc.OpenRecordset(&quot;SELECT * FROM tblPlatzhalter WHERE FormularID = &quot; &amp; lngFormularID)\r\n    Do While Not rst.EOF\r\n        strForm = Replace(strForm, &quot;[&quot; &amp; rst!Platzhalter &amp; &quot;]&quot;, rst!Wert)\r\n        rst.MoveNext\r\n    Loop\r\n    PlatzhalterErsetzen = strForm\r\nEnd Function<\/pre>\n<p><b>Fehler bei LoadFromText ermitteln<\/b><\/p>\n<p>Sollten Sie auf Fehler beim Ausf&uuml;hren der Anweisung <b>LoadFromText <\/b>sto&szlig;en, erhalten Sie eine wenig aussagekr&auml;ftige Fehlermeldung (s. Bild 9):<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_03\/FormularImporter-web-images\/pic007.png\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Fehler beim Importieren eines Formulars<\/span><\/b><\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_03\/FormularImporter-web-images\/pic008.png\" alt=\"pic008.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Das Ausf&uuml;hren im Direktfenster liefert n&auml;here Informationen, &#8230;<\/span><\/b><\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_03\/FormularImporter-web-images\/pic009.png\" alt=\"pic009.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 9: &#8230; die sich in der angegebenen Textdatei konkretisieren.<\/span><\/b><\/p>\n<pre>NoSaveCTIWhenDisabled =1<\/pre>\n<p>F&uuml;gen Sie dem Add-In Code hinzu, der solche Textzeilen vor dem Anlegen des Formulars entfernt, damit es ordnungsgem&auml;&szlig; funktioniert.<\/p>\n<p><b>Add-In installieren<\/b><\/p>\n<p>Das Add-In installieren Sie auf herk&ouml;mmliche Weise. Sie kopieren es in ein beliebiges Verzeichnis auf Ihrem Rechner und rufen dann in Access den Add-In-Manager auf. Dort klicken Sie auf <b>Hinzuf&uuml;gen&#8230; <\/b>(variiert je nach Access-Version) und w&auml;hlen die Datei <b>FormularImporter <\/b>aus. Danach k&ouml;nnen Sie den FormularImporter &uuml;ber den gleichnamigen Eintrag in der Liste der Men&uuml;-Add-Ins ausw&auml;hlen.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Diese L&ouml;sung l&auml;sst sich beliebig ausbauen, bietet aber bereits jetzt eine enorme Erleichterung, wenn Sie oft ben&ouml;tigte Formulare schnell in eine Datenbank importieren m&ouml;chten. Sie m&uuml;ssen einfach nicht mehr die sonst n&ouml;tigen Schritte &uuml;ber den Import-Assistenten von Access gehen.<\/p>\n<p>Dieses Tool l&auml;sst sich auf weitere Objekttypen erweitern, beispielsweise auf Tabellen. Hier steckt der Teufel jedoch im Detail, denn eine Tabelle steht in den seltensten F&auml;llen f&uuml;r sich allein. Gut: Wenn Sie schlicht und einfach die Tabelle <b>tblAnreden <\/b>einer Anwendung schnell importieren wollen, anstatt diese neu zu erstellen, hilft ein Add-In wohl weiter. Sobald Tabellen jedoch mit anderen Tabellen verkn&uuml;pft sind, wird es kompliziert.<\/p>\n<p>Gleiches gilt &uuml;brigens auch f&uuml;r komplexere Formulare, die Funktionen etwa aus Standardmodulen verwenden oder gar Objekte auf Basis von Klassenmodulen instanzieren. Diese m&uuml;ssten Sie dann separat importieren oder entsprechende Pakete zusammenstellen, die s&auml;mtliche Abh&auml;ngigkeiten ber&uuml;cksichtigen. Im ersten Anlauf belassen wir es daher bei einem einfachen Formular-Import-Assistenten.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>FormularImporter.mda<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{9ACB73F7-876B-4C28-A8CA-DF05D9DC05D9}\/aiu_837.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Beim Fertigstellen einer jeden Ausgabe von Access im Unternehmen sind auch einige Beispieldatenbanken anzupassen. Manchmal sind einige Schritte n&ouml;tig, um diese rund zu machen, mindestens aber muss das Startformular mit den Hinweis auf die Herkunft der Datenbank hinzugef&uuml;gt werden. Und jedes Mal nehmen die notwendigen Schritte einige Zeit in Anspruch. Zeit, ein Access-Add-In zu entwickeln, das einem diese Arbeit abnimmt. Dieser Beitrag zeigt, wie Sie solche Aufgaben viel einfacher erledigen.<\/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":[662012,66032012,44000020],"tags":[],"class_list":["post-55000837","post","type-post","status-publish","format-standard","hentry","category-662012","category-66032012","category-Tools"],"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>Formular-Importer - 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\/FormularImporter\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Formular-Importer\" \/>\n<meta property=\"og:description\" content=\"Beim Fertigstellen einer jeden Ausgabe von Access im Unternehmen sind auch einige Beispieldatenbanken anzupassen. Manchmal sind einige Schritte n&ouml;tig, um diese rund zu machen, mindestens aber muss das Startformular mit den Hinweis auf die Herkunft der Datenbank hinzugef&uuml;gt werden. Und jedes Mal nehmen die notwendigen Schritte einige Zeit in Anspruch. Zeit, ein Access-Add-In zu entwickeln, das einem diese Arbeit abnimmt. Dieser Beitrag zeigt, wie Sie solche Aufgaben viel einfacher erledigen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/FormularImporter\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:54:48+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg05.met.vgwort.de\/na\/4f33936f284b45a6a58266be53fdb04f\" \/>\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=\"17\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/FormularImporter\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/FormularImporter\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Formular-Importer\",\"datePublished\":\"2020-05-22T21:54:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/FormularImporter\\\/\"},\"wordCount\":2759,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/FormularImporter\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/4f33936f284b45a6a58266be53fdb04f\",\"articleSection\":[\"2012\",\"3\\\/2012\",\"Tools\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/FormularImporter\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/FormularImporter\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/FormularImporter\\\/\",\"name\":\"Formular-Importer - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/FormularImporter\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/FormularImporter\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/4f33936f284b45a6a58266be53fdb04f\",\"datePublished\":\"2020-05-22T21:54:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/FormularImporter\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/FormularImporter\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/FormularImporter\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/4f33936f284b45a6a58266be53fdb04f\",\"contentUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/4f33936f284b45a6a58266be53fdb04f\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/FormularImporter\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Formular-Importer\"}]},{\"@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":"Formular-Importer - 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\/FormularImporter\/","og_locale":"de_DE","og_type":"article","og_title":"Formular-Importer","og_description":"Beim Fertigstellen einer jeden Ausgabe von Access im Unternehmen sind auch einige Beispieldatenbanken anzupassen. Manchmal sind einige Schritte n&ouml;tig, um diese rund zu machen, mindestens aber muss das Startformular mit den Hinweis auf die Herkunft der Datenbank hinzugef&uuml;gt werden. Und jedes Mal nehmen die notwendigen Schritte einige Zeit in Anspruch. Zeit, ein Access-Add-In zu entwickeln, das einem diese Arbeit abnimmt. Dieser Beitrag zeigt, wie Sie solche Aufgaben viel einfacher erledigen.","og_url":"https:\/\/access-im-unternehmen.de\/FormularImporter\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:54:48+00:00","og_image":[{"url":"http:\/\/vg05.met.vgwort.de\/na\/4f33936f284b45a6a58266be53fdb04f","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/FormularImporter\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/FormularImporter\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Formular-Importer","datePublished":"2020-05-22T21:54:48+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/FormularImporter\/"},"wordCount":2759,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/FormularImporter\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/4f33936f284b45a6a58266be53fdb04f","articleSection":["2012","3\/2012","Tools"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/FormularImporter\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/FormularImporter\/","url":"https:\/\/access-im-unternehmen.de\/FormularImporter\/","name":"Formular-Importer - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/FormularImporter\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/FormularImporter\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/4f33936f284b45a6a58266be53fdb04f","datePublished":"2020-05-22T21:54:48+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/FormularImporter\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/FormularImporter\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/FormularImporter\/#primaryimage","url":"http:\/\/vg05.met.vgwort.de\/na\/4f33936f284b45a6a58266be53fdb04f","contentUrl":"http:\/\/vg05.met.vgwort.de\/na\/4f33936f284b45a6a58266be53fdb04f"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/FormularImporter\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Formular-Importer"}]},{"@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\/55000837","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=55000837"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000837\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000837"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000837"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000837"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}