{"id":55000964,"date":"2014-12-01T00:00:00","date_gmt":"2020-05-22T21:14:04","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=964"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Suchen_mit_der_clsFlexSearchKlasse","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Suchen_mit_der_clsFlexSearchKlasse\/","title":{"rendered":"Suchen mit der clsFlexSearch-Klasse"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/ef5a311f1f3d4b488052355d3e37eae3\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Die Klasse clsFlexSearch l&auml;sst sich einfach in Formulare integrieren und f&uuml;gt einem einfachen Textfeld umfassende Suchm&ouml;glichkeiten hinzu. Wie Sie diese Suche implementieren, erfahren Sie im Beitrag Flexible Suche in Formularen (www.access-im-unternehmen.de\/965). Der vorliegende Beitrag erl&auml;utert die Klasse clsFlexSearch und stellt den Code vor, damit Sie diesen nachvollziehen und ihn gegebenenfalls an Ihre eigenen Bed&uuml;rfnisse anpassen k&ouml;nnen.<\/b><\/p>\n<p><b>Alles in einer Klasse<\/b><\/p>\n<p>Die Klasse <b>clsFlexSearch <\/b>bietet nicht nur eine praktische Suchfunktion, sondern Sie ist au&szlig;erdem auch noch ganz leicht zu implementieren.<\/p>\n<p>Der Grund ist, dass der komplette Code in einer einzigen Klasse gekapselt ist und Sie dem Formular, das Sie mit der Funktion ausstatten m&ouml;chten, lediglich einige Zeilen VBA-Code hinzuf&uuml;gen m&uuml;ssen.<\/p>\n<p>Die Klasse hat die Aufgabe, ein Textfeld mit einer Suchfunktion zu versehen (s. Bild 1). Der Benutzer gibt dort das Suchkriterium ein und die in der Klasse enthaltenen Ereignisprozeduren liefern die Funktionen dazu:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_06\/pic_964_001.png\" alt=\"Die Klasse clsFlexSearch in Aktion\" width=\"575\" height=\"407,1812\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Die Klasse clsFlexSearch in Aktion<\/span><\/b><\/p>\n<ul>\n<li>die automatische Erg&auml;nzung der Eingabe des Benutzers bez&uuml;glich der zu durchsuchenden Feldnamen und<\/li>\n<li>die Funktion, die den eingegebenen Ausdruck parst und eine entsprechende <b>Where<\/b>-Klausel formuliert und zur&uuml;ckgibt.<\/li>\n<\/ul>\n<p><b>Die Klasse clsFlexSearch<\/b><\/p>\n<p>Um die Klasse anzulegen, erstellen Sie im VBA-Editor &uuml;ber <b>Einf&uuml;gen|Klassenmodul <\/b>ein neues Klassenmodul und speichern es unter dem Namen <b>clsFlexSearch<\/b>.<\/p>\n<p>Die Klasse verwendet insgesamt vier Member-Variablen, denen der Benutzer vom Klassenmodul des Formulars aus die entsprechenden Eigenschaftswerte zuweist. Diese Member-Variablen werden wie folgt im Kopf des Klassenmoduls <b>clsFlexSearch <\/b>deklariert:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_Suchabfrage<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>m_PKFeld<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>m_PKFeldEinschliessen<span style=\"color:blue;\"> As Boolean<\/span>\r\n<span style=\"color:blue;\">Private <\/span>WithEvents m_Suchfeld<span style=\"color:blue;\"> As <\/span>TextBox<\/pre>\n<p><b>Eigenschaften zuweisen<\/b><\/p>\n<p>Die in diesen vier Variablen gespeicherten Werte sollen &uuml;ber &ouml;ffentliche Eigenschaften der Implementierung der Klasse <b>clsFlexSearch <\/b>zugewiesen werden, also etwa so:<\/p>\n<pre><span style=\"color:blue;\">With<\/span> objFlexSearch\r\n     .Suchabfrage = \"qryArtikelsuche\"\r\n     .PKFeld = \"ArtikelID\"\r\n     .PKFeldEinschliessen = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> .Suchfeld = Me!txtSucheNach\r\nEnd <span style=\"color:blue;\">With<\/span><\/pre>\n<p>Diese Eigenschaften zum Entgegennehmen der Werte f&uuml;r die Member-Variablen programmieren wir in der Klasse <b>clsFlexSearch <\/b>als <b>Public Property Let<\/b>&#8211; beziehungsweise <b>Public Property Set<\/b>-Prozeduren. Die erste sieht wie in Listing 1 aus und nimmt als Parameter einen Wert entgegen, der nach dem Zuweisen in die Variable <b>m_Suchabfrage <\/b>eingetragen wird.<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>Suchabfrage(strSuchabfrage<span style=\"color:blue;\"> As String<\/span>)\r\n     m_Suchabfrage = strSuchabfrage\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: &ouml;ffentliche Eigenschaft f&uuml;r die Angabe der Suchabfrage<\/span><\/b><\/p>\n<p>F&uuml;r Wert-Variablen etwa vom Datentyp <b>String <\/b>verwenden wir das Schl&uuml;sselwort <b>Let<\/b>, sp&auml;ter f&uuml;r Objektvariablen das Schl&uuml;sselwort <b>Set<\/b>.<\/p>\n<p>Die <b>Public Property Let<\/b>-Prozedur <b>PKFeld <\/b>aus Listing 2 erwartet den Namen des Prim&auml;rschl&uuml;sselfeldes und weist diesen der Membervariablen <b>m_PKFeld <\/b>zu.<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>PKFeld(strPKFeld<span style=\"color:blue;\"> As String<\/span>)\r\n     m_PKFeld = strPKFeld\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: &ouml;ffentliche Eigenschaft f&uuml;r die Angabe des Prim&auml;rschl&uuml;sselfeldes<\/span><\/b><\/p>\n<p>&auml;hnlich arbeitet die <b>Public Property Let<\/b>-Prozedur <b>PKFeldEinschliessen<\/b>. Die an diese Eigenschaft &uuml;bergebene Variable legt fest, ob der Name des Prim&auml;rschl&uuml;sselfelds im Such-Textfeld automatisch erg&auml;nzt und ob es bei der Suche &uuml;ber alle Felder ber&uuml;cksichtigt werden soll (s. Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>PKFeldEinschliessen(bolPKFeldEinschliessen<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     m_PKFeldEinschliessen = bolPKFeldEinschliessen\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Hiermit legen Sie fest, ob der Prim&auml;rschl&uuml;ssel f&uuml;r die Suche ber&uuml;cksichtigt wird.<\/span><\/b><\/p>\n<p>Interessant wird es bei der <b>Public Property Set<\/b>-Prozedur <b>Suchfeld<\/b>. Diese nimmt einen Verweis auf das Textfeld entgegen, das zur Eingabe der Suchbegriffe verwendet werden soll.<\/p>\n<p>Die Prozedur speichert diesen Verweis in der Membervariablen <b>m_Suchfeld<\/b>, welches den Datentyp <b>Textbox <\/b>aufweist und mit dem Schl&uuml;sselwort <b>WithEvents <\/b>deklariert wurde.<\/p>\n<p>Auf diese Weise k&ouml;nnen Sie, auch wenn das Textfeld gar kein Objekt der aktuellen Klasse ist, in dieser Klasse auf seine Ereignisse reagieren. Dazu tragen wir f&uuml;r die den relevanten Ereignissen entsprechenden Eigenschaften jeweils den Wert <b>[Event Procedure] <\/b>ein &#8211; hier f&uuml;r die Eigenschaften <b>OnKeyUp <\/b>und <b>OnKeyDown<\/b> (s. Listing 4).<\/p>\n<pre><span style=\"color:blue;\">Public Property <span style=\"color:blue;\">Set<\/span> <\/span>Suchfeld(txtSuchfeld<span style=\"color:blue;\"> As <\/span>TextBox)\r\n     <span style=\"color:blue;\">Set<\/span> m_Suchfeld = txtSuchfeld\r\n     <span style=\"color:blue;\">With<\/span> m_Suchfeld\r\n         .OnKeyDown = \"[Event Procedure]\"\r\n         .OnKeyUp = \"[Event Procedure]\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Zuweisen des Such-Textfeldes<\/span><\/b><\/p>\n<p>Auf die entsprechenden Ereignisse <b>Bei Taste ab <\/b>und <b>Bei Taste auf <\/b>reagieren wir, um bei der Eingabe von Zeichen erstens zu pr&uuml;fen, ob hier eine automatische Vervollst&auml;ndigung angewendet werden muss, und zweitens, um auf die Tab-Taste und das Zeichen Doppelpunkt (:) zu reagieren.<\/p>\n<p>Beides soll den als Autovervollst&auml;ndigungs-Wert angegebenen Ausdruck best&auml;tigen und einen Doppelpunkt hinten anf&uuml;gen, damit der Benutzer hier den Vergleichsausdruck eintragen kann.<\/p>\n<p><b>Beim Herunterdr&uuml;cken einer Taste<\/b><\/p>\n<p>Nun m&uuml;ssen wir die Ereignisprozedur programmieren, die beim Herunterdr&uuml;cken einer Taste im Suchen-Textfeld ausgel&ouml;st wird. Die Prozedur sieht wie in Listing 5 aus und liefert mit <b>KeyCode <\/b>einen der gedr&uuml;ckten Taste entsprechenden Integer-Wert sowie mit <b>Shift <\/b>einen Wert, der angibt, ob gleichzeitig die <b>Umschalt<\/b>-, die <b>Alt<\/b>&#8211; oder die <b>Strg<\/b>-Taste gedr&uuml;ckt wurde.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_Suchfeld_KeyDown(KeyCode<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>intSelStart<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intSelLength<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intStarttemp<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intLenTemp<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFeldTemp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSuche<span style=\"color:blue;\"> As String<\/span>\r\n     intKeycode = KeyCode\r\n     Select Case intKeycode\r\n         <span style=\"color:blue;\">Case <\/span>9, 190\r\n             <span style=\"color:blue;\">If <\/span>intKeycode = 190 And <span style=\"color:blue;\">Not<\/span> Shift = acShiftMask<span style=\"color:blue;\"> Then<\/span>\r\n                 <span style=\"color:blue;\">Exit Sub<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             KeyCode = 0\r\n             strSuche = m_Suchfeld.Text\r\n             intSelStart = m_Suchfeld.SelStart\r\n             intSelLength = m_Suchfeld.SelLength\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> ArrayGefuellt(strSuchfelder)<span style=\"color:blue;\"> Then<\/span>\r\n                 SuchfelderEinlesen\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             intStarttemp = <span style=\"color:blue;\">InStrRev<\/span>(strSuche, \" \", intSelStart + intSelLength) + 1\r\n             strFeldTemp = <span style=\"color:blue;\">Mid<\/span>(strSuche, intStarttemp, intSelStart + intSelLength)\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strFeldTemp) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                 intLenTemp = <span style=\"color:blue;\">Len<\/span>(strFeldTemp)\r\n                 For i = <span style=\"color:blue;\">LBound<\/span>(strSuchfelder) To <span style=\"color:blue;\">UBound<\/span>(strSuchfelder)\r\n                     <span style=\"color:blue;\">If <\/span>strFeldTemp = <span style=\"color:blue;\">Left<\/span>(strSuchfelder(i), intLenTemp)<span style=\"color:blue;\"> Then<\/span>\r\n                         m_Suchfeld.Text = <span style=\"color:blue;\">Left<\/span>(m_Suchfeld.Text, intSelStart + intSelLength - 1) _\r\n                             & <span style=\"color:blue;\">Mid<\/span>(strSuchfelder(i), intLenTemp) & \":\" _\r\n                             & <span style=\"color:blue;\">Mid<\/span>(m_Suchfeld.Text, intSelStart + intSelLength + 1)\r\n                         m_Suchfeld.SelStart = _\r\n                             intSelStart + intSelLength + <span style=\"color:blue;\">Len<\/span>(strSuchfelder(i)) - intLenTemp + 1\r\n                         <span style=\"color:blue;\">Exit For<\/span>\r\n                     <span style=\"color:blue;\">End If<\/span>\r\n                 <span style=\"color:blue;\">Next<\/span> i\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Case <\/span>13\r\n             Suchen m_Suchfeld.Text\r\n             KeyCode = 0\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">Debug.Print<\/span> intKeycode\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Ereignisprozedur, die bei Herunterdr&uuml;cken einer Taste im Suchen-Textfeld ausgel&ouml;st wird<\/span><\/b><\/p>\n<p>Die Prozedur speichert zun&auml;chst den <b>KeyCode <\/b>in der Variablen <b>intKeyCode<\/b>, die wir im Kopf des Klassenmoduls wie folgt deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>intKeycode<span style=\"color:blue;\"> As Integer<\/span><\/pre>\n<p>Dies ist n&ouml;tig, weil wir den <b>KeyCode <\/b>in einigen F&auml;llen auch noch in der sp&auml;ter aufgerufenen Ereignisprozedur <b>m_Suchfeld_KeyUp <\/b>ben&ouml;tigen, diese aber in <b>m_Suchfeld_KeyDown <\/b>auf den Wert <b>0 <\/b>setzen, damit die eigentliche Wirkung dieses Tastendrucks unterdr&uuml;ckt wird.<\/p>\n<p>Die folgende <b>Select Case<\/b>-Bedingung pr&uuml;ft einige Werte f&uuml;r <b>intKeyCode<\/b>. Der erste Zweig reagiert auf die Werte <b>9 <\/b>und <b>190<\/b>. <b>9 <\/b>entspricht der <b>Tab<\/b>-Taste, <b>190 <\/b>dem Doppelpunkt.<\/p>\n<p>Eigentlich entspricht 190 der Taste, auf der sich der Punkt und der Doppelpunkt befinden, aber auf den Punkt wollen wir nicht reagieren. Also verlassen wir die Prozedur, wenn der zweite Parameter, <b>Shift<\/b>, nicht den Wert 1 (oder <b>acShiftMask<\/b>) enth&auml;lt.<\/p>\n<p>In diesem Fall stellen wir <b>KeyCode <\/b>auf den Wert <b>0 <\/b>ein, da etwa das Bet&auml;tigen der <b>Tab<\/b>-Taste sonst zum Verlassen des Textfeldes f&uuml;hren w&uuml;rde. Die Prozedur speichert den aktuellen Inhalt des mit <b>m_Suchfeld <\/b>referenzierten Such-Textfeldes in der Variablen <b>strSuche<\/b>. Die Variable <b>intSelStart <\/b>nimmt die aktuelle Position der Einf&uuml;gemarke auf, die Variable <b>intSelLength<\/b> die L&auml;nge des aktuell markierten Textes.<\/p>\n<p>Nun ben&ouml;tigen wir eine Liste aller Suchfelder, also derjenigen Felder, die in der f&uuml;r die Eigenschaft <b>Suchabfrage <\/b>angegebenen Abfrage enthalten sind.<\/p>\n<p>Der Performance halber wollen wir diese nicht jedes Mal neu aus der Definition der Abfrage abrufen, deshalb speichern wir diese einmalig in einem Array namens <b>strSuchfelder<\/b>.<\/p>\n<p>Um dieses nur einmal zu f&uuml;llen, pr&uuml;fen wir zun&auml;chst mithilfe der Funktion <b>ArrayGefuellt<\/b>, ob das Array <b>strSuchfelder <\/b>bereits gef&uuml;llt ist. Diese Funktion erl&auml;utern wir im Detail im Beitrag <b>Mit Arrays arbeiten <\/b>(<b>www.access-im-unternehmen.de\/963<\/b>).<\/p>\n<p>Die Variable <b>strSuchfelder <\/b>deklarieren wir &uuml;brigens wie folgt im Kopf des Klassenmoduls <b>clsFlexSearch<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>strSuchfelder()<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Wenn das Array noch nicht gef&uuml;llt ist, liest die Prozedur <b>SuchfelderEinlesen <\/b>die Felder der unter <b>m_Suchabfrage <\/b>angegebenen Abfrage in das Array <b>strSuchfelder <\/b>ein (s. Listing 6). Die Prozedur &ouml;ffnet ein <b>QueryDef<\/b>-Objekt auf Basis der angegebenen Abfrage und durchl&auml;uft in einer <b>For Each<\/b>-Schleife alle Felder dieser Abfrage. Dabei pr&uuml;ft die Prozedur, ob es sich bei dem aktuellen Feld um das als Prim&auml;rschl&uuml;ssel angegebene Feld handelt und dieses gleichzeitig f&uuml;r die Suche ber&uuml;cksichtigt werden soll.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SuchfelderEinlesen()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>qdf<span style=\"color:blue;\"> As <\/span>DAO.QueryDef\r\n     <span style=\"color:blue;\">Dim <\/span>fld<span style=\"color:blue;\"> As <\/span>DAO.Field\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> qdf = db.QueryDefs(m_Suchabfrage)\r\n     For Each fld In qdf.Fields\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> (fld.Name = m_PKFeld And m_PKFeldEinschliessen = <span style=\"color:blue;\">False<\/span>)<span style=\"color:blue;\"> Then<\/span>\r\n             ReDim Preserve strSuchfelder(qdf.Fields.Count)<span style=\"color:blue;\"> As String<\/span>\r\n             strSuchfelder(i) = fld.Name\r\n             i = i + 1\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> fld\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Einlesen von Suchfeldern in ein Array<\/span><\/b><\/p>\n<p>Ist dies der Fall oder handelt es sich um eines der &uuml;brigen Felder, f&uuml;gt die Prozedur den Namen des Feldes zum Array hinzu, wobei zuvor die Anzahl der zul&auml;ssigen Elemente angepasst wird.<\/p>\n<p>Die Prozedur ermittelt dann ausgehend von der aktuellen Position der Einf&uuml;gemarke die Position des ersten Leerzeichens links von der Einf&uuml;gemarke und speichert diese in der Variablen <b>intStartTemp<\/b>. Sollte hierbei kein Leerzeichen gefunden werden, liefert die <b>InStrRev<\/b>-Funktion den Wert <b>0<\/b>. In jedem Fall addiert diese Zeile den Wert <b>1 <\/b>zum Ergebnis.<\/p>\n<p>In <b>strFeldTemp <\/b>landet dann die Zeichenkette, die sich zwischen dieser Position und der aktuellen Position der Einf&uuml;gemarke befindet (inklusive Markierung, falls vorhanden).<\/p>\n<p>Enth&auml;lt <b>strFeldTemp <\/b>nun einen Wert (<b>Len(strFeldTemp) > 0<\/b>), beginnt die weitere Verarbeitung. Die Variable <b>intLen-Temp <\/b>wird nun mit der L&auml;nge des in <b>strFeldTemp <\/b>gespeicherten Ausdrucks gef&uuml;llt.<\/p>\n<p>In einer <b>For&#8230;Next<\/b>-Schleife durchl&auml;uft die Prozedur alle Eintr&auml;ge des Arrays <b>strSuchfelder<\/b>, also alle Feldnamen der Suchabfrage. Darin pr&uuml;ft die Prozedur, ob der in <b>strFeldTemp <\/b>gespeicherte Ausdruck mit den ersten <b>intLenTemp <\/b>Zeichen des Feldnamens &uuml;bereinstimmt.<\/p>\n<p>Wenn <b>strFeldTemp <\/b>also nun den Aus-druck <b>Art <\/b>enth&auml;lt, weil der Benutzer gerade das Feld <b>Artikelname <\/b>eintippen m&ouml;chte, vergleicht die Prozedur diesen Ausdruck jeweils mit den ersten drei Zeichen der in der Variablen <b>strSuchfelder <\/b>gespeicherten Feldnamen. St&ouml;&szlig;t die Prozedur so auf das Feld <b>Artikelname<\/b>, wird der Teil innerhalb der <b>If&#8230;Then<\/b>-Bedingung ausgef&uuml;hrt. Hier tr&auml;gt die Prozedur einen Ausdruck in die Eigenschaft <b>Text<\/b> des Suchen-Textfeldes ein, der aus den folgenden Elementen besteht:<\/p>\n<ul>\n<li>Inhalt des Such-Textfeldes bis zur Einf&uuml;gemarke und<\/li>\n<li>den Teil des gefundenen Feldnamens, der noch nicht eingegeben wurde (in diesem Beispiel <b>Artikelname <\/b>ohne die ersten drei Buchstaben <b>Art<\/b>, also <b>ikelname<\/b>) und<\/li>\n<li>den Doppelpunkt.<\/li>\n<\/ul>\n<p>Au&szlig;erdem positioniert die Prozedur die Einf&uuml;gemarke hinter den Doppelpunkt.<\/p>\n<p>Da die Prozedur nun ein passendes Feld f&uuml;r die Autoerg&auml;nzung gefunden hat, k&ouml;nnen wir die <b>For&#8230;Next<\/b>-Schleife verlassen.<\/p>\n<p>Der folgende Zweig der <b>Select Case<\/b>-Bedingung pr&uuml;ft noch, ob der Benutzer die Eingabetaste gedr&uuml;ckt hat (<b>KeyCode <\/b>hat dann den Wert <b>13<\/b>). Dies soll die Suche ausl&ouml;sen.<\/p>\n<p>Ist dies der Fall, wird <b>KeyCode <\/b>auf den Wert <b>0 <\/b>eingestellt, damit die Eingabe nicht wie &uuml;blich verarbeitet wird. Au&szlig;erdem ruft die Prozedur die Routine <b>Suchen <\/b>mit dem aktuellen Inhalt des Textfeldes als Parameter auf.<\/p>\n<p>Bevor wir uns diese Routine ansehen, werfen wir noch einen Blick auf die Prozedur, die durch das Ereignis <b>Bei Taste auf <\/b>ausgel&ouml;st wird.<\/p>\n<p><b>Taste im Suchfeld loslassen<\/b><\/p>\n<p>Die Prozedur liefert die gleichen Parameter wie die zuvor beschriebene Ereignisprozedur, also <b>KeyCode <\/b>und <b>Shift<\/b> (s. Listing 7). Da wir hier und da aber den Wert von <b>KeyCode <\/b>auf <b>0 <\/b>gesetzt haben, damit die eigentliche Wirkung dieses Tastendrucks nicht zustande kommt, verwenden wir diese nicht. Stattdessen verwenden wir den in der vorher aufgerufenen Ereignisprozedur <b>m_Suchfeld_KeyDown <\/b>in der modulweit deklarierten Variable <b>intKeyCode <\/b>gespeicherten Wert. <\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>m_Suchfeld_KeyUp(KeyCode<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strSuche<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intSelStart<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intSelLength<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFeldTemp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intStarttemp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intLenTemp<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     Select Case intKeycode\r\n         <span style=\"color:blue;\">Case <\/span>8, 37, 39 ''L&ouml;schen, nach links, nach rechts\r\n             <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     strSuche = m_Suchfeld.Text\r\n     intSelStart = m_Suchfeld.SelStart\r\n     intSelLength = m_Suchfeld.SelLength\r\n     <span style=\"color:blue;\">If <\/span>intSelStart + intSelLength &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         intStarttemp = <span style=\"color:blue;\">InStrRev<\/span>(strSuche, \" \", intSelStart + intSelLength) + 1\r\n         strFeldTemp = <span style=\"color:blue;\">Mid<\/span>(strSuche, intStarttemp, intSelStart + intSelLength)\r\n         intLenTemp = <span style=\"color:blue;\">Len<\/span>(strFeldTemp)\r\n         <span style=\"color:blue;\">If <\/span>intLenTemp &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> ArrayGefuellt(strSuchfelder)<span style=\"color:blue;\"> Then<\/span>\r\n                 SuchfelderEinlesen\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             For i = <span style=\"color:blue;\">LBound<\/span>(strSuchfelder) To <span style=\"color:blue;\">UBound<\/span>(strSuchfelder)\r\n                 <span style=\"color:blue;\">If <\/span>strFeldTemp = <span style=\"color:blue;\">Left<\/span>(strSuchfelder(i), intLenTemp)<span style=\"color:blue;\"> Then<\/span>\r\n                     <span style=\"color:blue;\">If <\/span>intSelStart = <span style=\"color:blue;\">Len<\/span>(strSuche)<span style=\"color:blue;\"> Then<\/span>\r\n                         m_Suchfeld.Text = m_Suchfeld.Text & <span style=\"color:blue;\">Mid<\/span>(strSuchfelder(i), intLenTemp + 1)\r\n                         m_Suchfeld.SelStart = intSelStart\r\n                         m_Suchfeld.SelLength = <span style=\"color:blue;\">Len<\/span>(strSuchfelder(i)) + intStarttemp - intSelStart\r\n                     <span style=\"color:blue;\">End If<\/span>\r\n                     <span style=\"color:blue;\">Exit For<\/span>\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">Next<\/span> i\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strFeldTemp = \"\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Ereignisprozedur, die bei Loslassen einer Taste im Suchen-Textfeld ausgel&ouml;st wird<\/span><\/b><\/p>\n<p>Die Prozedur soll nichts tun, wenn der Benutzer die Tasten <b>L&ouml;schen<\/b>, <b>Nach links <\/b>und <b>Nach rechts <\/b>bet&auml;tigt hat &#8211; hier sollen die herk&ouml;mmlichen Funktionen verwendet werden.<\/p>\n<p>F&uuml;r die &uuml;brigen Tasten speichert die Prozedur zun&auml;chst den aktuellen Inhalt des mit <b>m_Suchfeld <\/b>referenzierten Textfeldes in der Variablen <b>strSuche<\/b>. Dann tr&auml;gt sie die Position der Einf&uuml;gemarke und die L&auml;nge der Markierung in die Variablen <b>intSelStart <\/b>und <b>intSelLength <\/b>ein.<\/p>\n<p>Wenn sich die Einf&uuml;gemarke plus Markierung an einer Position rechts von der ganz linken Position befindet, wird der Inhalt der folgenden <b>If&#8230;Then<\/b>-Bedingung ausgef&uuml;hrt.<\/p>\n<p><b>intStartTemp <\/b>erh&auml;lt dort zun&auml;chst die Position des ersten Leerzeichens links von der aktuellen Markierung plus eins, sollte sich dort kein Leerzeichen finden erh&auml;lt die Variable den Wert <b>1<\/b>.<\/p>\n<p>Die Variable <b>strFeldTemp <\/b>wird mit dem Ausdruck von dieser Position bis zur Position hinter der aktuellen Markierung gef&uuml;llt. <b>intLenTemp <\/b>nimmt wiederum die L&auml;nge des so erfassten Ausdrucks aus <b>strFeldTemp <\/b>auf. Ist nun ein Ausdruck in <b>strFeldTemp <\/b>vorhanden, folgt eine weitere <b>If&#8230;Then<\/b>-Bedingung. Diese pr&uuml;ft wieder, ob das Array <b>strSuchfelder <\/b>gef&uuml;llt ist, und f&uuml;llt dieses gegebenenfalls anhand der Felder der als Suchabfrage festgelegten Abfrage.<\/p>\n<p>In einer <b>For&#8230;Next<\/b>-Schleife durchl&auml;uft die Prozedur wiederum die in <b>strSuchfelder <\/b>gespeicherten Eintr&auml;ge. Entspricht der Anfang eines dieser Eintr&auml;ge dem aktuell in <b>strFeldTemp <\/b>gespeicherten Wert (das w&auml;re beispielsweise bei dem Feldnamen <b>Artikelname <\/b>der Fall, wenn sich im Textfeld der Ausdruck <b>Art <\/b>befindet).<\/p>\n<p>Die folgende Aktion erfolgt nur, wenn sich die Einf&uuml;gemarke aktuell am Ende des im Suchen-Textfeld eingegebenen Ausdrucks befindet: Dann tr&auml;gt die Prozedur n&auml;mlich den fehlenden Teil des Feldnamens hinter dem aktuellen Text ein und markiert den neu hinzugef&uuml;gten Teil des Textes &#8211; also in diesem Fall wie in Bild 2.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_06\/pic_964_002.png\" alt=\"Automatische Erg&auml;nzung eines Feldnamens\" width=\"575\" height=\"182,5048\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Automatische Erg&auml;nzung eines Feldnamens<\/span><\/b><\/p>\n<p><b>Parsen des Suchausdrucks<\/b><\/p>\n<p>Irgendwann wird der Benutzer die Eingabetaste bet&auml;tigen und somit einen Prozess ansto&szlig;en, der zun&auml;chst die Prozedur <b>Suchen <\/b>mit dem Parameter <b>strSuche <\/b>aufruft und von dort das gleichnamige Ereignis <b>Suchen <\/b>ausl&ouml;st.<\/p>\n<p>Den ersten Teil der Prozedur <b>Suchen<\/b> finden Sie in Listing 8. Die Prozedur erh&auml;lt den aktuell im Suchen-Textfeld befindlichen Ausdruck als Parameter. Sie erstellt dann zun&auml;chst ein <b>QueryDef<\/b>-Objekt auf Basis der in <b>m_Suchabfrage <\/b>gespeicherten Abfrage und speichert dieses in der Variablen <b>qdf<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Suchen(strSuche<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>qdf<span style=\"color:blue;\"> As <\/span>DAO.QueryDef\r\n     <span style=\"color:blue;\">Dim <\/span>strSuchkriterien()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strWhere<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strWhereTemp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFeld<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strVergleichswert<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSuchbegriff<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>fld<span style=\"color:blue;\"> As <\/span>DAO.Field\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> qdf = db.QueryDefs(m_Suchabfrage)\r\n     strSuche = <span style=\"color:blue;\">Replace<\/span>(strSuche, \"(\", \" \")\r\n     strSuche = <span style=\"color:blue;\">Replace<\/span>(strSuche, \")\", \" \")\r\n     strSuchkriterien = <span style=\"color:blue;\">Split<\/span>(<span style=\"color:blue;\">Trim<\/span>(strSuche), \" \")\r\n     For i = <span style=\"color:blue;\">LBound<\/span>(strSuchkriterien) To <span style=\"color:blue;\">UBound<\/span>(strSuchkriterien)\r\n         strSuchbegriff = <span style=\"color:blue;\">Trim<\/span>(strSuchkriterien(i))\r\n         Select Case strSuchbegriff\r\n             <span style=\"color:blue;\">Case <\/span>\"OR\", \"AND\"\r\n                 strWhere = strWhere & \" \" & strSuchbegriff & \" \"\r\n             <span style=\"color:blue;\">Case Else<\/span>\r\n                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">InStr<\/span>(1, strSuchkriterien(i), \":\") &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                     strFeld = <span style=\"color:blue;\">Split<\/span>(strSuchkriterien(i), \":\")(0)\r\n                     strVergleichswert = <span style=\"color:blue;\">Split<\/span>(strSuchkriterien(i), \":\")(1)\r\n                     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strFeld) * <span style=\"color:blue;\">Len<\/span>(strVergleichswert) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> (<span style=\"color:blue;\">Right<\/span>(strWhere, 3) = \"OR \" Or <span style=\"color:blue;\">Right<\/span>(strWhere, 4) = \"AND \")<span style=\"color:blue;\"> Then<\/span>\r\n                             strWhere = strWhere & \" OR \"\r\n                         <span style=\"color:blue;\">End If<\/span>\r\n                         Select Case qdf.Fields(strFeld).Type\r\n                             <span style=\"color:blue;\">Case <\/span>dbText, dbMemo\r\n                                 strWhere = strWhere & strFeld & \" LIKE ''\" & strVergleichswert & \"''\"\r\n                             <span style=\"color:blue;\">Case Else<\/span>\r\n                                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">InStr<\/span>(1, strVergleichswert, \"*\") = 0<span style=\"color:blue;\"> Then<\/span>\r\n                                     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strVergleichswert) - _\r\n                                             <span style=\"color:blue;\">Len<\/span>(<span style=\"color:blue;\">Replace<\/span>(strVergleichswert, \".\", \"\")) &gt; 1<span style=\"color:blue;\"> Then<\/span>\r\n                                         strWhere = strWhere & strFeld & \" = \" _\r\n                                             & ISODatum(<span style=\"color:blue;\">Replace<\/span>(strVergleichswert, \",\", \".\"))\r\n                                     <span style=\"color:blue;\">Else<\/span>\r\n                                         strWhere = strWhere & strFeld & \" = \" _\r\n                                             & <span style=\"color:blue;\">Replace<\/span>(strVergleichswert, \",\", \".\")\r\n                                     <span style=\"color:blue;\">End If<\/span>\r\n                                 <span style=\"color:blue;\">Else<\/span>\r\n                                     strWhere = strWhere & CStr(strFeld) _\r\n                                         & \" LIKE ''\" & strVergleichswert & \"''\"\r\n                                 End If                        \r\n                         <span style=\"color:blue;\">End Select<\/span>\r\n                     <span style=\"color:blue;\">End If<\/span>\r\n                     ...<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Zusammenstellen des Suchausdrucks, Teil I<\/span><\/b><\/p>\n<p>Die Prozedur ersetzt dann eventuell vorhandene &ouml;ffnende und schlie&szlig;ende Klammern per <b>Replace<\/b>-Funktion. Dann schneidet sie f&uuml;hrende oder folgende Leerzeichen mit der <b>Trim<\/b>-Funktion ab.<\/p>\n<p>Im gleichen Zuge teilt sie den Ausdruck aus <b>strSuche<\/b> an den enthaltenen Leerzeichen auf und speichert die einzelnen Abschnitte zwischen den Leerzeichen als Elemente der Array-Variablen <b>strSuchkriterien<\/b>. Aus <b>Artikelname:C* Kategorie:Getr&auml;nke <\/b>wird so ein Array mit dem Elementen <b>Artikelname:C* <\/b>und <b>Kategorie:Getr&auml;nke<\/b>.<\/p>\n<p>Die folgende <b>For&#8230;Next<\/b>-Schleife durchl&auml;uft alle Elemente dieses Arrays und tr&auml;gt das jeweils aktuelle Element in die Variable <b>strSuchbegriff <\/b>ein. Dann pr&uuml;ft sie in einer <b>Select Case<\/b>-Anweisung den Inhalt der Variablen <b>strSuchbegriff<\/b>. Lautet dieser <b>OR <\/b>oder <b>AND<\/b>, f&uuml;gt sie diese einfach an die in der Variablen <b>strWhere <\/b>enthaltene, nun Schritt f&uuml;r Schritt zusammenzustellende <b>Where<\/b>-Klausel zusammen.<\/p>\n<p>In allen anderen F&auml;llen greift der <b>Else<\/b>-Teil der <b>Select Case<\/b>-Bedingung. Hier f&uuml;hrt eine <b>If&#8230;Then<\/b>-Bedingung weitere Pr&uuml;fungen durch. Die erste pr&uuml;ft, ob sich im aktuellen Element <b>strSuchkriterien(i) <\/b>ein Doppelpunkt befindet (s. Listing 9).<\/p>\n<pre>                 ...\r\n                 <span style=\"color:blue;\">Else<\/span>\r\n                     strSuchbegriff = <span style=\"color:blue;\">Trim<\/span>(strSuchkriterien(i))\r\n                     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> (<span style=\"color:blue;\">Right<\/span>(strWhere, 3) = \"OR \" Or <span style=\"color:blue;\">Right<\/span>(strWhere, 4) = \"AND \")<span style=\"color:blue;\"> Then<\/span>\r\n                         strWhere = strWhere & \" OR \"\r\n                     <span style=\"color:blue;\">End If<\/span>\r\n                     For Each fld In qdf.Fields\r\n                         strFeld = fld.Name\r\n                         Select Case fld.Type\r\n                             <span style=\"color:blue;\">Case <\/span>dbText, dbMemo\r\n                                 strWhereTemp = strWhereTemp & \" OR \"\r\n                                 strWhereTemp = _\r\n                                     strWhereTemp & strFeld & \" LIKE ''\" & strSuchbegriff & \"''\"\r\n                             <span style=\"color:blue;\">Case Else<\/span>\r\n                                 <span style=\"color:blue;\">If <\/span>IsNumeric(strSuchbegriff)<span style=\"color:blue;\"> Then<\/span>\r\n                                     strWhereTemp = strWhereTemp & \" OR \"\r\n                                     <span style=\"color:blue;\">If <\/span>IsDate(strSuchbegriff)<span style=\"color:blue;\"> Then<\/span>\r\n                                         strWhereTemp = strWhereTemp _\r\n                                             & strFeld & \" = \" & ISODatum(strSuchbegriff)\r\n                                     <span style=\"color:blue;\">Else<\/span>\r\n                                         strWhereTemp = _\r\n                                          strWhereTemp & strFeld & \" = \" & strSuchbegriff\r\n                                     <span style=\"color:blue;\">End If<\/span>\r\n                                 <span style=\"color:blue;\">End If<\/span>\r\n                         <span style=\"color:blue;\">End Select<\/span>\r\n                     <span style=\"color:blue;\">Next<\/span> fld\r\n                     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strWhereTemp) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                         strWhereTemp = <span style=\"color:blue;\">Mid<\/span>(strWhereTemp, 4)\r\n                         strWhere = strWhere & \" (\" & strWhereTemp & \") \"\r\n                     <span style=\"color:blue;\">End If<\/span>\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strWhere) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Right<\/span>(strWhere, 3) = \"OR \"<span style=\"color:blue;\"> Then<\/span>\r\n             strWhere = <span style=\"color:blue;\">Left<\/span>(strWhere, <span style=\"color:blue;\">Len<\/span>(strWhere) - 3)\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Right<\/span>(strWhere, 4) = \"AND \"<span style=\"color:blue;\"> Then<\/span>\r\n             strWhere = <span style=\"color:blue;\">Left<\/span>(strWhere, <span style=\"color:blue;\">Len<\/span>(strWhere) - 3)\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Left<\/span>(strWhere, 4) = \" OR \"<span style=\"color:blue;\"> Then<\/span>\r\n             strWhere = <span style=\"color:blue;\">Mid<\/span>(strWhere, 5)\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         strWhere = m_PKFeld & \" IN (SELECT \" & m_PKFeld & \" FROM \" & m_Suchabfrage _\r\n             & \" WHERE \" & strWhere & \")\"\r\n         RaiseEvent Suchen(strWhere)\r\n         <span style=\"color:blue;\">Debug.Print<\/span> strWhere\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         RaiseEvent Suchen(\"\")\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Zusammenstellen des Suchausdrucks, Teil II<\/span><\/b><\/p>\n<p>Ist dies der Fall, gelangt der Teil vor dem Doppelpunkt in die Variable <b>strFeld<\/b>, der Teil hinter dem Doppelpunkt in die Variable <b>strVergleichswert<\/b>. Enthalten beide Variablen nun eine Zeichenkette mit einer L&auml;nge gr&ouml;&szlig;er als <b>0<\/b>, pr&uuml;ft die Prozedur zun&auml;chst, ob die Zeichenkette <b>strWhere<\/b>, in der wir die Bedingung im SQL-Format eintragen, am Ende ein <b>OR <\/b>oder ein <b>AND <\/b>aufweist. Falls nicht, h&auml;ngt die nun folgende Anweisung zun&auml;chst den Vergleichsoperator <b>OR <\/b>an <b>strWhere <\/b>an.<\/p>\n<p>Dann pr&uuml;ft die Prozedur den Felddatentyp des Feldes aus der Variablen <b>strFeld<\/b>. Im Falle eines Text- oder Memo-Feldes f&uuml;gt die Prozedur nun einen Ausdruck an die Variable <b>strWhere <\/b>an, der aus dem Feldnamen, dem Operator <b>LIKE <\/b>und dem in Hochkommata eingefassten Vergleichswert besteht, also beispielsweise <b>Artikelname LIKE &#8220;C*&#8220;<\/b>. In allen anderen F&auml;llen pr&uuml;ft die Prozedur zun&auml;chst, ob der Vergleichswert aus <b>strVergleichswert <\/b>das Sternchen (<b>*<\/b>) als Platzhalter enth&auml;lt.<\/p>\n<p>Manchmal kommen Benutzer auf die Idee, auch f&uuml;r Zahlenvergleiche Platzhalter wie das Sternchen anzugeben. Auf diesen Fall wollen wir vorbereitet sein &#8211; zun&auml;chst jedoch schauen wir uns den Fall an, dass wirklich nur ein Zahlenwert, ein Datum oder &auml;hnliches angegeben wurde.<\/p>\n<p>In diesem Fall pr&uuml;ft die Prozedur noch, ob der Ausdruck mehr als einen Punkt enth&auml;lt, was darauf hindeutet, dass hier ein Datum verwendet wird. In diesem Fall wandelt die Prozedur das Datum noch mit der Funktion <b>IsoDatum <\/b>in ein SQL-taugliches Datum um.<\/p>\n<p>Dann f&uuml;gt die Prozedur in beiden F&auml;llen einfach nur den Feldnamen, das Gleichheitszeichen (<b>=<\/b>) als Vergleichsoperator und den Wert aus <b>strVergleichswert <\/b>als Vergleichswert zusammen. Dabei wird das Komma als Dezimaltrennzeichen durch einen Punkt ersetzt.<\/p>\n<p>Hat der Benutzer den numerischen Wert um ein Sternchen als Platzhalter erg&auml;nzt (was zum Beispiel vorkommen kann, wenn etwa das Feld <b>PLZ <\/b>f&auml;lschlicherweise als Zahlenfeld formuliert wurde und der Benutzer alle Kunden aus dem Postleitzahlengebiet <b>47* <\/b>ermitteln will), dann stellen wir einen korrekten Vergleichsausdruck her, indem wir das Vergleichsfeld mit der Funktion <b>CStr <\/b>in eine Zeichenkette umwandeln und dann den <b>LIKE<\/b>-Operator sowie den Vergleichs-ausdruck anh&auml;ngen (zum Beispiel <b>CStr(Kundennummer) LIKE &#8220;12*&#8220;<\/b>).<\/p>\n<p>Enth&auml;lt der Ausdruck keinen Doppelpunkt, gehen wir davon aus, dass in allen Feldern der Suchabfrage nach dem Vergleichswert gesucht werden soll.<\/p>\n<p>Auch hier h&auml;ngen wir, wenn der aktuelle Stand der Variablen <b>strWhere <\/b>nicht mit einem Verkn&uuml;pfungsoperator wie <b>OR <\/b>oder <b>AND <\/b>endet, den <b>OR<\/b>-Operator an.<\/p>\n<p>Dann folgt ein Ausdruck, der alle Felder der Suchabfrage mit dem Vergleichswert vergleicht &#8211; vorausgesetzt, der Vergleichswert stimmt mit dem Datentyp des jeweiligen Feldes &uuml;berein.<\/p>\n<p>Die Prozedur setzt diesen Ausdruck innerhalb einer <b>For Each<\/b>-Schleife &uuml;ber alle Felder des <b>QueryDef<\/b>-Objekts aus <b>qdf <\/b>zusammen. Dabei landet der Feldname des aktuellen Feldes jeweils in der Variablen <b>strFeld<\/b>. Die folgende <b>Select Case<\/b>-Bedingung pr&uuml;ft den Felddatentyp. <\/p>\n<p>Bei Text- oder Memofeldern f&uuml;gt die Prozedur den Ausdruck aus Feldname, <b>LIKE <\/b>und Vergleichswert in Hochkommata zusammen, also etwa <b>Artikelname LIKE &#8220;A*&#8220;<\/b>. In den &uuml;brigen F&auml;llen pr&uuml;ft die Prozedur wieder, ob es sich um ein Datum oder eine Zahl handelt, und setzt die Bedingung entsprechend zusammen &#8211; diesmal allerdings nicht direkt in der Variablen <b>strWhere<\/b>, sondern zun&auml;chst in <b>strWhereTemp<\/b>.<\/p>\n<p>Der Grund ist, dass alle hier zusammengesetzten Kriterien per <b>OR <\/b>verkn&uuml;pft und in eine Klammer eingefasst werden sollen. Erst dann landen Sie als weiteres Element in der in <b>strWhere <\/b>gespeicherten Bedingung.<\/p>\n<p>Schlie&szlig;lich pr&uuml;ft die Prozedur, ob <b>strWhereTemp <\/b>&uuml;berhaupt einen Ausdruck enth&auml;lt. Falls ja, schneidet sie das f&uuml;hrende <b>OR <\/b>ab und fasst den Ausdruck in runde Klammern ein.<\/p>\n<p>Anschlie&szlig;end verarbeitet sie das n&auml;chste Element des Arrays <b>strSuchkriterien<\/b>.<\/p>\n<p>Wurden alle Kriterien als Elemente des Ausdrucks in <b>strWhere <\/b>hinzugef&uuml;gt, pr&uuml;ft die Prozedur, ob <b>strWhere <\/b>nicht leer ist. Falls nicht, pr&uuml;ft sie, ob <b>strWhere <\/b>mit <b>OR <\/b>oder <b>AND <\/b>beginnt, und schneidet diese Ausdr&uuml;cke ab.<\/p>\n<p>Schlie&szlig;lich f&uuml;gt die Prozedur noch ein Element hinzu, dass es erlaubt, den Prim&auml;rschl&uuml;sselwert der Datenherkunft des Formulars oder Unterformulars beziehungsweise der Datensatzherkunft des Listenfeldes als Vergleichsfeld f&uuml;r die Bedingung zu nutzen.<\/p>\n<p>Bisher sieht dieser beispielsweise so aus:<\/p>\n<pre>Artikelname LIKE ''C*''<\/pre>\n<p>Die folgende Anweisung erweitert diesen Ausdruck wie folgt:<\/p>\n<pre>ArtikelID IN (SELECT ArtikelID FROM qryArtikelsuche WHERE artikelname LIKE ''C*'')<\/pre>\n<p>Das hei&szlig;t, sie erg&auml;nzt die <b>WHERE<\/b>-Klausel um den <b>SELECT<\/b>&#8211; und den <b>FROM<\/b>-Teil, sodass eine komplette Abfrage entsteht, welche die Prim&auml;rschl&uuml;sselwerte aller Datens&auml;tze liefert, zu denen das Kriterium passt.<\/p>\n<p>Diese wiederum dient als Datenquelle eines Ausdrucks, der das Prim&auml;rschl&uuml;sselfeld der Suchabfrage als Kriteriumsfeld verwendet und eine <b>IN<\/b>-Klausel mit der <b>SELECT<\/b>-Abfrage als Vergleichswert.<\/p>\n<p><b>Ausl&ouml;sen des Suchen-Ereignisses<\/b><\/p>\n<p>Schlie&szlig;lich l&ouml;st die Zeile<\/p>\n<pre>RaiseEvent Suchen(strWhere)<\/pre>\n<p>das Ereignis <b>Suchen <\/b>mit dem Inhalt von <b>strWhere <\/b>als Parameter aus. Dieses Ereignis haben wir mit der folgenden Anweisung im Kopf des Klassenmoduls <b>clsFlexSearch <\/b>definiert:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Event Suchen(strWhere<span style=\"color:blue;\"> As String<\/span>)<\/pre>\n<p>Dieses Ereignis fangen Sie dann im betroffenen Formular ab und weisen die Bedingung aus <b>strWhere <\/b>der Datenherkunft des betroffenen Formulars oder Unterformulars beziehungsweise der Datensatzherkunft des Listenfeldes zu.<\/p>\n<p>Es kann auch sein, dass der Benutzer die Eingabetaste dr&uuml;ckt, w&auml;hrend das Such-Textfeld leer ist. In diesem Fall soll der Filter des Formulars oder Unterformulars nat&uuml;rlich wieder geleert beziehungsweise die Datensatzherkunft des Listenfeldes zur&uuml;ckgesetzt werden.<\/p>\n<p>Deshalb l&ouml;st auch das Best&auml;tigen eines leeren Such-Textfeldes dieses Ereignis aus. Der Unterschied ist, dass eine leere Zeichenkette statt des Ausdrucks aus <b>strWhere <\/b>als Parameter &uuml;bergeben wird.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Dieser Beitrag beschreibt die Programmierung und die Funktionsweise der Klasse <b>clsFlexSearch<\/b>, mit der Sie ein Such-Textfeld in einem Formular um eine praktische Suchfunktion erweitern k&ouml;nnen.<\/p>\n<p>Der Beitrag <b>Flexible Suche in Formularen <\/b>(<b>www.access-im-unternehmen.de\/965<\/b>) liefert Beispiele f&uuml;r den Einsatz dieser Klasse in verschiedenen Konstellationen, zum Beispiel in einem Formular in der Formularansicht, in einem Formular mit Unterformular in der Datenblattansicht oder in einem Formular mit einem zu durchsuchenden Listenfeld.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>FlexibleSuche.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{0D92D5C1-738E-4BA9-BC40-674F7C8F1F97}\/aiu_964.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Klasse clsFlexSearch l&auml;sst sich einfach in Formulare integrieren und f&uuml;gt einem einfachen Textfeld umfassende Suchm&ouml;glichkeiten hinzu. Wie Sie diese Suche implementieren, erfahren Sie im Beitrag Flexible Suche in Formularen (www.access-im-unternehmen.de\/965). Der vorliegende Beitrag erl&auml;utert die Klasse clsFlexSearch und stellt den Code vor, damit Sie diesen nachvollziehen und ihn gegebenenfalls an Ihre eigenen Bed&uuml;rfnisse anpassen 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":[662014,66062014,44000025],"tags":[],"class_list":["post-55000964","post","type-post","status-publish","format-standard","hentry","category-662014","category-66062014","category-VBA_und_Programmiertechniken"],"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>Suchen mit der clsFlexSearch-Klasse - 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\/Suchen_mit_der_clsFlexSearchKlasse\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Suchen mit der clsFlexSearch-Klasse\" \/>\n<meta property=\"og:description\" content=\"Die Klasse clsFlexSearch l&auml;sst sich einfach in Formulare integrieren und f&uuml;gt einem einfachen Textfeld umfassende Suchm&ouml;glichkeiten hinzu. Wie Sie diese Suche implementieren, erfahren Sie im Beitrag Flexible Suche in Formularen (www.access-im-unternehmen.de\/965). Der vorliegende Beitrag erl&auml;utert die Klasse clsFlexSearch und stellt den Code vor, damit Sie diesen nachvollziehen und ihn gegebenenfalls an Ihre eigenen Bed&uuml;rfnisse anpassen k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Suchen_mit_der_clsFlexSearchKlasse\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:14:04+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/ef5a311f1f3d4b488052355d3e37eae3\" \/>\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=\"21\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_mit_der_clsFlexSearchKlasse\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_mit_der_clsFlexSearchKlasse\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Suchen mit der clsFlexSearch-Klasse\",\"datePublished\":\"2020-05-22T21:14:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_mit_der_clsFlexSearchKlasse\\\/\"},\"wordCount\":3295,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_mit_der_clsFlexSearchKlasse\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/ef5a311f1f3d4b488052355d3e37eae3\",\"articleSection\":[\"2014\",\"6\\\/2014\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_mit_der_clsFlexSearchKlasse\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_mit_der_clsFlexSearchKlasse\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_mit_der_clsFlexSearchKlasse\\\/\",\"name\":\"Suchen mit der clsFlexSearch-Klasse - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_mit_der_clsFlexSearchKlasse\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_mit_der_clsFlexSearchKlasse\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/ef5a311f1f3d4b488052355d3e37eae3\",\"datePublished\":\"2020-05-22T21:14:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_mit_der_clsFlexSearchKlasse\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_mit_der_clsFlexSearchKlasse\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_mit_der_clsFlexSearchKlasse\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/ef5a311f1f3d4b488052355d3e37eae3\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/ef5a311f1f3d4b488052355d3e37eae3\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Suchen_mit_der_clsFlexSearchKlasse\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Suchen mit der clsFlexSearch-Klasse\"}]},{\"@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":"Suchen mit der clsFlexSearch-Klasse - 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\/Suchen_mit_der_clsFlexSearchKlasse\/","og_locale":"de_DE","og_type":"article","og_title":"Suchen mit der clsFlexSearch-Klasse","og_description":"Die Klasse clsFlexSearch l&auml;sst sich einfach in Formulare integrieren und f&uuml;gt einem einfachen Textfeld umfassende Suchm&ouml;glichkeiten hinzu. Wie Sie diese Suche implementieren, erfahren Sie im Beitrag Flexible Suche in Formularen (www.access-im-unternehmen.de\/965). Der vorliegende Beitrag erl&auml;utert die Klasse clsFlexSearch und stellt den Code vor, damit Sie diesen nachvollziehen und ihn gegebenenfalls an Ihre eigenen Bed&uuml;rfnisse anpassen k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/Suchen_mit_der_clsFlexSearchKlasse\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:14:04+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/ef5a311f1f3d4b488052355d3e37eae3","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"21\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Suchen_mit_der_clsFlexSearchKlasse\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Suchen_mit_der_clsFlexSearchKlasse\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Suchen mit der clsFlexSearch-Klasse","datePublished":"2020-05-22T21:14:04+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Suchen_mit_der_clsFlexSearchKlasse\/"},"wordCount":3295,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Suchen_mit_der_clsFlexSearchKlasse\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/ef5a311f1f3d4b488052355d3e37eae3","articleSection":["2014","6\/2014","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Suchen_mit_der_clsFlexSearchKlasse\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Suchen_mit_der_clsFlexSearchKlasse\/","url":"https:\/\/access-im-unternehmen.de\/Suchen_mit_der_clsFlexSearchKlasse\/","name":"Suchen mit der clsFlexSearch-Klasse - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Suchen_mit_der_clsFlexSearchKlasse\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Suchen_mit_der_clsFlexSearchKlasse\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/ef5a311f1f3d4b488052355d3e37eae3","datePublished":"2020-05-22T21:14:04+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Suchen_mit_der_clsFlexSearchKlasse\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Suchen_mit_der_clsFlexSearchKlasse\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Suchen_mit_der_clsFlexSearchKlasse\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/ef5a311f1f3d4b488052355d3e37eae3","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/ef5a311f1f3d4b488052355d3e37eae3"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Suchen_mit_der_clsFlexSearchKlasse\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Suchen mit der clsFlexSearch-Klasse"}]},{"@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\/55000964","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=55000964"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000964\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000964"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000964"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000964"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}