{"id":55000762,"date":"2011-02-01T00:00:00","date_gmt":"2020-05-22T22:01:38","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=762"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"DatenblattSuchleiste","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/DatenblattSuchleiste\/","title":{"rendered":"Datenblatt-Suchleiste"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/c148db44012144e5aedb35bc1cb1257e\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Datenbl&auml;tter liefern ausreichende M&ouml;glichkeiten zum Durchsuchen und Filtern ihrer Inhalte. Leider sind diese meist versteckt, sodass Otto Normalverbraucher &uuml;blicherweise erst mit der Nase darauf gesto&szlig;en werden muss. Viel sch&ouml;ner w&auml;re es doch, wenn das Datenblatt &uuml;ber jeder Spalte ein entsprechendes Steuerelement zur Eingabe der gesuchten Werte enthielte. Schauen wir uns also an, welche M&ouml;glichkeiten es hier gibt und wie wir die auftretenden Klippen umschiffen.<\/b><\/p>\n<p>Die Aufgabe, ein Datenblatt mit einer integrierten Leiste mit Suchfeldern zu erweitern, scheitert zuerst einmal an der Natur von Formularen, die Daten in der Datenblattansicht anzeigen: Sie zeigen n&auml;mlich au&szlig;er dem reinen Datenblatt gar nichts an. Die gew&uuml;nschte Suchleiste m&uuml;sste also, zusammen mit dem Formular in der Datenblattansicht, in einem weiteren &uuml;bergeordneten Formular angezeigt werden.<\/p>\n<p><b>Schnellanleitung<\/b><\/p>\n<p>Mit unserer L&ouml;sung aus diesem Beitrag realisieren Sie dies aber ganz schnell und flexibel. Und so geht es:<\/p>\n<ul>\n<li class=\"aufz-hlung\">F&uuml;gen Sie die Objekte <b>frmSearchbar<\/b>, <b>clsDatasheetSearch <\/b>und <b>clsDatasheetSearchControl <\/b>zur Zieldatenbank hinzu.<\/li>\n<li class=\"aufz-hlung\">&Ouml;ffnen Sie das Formular mit dem Unterformular in der Datenblattansicht und f&uuml;gen Sie dar&uuml;ber ein weiteres, flaches Unterformular-Steuerelement ein. Stellen Sie seine Eigenschaft <b>Herkunftsobjekt <\/b>auf <b>frmSearchbar <\/b>ein.<\/li>\n<li class=\"aufz-hlung\">F&uuml;gen Sie dem Hauptformular eine Prozedur hinzu, die durch das Ereignis <b>Beim Laden <\/b>ausgel&ouml;st wird und &auml;ndern Sie diese wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-30-anchor\">Listing 1<\/a><\/span>.<\/li>\n<li class=\"aufz-hlung\">Ersetzen Sie dabei <b>&lt;Unterformular&gt; <\/b>durch den Namen des Unterformular-Steuerelements mit dem Formular in der Datenblattansicht.<\/li>\n<li class=\"aufz-hlung\">Ersetzen Sie au&szlig;erdem <b>&lt;Suchformular&gt; <\/b>durch den Namen des Unterformular-Steuerelements, dem Sie das Formular <b>frmSearchbar<\/b> zugewiesen haben. Achtung: Der Name des Unterformular-Steuerelements entspricht nicht zwangsl&auml;ufig dem darin angezeigten Unterformular!<\/li>\n<\/ul>\n<p class=\"listingueberschrift\">Listing 1: Mehr als dieser Code ist f&uuml;r den Betrieb der Suchleiste nicht notwendig.<\/p>\n<pre>Dim objDatasheetSearch As clsDatasheetSearch\r\nPrivate Sub Form_Load()\r\n    Set objDatasheetSearch = New clsDatasheetSearch\r\n    With objDatasheetSearch\r\n        Set .DatasheetControl = Me!&lt;Unterformular&gt;\r\n        Set .SearchformControl = Me!&lt;Suchformular&gt;\r\n    End With\r\nEnd Sub<\/pre>\n<p><b>Such-Steuerelemente<\/b><\/p>\n<p>Sie m&uuml;ssten also normalerweise die ben&ouml;tigten Steuerelemente &#8211; Textfelder, Kombinationsfelder und Kontrollk&auml;stchen &#8211; oberhalb des Unterformular-Steuerelements mit dem Unterformular in der Datenblattansicht einf&uuml;gen. Diese werden dann in der entsprechenden Breite angelegt.<\/p>\n<p>Die Suchfelder f&uuml;r normale Textfelder bleiben zun&auml;chst leer, die Suchfelder f&uuml;r Werte aus Kombinationsfeldern sollen ebenfalls als Kombinationsfelder ausgef&uuml;hrt werden. So kann der Benutzer einen der Eintr&auml;ge ausw&auml;hlen und damit die Datens&auml;tze des Unterformulars nach diesem Eintrag filtern (s. Bild 1).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_01\/Datenblattsuche-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Unterformular mit dar&uuml;ber liegenden Suchfeldern<\/span><\/b><\/p>\n<p>Bei Kontrollk&auml;stchen im Unterformular m&uuml;ssen wir uns etwas einfallen lassen: Ein solches zeigt ja standardm&auml;&szlig;ig nur die Werte <b>Wahr <\/b>und <b>Falsch <\/b>an. Wir m&ouml;chten aber auch die M&ouml;glichkeit bieten, sowohl Datens&auml;tze mit dem Feldinhalt Wahr als auch Falsch anzuzeigen.<\/p>\n<p>Wenn dann als Suchsteuerelement ebenfalls ein Kontrollk&auml;stchen zum Einsatz kommt, ist dies nicht m&ouml;glich. Also verwenden wir ein Kombinationsfeld, mit dem der Benutzer die drei Werte <b>Alle<\/b>, <b>Wahr <\/b>und <b>Falsch <\/b>ausw&auml;hlen kann.<\/p>\n<p>Dementsprechend m&uuml;ssten auch die Steuerelemente zum Filtern von Datens&auml;tzen nach dem Inhalt von Kombinationsfeldern einen Eintrag namens <b>&lt;Alle&gt; <\/b>enthalten. Anderenfalls m&uuml;sste der Benutzer das Kombinationsfeld von Hand leeren, was wenig intuitiv erscheint.<\/p>\n<p><b>Datenblatt und fixe Suchfelder<\/b><\/p>\n<p>Nun w&uuml;rden wir also ein Datenblatt aufbauen, es als Unterformular in ein anderes Formular integrieren und die gew&uuml;nschten Suchsteuerelemente &uuml;ber den jeweiligen Spalten anordnen. Dies k&ouml;nnte wie in Bild 2 aussehen. Dann funktioniert die Suche aber auch nur solange, bis der Benutzer eine der folgenden Aktionen durchf&uuml;hrt:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_01\/Datenblattsuche-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Zwei Unterformular f&uuml;r Suchfelder und Datenblatt<\/span><\/b><\/p>\n<ul>\n<li class=\"aufz-hlung\">Ver&auml;ndern der Spaltenbreite eines Feldes<\/li>\n<li class=\"aufz-hlung\">Vertauschen zweier Felder<\/li>\n<li class=\"aufz-hlung\">Ein-\/Ausblenden von Feldern<\/li>\n<li class=\"aufz-hlung\">Scrollen des Datenblatts, wenn die Felder nicht gleichzeitig dargestellt werden k&ouml;nnen<\/li>\n<\/ul>\n<p>All dies f&uuml;hrt dazu, dass die Suchsteuerelemente nicht mehr richtig &uuml;ber den entsprechenden Feldern stehen. Fazit: Starr eingebaute Steuerelemente eignen sich nur f&uuml;r die Suche in Datenblattansichten, deren Layout nicht durch den Benutzer ver&auml;ndert werden kann.<\/p>\n<p>Sprich: F&uuml;r den Moment wirklich etwas zu langweilig. Wir wollen mehr!<\/p>\n<p><b>Flexibles Such-Unterformular<\/b><\/p>\n<p>Und zwar eine variabel einsetzbare L&ouml;sung, die nicht nur f&uuml;r ein einziges Datenblatt funktioniert, sondern m&ouml;glichst f&uuml;r alle m&ouml;glichen. Daher zun&auml;chst folgende Ideen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Die Steuerelemente zum Eingeben von Such-\/Filterbegriffen sollen in einem eigenen Unterformular liegen, damit diese in verschiedenen Formularen eingesetzt werden k&ouml;nnen.<\/li>\n<li class=\"aufz-hlung\">Es sollen ausreichend Steuerelemente vorliegen, um auch breite Datenblatt-Unterformulare mit Suchfeldern ausstatten zu k&ouml;nnen. Also legen wir uns auf 20 fest, was auch breite Datenbl&auml;tter abdecken sollte. Gegebenenfalls kann man dies auch erweitern.<\/li>\n<li class=\"aufz-hlung\">Dummerweise wei&szlig; man vorher nie, wieviele Textfelder, Kombinationsfelder und Kontrollk&auml;stchen das Datenblatt enth&auml;lt. Also legen wir diese flexibel an: Je ein Textfeld, Kombinationsfeld und Kontrollk&auml;stchen f&uuml;r jedes Feld des Datenblatts, f&uuml;r 20 Spalten also immerhin 60 Steuerelemente. Wir blenden ein, was f&uuml;r das jeweilige Feld des Datenblatts ben&ouml;tigt wird.<\/li>\n<li class=\"aufz-hlung\">Beim &Ouml;ffnen des Formulars soll Code das Datenblatt-Unterformular untersuchen und die entsprechenden Steuerelemente im Such-Unterformular ein-\/ausblenden, auf die richtige Breite anpassen und gegebenenfalls mit Daten f&uuml;llen (gilt nur f&uuml;r Kombinationsfelder und Kontrollk&auml;stchen).<\/li>\n<li class=\"aufz-hlung\">Wenn der Benutzer die Datenblatt-Konfiguration &auml;ndert, also etwa Spaltenbreiten anpasst, Spalten vertauscht, ein- oder ausblendet oder scrollt, m&uuml;ssen die Steuerelemente im Such-Unterformular angepasst werden. Wann und wie dies geschieht, erfahren Sie weiter unten im Detail.<\/li>\n<\/ul>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Grundlage: Ausreichend Steuerelemente!<\/p>\n<p>Das Unterformular mit den Such-Steuerelementen soll <b>frmSearchbar <\/b>hei&szlig;en. Der Rest, also das Hauptformular und das Unterformular mit der Datenblattansicht, k&ouml;nnen nach Wunsch benannt werden &#8211; das Suchformular soll ohnehin dynamisch daran angepasst werden.<\/p>\n<p>Bevor wir &uuml;berhaupt mit der eigentlichen Programmierung der L&ouml;sung beginnen, statten wir das Unterformular mit den oben erw&auml;hnten 60 Steuerelementen f&uuml;r die Eingabe der Suchkriterien aus.<\/p>\n<p>Erfreulicherweise brauchen Sie nicht einen Handschlag selbst durchzuf&uuml;hren, denn wir haben eine kleine Routine programmiert, die diese Aufgabe f&uuml;r uns erledigt.<\/p>\n<p>Die Prozedur <b>SuchleistenformularErstellen <\/b>aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-anchor\">Listing 2<\/a><\/span> l&ouml;scht zun&auml;chst ein eventuell vorhandenes Formular gleichen Namens und erstellt dann mit der <b>CreateForm<\/b>-Methode ein neues Formular. Dieses referenziert es dann mit der Objektvariablen <b>frm <\/b>und &ouml;ffnet es in der Entwurfsansicht.<\/p>\n<p class=\"listingueberschrift\">Listing 2: Anlegen des Suchformulars<\/p>\n<pre>Public Sub SuchleistenformularErstellen()\r\n    ...\r\n    On Error Resume Next\r\n    DoCmd.DeleteObject acForm, &quot;frmSearchbar&quot;\r\n    On Error GoTo 0\r\n    Set frm = Application.CreateForm\r\n    strForm = frm.Name\r\n    DoCmd.OpenForm frm.Name, acDesign\r\n    For i = 1 To 20\r\n        Set txt = Application.CreateControl(frm.Name, acTextBox, acDetail)\r\n        With txt\r\n            .Name = &quot;txt&quot; &amp; Format(i, &quot;00&quot;)\r\n            .Visible = False\r\n        End With\r\n        Set cbo = Application.CreateControl(frm.Name, acComboBox, acDetail)\r\n        With cbo\r\n            .Name = &quot;cbo&quot; &amp; Format(i, &quot;00&quot;)\r\n            .Visible = False\r\n        End With\r\n        Set chk = Application.CreateControl(frm.Name, acComboBox, acDetail)\r\n        With chk\r\n            .Name = &quot;chk&quot; &amp; Format(i, &quot;00&quot;)\r\n            .Visible = False\r\n            .RowSourceType = &quot;Value List&quot;\r\n            .RowSource = &quot;''Alle'';''Wahr'';''Falsch''&quot;\r\n        End With\r\n    Next i\r\n    With frm\r\n        .NavigationButtons = False\r\n        .RecordSelectors = False\r\n        .ScrollBars = False\r\n        .DividingLines = False\r\n        .HasModule = True\r\n    End With\r\n    DoCmd.Close acForm, frm.Name, acSaveYes\r\n    DoCmd.Rename &quot;frmSearchbar&quot;, acForm, strForm\r\nEnd Sub<\/pre>\n<p>Die Hauptarbeit f&uuml;hrt dann eine Schleife mit 20 Durchl&auml;ufen aus: Sie legt jeweils ein Steuerelement zum Eingeben von Filterkriterien f&uuml;r <b>Textbox<\/b>-, <b>ComboBox<\/b>&#8211; und <b>Checkbox<\/b>-Steuerelemente an und weist diesen durchnummerierte Namen wie <b>txt01<\/b>, <b>cbo01 <\/b>oder <b>chk01 <\/b>zu.<\/p>\n<p>Die mit <b>chk&#8230; <\/b>benannten Steuerelemente sind jedoch, wie oben bereits beschrieben, keine Kontrollk&auml;stchen, sondern Kombinationsfelder, die lediglich zur Auswahl der Werte <b>Alle<\/b>, <b>Wahr <\/b>und <b>Falsch <\/b>dienen.<\/p>\n<p>Alle Steuerelemente werden zun&auml;chst mit der Eigenschaft <b>Visible <\/b>auf Unsichtbar eingestellt. Nach dem Anlegen der Steuerelemente legt die Prozedur noch einige Eigenschaften f&uuml;r das Unterformular fest. So werden die Datensatzmarkierer, die Navigationsleiste, Bildlaufleisten und Trennlinien ausgeschaltet.<\/p>\n<p>Au&szlig;erdem wird mit <b>HasModule = True <\/b>ein Klassenmodul zum Formular hinzugef&uuml;gt. Schlie&szlig;lich speichert die Routine das neue Formular und benennt es in <b>frmSearchbar<\/b> um.<\/p>\n<p>Probieren Sie es aus &#8211; Formularerstellung per Mausklick! Die Steuerelemente w&uuml;rden, sorgf&auml;ltig ausgerichtet, wie in Bild 3 aussehen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_01\/Datenblattsuche-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Alle Steuerelemente des Formulars frmSearchbar<\/span><\/b><\/p>\n<p><b>Klasseneinsatz<\/b><\/p>\n<p>Den gr&ouml;&szlig;ten Teil des Codes dieser L&ouml;sung k&ouml;nnte man im Unterformular <b>frmSearchbar <\/b>unterbringen. Allerdings m&uuml;ssen auch die 60 Steuerelemente dieses Formulars Ereignisprozeduren besitzen, die etwa nach Eingabe oder &auml;nderung von Suchbegriffen ausgel&ouml;st werden.<\/p>\n<p>Da zumindest jeweils 20 Steuerelemente identische Anweisungen aufrufen d&uuml;rften, wollen wir aus Gr&uuml;nden der Wartbarkeit zwei Klassenmodule einf&uuml;hren.<\/p>\n<p>Das erste hei&szlig;t <b>clsDatasheetSearch <\/b>und enth&auml;lt die wesentlichen Elemente der Steuerung des Suchformulars. Es greift auch durch das Datenblatt-Formular ausgel&ouml;ste Aktionen &#8211; wie etwa das &auml;ndern der Spaltenbreiten oder -anordnung &#8211; auf und reagiert entsprechend darauf.<\/p>\n<p>Die zweite Klasse hei&szlig;t <b>clsDatasheetSearchControl <\/b>und wird f&uuml;r jedes der 60 Steuerelemente einmal instanziert. Diese Klasse enth&auml;lt im Wesentlichen Ereignisprozeduren, die beim &auml;ndern der Suchbegriffe durch den Benutzer ausgel&ouml;st werden und in der Folge die angezeigten Datens&auml;tze im Datenblatt-Unterformular filtern sollen.<\/p>\n<p><b>Black Box<\/b><\/p>\n<p>Eigentlich k&ouml;nnen Sie die beiden Klassen als Black Box betrachten. Damit die Suchleiste funktioniert, brauchen Sie n&auml;mlich nur ganz wenige Aufgaben zu erledigen.<\/p>\n<p>Sie f&uuml;gen das Formular <b>frmSearchbar <\/b>zum Hauptformular hinzu, f&uuml;gen darunter in der gleichen Breite das Formular mit der Datenblattansicht hinzu und legen einige Zeilen Code an.<\/p>\n<p>Zun&auml;chst brauchen Sie eine Zeile, die eine Objektvariable f&uuml;r eine Instanz der Klasse <b>clsDatasheetSearch <\/b>aufnehmen kann:<\/p>\n<pre>Dim objDatasheetSearch As clsDatasheetSearch<\/pre>\n<p>Au&szlig;erdem legen Sie f&uuml;r das Hauptformular eine Ereignisprozedur an, die durch das Ereignis <b>Beim Laden <\/b>ausgel&ouml;st wird und wie folgt aussieht:<\/p>\n<pre>Private Sub Form_Load()\r\n    Set objDatasheetSearch = New clsDatasheetSearch\r\n    With objDatasheetSearch\r\n        Set .DatasheetControl = Me!sfmDatasheet\r\n        Set .SearchformControl = Me!sfmSearchform\r\n    End With\r\nEnd Sub<\/pre>\n<p>Diese instanziert das Objekt und stellt zwei seiner Eigenschaften ein. Der Eigenschaft <b>DatasheetControl <\/b>weisen Sie einen Verweis auf das Unterformularsteuerelement zur Anzeige der Datenblattansicht zu und der Eigenschaft <b>SearchformControl <\/b>einen Verweis auf das Unterformularsteuerelement mit dem Unterformular <b>frmSearchbar<\/b>.<\/p>\n<p>F&uuml;r beides ermitteln Sie zun&auml;chst den Namen des jeweiligen Unterformular-Steuerelements, etwa <b>sfmDatasheet <\/b>oder <b>sfmSearchform<\/b>, und weisen diese den Eigenschaften des Objekts <b>objDatasheetSearch <\/b>zu.<\/p>\n<p><b>Innereien der Klasse clsDatasheetSearch<\/b><\/p>\n<p>Nat&uuml;rlich wollen wir Ihnen an dieser Stelle die Funktionsweise der Klasse nicht vorenthalten &#8211; dies ist unabdingbar, wenn Sie eigene Feineinstellungen vornehmen m&ouml;chten.<\/p>\n<p><!--30percent--><\/p>\n<p>Die Klasse definiert zun&auml;chst vier Objektvariablen. Die ersten beiden speichern Verweise auf die vom instanzierenden Formular &uuml;bergebenen Unterformular-Steuerelemente:<\/p>\n<pre>Private m_sfmSearch As SubForm\r\nPrivate m_sfmDatasheet As SubForm<\/pre>\n<p>Die Klasse ben&ouml;tigt aber auch Zugriff auf die darin enthaltenen Formulare. Objektverweise darauf landen sp&auml;ter in diesen Variablen:<\/p>\n<pre>Private m_frmSearch As Form\r\nPrivate WithEvents m_frmDatasheet As Form<\/pre>\n<p>Die Variable f&uuml;r das Formular in der Datenblattansicht wird als <b>WithEvents <\/b>deklariert, was bedeutet, das wir in der Klasse <b>clsDatasheetSearch <\/b>mit entsprechenden Prozeduren auf die Ereignisse dieses Formulars reagieren k&ouml;nnen. Warum dies notwendig ist, erfahren Sie gleich.<\/p>\n<p><b>Datenblatt- und Suchformular festlegen<\/b><\/p>\n<p>Das Festlegen der beiden Unterformularsteuerelemente aus Sicht des Hauptformulars haben Sie weiter oben schon kennengelernt. Nun schauen wir uns an, was dabei innerhalb der Klasse <b>clsDatasheetSearch <\/b>geschieht.<\/p>\n<p>Die &ouml;ffentliche <b>Property Set<\/b>-Prozedur <b>DatasheetControl <\/b>schreibt den &uuml;bergebenen Verweis auf das Unterformular mit dem Datenblatt in die Variable <b>m_sfmDatasheet <\/b>und den daraus abzuleitenden Verweis auf das enthaltene Unterformular in die Objektvariable <b>m_frmDatasheet<\/b>.<\/p>\n<p>Dann erledigt sie wichtige Aufgaben im Hinblick auf die st&auml;ndige Aktualisierung der Anordnung der Elemente der Suchleiste: Sie stellt die Eigenschaft <b>TimerInterval <\/b>des in <b>m_frmDatasheet <\/b>gespeicherten Formulars auf den Wert <b>10 <\/b>ein, was bedeutet, dass die Ereignisprozedur <b>Bei Zeitgeber <\/b>ziemlich oft ausgel&ouml;st wird.<\/p>\n<p>Damit diese jedoch &uuml;berhaupt feuert, fehlen noch zwei Dinge: erstens die Zuweisung des Wertes <b>[Event Procedure]<\/b> zur Eigenschaft <b>OnTimer <\/b>des Formular-Objekts und zweitens die Definition einer entsprechenden Ereignisprozedur innerhalb der Klasse <b>clsDatasheetSearch <\/b>(hierzu gleich mehr).<\/p>\n<p>Schlie&szlig;lich wird auch noch die Ereigniseigenschaft <b>Bei Mauszeiger <\/b>ab mit dem Wert <b>[Event Procedure] <\/b>gef&uuml;llt, was dem manuellen Ausw&auml;hlen des Wertes <b>[Ereignisprozedur] <\/b>in der deutschen Access-Version entspricht.<\/p>\n<pre>Public Property Set DatasheetControl(sfm As SubForm)\r\n    Set m_sfmDatasheet = sfm\r\n    Set m_frmDatasheet = m_sfmDatasheet.Form\r\n    With m_frmDatasheet\r\n        .TimerInterval = 10\r\n        .OnMouseUp = &quot;[Event Procedure]&quot;\r\n        .OnTimer = &quot;[Event Procedure]&quot;\r\n    End With\r\n    Call FillCollection\r\nEnd Property<\/pre>\n<p>Wozu diese Ereignisprozeduren Kurz gefasst: Sie pr&uuml;fen erstens alle paar Millisekunden, ob der Benutzer die angezeigten Spalten im Datenblatt mit der Bildlaufleiste ge&auml;ndert oder ob er die Spalten des Datenblatts mit der Maus bez&uuml;glich Gr&ouml;&szlig;e, Position oder Sichtbarkeit manipuliert hat.<\/p>\n<p>In all diesen Situationen m&uuml;ssen n&auml;mlich auch die Suchfelder erneut an die Spalten angepasst werden. Eine Anweisung haben wir noch unterschlagen: <b>FillCollection<\/b> ruft die gleichnamige Prozedur auf, welche die folgende <b>Collection<\/b>-Variable f&uuml;llen soll:<\/p>\n<pre>Private m_Fields As Collection<\/pre>\n<p>Die Prozedur <b>FillCollection <\/b>durchl&auml;uft alle Felder des Recordsets des Unterformulars mit dem Datenblatt. F&uuml;r jedes Feld f&uuml;gt sie der Collection <b>m_Fields <\/b>ein neues Objekts hinzu und tr&auml;gt den Feldnamen als <b>Key <\/b>der Collection ein.<\/p>\n<pre>Private Sub FillCollection()\r\n    Dim fld As DAO.Field\r\n    Set m_Fields = New Collection\r\n    For Each fld In m_frmDatasheet.Recordset.Fields\r\n        m_Fields.Add Null, fld.Name\r\n    Next fld\r\nEnd Sub<\/pre>\n<p>Wir kl&auml;ren gleich, wof&uuml;r wir diese Collection verwenden.<\/p>\n<p>Die andere <b>Property Set<\/b>-Prozedur <b>SearchformControl <\/b>nimmt den Verweis auf das Unterformularsteuerelement mit dem Suchformular entgegen (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-41-anchor\">Listing 3<\/a><\/span>). Sie f&uuml;llt die Variablen <b>m_sfmSearch <\/b>und <b>m_frmSearch <\/b>mit Verweisen auf das Unterformularsteuerelement und das Formular selbst.<\/p>\n<p class=\"listingueberschrift\">Listing 3: Diese Routine nimmt den Verweis auf das Suchformular entgegen.<\/p>\n<pre>Public Property Set SearchformControl(sfm As SubForm)\r\n    Dim i As Integer\r\n    Set m_sfmSearch = sfm\r\n    Set m_frmSearch = sfm.Form\r\n    m_sfmSearch.Width = m_sfmDatasheet.Width\r\n    m_sfmSearch.Left = m_sfmDatasheet.Left\r\n    For i = 1 To 20\r\n         m_frmSearch.Controls(&quot;txt&quot; &amp; Format(i, &quot;00&quot;)).Top = m_frmSearch.InsideHeight * 0.05\r\n        ...\r\n        m_frmSearch.Controls(&quot;txt&quot; &amp; Format(i, &quot;00&quot;)).Height = m_frmSearch.InsideHeight * 0.95\r\n        ....\r\n    Next i\r\nEnd Property<\/pre>\n<p>Danach passt es die Breite des Unterformularsteuerelements so an, dass es der Breite des zu durchsuchenden Formulars entspricht. Aus diesem Grund muss das Formular mit dem Datenblatt auch zuerst &uuml;bergeben werden.<\/p>\n<p>Schlie&szlig;lich durchl&auml;uft die Prozedur alle Such-Steuerelemente und stellt deren H&ouml;he entsprechend der H&ouml;he des Such-Unterformulars ein.<\/p>\n<p>Die Vorbereitungen sind damit abgeschlossen.<\/p>\n<p><b>Aufbau der Such-Steuerelemente ansto&szlig;en<\/b><\/p>\n<p>Zum aktuellen Zeitpunkt haben wir lediglich vier mit Verweisen auf die Unterformularsteuerelemente und den enthaltenen Formularen gef&uuml;llte Objektvariablen sowie eine Collection mit den Namen der Felder des Recordsets im Datenblatt.<\/p>\n<p>Die Steuerelemente im Such-Unterformular befinden sich noch im jungfr&auml;ulichen Zustand. Damit sich dies &auml;ndert, legen wir die beiden oben bereits angesprochenen Ereignisprozeduren an, die durch den Timer alle zehn Millisekunden sowie durch manuelle &auml;nderungen des Spaltenaufbaus im Unterformular ausgel&ouml;st werden.<\/p>\n<p>Wenn der Benutzer an Spaltenbreiten, -sichtbarkeit oder -anordnung herumjustiert, erledigt er dies mit der Maus.<\/p>\n<p>Nach Abschluss der jeweiligen &auml;nderung l&auml;sst er die Maustaste los, was das Ereignis <b>Bei Maustaste <\/b>auf ausl&ouml;st. Die dadurch aufgerufene Prozedur sieht wie folgt aus und startet lediglich die Prozedur <b>CustomizeControls<\/b> (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-31-anchor\">Listing 4<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 4: Ereignisprozedur, die nach einem Mausklick auf die Spaltenk&ouml;pfe feuert.<\/p>\n<pre>Private Sub m_frmDatasheet_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)\r\n    Call CustomizeControls\r\nEnd Sub<\/pre>\n<p>Die durch den Timer ausgel&ouml;ste Prozedur besitzt ein paar Zeilen Code mehr. W&auml;hrend ein Mausklick auf die Spaltenk&ouml;pfe mit hoher Wahrscheinlichkeit auf ein &auml;ndern der Spalten abzielt, wird das <b>Timer<\/b>-Ereignis eher ausgel&ouml;st, um ja keine Scrollbewegung des Datenblatts zu verpassen.<\/p>\n<p>Daher ruft das Ereignis <b>OnMouseUp <\/b>immer die Prozedur <b>CustomizeControls <\/b>zum Anpassen der Suchleiste auf, w&auml;hrend das <b>Timer<\/b>-Ereignis zuerst pr&uuml;ft, ob eine &auml;nderung der Spalten durch das Scrollen im Datenblatt erfolgte (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-32-anchor\">Listing 5<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 5: Diese Routine wird alle 10 Millisekunden durch den Timer ausgel&ouml;st.<\/p>\n<pre>Private Sub m_frmDatasheet_Timer()\r\n    Dim strControlnames As String\r\n    strControlnames = CheckControlnames\r\n    If Not strControlnames = strControlnamesOld Then\r\n        Call CustomizeControls\r\n    End If\r\n    strControlnamesOld = strControlnames\r\nEnd Sub<\/pre>\n<p>Diese Pr&uuml;fung ist eigentlich ganz banal: Die Prozedur <b>CheckControlnames <\/b>durchl&auml;uft einfach nur in einer Schleife alle aktuell angezeigten Spalten des Datenblatts und fasst die Namen der entsprechenden Felder in einer Zeichenkette der Form <b>&lt;Feld1&gt;|&lt;Feld2&gt;|&lt;Feld3&gt;<\/b> zusammen.<\/p>\n<p>Das Ergebnis wird in der folgenden Variablen zwischengespeichert:<\/p>\n<pre>Private strControlnamesOld As String<\/pre>\n<p>Bei jedem Ausl&ouml;sen des <b>Timer<\/b>-Ereignisses liest <b>CheckControlnames <\/b>die Feldnamen erneut ein und pr&uuml;ft, ob sich im Vergleich zum vorherigen Aufruf etwas ge&auml;ndert hat.<\/p>\n<p>Falls ja, m&uuml;ssen die Suchfelder angepasst werden, was ein Aufruf der Prozedur <b>CustomizeControls <\/b>bewerkstelligt.<\/p>\n<p><b>Spalten des Datenblatts einlesen<\/b><\/p>\n<p>Spannend ist das Einlesen der einzelnen Feldnamen der Datenblattansicht. Der Grund: Wir k&ouml;nnen zwar mit einfachen Mitteln die Position, die Breite, die Sichtbarkeit und weitere Informationen zu jeder Spalte im Datenblatt einlesen.<\/p>\n<p>Es gibt aber keine M&ouml;glichkeit, die erste sichtbare Spalte zu ermitteln! Und das Scrollen erm&ouml;glicht es nun einmal, Spalten nach links au&szlig;erhalb des sichtbaren Bereichs zu bewegen.<\/p>\n<p>Somit ist es auf diese Weise unm&ouml;glich, die Suchsteuerelemente an die aktuell sichtbaren Spalten anzupassen.<\/p>\n<p>Also betreiben wir ein wenig mehr Aufwand. Die Funktion <b>CheckControlnames <\/b>holt sich zun&auml;chst &uuml;ber die Eigenschaft <b>hwnd <\/b>ein Handle auf das Datenblatt-Unterformular (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-34-anchor\">Listing 6<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 6: Einlesen der Namen der sichtbaren Spalten des Datenblatts<\/p>\n<pre>Private Function CheckControlnames()\r\n    ...\r\n    hwnd = m_frmDatasheet.hwnd\r\n    GetWindowRect hwnd, r\r\n    lngX = r.Left\r\n    lngY = r.Top\r\n    lngFormWidth = ConvertTwipsToPixels(m_frmDatasheet.InsideWidth, 0)\r\n    Do While Not lngX - r.Left + lngWidth &gt; lngFormWidth\r\n        If strControlVorher = strControl Then\r\n            lngX = lngX + 1\r\n        Else\r\n            If ctl.ColumnHidden = False Then\r\n                lngX = lngX + ConvertTwipsToPixels(ctl.ColumnWidth, 0)\r\n            Else\r\n                lngX = lngX + 1\r\n            End If\r\n        End If\r\n        If IsObject(m_frmDatasheet.acchittest(lngX, lngY)) Then\r\n            Select Case TypeName(m_frmDatasheet.acchittest(lngX, lngY))\r\n                Case &quot;Textbox&quot;, &quot;ComboBox&quot;, &quot;Checkbox&quot;\r\n                    Set ctl = m_frmDatasheet.acchittest(lngX, lngY)\r\n                Case Else\r\n                    Exit Do\r\n            End Select\r\n        End If\r\n        If Not ctl Is Nothing Then\r\n            strControlVorher = strControl\r\n            strControl = ctl.Name\r\n            If ctl.ColumnHidden = False Then\r\n                If Not strControlVorher = ctl.Name Then\r\n                    strControlnames = strControlnames &amp; &quot;|&quot; &amp; ctl.Name\r\n                End If\r\n            End If\r\n        End If\r\n    Loop\r\n    CheckControlnames = strControlnames\r\nEnd Function<\/pre>\n<p>Dies ist eine Speicheradresse, die f&uuml;r das Ermitteln von Informationen zu diesem Objekt in zahlreichen API-Funktionen notwendig ist.<\/p>\n<p>In unserem Fall verwenden wir die API-Funktion <b>GetWindowRect<\/b>, um die Koordinaten des Datenblatt-Unterformulars zu ermitteln und diese in eine Variable auf Basis des wie folgt deklarierten Typs zu speichern:<\/p>\n<pre>Private Type Rect\r\n    Left As Long\r\n    Top As Long\r\n    Right As Long\r\n    Bottom As Long\r\nEnd Type<\/pre>\n<p>Hier liest die Routine die Position der linken oberen Ecke des Unterformulars aus und speichert diese in den Variablen <b>lngX <\/b>und <b>lngY<\/b>.<\/p>\n<p>Die folgende Untersuchung erstreckt sich &uuml;ber die komplette Breite des Unterformulars, welche die Routine &uuml;ber die Eigenschaft <b>InsideWidth <\/b>des Formulars ermittelt.<\/p>\n<p>Danach beginnt eine Schleife, in der die Position eines gedachten Punktes so lange von der linken oberen Ecke nach rechts bewegt wird, bis dieser ein Objekt ber&uuml;hrt.<\/p>\n<p>Dies pr&uuml;ft die undokumentierte Funktion <b>accHitTest <\/b>auf Basis der aktuellen Koordinaten des Punktes. Handelt es sich bei diesem Objekt um ein <b>Textbox<\/b>-, ein <b>Checkbox<\/b>&#8211; oder ein <b>ComboBox<\/b>-Objekt, wird eine Referenz darauf in der Objektvariablen <b>ctl <\/b>gespeichert.<\/p>\n<p>Der Name dieses Steuerelements landet dann in einer Variablen namens <b>strControl<\/b>. Dies ist deshalb wichtig, weil die Schleife den Punkt weiter nach rechts bewegt und mit jedem Schritt erneut pr&uuml;ft, auf welchem Steuerelement dieser sich gerade befindet.<\/p>\n<p>Damit die Routine erkennt, wann sie innerhalb der Schleife eine Spalte verl&auml;sst und auf das der n&auml;chsten Spalte entsprechende Steuerelement st&ouml;&szlig;t, wird <b>strControl <\/b>vor dem F&uuml;llen in die Variable <b>strControlVorher <\/b>geschrieben.<\/p>\n<p>Sind <b>strControl <\/b>und <b>strControlVorher <\/b>nicht gleich, hat die Schleife eine neue Spalte gefunden.<\/p>\n<p>Auf diese Weise bewegt die Routine den zu untersuchenden Punkt solange weiter nach rechts, bis der rechte Rand des Formulars erreicht wurde. Jede neu erkannte Spalte wird in Form des Feldnamens an die bereits erw&auml;hnte Zeichenkette angeh&auml;ngt &#8211; jeweils durch das Pipe-Zeichen von den bereits vorhandenen Feldnamen getrennt.<\/p>\n<p>Und sollte sich das Ergebnis dieser Funktion in <b>m_frmDatasheet_Timer <\/b>vom vorherigen, in der Variablen <b>strControlnamesOld<\/b> gespeicherten Ergebnis unterscheiden, wissen wir: Der Benutzer hat vermutlich mit der horizontalen Bildlaufleiste eine &auml;nderung der sichtbaren Spalten durchgef&uuml;hrt.<\/p>\n<p><b>Such-Steuerelemente aufbauen<\/b><\/p>\n<p>Eine der schwierigsten Aufgaben dieser L&ouml;sung ist es, die 60 Steuerelemente des Formulars <b>frmSearchbar <\/b>so zu organisieren, dass diese genau &uuml;ber den Spalten des betroffenen Unterformulars in der Datenblattansicht angezeigt werden &#8211; und dass au&szlig;erdem auch noch immer das dem Felddatentyp entsprechende Steuerelement erscheint.<\/p>\n<p>Diese Aufgabe &uuml;bernimmt die Prozedur <b>CustomizeControls<\/b>, die zu einem gro&szlig;en Teil so &auml;hnlich wie die Funktion <b>CheckControlnames <\/b>funktioniert.<\/p>\n<p>Zumindest verwendet sie die gleiche Technik, um die Konfiguration der aktuell sichtbaren Spalten des Datenblatts zu ermitteln und die Suchsteuerelemente entsprechend anzupassen.<\/p>\n<p>In dieser Beziehung arbeitet die Prozedur sogar noch ein wenig genauer, denn die erste Spalte wird in der Regel nicht hundertprozentig erkannt. Mit einer zus&auml;tzlichen Variablen wird dieses Problem jedoch behoben.<\/p>\n<p>Schauen wir uns aber lieber den Ablauf der Prozedur <b>CustomizeControls <\/b>an, die sich konkret mit der Konfiguration der Suchsteuerelemente besch&auml;ftigt (die komplette Prozedur finden Sie im Modul <b>clsDatasheetSearch <\/b>der Beispieldatenbank). <\/p>\n<p>Wichtig ist hier beispielsweise die Collection, die modulweit wie folgt deklariert wird:<\/p>\n<pre>Private colControls As Collection<\/pre>\n<p>Diese wird jeweils beim Start der Prozedur gel&ouml;scht und neu erzeugt. Die Hauptaufgabe dieser Collection ist es, f&uuml;r jedes angezeigt Steuerelement eine sogenannte Wrapperklasse namens <b>clsDatasheetSearchControl <\/b>aufzunehmen.<\/p>\n<p>Diese Wrapperklasse dient unter anderem dazu, einen Verweis auf das entsprechende Suchsteuerelement aufzunehmen. Die Hauptaufgabe ist jedoch, dem betroffenen Steuerelement eine &#8211; Sie ahnen es bereits &#8211; Ereignisprozedur einzupflanzen.<\/p>\n<p>Dies scheint kompliziert, aber letztlich m&uuml;sste man sonst jedes einzelne der 60 Steuerelemente mit dem in der Wrapperklasse enthaltenen Code ausstatten.<\/p>\n<p>Doch der Reihe nach: Die Prozedur <b>CustomizeControls <\/b>greift sich, je nach dem Typ des zu durchsuchenden Feldes im Datenblatt, zun&auml;chst das erste Steuerelement, also entweder <b>txt01<\/b>, <b>cbo01 <\/b>oder <b>chk01<\/b>.<\/p>\n<p>Das betroffene Steuerelement wird sichtbar gemacht und der Abstand vom linken Formularrand entsprechend der Spaltenposition eingestellt.<\/p>\n<p>Gleiches geschieht mit der Breite des Suchsteuerelements &#8211; allerdings pr&uuml;ft die Prozedur hier noch, ob die korrespondierende Spalte des Datenblatts nicht gegebenenfalls die letzte sichtbare ist und dementsprechend nur teilweise angezeigt wird. In diesem Fall wird das Suchsteuerelement nicht breiter als der sichtbare Teil der Spalte.<\/p>\n<p>Das erste Suchsteuerelement erh&auml;lt den Fokus. Danach folgen einige vom Typ des Steuerelements der aktuellen Spalte abh&auml;ngige Einstellungen.<\/p>\n<p>Enth&auml;lt die Spalte ein Kombinationsfeld, wird das Suchsteuerelement beispielsweise mit den gleichen Eigenschaften wie dieses ausgestattet &#8211; schlie&szlig;lich soll es ja der Auswahl der m&ouml;glichen Eintr&auml;ge dieses Feldes dienen.<\/p>\n<p>Danach wird ein neues Objekt auf Basis der Wrapperklasse <b>clsDatasheetSearchControl <\/b>erstellt. Dieses hat drei Eigenschaften, welche die folgenden drei Informationen aufnehmen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">einen Verweis auf die zu untersuchende Spalte (<b>Control<\/b>),<\/li>\n<li class=\"aufz-hlung\">einen Verweis auf das Suchsteuerelement (<b>SearchControl<\/b>) und<\/li>\n<li class=\"aufz-hlung\">einen Verweis auf das aktuelle Objekt, also die Instanz der Klasse <b>clsDatasheetSearch<\/b>.<\/li>\n<\/ul>\n<p>Das frisch erzeugte und gef&uuml;llte Objekt landet dann gleich in der Collection <b>colControls<\/b>, damit es nach dem Beenden der Routine nicht im Daten-Nirwana verschwindet.<\/p>\n<p>Auf die gleiche Weise durchl&auml;uft die Prozedur alle sichtbaren Spalten des Datenblatts und bereitet die entsprechenden Steuerelemente f&uuml;r die Eingabe von Suchbegriffen vor. Schlie&szlig;lich werden die verbleibenden Steuerelemente unsichtbar gemacht.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Zwischenstand<\/p>\n<p>Wir haben also nun ein Datenblatt, ein Unterformular mit fertig ausgerichteten Suchsteuerelementen, die auf die Eingabe von Suchbegriffen warten und f&uuml;r jedes dieser Steuerelemente eine Klasse, welche weitere Funktionen bereitstellt. <\/p>\n<p>Die Suchsteuerelemente werden bei &auml;nderungen an der Konfiguration der sichtbaren Spalten automatisch angepasst. Was brauchen wir noch Eigentlich nur noch einen Algorithmus, der nach der Aktualisierung eines der Suchsteuerelemente den Filterausdruck f&uuml;r das Datenblatt zusammenstellt und diesen anwendet &#8211; und au&szlig;erdem eine Ereignisprozedur, die auf die Eingabe von Suchbegriffen in die Suchsteuerelemente reagiert.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Suche durchf&uuml;hren<\/p>\n<p>Um die Beschreibung der Klasse <b>clsDatasheetSearch <\/b>abzuschlie&szlig;en, schauen wir uns zun&auml;chst die Prozedur <b>Search <\/b>an (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-37-anchor\">Listing 7<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 7: Zusammenstellung des Filterausdrucks und Durchf&uuml;hren der Suche<\/p>\n<pre>Public Sub Search()\r\n    Dim fld As DAO.Field\r\n    Dim intDisplayControl As Integer\r\n    Dim strFilter As String\r\n    For Each fld In m_frmDatasheet.Recordset.Fields\r\n         intDisplayControl = 0\r\n        On Error Resume Next\r\n        intDisplayControl = fld.Properties(&quot;DisplayControl&quot;)\r\n        Select Case intDisplayControl\r\n            Case 0, acTextBox, acComboBox, acCheckBox\r\n                If Len(m_Fields.Item(fld.Name)) &gt; 0 Then\r\n                    Select Case fld.Type\r\n                        Case dbText, dbMemo\r\n                            strFilter = strFilter &amp; &quot; AND &quot; &amp; fld.Name &amp; &quot; LIKE ''&quot; _\r\n                                &amp; m_Fields.Item(fld.Name) &amp; &quot;''&quot;\r\n                        Case dbBoolean\r\n                            strFilter = strFilter &amp; &quot; AND &quot; &amp; fld.Name &amp; &quot; = &quot; _\r\n                                &amp; Replace(Replace(m_Fields.Item(fld.Name), &quot;Wahr&quot;, -1), &quot;Falsch&quot;, 0)\r\n                        Case Else\r\n                            strFilter = strFilter &amp; &quot; AND &quot; &amp; fld.Name &amp; &quot; LIKE ''&quot; _\r\n                                &amp; m_Fields.Item(fld.Name) &amp; &quot;''&quot;\r\n                    End Select\r\n                End If\r\n            Case Else\r\n                Debug.Print fld.Name, &quot;None&quot;\r\n        End Select\r\n        On Error GoTo 0\r\n    Next fld\r\n    If Len(strFilter) &gt; 0 Then\r\n         strFilter = Mid(strFilter, 5)\r\n        m_frmDatasheet.Filter = strFilter\r\n        m_frmDatasheet.FilterOn = True\r\n    Else\r\n         m_frmDatasheet.Filter = &quot;&quot;\r\n        m_frmDatasheet.FilterOn = False\r\n    End If\r\nEnd Sub<\/pre>\n<p>Diese durchl&auml;uft in einer Schleife alle Felder des Recordsets des Unterformulars in der Datenblattansicht.<\/p>\n<p>Dabei pr&uuml;ft sie den Typ des Steuerelements, das sich hinter der jeweiligen Spalte verbirgt. Au&szlig;erdem kommt hier endlich die weiter oben deklarierte und gef&uuml;llte Collection <b>m_Fields <\/b>zum Einsatz.<\/p>\n<p>Deren Eintr&auml;ge enthielten bislang nur die Feldnamen in der Eigenschaft <b>Key<\/b>. Nun wird auch noch die Eigenschaft <b>Value<\/b>, also der Wert des Collection-Eintrags, ausgelesen.<\/p>\n<p>Ist dieser Wert f&uuml;r das aktuelle Feld vorhanden (was erst geschieht, wenn der Benutzer einen Suchbegriff f&uuml;r ein Feld eingetragen hat), stellt die Prozedur einen entsprechenden Filterausdruck zusammen.<\/p>\n<p>Dieser setzt sich aus dem bisher zusammengestellten Filterausdruck, dem Schl&uuml;sselwort <b>AND<\/b>, dem Feldnamen, einem Vergleichsoperator (<b>LIKE <\/b>oder <b>=<\/b>) und dem Vergleichswert aus <b>m_Fields <\/b>zusammen.<\/p>\n<p>Auf diese Weise werden alle durch den Benutzer in die Suchsteuerelemente eingegebenen Suchausdr&uuml;cke erfasst und in entsprechende Filterkriterien umgesetzt.<\/p>\n<p>Den fertigen Ausdruck weist die Prozedur dann der <b>Filter<\/b>-Eigenschaft des Datenblatt-Unterformulars zu und aktiviert diesen mit der Eigenschaft <b>FilterOn<\/b>.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Die Wrapperklasse f&uuml;r die Suchsteuerelemente<\/p>\n<p>Die Klasse <b>clsDatasheetSearchControl <\/b>besitzt die &ouml;ffentlichen <b>Property Get<\/b>-Prozeduren, um die oben beschriebenen Verweise entgegenzunehmen.<\/p>\n<p>Wenn die Klasse <b>clsDatasheetSearch <\/b>beispielsweise ein Textfeld &uuml;bergibt, erfolgt das &uuml;ber die <b>Property Get<\/b>-Prozedur <b>SearchControl<\/b> (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-40-anchor\">Listing 8<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 8: Einstellen der Steuerelemente und ihrer Ereigniseigenschaften<\/p>\n<pre>Public Property Set SearchControl(ctl As Control)\r\n    Select Case ctl.ControlType\r\n        Case acTextBox\r\n            Set m_txt = ctl\r\n            m_txt.AfterUpdate = &quot;[Event Procedure]&quot;\r\n            m_txt.OnChange = &quot;[Event Procedure]&quot;\r\n        Case acCheckBox\r\n            Set m_chk = ctl\r\n            m_chk.AfterUpdate = &quot;[Event Procedure]&quot;\r\n        Case acComboBox\r\n            Set m_cbo = ctl\r\n            m_cbo.AfterUpdate = &quot;[Event Procedure]&quot;\r\n    End Select\r\nEnd Property<\/pre>\n<p>Diese pr&uuml;ft den Steuerelement-Typ und weist das Steuerelement einer der drei folgenden Variablen zu:<\/p>\n<pre>Private WithEvents m_txt As TextBox\r\nPrivate WithEvents m_cbo As ComboBox\r\nPrivate WithEvents m_chk As CheckBox<\/pre>\n<p>Alle sind als <b>WithEvents <\/b>deklariert und sollen auf das Ereignis <b>Nach Aktualisierung <\/b>reagieren, weshalb die Eigenschaft <b>AfterUpdate <\/b>des entsprechenden Steuerelements auf <b>[Event Procedure] <\/b>eingestellt wird. Zur entscheidenden Ereignisprozedur kommen wir gleich.<\/p>\n<p>Die auftauchende Objektvariable <b>m_DatasheetSearch <\/b>repr&auml;sentiert einen Verweis auf die Instanz der Klasse <b>clsDatasheetSearch<\/b>.<\/p>\n<p>Sie wird wie folgt deklariert und &uuml;ber die <b>Property Set<\/b>-Prozedur <b>DatasheetSearch <\/b>&uuml;bergeben:<\/p>\n<pre>Private m_DatasheetSearch As clsDatasheetSearch\r\nPublic Property Set DatasheetSearch(objDatasheetSearch As clsDatasheetSearch)\r\n    Set m_DatasheetSearch = objDatasheetSearch\r\nEnd Property<\/pre>\n<p>Der Verweis auf das zu durchsuchende Feld des Datenblatt-Unterformulars landet in dieser Variablen:<\/p>\n<pre>Private ctlDatasheet As Control<\/pre>\n<p>Die &Uuml;bergabe erfolgt mit der folgenden <b>Property Set<\/b>-Methode:<\/p>\n<pre>Public Property Set Control(ctl As Control)\r\n    Set ctlDatasheet = ctl\r\nEnd Property<\/pre>\n<p>Fehlt nur noch das Ereignis, das durch das &auml;ndern des Suchbegriffs durch den Benutzer ausgel&ouml;st wird. Dieses sieht etwa f&uuml;r ein Textfeld wie folgt aus:<\/p>\n<pre>Private Sub m_txt_AfterUpdate()\r\n    With m_DatasheetSearch\r\n        .Fields.Remove ctlDatasheet.ControlSource\r\n        .Fields.Add m_txt.Value, ctlDatasheet.ControlSource\r\n        .Search\r\n    End With\r\nEnd Sub<\/pre>\n<p>Die Eigenschaft <b>Fields <\/b>entspricht der Auflistung <b>m_Fields <\/b>der Klasse <b>clsDatasheetSearch <\/b>und enth&auml;lt, wie bereits weiter oben erw&auml;hnt, Eintr&auml;ge mit den Namen der Felder des Datenblatt-Unterformulars sowie den bereits eingegebenen Suchbegriffen.<\/p>\n<p><b>m_Fields <\/b>wird in <b>clsDatasheetSearch <\/b>durch folgende &ouml;ffentliche <b>Property Get<\/b>-Prozedur bereitgestellt &#8211; so kann beispielsweise die Ereignisprozedur <b>m_txt_AfterUpdate <\/b>leicht auf ihre Elemente zugreifen:<\/p>\n<pre>Public Property Get Fields() As Collection\r\nSet Fields = m_Fields\r\nEnd Property<\/pre>\n<p>Hat der Benutzer nun einen neuen Suchbegriff eingegeben, l&ouml;scht <b>m_txt_AfterUpdate <\/b>zun&auml;chst das Element mit dem Feldnamen als <b>Key <\/b>aus der Collection. Anschlie&szlig;end legt sie diesen neu an und f&uuml;gt gleich noch den Suchbegriff als Wert hinzu.<\/p>\n<p>Zu guter Letzt ruft die Prozedur die Methode <b>Search <\/b>der Klasse <b>clsDatasheetSearch <\/b>auf, die wie oben beschrieben den Filterausdruck mit dem neuen Suchbegriff zusammenstellt und anwendet.<\/p>\n<p>Dies funktioniert &uuml;brigens f&uuml;r alle Aktualisierungen der Suchsteuerelemente &#8211; auch, wenn der Benutzer ein Suchsteuerelement geleert hat, um den Filter zu entfernen. Ein eventuell vorhandener Eintrag in der <b>Fields<\/b>-Collection mit einem Suchbegriff wird dann gel&ouml;scht und durch einen ohne Suchbegriff ersetzt.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Sollte es bereits einen solchen Suchmechanismus f&uuml;r Unterformulare in der Datenblattansicht geben, so ist er unseren Recherchen bislang entgangen. Wir gehen jedoch davon aus, dass die Technik so noch nicht existiert und freuen uns, Ihnen damit ein hoffentlich n&uuml;tzliches Tool an die Hand zu geben.<\/p>\n<p>Es kann nat&uuml;rlich noch beliebig erweitert werden. So w&auml;re es beispielsweise denkbar, die Suchkriterien etwa f&uuml;r Zahlen- und Datumsfelder auf Bereiche (von &#8230; bis) auszudehnen. Oder man k&ouml;nnte jedem Suchfeld kleine Schaltfl&auml;chen hinzuf&uuml;gen, mit denen es komfortabel geleert wird.<\/p>\n<p>Vielleicht fallen Ihnen andere Erweiterungen ein &#8211; falls ja, teilen Sie uns diese doch einfach unter <b>info@access-im-unternehmen.de <\/b>mit.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Suchfelder.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{08F37DBE-10AB-4ED2-AC56-0D16B4CB90DC}\/aiu_762.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Datenbl&auml;tter liefern ausreichende M&ouml;glichkeiten zum Durchsuchen und Filtern ihrer Inhalte. Leider sind diese meist versteckt, sodass Otto Normalverbraucher &uuml;blicherweise erst mit der Nase darauf gesto&szlig;en werden muss. Viel sch&ouml;ner w&auml;re es doch, wenn das Datenblatt &uuml;ber jeder Spalte ein entsprechendes Steuerelement zur Eingabe der gesuchten Werte enthielte. Schauen wir uns also an, welche M&ouml;glichkeiten es hier gibt und wie wir die auftretenden Klippen umschiffen.<\/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":[66012011,662011,44000027],"tags":[],"class_list":["post-55000762","post","type-post","status-publish","format-standard","hentry","category-66012011","category-662011","category-Loesungen"],"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>Datenblatt-Suchleiste - 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\/DatenblattSuchleiste\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Datenblatt-Suchleiste\" \/>\n<meta property=\"og:description\" content=\"Datenbl&auml;tter liefern ausreichende M&ouml;glichkeiten zum Durchsuchen und Filtern ihrer Inhalte. Leider sind diese meist versteckt, sodass Otto Normalverbraucher &uuml;blicherweise erst mit der Nase darauf gesto&szlig;en werden muss. Viel sch&ouml;ner w&auml;re es doch, wenn das Datenblatt &uuml;ber jeder Spalte ein entsprechendes Steuerelement zur Eingabe der gesuchten Werte enthielte. Schauen wir uns also an, welche M&ouml;glichkeiten es hier gibt und wie wir die auftretenden Klippen umschiffen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/DatenblattSuchleiste\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:01:38+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/c148db44012144e5aedb35bc1cb1257e\" \/>\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\\\/DatenblattSuchleiste\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenblattSuchleiste\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Datenblatt-Suchleiste\",\"datePublished\":\"2020-05-22T22:01:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenblattSuchleiste\\\/\"},\"wordCount\":4232,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenblattSuchleiste\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/c148db44012144e5aedb35bc1cb1257e\",\"articleSection\":[\"1\\\/2011\",\"2011\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenblattSuchleiste\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenblattSuchleiste\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenblattSuchleiste\\\/\",\"name\":\"Datenblatt-Suchleiste - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenblattSuchleiste\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenblattSuchleiste\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/c148db44012144e5aedb35bc1cb1257e\",\"datePublished\":\"2020-05-22T22:01:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenblattSuchleiste\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenblattSuchleiste\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenblattSuchleiste\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/c148db44012144e5aedb35bc1cb1257e\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/c148db44012144e5aedb35bc1cb1257e\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/DatenblattSuchleiste\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Datenblatt-Suchleiste\"}]},{\"@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":"Datenblatt-Suchleiste - 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\/DatenblattSuchleiste\/","og_locale":"de_DE","og_type":"article","og_title":"Datenblatt-Suchleiste","og_description":"Datenbl&auml;tter liefern ausreichende M&ouml;glichkeiten zum Durchsuchen und Filtern ihrer Inhalte. Leider sind diese meist versteckt, sodass Otto Normalverbraucher &uuml;blicherweise erst mit der Nase darauf gesto&szlig;en werden muss. Viel sch&ouml;ner w&auml;re es doch, wenn das Datenblatt &uuml;ber jeder Spalte ein entsprechendes Steuerelement zur Eingabe der gesuchten Werte enthielte. Schauen wir uns also an, welche M&ouml;glichkeiten es hier gibt und wie wir die auftretenden Klippen umschiffen.","og_url":"https:\/\/access-im-unternehmen.de\/DatenblattSuchleiste\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:01:38+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/c148db44012144e5aedb35bc1cb1257e","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\/DatenblattSuchleiste\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/DatenblattSuchleiste\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Datenblatt-Suchleiste","datePublished":"2020-05-22T22:01:38+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/DatenblattSuchleiste\/"},"wordCount":4232,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/DatenblattSuchleiste\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/c148db44012144e5aedb35bc1cb1257e","articleSection":["1\/2011","2011","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/DatenblattSuchleiste\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/DatenblattSuchleiste\/","url":"https:\/\/access-im-unternehmen.de\/DatenblattSuchleiste\/","name":"Datenblatt-Suchleiste - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/DatenblattSuchleiste\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/DatenblattSuchleiste\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/c148db44012144e5aedb35bc1cb1257e","datePublished":"2020-05-22T22:01:38+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/DatenblattSuchleiste\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/DatenblattSuchleiste\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/DatenblattSuchleiste\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/c148db44012144e5aedb35bc1cb1257e","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/c148db44012144e5aedb35bc1cb1257e"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/DatenblattSuchleiste\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Datenblatt-Suchleiste"}]},{"@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\/55000762","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=55000762"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000762\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000762"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000762"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000762"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}