{"id":55000727,"date":"2010-06-01T00:00:00","date_gmt":"2020-05-22T22:13:42","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=727"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Suchformularassistent","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Suchformularassistent\/","title":{"rendered":"Suchformularassistent"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg01.met.vgwort.de\/na\/7ea8502e486b4df280457e4e2ba9caad\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Im Beitrag &#8222;Suchformulare f&uuml;r die Datenblattansicht&#8220; haben Sie ein einfach zu erstellendes Suchformular kennengelernt. Dieses ist so praktisch, dass Sie es hoffentlich gleich in Ihre Datenbanken einbauen. Damit ist allerdings immer noch ein wenig Arbeit verbunden: Immerhin m&uuml;ssen Sie noch die Steuerelemente f&uuml;r die Eingabe der Suchbegriffe anlegen. Das ist eigentlich nicht allzuviel Arbeit, aber warum selbst Hand anlegen, wenn man dies einfach per Assistent erledigen k&ouml;nnen<\/b><\/p>\n<p>Mit dem Suchformular aus dem Beitrag <b>Suchformular f&uuml;r die Datenblattansicht <\/b>(<b>www.access-im-unternehmen.de\/724<\/b>) haben wir eine solide Basis f&uuml;r die flexible Neuerstellung eines Suchformulars in Abh&auml;ngigkeit von der jeweils zu filternden Datenherkunft. Den Code dieses Formulars brauchen Sie quasi gar nicht anzufassen, Sie m&uuml;ssen lediglich die Steuerelemente zum Eingeben der Suchkriterien hineinschreiben.<\/p>\n<p>Im Beitrag <b>Formulare generieren <\/b>(<b>www.access-im-unternehmen.de\/709<\/b>) haben Sie bereits einige Techniken zum Erstellen von Formularen und zum Hinzuf&uuml;gen von Steuerelementen kennengelernt. F&uuml;r den nachfolgend beschriebenen Assistenten brauchen wir allerdings gar nicht von Grund auf zu beginnen: Die Basis des Suchformulars (siehe Bild 1) besteht ja schon, das Bezeichnungsfeld f&uuml;r die &Uuml;berschrift und die drei Schaltfl&auml;chen <b>Suchen<\/b>, <b>Leeren <\/b>und <b>Abbrechen <\/b>k&ouml;nnen wir auch beibehalten &#8211; genauso wie den kompletten Code des Formulars. Wir brauchen also nur ein solches Formular in der Rohfassung zu verwenden, die ben&ouml;tigten Steuerelemente zu konfigurieren und einzubauen und die Abmessungen des Formulars an die vorhandenen Steuerelemente anzupassen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_03\/SuchformularAssistent-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Solch ein Suchformular m&ouml;chten wir f&uuml;r beleibige Datenherk&uuml;nfte nachbauen k&ouml;nnen.<\/span><\/b><\/p>\n<p><b>Arbeitstier Assistent<\/b><\/p>\n<p>Als Grundger&uuml;st f&uuml;r unseren Assistenten zur Erstellung von Suchformularen dient die Beispieldatenbank zum Beitrag <b>Formular-Assistenten <\/b>(<b>www.access-im-unternehmen.de\/726<\/b>). Diese Beispieldatenbank passen wir nun f&uuml;r unseren konkreten Einsatzzweck an, indem wir eine Kopie davon erstellen und den Namen in <b>Suchformularassistent.mda <\/b>&auml;ndern. Danach stellen Sie in den Datenbankeigenschaften die Werte ein, die im Add-In-Manager angezeigt werden (siehe Bild 2). Danach bearbeiten wir die Tabelle <b>USysRegInfo<\/b>, die ja die Eintr&auml;ge f&uuml;r die Registry enth&auml;lt (siehe Bild 3). Im Wesentlichen &auml;ndern wir dort den Namen des neu anzulegenden Schl&uuml;ssels (hier Suchformularassistent), den Beschreibungstext und die <b>Library<\/b>-Datei. Au&szlig;erdem k&ouml;nnen Sie durch Einstellen von <b>Datasource Required <\/b>auf den Wert <b>1 <\/b>sicherstellen, dass der Benutzer eine Datenherkunft ausw&auml;hlen muss. Vielleicht m&ouml;chten Sie dem Benutzer aber auch sp&auml;ter im der Benutzeroberfl&auml;che des Add-Ins noch die M&ouml;glichkeit geben, eine andere Datenherkunft auszuw&auml;hlen &#8211; in dem Fall stellen Sie den Wert <b>0 <\/b>ein und &uuml;berlassen es den Gepflogenheiten des Benutzers, ob dieser die Datenherkunft gleich im Dialog <b>Neues Formular <\/b>ausw&auml;hlen m&ouml;chte. Die im VBA-Modul <b>mdlWizard <\/b>enthaltene Funktion <b>StartFormWizard <\/b>k&ouml;nnen wir zun&auml;chst beibehalten.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_03\/SuchformularAssistent-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Einstellen der Eigenschaften f&uuml;r die Anzeige im Add-In-Manager<\/span><\/b><\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_03\/SuchformularAssistent-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Einstellen der Werte der Tabelle USysRegInfo<\/span><\/b><\/p>\n<p><b>Aufgaben des Suchformularassistenten aus Benutzersicht<\/b><\/p>\n<p>Der Suchformularassistent soll ein Suchformular wie in Bild 1 erstellen, wobei die verwendete Datenherkunft und somit die Felder variieren k&ouml;nnen. Die Datenherkunft w&auml;hlt der Benutzer schon vor dem Start aus. Es bleibt also lediglich die Anforderung, die Felder abzufragen, die im Suchformular erscheinen sollen, und deren Aussehen einzustellen. Gro&szlig;artige Varianten soll der Assistent hier nicht bieten: Ein einfaches Textfeld der Datenherkunft soll in der Regel durch ein Textfeld im Suchformular abgebildet werden. Alternativ k&ouml;nnte man hier ein Kombinationsfeld verwenden, das alle im Textfeld vorkommenden Eintr&auml;ge anzeigt.<\/p>\n<p>Bei Nachschlagefeldern soll einfach ein Kombinationsfeld mit der Datensatzherkunft des Nachschlagefelds zur Auswahl der enthaltenen Datens&auml;tze im Suchformular erscheinen. Und f&uuml;r <b>Ja\/Nein<\/b>-Felder wird ebenfalls ein Kombinationsfeld angezeigt, dass die Werte <b>Ja <\/b>und <b>Nein <\/b>zur Auswahl anbietet.<\/p>\n<p>Zusammengefasst muss der Benutzer neben der eigentlichen Auswahl der zu verwendenden Felder nur noch f&uuml;r Textfelder festlegen, ob die Suche per Textfeld oder per Kombinationsfeld erfolgen soll.<\/p>\n<p>Um den Assistenten m&ouml;glichst einfach und intuitiv zu gestalten, soll ein Listenfeld alle m&ouml;glichen Suchfelder anzeigen (inklusive der Varianten f&uuml;r Textfelder) und ein weiteres alle durch den Benutzer ausgew&auml;hlten Eintr&auml;ge.<\/p>\n<p>Zum Hinzuf&uuml;gen eines Feldes muss der Benutzer dieses lediglich im Listenfeld aller Suchfelder markieren und etwa per Doppelklick zum Listenfeld der hinzuzuf&uuml;genden Suchfelder hinzuf&uuml;gen.<\/p>\n<p>Das Geschehen wird sich also weitgehend in einem einzigen Formular abspielen, dass wir <b>frmSuchformularassistent <\/b>nennen und dem wir die Bezeichnung <b>Suchformular-Assistent <\/b>verpassen.<\/p>\n<p>Da wir darin auch nicht durch Datens&auml;tze navigieren m&ouml;chten, stellen wir die Eigenschaften <b>Navigationsleisten<\/b>, <b>Datensatzmarkierer<\/b>, <b>Trennlinien <\/b>und <b>Bildlaufleisten <\/b>auf <b>Nein <\/b>und <b>Zentrieren <\/b>auf <b>Ja <\/b>ein. F&uuml;r ein erstes Erfolgserlebnis schreiben wir au&szlig;erdem die Funktion <b>StartFormWizard <\/b>wie folgt um:<\/p>\n<pre>Function StartFormWizard(strRecordSource As String) As Variant\r\n    DoCmd.OpenForm \"frmSuchformularassistent\", OpenArgs:=strRecordSource, WindowsMode:=acDialog\r\nEnd Function<\/pre>\n<p>Diese Variante &ouml;ffnet nach dem Aufrufen des Assistenten gleich das Formular <b>frmSuchformularassistent <\/b>und &uuml;bergibt diesem mit dem &Ouml;ffnungsargument den Namen der vom Benutzer ausgew&auml;hlten Datenherkunft. Sie k&ouml;nnen das Add-In nun bereits testweise mithilfe des Add-In-Managers installieren und ausprobieren.<\/p>\n<p><b>Tipps f&uuml;r die Add-In-Entwicklung<\/b><\/p>\n<p>Sobald Sie das Add-In w&auml;hrend der Entwicklung einmal installiert haben, befindet sich eine Kopie der <b>.mda<\/b>-Datei im Add-In-Verzeichnis des aktuellen Benutzers. Sie sollten sich an dieser Stelle entscheiden, welche Version des Add-Ins Sie weiterentwickeln m&ouml;chten &#8211; die urspr&uuml;ngliche Version oder die im Add-In-Verzeichnis. Wir empfehlen letzteres, da Sie das Add-In so nicht st&auml;ndig erneut installieren oder zumindest vom Entwicklungsordner in das Add-In-Verzeichnis kopieren m&uuml;ssen.<\/p>\n<p>Eines m&uuml;ssen Sie dabei allerdings beachten: Wenn Sie zum Testen eine Access-Instanz samt Anwendung ge&ouml;ffnet und das Add-In gestartet haben, m&uuml;ssen Sie diese Instanz vor der Weiterbearbeitung der Add-In-Datenbank komplett schlie&szlig;en. Anderenfalls beschwert sich Access beim Wechsel in die Entwurfsansicht eines Objekts, weil kein exklusiver Zugriff m&ouml;glich ist. Eine andere Beobachtung: Formulare, die beim Testen des Add-Ins in der Zieldatenbank ge&ouml;ffnet werden sollen, m&uuml;ssen in einer parallel f&uuml;r die Entwicklung ge&ouml;ffneten Add-In-Datenbank geschlossen sein. Dies gilt auch f&uuml;r ge&auml;nderte, aber noch nicht gespeicherte VBA-Module: Diese m&uuml;ssen Sie vor dem Testen des Add-Ins zwar nicht schlie&szlig;en, aber zumindest speichern.<\/p>\n<p>Und noch ein Tipp: Wenn Sie eine f&uuml;r Tests vorgesehene Datenbank immer ganz schnell &ouml;ffnen m&ouml;chten, legen Sie doch einfach eine Tastenkombination in der Add-In-Datenbank selbst an. Dazu erstellen Sie ein Makro namens <b>AutoKeys<\/b>, das Sie wie in Bild 4 ausstatten. Dieses Makro reagiert auf die Tastenkombination <b>Strg + Umschalt + T<\/b>. Die dadurch aufgerufene Funktion bringen Sie dann in einem eigenen Standardmodul namens <b>mdlTools <\/b>unter:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_03\/SuchformularAssistent-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Dieses Makro ruft bei Strg + Umschalt + T eine Funktion auf, die eine Beispieldatenbank &ouml;ffnet.<\/span><\/b><\/p>\n<pre>Public Function OeffneTestdatenbank()\r\n    Shell &quot;\"\"c:\\Programme\\Microsoft Office\\Office12\\MSAccess.exe\"\" &quot;\"\" &amp;\r\n    &amp; CurrentProject.Path &amp; &quot;\\test.mdb\"\"\"\r\nEnd Function<\/pre>\n<p>In dieser Prozedur m&uuml;ssen Sie gegebenenfalls den Pfad zur Datei <b>MSAccess.exe <\/b>und zur Beispieldatenbank anpassen.<\/p>\n<p><b>Konfigurieren des Suchformulars<\/b><\/p>\n<p>Das Suchformular enth&auml;lt ein Kombinationsfeld zur Auswahl der Datenherkunft, die durch die Auswahl im Dialog <b>Neues Formular <\/b>voreinstellt werden kann. Das Kombinationsfeld soll alle Tabellen und Abfragen der Zieldatenbank anzeigen, was von einem Add-In aus nicht ganz trivial ist. Normalerweise w&uuml;rde man hier einfach auf die Eintr&auml;ge der Systemtabelle <b>MSysObjects <\/b>zugreifen und eine Abfrage wie die folgende als Datensatzherkunft des Kombinationsfeldes angeben:<\/p>\n<pre>SELECT Name, Type FROM MSysObjects\r\nWHERE Type=1 Or Type=5 ORDER BY Name;<\/pre>\n<p>Wenn Sie diese Abfrage in der Add-In-Datenbank selbst testen, liefert sie auch die gew&uuml;nschten Daten. Wenn Sie das Add-In allerdings in der Zieldatenbank &ouml;ffnen, zeigt es nicht die Tabellen und Abfragen der Zieltabelle, sondern die des Add-Ins an. Gl&uuml;cklicherweise bietet Access-SQL aber die <b>IN<\/b>-Klausel, mit der man nicht nur auf Unterabfragen zugreifen, sondern auch eine alternative Datenbank als Quelle einer <b>SELECT<\/b>-Abfrage festlegen kann. Wenn wir also die obige SQL-Anweisung wie folgt &auml;ndern, k&ouml;nnen wir auch vom Add-In-Formular auf die Tabellen der Datenbank zugreifen, in der das Add-In gestartet wurde:<\/p>\n<pre>SELECT Name, Type FROM MSysObjects\r\nIN ''&lt;Datenbankname&gt;''\r\nWHERE Type = 1 Or Type = 5 ORDER BY Name<\/pre>\n<p>Nat&uuml;rlich kennen wir den Datenbanknamen der Zieldatenbank beim Entwickeln des Add-Ins noch nicht, daher m&uuml;ssen wir diesen zur Laufzeit ermitteln. Pfad und Namen dieser Datenbank erhalten wir ganz einfach &uuml;ber die Funktion <b>CurrentDB.Name<\/b>.<\/p>\n<p>Diesen bauen wir per VBA in die SQL-Abfrage ein und weisen diesen dann dem Kombinationsfeld als Datensatzherkunft zu. Dies erledigen wir gleich beim &Ouml;ffnen des Formulars in der Prozedur, die durch das Ereignis <b>Beim &Ouml;ffnen <\/b>ausgel&ouml;st wird:<\/p>\n<pre>Private Sub Form_Open(Cancel As Integer)\r\n    Dim strSQL As String\r\n    strSQL = &quot;SELECT Name,\r\n    Type FROM MSysObjects IN ''&quot;\r\n    &amp; CurrentDb.Name &amp; &quot;''\r\n    WHERE Type = 1 Or Type = 5 ORDER BY Name&quot;\r\n    Me!cboDatenherkunft.RowSource = strSQL\r\n    Me!cboDatenherkunft = Me.OpenArgs\r\nEnd Sub<\/pre>\n<p>Gleichzeitig wertet diese Routine das &Ouml;ffnungsargument des Formulars aus, das gegebenenfalls den Namen der zuvor im Dialog <b>Neues Formular <\/b>ausgew&auml;hlten Datenherkunft (siehe Bild 5) enth&auml;lt, und weist es dem Kombinationsfeld <b>cboDatenherkunft <\/b>zu. Das Formular zur Auswahl der Suchfelder sieht im Entwurf wie in Bild 6 aus. Das Kombinationsfeld <b>cboDatenherkunft<\/b> haben Sie ja bereits kennengelernt.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_03\/SuchformularAssistent-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Die Auswahl der Datenherkunftf&uuml;r das Suchformular kann gleich in diesem Dialog erfolgen.<\/span><\/b><\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_03\/SuchformularAssistent-web-images\/pic006.png\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Entwurf des Formulars zur Definition der Suchfelder<\/span><\/b><\/p>\n<p>Die beiden Listenfelder sollen die ausgew&auml;hlten und alle f&uuml;r die Suche einsetzbaren Felder der Datenherkunft anzeigen. Wir k&ouml;nnten nun einfach eine Feldliste auf Basis der in <b>cboDatenherkunft<\/b> ausgew&auml;hlten Tabelle oder Abfrage anzeigen, aber dies gen&uuml;gt leider nicht den Anspr&uuml;chen des geplanten Assistenten: Dieser soll ja beispielsweise bei Textfeldern nicht nur den Einbau eines Text-Suchfelds, sondern auch eines Auswahl-Suchfelds zur Auswahl aller im entsprechenden Feld der Datenherkunft enthaltenen Werte anbieten.<\/p>\n<p><b>Daten f&uuml;r die Listenfelder<\/b><\/p>\n<p>Das rechte Listenfeld <b>lstAlle <\/b>soll alle m&ouml;glichen Suchfelder anzeigen, die der Entwickler dem Suchformular hinzuf&uuml;gen kann. Wie bereits erw&auml;hnt, sind dies zumindest alle Felder der im Kombinationsfeld <b>cboDatenherkunft <\/b>plus die Kombinationsfeldvariante zum Durchsuchen von Textfeldern durch Auswahl eines der darin enthaltenen Eintr&auml;ge. Das linke Listenfeld <b>lstAusgewaehlt <\/b>soll alle Eintr&auml;g enthalten, die der Benutzer aus dem rechten Listenfeld ausgew&auml;hlt hat. F&uuml;r die Gestaltung der Datensatzherkunft der beiden Listenfelder gibt es wie &uuml;blich verschiedene M&ouml;glichkeiten. Der Einfachheit halber verwenden wir an dieser Stelle einfach zwei Tabellen. Die Tabelle <b>tblSuchfelder <\/b>sieht wie in Bild 7 aus und enth&auml;lt die Datensatzherkunft f&uuml;r das rechte Listenfeld <b>lstAlle<\/b>. Neben dem Prim&auml;rschl&uuml;sselfeld gibt es drei weitere Felder. Suchfeld ist das Feld, dass im Listenfeld angezeigt werden soll und dem Benutzer mitteilt, auf welches Feld der Datenherkunft sich das potenzielle Suchfeld beziehen wird und welches Steuerelement f&uuml;r die Eingabe des Suchbegriffs verwendet wird. Die letzten beiden Felder werden f&uuml;r die eigentliche Erstellung des Suchformulars ben&ouml;tigt. Neben dem Feldnamen ist hier der Feldtyp interessant. Der Feldtyp wird im Code des Formularmoduls durch eine Enumeration definiert, die wie folgt aussieht:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_03\/SuchformularAssistent-web-images\/pic007.png\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Die Datenherkunft des Listenfelds lstAlle enth&auml;lt alle m&ouml;glichen Suchfelder.<\/span><\/b><\/p>\n<pre>Public Enum eSearchFieldType\r\n    eText = 0\r\n    eTextCombo = 1\r\n    eCombo = 2\r\n    eBoolean = 3\r\nEnd Enum<\/pre>\n<p><!--30percent--><\/p>\n<p>Diese Enumeration kommt in der Prozedur zum Einsatz, welche aus der Datenherkunft die Datens&auml;tze der Tabelle <b>tblSuchfelder <\/b>erzeugt. Diese Prozedur hei&szlig;t <b>SuchfelderSpeichern <\/b>und erwartet den Namen der Datenherkunft als Parameter. Hierbei ist es egal, ob der Name einer Tabelle oder einer Abfrage &uuml;bergeben wird (s. Listing 1).<\/p>\n<p class=\"kastentabelleheader\">Listing 1: F&uuml;llen der Tabelle tblSuchfelder mit allen m&ouml;glichen Suchfeldern<\/p>\n<pre>Private Sub SuchfelderSpeichern(strDatenherkunft As String)\r\n  ''Deklaration ...\r\n  Set db = CurrentDb\r\n  Set dbc = CodeDb\r\n  Set rst = db.OpenRecordset(&quot;SELECT * FROM &quot; &amp; strDatenherkunft &amp; &quot; WHERE 1 = 2&quot;, dbOpenDynaset)\r\n  dbc.Execute &quot;DELETE FROM tblSuchfelder&quot;, dbFailOnError\r\n  For Each fld In rst.Fields\r\n    intControltype = acTextBox\r\n    On Error Resume Next\r\n    intControltype = fld.Properties(&quot;DisplayControl&quot;)\r\n    On Error GoTo 0\r\n    Select Case intControltype\r\n      Case acCheckBox\r\n        dbc.Execute &quot;INSERT INTO tblSuchfelder(Feldname, Feldtyp, Suchfeld) VALUES(''&quot; &amp; fld.Name &amp; &quot;'', &quot; _\r\n          &amp; eSearchFieldType.eBoolean &amp; &quot;, ''&quot; &amp; fld.Name &amp; &quot; (Auswahlsuchfeld)'')&quot;, dbFailOnError\r\n      Case acTextBox\r\n        dbc.Execute &quot;INSERT INTO tblSuchfelder(Feldname, Feldtyp, Suchfeld) VALUES(''&quot; &amp; fld.Name &amp; &quot;'', &quot; _\r\n        &amp; eSearchFieldType.eText &amp; &quot;, ''&quot; &amp; fld.Name &amp; &quot; (Textsuchfeld)'')&quot;, dbFailOnError\r\n       dbc.Execute &quot;INSERT INTO tblSuchfelder(Feldname, Feldtyp, Suchfeld) VALUES(''&quot; &amp; fld.Name &amp; &quot;'', &quot; _\r\n       &amp; eSearchFieldType.eTextCombo &amp; &quot;, ''&quot; &amp; fld.Name &amp; &quot; (Auswahlsuchfeld)'')&quot;, dbFailOnError\r\n      Case acComboBox\r\n        dbc.Execute &quot;INSERT INTO tblSuchfelder(Feldname, Feldtyp, Suchfeld) VALUES(''&quot; &amp; fld.Name &amp; &quot;'', &quot; _\r\n        &amp; eSearchFieldType.eCombo &amp; &quot;, ''&quot; &amp; fld.Name &amp; &quot; (Auswahlsuchfeld)'')&quot;, dbFailOnError\r\n      Case Else\r\n        Debug.Print fld.Name, intControltype\r\n    End Select\r\n  Next fld\r\n  Me!lstAlle.Requery\r\nEnd Sub<\/pre>\n<p>Die Prozedur erstellt durch Hinzuf&uuml;gen der <b>WHERE<\/b>-Bedingung <b>1=2 <\/b>ein leeres Recordset auf Basis der angegebenen Datenherkunft. Es l&ouml;scht alle bereits in der Tabelle <b>tblSuchfelder <\/b>enthaltenen Datens&auml;tze und durchl&auml;uft dann mit einer <b>For Each<\/b>-Schleife und der Laufvariablen <b>fld <\/b>alle Felder des <b>Recordset<\/b>-Objekts. Innerhalb der Schleife ermittelt die Prozedur zun&auml;chst den Steuerelementtyp des Feldes, wobei nur Textfelder, Kombinationsfelder und <b>Ja\/Nein<\/b>-Felder ber&uuml;cksichtigt werden. In Abh&auml;ngigkeit vom Steuerelementtyp werden innerhalb der folgenden <b>Select Case<\/b>-Struktur verschiedene SQL-Abfragen ausgef&uuml;hrt, um einen oder mehrere Datens&auml;tze je Feld zur Tabelle <b>tblSuchfelder <\/b>hinzuzuf&uuml;gen. Mehrere deshalb, weil der Entwickler ja f&uuml;r Textfelder entweder ein Text- oder ein Kombinationsfeld als Suchfeld verwenden kann (oder auch beide). Nach Eintragen aller Datens&auml;tze f&uuml;r die angegebene Datenherkunft wird das Listenfeld <b>lstAlle <\/b>aktualisiert. Damit dieses die Daten wie in Bild 8 anzeigt, stellen Sie die Datensatzherkunft des Listenfeldes auf <b>tblAlle <\/b>ein und setzen die beiden Eigenschaften <b>Spaltenanzahl <\/b>und <b>Spaltenbreiten <\/b>auf <b>2 <\/b>beziehungsweise <b>0cm<\/b>.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_03\/SuchformularAssistent-web-images\/pic009.png\" alt=\"pic009.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 8: Das Listenfeld wird nach Aktualisierung der Datenherkunft gef&uuml;llt.<\/span><\/b><\/p>\n<p><b>Suchfelder gleich beim &Ouml;ffnen eintragen<\/b><\/p>\n<p>Da der Benutzer gleich im Dialog <b>Neues Formular <\/b>eine Datenherkunft angeben kann, stellt man das Kombinationsfeld <b>cboDatenherkunft<\/b> gleich auf die angegebene Datenherkunft ein und f&uuml;llt im gleichen Zuge das Listenfeld <b>lstAlle<\/b>. Dies geschieht in der angepassten Version der Ereignisprozedur <b>Form_Open <\/b>aus Listing 2. Diese Prozedur ruft zun&auml;chst eine weitere Routine auf, welche die Inhalte der Datensatzherk&uuml;nfte der beiden Listenfelder l&ouml;scht:<\/p>\n<p class=\"kastentabelleheader\">Listing 2: F&uuml;llen von Kombinations- und Listenfelder beim &Ouml;ffnen des Formulars<\/p>\n<pre>Private Sub Form_Open(Cancel As Integer)\r\n    Dim strSQL As String\r\n    Call SuchfelderLoeschen\r\n    strSQL = &quot;SELECT Name FROM MSysObjects IN ''&quot; &amp; CurrentDb.Name &amp; &quot;'' WHERE (Type=1 Or Type=5)\r\n        AND Left(Name,4)&lt;&gt;''MSys'' AND Left(Name,1)&lt;&gt;''~'' ORDER BY Name;&quot;\r\n    Me!cboDatenherkunft.RowSource = strSQL\r\n    Me!cboDatenherkunft = Me.OpenArgs\r\n    If Not (Nz(Me!cboDatenherkunft)) = 0 Then\r\n        Call SuchfelderSpeichern(Me!cboDatenherkunft)\r\n    End If\r\nEnd Sub<\/pre>\n<p>Danach f&uuml;llt sie das Kombinationsfeld <b>cboDatenherkunft <\/b>mit allen in der Datenbank enthaltenen Tabellen und Abfragen, wobei Systemtabellen und Abfragen, die als Datenherkunft von Formularen, Berichten oder Steuerelementen dienen, ausgeblendet werden. Wenn das &Ouml;ffnungsargument bereits den Namen der zuvor ausgew&auml;hlten Datenherkunft enth&auml;lt, weist die Prozedur diese dem Feld <b>cboDatenherkunft <\/b>zu. Schlie&szlig;lich ruft die Prozedur die Routine <b>SuchfelderSpeichern <\/b>auf, die wir bereits weiter oben besprochen haben.<\/p>\n<p><b>Suchfelder ausw&auml;hlen<\/b><\/p>\n<p>Nun soll der Benutzer die Eintr&auml;ge des rechten Listenfeldes auf einfache Weise, und zwar per Doppelklick, in das linke Listenfeld eintragen. Dazu brauchen wir zun&auml;chst eine Tabelle, in der die Datens&auml;tze des linken Listenfeldes gespeichert werden.<\/p>\n<p>Diese Aufgabe &uuml;bernimmt die Tabelle <b>tblAusgewaehlteSuchfelder<\/b>. Sie soll die ausgew&auml;hlten Suchfelder aufnehmen und als Datensatzherkunft des linken Kombinationsfeldes dienen (siehe Bild 9). Die Tabelle enth&auml;lt ein Feld mehr als die Tabelle <b>tblSuchfelder<\/b>. Dieses hei&szlig;t <b>ReihenfolgeID <\/b>und erm&ouml;glicht dem Entwickler das Einstellen der Reihenfolge der Suchfelder f&uuml;r das Suchformular.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_03\/SuchformularAssistent-web-images\/pic008.png\" alt=\"pic008.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 9: Diese Tabelle nimmt die Suchfelder f&uuml;r das Suchformular auf.<\/span><\/b><\/p>\n<p>Bevor wir dazu kommen, wie der Benutzer die Reihenfolge der Eintr&auml;ge einstellt, k&uuml;mmern wir uns um das Hinzuf&uuml;gen von Suchfeldern zum linken Listenfeld. Dies erledigt die Prozedur aus Listing 3, die durch einen Doppelklick auf einen der Eintr&auml;ge des rechten Kombinationsfeldes ausgel&ouml;st wird.<\/p>\n<p class=\"kastentabelleheader\">Listing 3: Suchfeld zur Liste der ausgew&auml;hlten Suchfelder hinzuf&uuml;gen<\/p>\n<pre>Private Sub lstAlle_DblClick(Cancel As Integer)\r\n    Dim db As DAO.Database\r\n    Dim intReihenfolgeID As Integer\r\n    If Not IsNull(Me!lstAlle) Then\r\n        Set db = CodeDb\r\n        intReihenfolgeID = Nz(CLookup(&quot;ReihenfolgeID&quot;, &quot;tblAusgewaehlteSuchfelder&quot;, &quot;SuchfeldID = &quot; _\r\n        &amp; Nz(Me!lstAusgewaehlt, 0)))\r\n        If intReihenfolgeID = 0 Then\r\n            intReihenfolgeID = Nz(CMax(&quot;ReihenfolgeID&quot;, &quot;tblAusgewaehlteSuchfelder&quot;), 0)\r\n        End If\r\n        intReihenfolgeID = intReihenfolgeID + 1\r\n        db.Execute &quot;UPDATE tblAusgewaehlteSuchfelder SET ReihenfolgeID = ReihenfolgeID + 1 WHERE ReihenfolgeID &gt;= &quot; _\r\n        &amp; intReihenfolgeID, dbFailOnError\r\n        db.Execute &quot;INSERT INTO tblAusgewaehlteSuchfelder(Feldname, Feldtyp, Suchfeld, ReihenfolgeID)\r\n        SELECT Feldname, Feldtyp, Suchfeld, &quot; &amp; intReihenfolgeID &amp; &quot; AS\r\n        ReihenfolgeID FROM tblSuchfelder WHERE SuchfeldID = &quot; &amp; Me!lstAlle, dbFailOnError\r\n        Me!lstAusgewaehlt.Requery\r\n    End If\r\nEnd Sub\r\nPrivate Sub SuchfelderLoeschen()\r\n    Dim db As DAO.Database\r\n    Set db = CodeDb\r\n    db.Execute &quot;DELETE FROM tblSuchfelder&quot;, _\r\n    dbFailOnError\r\n    db.Execute &quot;DELETE FROM\r\n    tblAusgewaehlteSuchfelder&quot;, dbFailOnError\r\n    Me!lstAlle.Requery\r\n    Me!lstAusgewaehlt.Requery\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p>Die Prozedur pr&uuml;ft zun&auml;chst, ob der Benutzer &uuml;berhaupt auf einen der Eintr&auml;ge des Listenfeldes oder in einen leeren Bereich darin geklickt hat. Hat der Benutzer einen Datensatz getroffen, setzt die Routine einen Objektverweis auf die Add-In-Datenbank, was mit der Funktion <b>CodeDB <\/b>geschieht Ein Verweis auf <b>CurrentDB <\/b>bezieht sich, von einem Add-In aus verwendet, immer auf die aufrufende Datenbank.<\/p>\n<p>Die folgenden Zeilen besch&auml;ftigen sich damit, herauszufinden, wo im linken Listenfeld der Eintrag hinzugef&uuml;gt werden soll. Dies hat folgenden Hintergrund: Wenn n&auml;mlich im linken Listenfeld ein Eintrag markiert ist, soll der neue Eintrag direkt hinter diesem eingereiht werden. Also liest die Prozedur mit der <b>CLookup<\/b>-Funktion die <b>ReihenfolgeID <\/b>eines m&ouml;glicherweise aktuell markierten Eintrags des linken Listenfeldes aus und merkt sich diesen. Die Funktion <b>CLookup <\/b>liefert im &Uuml;brigen das gleiche Ergebnis wie <b>DLookup<\/b>, nur dass sich <b>CLookup <\/b>auf die Add-In-Datenbank bezieht und <b>DLookup <\/b>auf die Datenbank, von der aus das Add-In aufgerufen wurde. <b>CLookup <\/b>ist im Gegensatz zu <b>DLookup <\/b>allerdings keine eingebaute, sondern eine benutzerdefinierte Funktion. Sie finden diese im Modul <b>mdlTools <\/b>der Beispieldatenbank.<\/p>\n<p>Wenn keiner der Datens&auml;tze im linken Listenfeld markiert ist, ermittelt die folgende Anweisung den gr&ouml;&szlig;ten Wert des Feldes <b>ReihenfolgeID <\/b>f&uuml;r die enthaltenen Datens&auml;tze. Diese <b>ReihenfolgeID <\/b>wird um eins erh&ouml;ht, bevor das neue Suchfeld mit einer <b>INSERT<\/b>-Abfrage zur Tabelle <b>tblAusgewaehlt <\/b>hinzugef&uuml;gt wird. Vorher allerdings sorgt eine <b>UPATE<\/b>-Abfrage daf&uuml;r, dass das Feld <b>ReihenfolgeID <\/b>aller Datens&auml;tze der Tabelle <b>tblAusgewaehlt<\/b>, deren Wert gr&ouml;&szlig;er oder gleich der <b>ReihenfolgeID <\/b>des neuen Datensatzes ist, um eins erh&ouml;ht wird. Somit wird das neue Suchfeld genau an der richtigen Stelle eingereiht.<\/p>\n<p><b>L&ouml;schen von Suchfeldern<\/b><\/p>\n<p>M&ouml;glicherweise m&ouml;chte der Benutzer einmal hinzugef&uuml;gte Suchfelder auch wieder l&ouml;schen. In diesem Falle muss er einfach nur den zu l&ouml;schenden Eintrag des linken Listenfeldes doppelt anklicken. Dies l&ouml;st die folgende Ereignisprozedur aus, die einfach nur den angeklickten Eintrag aus der Tabelle <b>tblAusgewaehlt <\/b>l&ouml;scht &#8211; nat&uuml;rlich nicht, ohne zu pr&uuml;fen, ob &uuml;berhaupt ein Eintrag markiert ist (s. Listing 4).<\/p>\n<p class=\"kastentabelleheader\">Listing 4: L&ouml;schen des aktuell markierten Suchfelds per Doppelklick<\/p>\n<pre>Private Sub lstAusgewaehlt_DblClick(Cancel As Integer)\r\n    Dim db As DAO.Database\r\n    Dim intReihenfolgeID As Integer\r\n    If Not IsNull(Me!lstAusgewaehlt) Then\r\n        Set db = CodeDb\r\n        intReihenfolgeID = CLookup(&quot;ReihenfolgeID&quot;, &quot;tblAusgewaehlteSuchfelder&quot;, &quot;SuchfeldID = &quot; _\r\n        &amp; Me!lstAusgewaehlt)\r\n        db.Execute &quot;DELETE FROM tblAusgewaehlteSuchfelder WHERE SuchfeldID = &quot; &amp; Me!lstAusgewaehlt, dbFailOnError\r\n        db.Execute &quot;UPDATE tblAusgewaehlteSuchfelder SET ReihenfolgeID = ReihenfolgeID - 1 WHERE ReihenfolgeID &gt; &quot; _\r\n        &amp; intReihenfolgeID, dbFailOnError\r\n        Me!lstAusgewaehlt.Requery\r\n        Set db = Nothing\r\n    End If\r\nEnd Sub<\/pre>\n<p><b>&auml;ndern der Reihenfolge<\/b><\/p>\n<p>Die Reihenfolge spielt in einem Suchformular eine genauso wichtige Rolle wie in einem &uuml;blichen Formular zur Dateneingabe. Hier sollten die wichtigsten Suchfelder sich oben befinden, weniger wichtige eher am Ende des Formulars. Damit der Benutzer diese Reihenfolge beeinflussen kann, kann er die Suchfelder zun&auml;chst wie oben beschrieben an der gew&uuml;nschten Stelle einf&uuml;gen. Dies ist jedoch nicht in allen F&auml;llen m&ouml;glich: Neue Suchfelder werden n&auml;mlich immer unterhalb des aktuell markierten Suchfeldes eingef&uuml;gt. Ein Anlegen an der obersten Position des Listenfeldes ist daher nicht m&ouml;glich. Und da Benutzer vielleicht auch gern erst einmal alle &uuml;berhaupt gew&uuml;nschten Eintr&auml;ge zur Liste hinzuf&uuml;gt und dann in Ruhe sortieren m&ouml;chte, haben wir eine entsprechende Funktion hinzugef&uuml;gt.<\/p>\n<p>Das Sortieren erfolgt dabei durch das Bet&auml;tigen der <b>Nach oben<\/b>&#8211; und <b>Nach unten<\/b>-Tasten bei gedr&uuml;ckter <b>Alt<\/b>-Taste.<\/p>\n<p>Die Prozedur aus Listing 5 erledigt diese Aufgabe. Sie wird beim Loslassen einer Taste beziehungsweise Tastenkombination ausgel&ouml;st und pr&uuml;ft zun&auml;chst, ob der Benutzer &uuml;berhaupt die <b>Alt<\/b>-Taste gedr&uuml;ckt h&auml;lt.<\/p>\n<p class=\"kastentabelleheader\">Listing 5: Position des aktuellen Suchfelds mit Alt + Nach oben oder Alt + Nach unten &auml;ndern<\/p>\n<pre>Private Sub lstAusgewaehlt_KeyUp(KeyCode As Integer, Shift As Integer)\r\n    ''Deklaration ...\r\n    Set db = CodeDb\r\n    lngAusgewaehltID = Nz(Me!lstAusgewaehlt)\r\n    intReihenfolgeID = Nz(CLookup(&quot;ReihenfolgeID&quot;, &quot;tblAusgewaehlteSuchfelder&quot;, &quot;SuchfeldID = &quot; &amp; lngAusgewaehltID))\r\n    Select Case Shift\r\n        Case 4 ''Alt\r\n            Select Case KeyCode\r\n                Case 38 ''oben\r\n                    db.Execute &quot;UPDATE tblAusgewaehlteSuchfelder SET ReihenfolgeID = 0 WHERE ReihenfolgeID = &quot; _\r\n                &amp; intReihenfolgeID - 1, dbFailOnError\r\n                    If db.RecordsAffected &gt; 0 Then\r\n                        db.Execute &quot;UPDATE tblAusgewaehlteSuchfelder SET ReihenfolgeID =\r\n                        ReihenfolgeID - 1 WHERE ReihenfolgeID = &quot; &amp; intReihenfolgeID, dbFailOnError\r\n                        db.Execute &quot;UPDATE tblAusgewaehlteSuchfelder SET ReihenfolgeID = &quot;\r\n                        &amp; intReihenfolgeID &amp; &quot; WHERE ReihenfolgeID = 0&quot;, dbFailOnError\r\n                        Me!lstAusgewaehlt.Requery\r\n                    End If\r\n                Case 40 ''unten\r\n                    ''umgekehrte Vorgehensweise\r\n            End Select\r\n    End Select\r\nEnd Sub<\/pre>\n<p>Dazu muss der Parameter <b>Shift <\/b>den Wert <b>4 <\/b>aufweisen. Anschlie&szlig;end &uuml;berpr&uuml;ft die Routine den <b>Keycode <\/b>der zusammen mit der <b>Alt<\/b>-Taste gedr&uuml;ckten Taste. Dabei steht <b>38 <\/b>f&uuml;r die <b>Nach oben<\/b>-Taste und <b>40 <\/b>f&uuml;r <b>Nach unten<\/b>.<\/p>\n<p>Beim Verschieben eines Datensatzes um eine Position nach oben geschieht Folgendes:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Die <b>ReihenfolgeID <\/b>des Datensatzes &uuml;ber dem angeklickten Datensatz wird auf <b>0 <\/b>eingestellt.<\/li>\n<li class=\"aufz-hlung\">Wenn diese Operation erfolgreich war, es also &uuml;berhaupt einen oberhalb des aktuellen Datensatzes platzierten Datensatz gibt, wird die <b>ReihenfolgeID <\/b>des angeklickten Datensatzes um eins vermindert.<\/li>\n<li class=\"aufz-hlung\">Gleichzeitig die <b>ReihenfolgeID <\/b>des Datensatzes, f&uuml;r den dieser Wert soeben auf <b>0 <\/b>eingestellt wurde, auf den Wert der <b>ReihenfolgeID <\/b>des angeklickten Datensatzes ge&auml;ndert.<\/li>\n<\/ul>\n<p>Anschlie&szlig;end aktualisiert die Prozedur den Inhalt des linken Listenfeldes und markiert den ausgew&auml;hlten Datensatz erneut.<\/p>\n<p><b>Neue Datenherkunft ausw&auml;hlen<\/b><\/p>\n<p>Falls der Benutzer zwischendurch feststellt, dass er gerade die falsche Datenherkunft bearbeitet, kann er diese nat&uuml;rlich noch nachtr&auml;glich &auml;ndern. Dies l&ouml;scht nat&uuml;rlich auch die Inhalte der beiden Tabellen <b>tblSuchfelder <\/b>und <b>tblAusgewaehlteSuchfelder<\/b> und f&uuml;llt <b>tblSuchfelder <\/b>neu. Die entsprechende Prozedur wird durch das Ereignis <b>Nach Aktualisierung <\/b>des Kombinationsfeldes <b>cboDatenherkunft <\/b>ausgel&ouml;st und sieht wie folgt aus:<\/p>\n<pre>Private Sub cboDatenherkunft_AfterUpdate()\r\n    Dim db As DAO.Database\r\n    Set db = CodeDb\r\n    Call SuchfelderSpeichern(Me!cboDatenherkunft)\r\n    Me!lstAlle.Requery\r\n    CodeDb.Execute &quot;DELETE FROM\r\n    tblAusgewaehlteSuchfelder&quot;, dbFailOnError\r\n    Me!lstAusgewaehlt.Requery\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p><b>Neues Suchformular erstellen<\/b><\/p>\n<p>Die Benutzeroberfl&auml;che des Assistenten w&auml;re somit fertiggestellt, allerdings fehlt noch die eigentliche Funktion: das Erstellen des Suchformulars. Da wir im Wesentlichen auf das Suchformular aus dem Beitrag <b>Suchformular f&uuml;r die Datenblattansicht <\/b>(<b>www.access-im-unternehmen.de\/724<\/b>) aufsetzen m&ouml;chten, verwenden wir das dort verwendete Formular als Vorlage. <\/p>\n<p>llerdings ver&auml;ndern wir es dahingehend, dass wir nur ein Kombinationsfeld und ein Textfeld sowie ein an eines der beiden Steuerelemente gebundenes Bezeichnungsfeld darin belassen (siehe Bild 10).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2010_03\/SuchformularAssistent-web-images\/pic011.png\" alt=\"pic011.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 10: Diese Tabelle speichert die Formular-Vorlage.<\/span><\/b><\/p>\n<p>Diese Steuerelemente nennen wir <b>txt<\/b>, <b>cbo <\/b>und <b>lbl<\/b>. Sie dienen beim Anlegen der Steuerelemente der neuen Suchformulare als Formatvorlage, was Textformatierungen, Breite, H&ouml;he und weitere Eigenschaften angeht. Diese drei Steuerelemente werden nach dem Erzeugen der tats&auml;chlich ben&ouml;tigten Steuerelemente einfach gel&ouml;scht.<\/p>\n<p><b>Formular kopieren<\/b><\/p>\n<p>Das Vorlagenformular m&uuml;ssen wir zun&auml;chst von der Add-In-Datenbank in die Zieldatenbank &uuml;bertragen. Normalerweise w&uuml;rde man denken, dass sich dies mit den undokumentierten Funktionen <b>SaveAsText <\/b>und <b>LoadFromText <\/b>erledigen lie&szlig;e. Diese Funktionen speichern die Definition aller Eigenschaften sowie den Code eines Formulars als Textdatei und erstellen auf Basis einer solchen Textdatei ein neues Formular.<\/p>\n<p>Leider kann man aber auf diese Weise kein Formular einer Add-In-Datenbank im Dateisystem speichern &#8211; wir m&uuml;ssen also zu anderen Methoden greifen. Das Einf&uuml;gen des im Dateisystem liegenden Formulars in die Zieldatei gelingt hingegeben mit der <b>LoadFromText<\/b>-Methode.<\/p>\n<p>Zum Exportieren der Suchformularvorlage m&uuml;ssen wir also einen kleinen Umweg gehen. Dabei &ouml;ffnen wir die Add-In-Datenbank zun&auml;chst allein und exportieren das f&uuml;r unsere Zwecke vorbereitete Suchformular von dort aus mit <b>SaveAsText <\/b>als Textdatei.<\/p>\n<p>Anschlie&szlig;end speichern wir den Code des Formulars in einem Feld einer Tabelle namens <b>tblForms<\/b> (siehe Bild 10), in dem wir diesen mit den Methoden <b>Open<\/b>, <b>Input <\/b>und <b>Close <\/b>in eine Variable einlesen. All dies erledigen wir manuell mit der Prozedur <b>SaveSearchFormInTable <\/b>(s. Listing 6).<\/p>\n<p class=\"kastentabelleheader\">Listing 6: Speichern des vorbereiteten Suchformulars in der Tabelle tblForms<\/p>\n<pre>Public Function SaveSearchFormInTable()\r\n    ''Deklaration ...\r\n    strForm = &quot;frmSuche&quot;\r\n    Set db = CurrentDb\r\n    strFile = CurrentProject.Path &amp; &quot;\\&quot; &amp; strForm &amp; &quot;.txt&quot;\r\n    SaveAsText acForm, strForm, strFile\r\n    Open strFile For Input As #1\r\n    strFormcode = Input$(LOF(1), #1)\r\n    db.Execute &quot;DELETE FROM tblForms WHERE Formname = ''&quot; &amp; strForm _\r\n    &amp; &quot;''&quot;, dbFailOnError\r\n    db.Execute &quot;INSERT INTO tblForms(Formname, Formcode) VALUES(''&quot; _\r\n    &amp; strForm &amp; &quot;'', ''&quot; &amp; Replace(strFormcode, &quot;''&quot;, _\r\n    &quot;''''&quot;) &amp; &quot;'')&quot;, dbFailOnError\r\n    Close #1\r\nEnd Function<\/pre>\n<p>Anschlie&szlig;end erstellen wir die Prozedur <b>SuchformularErstellen<\/b>, die durch die Schaltfl&auml;che <b>cmdOK <\/b>aufgerufen wird (gek&uuml;rzte Fassung in Listing 7). <\/p>\n<p class=\"kastentabelleheader\">Listing 7: Erstellen des neuen Suchformulars<\/p>\n<pre>Public Sub SuchformularErstellen()\r\n    ''Deklaration ...\r\n    strForm = FormularImportieren\r\n    DoCmd.OpenForm strForm, acDesign\r\n    Set frm = Forms(strForm)\r\n    Set db = CodeDb\r\n    Set dbt = CurrentDb\r\n    Set rst = db.OpenRecordset(&quot;tblAusgewaehlteSuchfelder&quot;, _\r\n        dbOpenDynaset)\r\n    lngSpace = frm.Controls(&quot;lbl&quot;).Top\r\n    Do While Not rst.EOF\r\n         Select Case rst!Feldtyp\r\n            Case 0\r\n                Set ctl = CreateControl(strForm, acTextBox, acDetail)\r\n                Set txt = ctl\r\n                Call TextfeldeigenschaftenKopieren(frm, txt)\r\n                txt.Name = &quot;txt_&quot; &amp; rst!Feldname\r\n            Case 1\r\n                Set ctl = CreateControl(strForm, acComboBox, acDetail)\r\n                Set cbo = ctl\r\n                Call KombinationsfeldeigenschaftenKopieren(frm, cbo)\r\n                cbo.RowSource = &quot;SELECT &quot; &amp; rst!Feldname &amp; &quot; FROM &quot; _\r\n                &amp; Me!cboDatenherkunft &amp; &quot; ORDER BY &quot; &amp; rst!Feldname\r\n                cbo.ColumnCount = 1\r\n                cbo.ColumnWidths = &quot;&quot;\r\n                cbo.Name = &quot;txtc&quot; &amp; rst!Feldname\r\n            Case ... ''Erstellung weiterer Steuerelementtypen\r\n        End Select\r\n        Set lbl = CreateControl(strForm, acLabel, acDetail, ctl.Name)\r\n        With lbl\r\n            For Each prp In lbl.Properties\r\n                On Error Resume Next\r\n                prp = frm.Controls(&quot;lbl&quot;).Properties(prp.Name)\r\n                On Error GoTo 0\r\n            Next prp\r\n            .Caption = rst!Beschriftung\r\n        End With\r\n        ctl.Top = frm.txt.Top + lngTop\r\n        lbl.Top = ctl.Top\r\n        lngTop = lngTop + frm.txt.Top + frm.txt.Height\r\n        rst.MoveNext\r\n    Loop\r\n    frm.txt.Top = ctl.Top + frm.txt.Top\r\n    DeleteControl strForm, &quot;txt&quot;\r\n    DeleteControl strForm, &quot;cbo&quot;\r\n    DoCmd.Close acForm, strForm\r\n    DoCmd.Close acForm, Me.Name\r\nEnd Sub<\/pre>\n<p>Die Prozedur ruft zun&auml;chst die Funktion <b>FormularImportieren <\/b>auf, welche die Formularvorlage in die Zieltabelle kopiert und den Namen des neuen Formulars zur&uuml;ckliefert (s. Listing 8). Dann &ouml;ffnet sie das Formular in der Entwurfsansicht, um die gew&uuml;nschten Steuerelemente zu erstellen. Um ihre Basisinformationen einzulesen, &ouml;ffnet sie ein Recordset auf Basis der Tabelle <b>tblAusgewaehlteSuchfelder<\/b>.<\/p>\n<p class=\"kastentabelleheader\">Listing 8: Kopieren der Formularvorlage in die Zieldatenbank <\/p>\n<pre>Public Function FormularImportieren() As String\r\n    Dim strForm As String\r\n    On Error Resume Next\r\n    Kill CurrentProject.Path &amp; &quot;\\frmSuche.txt&quot;\r\n    On Error GoTo 0\r\n    Open CurrentProject.Path &amp; &quot;\\frmSuche.txt&quot; For Append As #1\r\n    Print #1, CLookup(&quot;Formcode&quot;, &quot;tblForms&quot;)\r\n    Close #1\r\n    strForm = &quot;frmSuche_&quot; &amp; Me!cboDatenherkunft\r\n    LoadFromText acForm, strForm, CurrentProject.Path _\r\n    &amp; &quot;\\frmSuche.txt&quot;\r\n    FormularImportieren = strForm\r\nEnd Function<\/pre>\n<p>Bei Durchlaufen pr&uuml;ft sie die verschiedenen Feldtypen und verzweigt in einer <b>Select Case<\/b>-Bedingung zu den entsprechenden Anweisungen. Beim einfachen Textfeld erstellt die <b>CreateControl<\/b>-Anweisung zun&auml;chst das neue Textfeld. Die Prozedur <b>TextfeldeigenschaftenKopieren<\/b> aus Listing 9 sorgt dann daf&uuml;r, dass neue Textfelder mit den Eigenschaften des in der Vorlage enthaltenen Textfeldes ausgestattet werden &#8211; so erscheinen diese konsistent in der gleichen Schriftart, -gr&ouml;&szlig;e et cetera. Wenn Sie das Vorlageformular &auml;ndern m&ouml;chten, &ouml;ffnen Sie in der aktuellen Version das Suchformular in der Add-In-Datenbank, passen die Steuerelemente an und kopieren den Formularcode wie oben beschrieben in die Tabelle <b>tblForms<\/b>. Das Kopieren der Steuerelementeigenschaften geschieht bei den &uuml;brigen Steuerelementen auf &auml;hnliche Weise.<\/p>\n<p class=\"kastentabelleheader\">Listing 9: Kopieren der Eigenschaften der Textfeld-Vorlage <\/p>\n<pre>Public Sub TextfeldeigenschaftenKopieren(frm As Form, txt As TextBox)\r\n    Dim prp As Property\r\n    For Each prp In txt.Properties\r\n        On Error Resume Next\r\n        prp = frm.Controls(&quot;txt&quot;).Properties(prp.Name)\r\n        On Error GoTo 0\r\n    Next prp\r\nEnd Sub<\/pre>\n<p>Im Anschluss werden steuerelementspezifische Eigenschaften eingestellt. Beim Textfeld wird hier nur der Name eingestellt, bei den drei Typen von Kombinationsfelder geschieht schon einiges mehr: Hier m&uuml;ssen Sie etwa die Datensatzherkunft und den Datensatztyp, die Spaltenanzahl und die Spaltenbreite einstellen.<\/p>\n<p>Die entsprechenden Werte erl&auml;utern wir im Beitrag <b>Suchformular f&uuml;r die Datenblattansicht <\/b>(<b>www.access-im-unternehmen.de\/724<\/b>) genauer. Anschlie&szlig;end folgt die Positionierung der Steuerelemente. Ma&szlig;geblich daf&uuml;r ist die Ausrichtung des Steuerelements txt im Vorlagenformular. Die Breite und die Abst&auml;nde vom linken beziehungsweise oberen Formularrand werden von diesem Steuerelement &uuml;bernommen.<\/p>\n<p>Nat&uuml;rlich muss der Abstand vom oberen Rand f&uuml;r alle Steuerelemente au&szlig;er dem obersten angepasst werden. Die Prozedur verschiebt jedes weitere Steuerelement genau um die H&ouml;he eines Steuerelements plus dem Abstand zwischen oberem Rand und erstem Steuerelement nach unten. G&uuml;nstigerweise vergr&ouml;&szlig;ert sich der Detailbereich automatisch mit.<\/p>\n<p>Damit zwischen dem letzten Steuerelement und dem unteren Rand des Detailbereich der gleiche Abstand wie oben eingestellt wird, verschieben wir das Vorlagensteuerelement txt so weit nach unten, dass der Detailbereich entsprechend vergr&ouml;&szlig;ert wird. Schlie&szlig;lich werden die Vorlagensteuerelemente gel&ouml;scht und die Formulare geschlossen.<\/p>\n<p><b>Einsatz des Suchformulars<\/b><\/p>\n<p>Das Suchformular &ouml;ffnen Sie nach dem Anlegen einfach per <b>DoCmd.OpenForm <\/b>von einem Hauptformular aus, dass ein Unterformular namens <b>sfm <\/b>in der Datenblatt- oder Endlosansicht anzeigt. Alle weiteren Funktionen liefert das Suchformular bereits mit.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Suchformularassistent.mda<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{1538647C-543E-4D3D-A20F-3882EFAD4E9E}\/aiu_727.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8222;Suchformulare f&uuml;r die Datenblattansicht&#8220; haben Sie ein einfach zu erstellendes Suchformular kennengelernt. Dieses ist so praktisch, dass Sie es hoffentlich gleich in Ihre Datenbanken einbauen. Damit ist allerdings immer noch ein wenig Arbeit verbunden: Immerhin m&uuml;ssen Sie noch die Steuerelemente f&uuml;r die Eingabe der Suchbegriffe anlegen. Das ist eigentlich nicht allzuviel Arbeit, aber warum selbst Hand anlegen, wenn man dies einfach per Assistent erledigen k&ouml;nnen<\/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":[662010,66032010,44000027],"tags":[],"class_list":["post-55000727","post","type-post","status-publish","format-standard","hentry","category-662010","category-66032010","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Suchformularassistent - 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\/Suchformularassistent\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Suchformularassistent\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag &quot;Suchformulare f&uuml;r die Datenblattansicht&quot; haben Sie ein einfach zu erstellendes Suchformular kennengelernt. Dieses ist so praktisch, dass Sie es hoffentlich gleich in Ihre Datenbanken einbauen. Damit ist allerdings immer noch ein wenig Arbeit verbunden: Immerhin m&uuml;ssen Sie noch die Steuerelemente f&uuml;r die Eingabe der Suchbegriffe anlegen. Das ist eigentlich nicht allzuviel Arbeit, aber warum selbst Hand anlegen, wenn man dies einfach per Assistent erledigen k&ouml;nnen\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Suchformularassistent\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:13:42+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg01.met.vgwort.de\/na\/7ea8502e486b4df280457e4e2ba9caad\" \/>\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=\"26\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchformularassistent\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchformularassistent\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Suchformularassistent\",\"datePublished\":\"2020-05-22T22:13:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchformularassistent\\\/\"},\"wordCount\":3994,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchformularassistent\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/7ea8502e486b4df280457e4e2ba9caad\",\"articleSection\":[\"2010\",\"3\\\/2010\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchformularassistent\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchformularassistent\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchformularassistent\\\/\",\"name\":\"Suchformularassistent - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchformularassistent\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchformularassistent\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/7ea8502e486b4df280457e4e2ba9caad\",\"datePublished\":\"2020-05-22T22:13:42+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchformularassistent\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchformularassistent\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchformularassistent\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/7ea8502e486b4df280457e4e2ba9caad\",\"contentUrl\":\"http:\\\/\\\/vg01.met.vgwort.de\\\/na\\\/7ea8502e486b4df280457e4e2ba9caad\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchformularassistent\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Suchformularassistent\"}]},{\"@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":"Suchformularassistent - 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\/Suchformularassistent\/","og_locale":"de_DE","og_type":"article","og_title":"Suchformularassistent","og_description":"Im Beitrag \"Suchformulare f&uuml;r die Datenblattansicht\" haben Sie ein einfach zu erstellendes Suchformular kennengelernt. Dieses ist so praktisch, dass Sie es hoffentlich gleich in Ihre Datenbanken einbauen. Damit ist allerdings immer noch ein wenig Arbeit verbunden: Immerhin m&uuml;ssen Sie noch die Steuerelemente f&uuml;r die Eingabe der Suchbegriffe anlegen. Das ist eigentlich nicht allzuviel Arbeit, aber warum selbst Hand anlegen, wenn man dies einfach per Assistent erledigen k&ouml;nnen","og_url":"https:\/\/access-im-unternehmen.de\/Suchformularassistent\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:13:42+00:00","og_image":[{"url":"http:\/\/vg01.met.vgwort.de\/na\/7ea8502e486b4df280457e4e2ba9caad","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"26\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Suchformularassistent\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Suchformularassistent\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Suchformularassistent","datePublished":"2020-05-22T22:13:42+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Suchformularassistent\/"},"wordCount":3994,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Suchformularassistent\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/7ea8502e486b4df280457e4e2ba9caad","articleSection":["2010","3\/2010","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Suchformularassistent\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Suchformularassistent\/","url":"https:\/\/access-im-unternehmen.de\/Suchformularassistent\/","name":"Suchformularassistent - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Suchformularassistent\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Suchformularassistent\/#primaryimage"},"thumbnailUrl":"http:\/\/vg01.met.vgwort.de\/na\/7ea8502e486b4df280457e4e2ba9caad","datePublished":"2020-05-22T22:13:42+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Suchformularassistent\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Suchformularassistent\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Suchformularassistent\/#primaryimage","url":"http:\/\/vg01.met.vgwort.de\/na\/7ea8502e486b4df280457e4e2ba9caad","contentUrl":"http:\/\/vg01.met.vgwort.de\/na\/7ea8502e486b4df280457e4e2ba9caad"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Suchformularassistent\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Suchformularassistent"}]},{"@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\/55000727","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=55000727"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000727\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000727"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000727"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000727"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}