{"id":55000784,"date":"2011-08-01T00:00:00","date_gmt":"2020-05-22T21:56:41","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=784"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Schnelle_Suche_mit_Klasse","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Schnelle_Suche_mit_Klasse\/","title":{"rendered":"Schnelle Suche mit Klasse"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg03.met.vgwort.de\/na\/5a1eb766d72b4b028a60e984c156185b\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Sie kennen sicher die Art von Schnellsuche, bei der direkt bei der Eingabe von Zeichen gefiltert wird. Diese kann sich auf eines oder mehrere Felder beziehen, arbeitet aber sonst prinzipiell immer gleich: Das Eingeben eines Zeichens l&ouml;st ein Ereignis aus, dass den aktuellen Suchbegriff ermittelt, eine SQL-Where-Bedingung zusammenstellt und diese dem Filter-Kriterium des Formulars zuweist. Wie Sie eine solche Suche ganz leicht implementieren, zeigt dieser Beitrag.<\/b><\/p>\n<p>In letzter Zeit stelle ich fest, dass ich eine solche Suche eigentlich in fast allen Formularen ben&ouml;tige &#8211; egal, ob es sich um die Formular-, Endlos- oder Datenblattansicht handelt. In der Regel reicht die Eingabe eines oder mehrerer Buchstaben aus, um schnell beim gesuchten Datensatz zu landen &#8211; eine effizientere Suchmethode gibt es nicht.<\/p>\n<p>Eine Ausnahme ist es wohl, wenn Sie aus vielen Datens&auml;tzen einen oder mehrere herausfiltern m&ouml;chten, die bestimmte Kriterien aufweisen &#8211; dann sind Sie aber mit einer Abfrage oder einer darauf aufbauenden umfassenderen Suchfunktion besser bedient. Die L&ouml;sung aus diesem Beitrag bezieht sich eher auf solche Anwendungsf&auml;lle, bei denen Sie mal eben den Kunden zu einer E-Mail-Anfrage herausfinden m&ouml;chten oder diesen &uuml;ber seine Kundennummer identifizieren m&ouml;chten.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Beispielsuche<\/p>\n<p>Die Basis f&uuml;r die in diesem Beitrag beschriebene L&ouml;sung ist ein Formular wie das aus Bild 1 (siehe Formular <b>frmSchnellsuche <\/b>in der Beispieldatenbank). Das Formular zeigt Daten in der Endlosansicht an und besitzt ein Textfeld zur Eingabe von Suchbegriffen.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/SchnelleSucheMitKlasse-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Die Beispielsuche in Aktion<\/span><\/b><\/p>\n<p>Nach der Eingabe etwa des Buchstabens <b>L <\/b>filtert das Formular bereits und zeigt nur noch alle Datens&auml;tze an, deren Artikelname mit dem Buchstaben <b>L <\/b>beginnt.<\/p>\n<p>Wenn Sie hier nun den Buchstaben <b>A <\/b>eingeben, zeigt das Formular nur noch alle Artikel an, deren Name mit <b>La <\/b>beginnt.<\/p>\n<p>Im Entwurf sieht das Formular wie in Bild 2 aus. Es ist an die Tabelle <b>tblArtikel <\/b>gebunden und verwendet f&uuml;r die Eigenschaft <b>Standardansicht <\/b>den Wert <b>Endlosformular<\/b>. Das Textfeld im Kopf des Formulars hei&szlig;t <b>txtSchnellsuche <\/b>und besitzt eine Prozedur, die durch das Ereignis <b>Bei &auml;nderung <\/b>ausgel&ouml;st wird.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/SchnelleSucheMitKlasse-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Entwurfsansicht der Beispielsuche<\/span><\/b><\/p>\n<p>Die Prozedur stellt zun&auml;chst ein Filterkriterium zusammen, dass aus dem Feldnamen, dem Vergleichsoperator (hier <b>LIKE<\/b>) und dem Wert der Eigenschaft <b>Text <\/b>des Such-Textfeldes besteht. Dieser Ausdruck wird dann der Eigenschaft <b>Filter <\/b>zugewiesen.<\/p>\n<p>Dies geschieht jedoch nur, wenn das Suchfeld einen Vergleichswert enth&auml;lt. Es kann jedoch auch sein, dass der Benutzer ein Zeichen eingibt und dieses wieder l&ouml;scht. In diesem Fall g&auml;be es keinen Suchbegriff mehr.<\/p>\n<p>Das Filterkriterium w&uuml;rde zwar wegen des enthaltenen Sternchens (<b>*<\/b>) dennoch wie erwartet alle Datens&auml;tze zur&uuml;ckliefern, aber gegebenenfalls f&auml;llt das statisch eingebaute Sternchen sp&auml;ter einmal weg &#8211; und dann liefert das Filterkriterium schlicht keinen Datensatz mehr zur&uuml;ck. Also pr&uuml;ft die Prozedur zun&auml;chst die L&auml;nge des Vergleichswerts:<\/p>\n<pre>Private Sub txtSuche_Change()\r\n    Dim strFilter As String\r\n    If Not Len(Me!txtSuche.Text) = 0 Then\r\n        strFilter = &quot;Artikelname LIKE ''&quot; &amp; Me!txtSuche.Text &amp; &quot;*''&quot;\r\n        Me.Filter = strFilter\r\n        Me.FilterOn = True\r\n    Else\r\n        Me.Filter = &quot;&quot;\r\n        Me.FilterOn = False\r\n    End If\r\nEnd Sub<\/pre>\n<p>Warum verwenden wir hier die Text-Eigenschaft und nicht den Wert des Suchfeldes Weil der Wert erst nach dem Abschlie&szlig;en der Eingabe etwa durch Dr&uuml;cken der Eingabetaste oder Verlassen des Suchfeldes auf die aktuell im Textfeld enthaltene Zeichenkette eingestellt wird. Die <b>Text<\/b>-Eigenschaft hingegen liefert immer den aktuell angezeigten Text.<\/p>\n<p><b>Hakelige Eingabe<\/b><\/p>\n<p>Je nach der aktuellen Einstellungen der Option <b>Cursorverhalten bei Eintritt in Feld <\/b>kann es vorkommen, dass der komplette Suchbegriff markiert wird oder die Einf&uuml;gemarke wieder zum Beginn des eingegebenen Textes verschoben wird.<\/p>\n<p>Obwohl es nicht so aussieht, verliert das Textfeld zur Eingabe des Suchbegriffes kurz den Fokus, w&auml;hrend der Filter eingestellt wird &#8211; und wenn das Textfeld den Fokus zur&uuml;ckerh&auml;lt, stellt Access den Cursor so ein, wie es in den Access-Optionen vorgesehen ist.<\/p>\n<p>Unter Access 2010 finden Sie diese Einstellung etwa unter <b>Backstage|Access-Optionen <\/b>und dort im Bereich <b>Clienteinstellungen <\/b>(s. Bild 3).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/SchnelleSucheMitKlasse-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Einstellung f&uuml;r das Cursorverhalten<\/span><\/b><\/p>\n<p>Dummerweise k&ouml;nnen Sie sich nicht darauf verlassen, dass der Benutzer die von Ihnen gew&uuml;nschte Einstellung verwendet &#8211; und Sie sollten diese auch nicht selbstst&auml;ndig anpassen, denn dann findet der Benutzer m&ouml;glicherweise an anderer Stelle nicht mehr das gewohnte Verhalten vor.<\/p>\n<p>Also f&uuml;gen Sie ein paar Zeilen zur Suchfunktion hinzu, die daf&uuml;r sorgen, dass sich diese die Cursorposition nach der Eingabe eines Zeichens merkt und diese unabh&auml;ngig von der aktuellen Einstellung der Option <b>Cursorverhalten bei Eintritt in Feld <\/b>wiederherstellt.<\/p>\n<p>Au&szlig;erdem verlor das Textfeld den Fokus, wenn es als Text nur noch eine leere Zeichenkette anzeigte &#8211; nach dem Zur&uuml;cksetzen des Filters sollte man also noch den Fokus auf das Suchfeld zur&uuml;cksetzen:<\/p>\n<pre>Private Sub txtSuche_Change()\r\n    Dim strFilter As String\r\n    Dim intStart As Integer\r\n    intStart = Me!txtSuche.SelStart\r\n    If Not Len(Me!txtSuche.Text) = 0 Then\r\n        strFilter = &quot;Artikelname LIKE ''&quot; &amp; Me!txtSuche.Text &amp; &quot;*''&quot;\r\n        Me.Filter = strFilter\r\n        Me.FilterOn = True\r\n        Me!txtSuche.SelStart = intStart\r\n    Else\r\n        Me.Filter = &quot;&quot;\r\n        Me.FilterOn = False\r\n        Me!txtSuche.SetFocus\r\n    End If\r\nEnd Sub<\/pre>\n<p>Diese Prozedur l&auml;sst sich nicht nur f&uuml;r Formulare in der Endlosansicht, sondern auch f&uuml;r solche in der Formularansicht einsetzen.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Schnellsuche in Datenbl&auml;ttern<\/p>\n<p>In der Datenblattansicht sind nat&uuml;rlich kleine &auml;nderungen n&ouml;tig. Formulare in der Datenblattansicht zeigen nur die Daten an und keine weiteren Steuerelemente wie Suchfelder oder OK-Schaltfl&auml;chen.<\/p>\n<p>Dazu m&uuml;ssen Sie ein Hauptformular anlegen und darin zumindest das Suchfeld und das Unterformular in der Datenblattansicht anzeigen. Dies sieht im Entwurf wie in Bild 4 aus (siehe <b>frmSchnellsucheDatenblatt <\/b>und <b>sfmSchnellsucheDatenblatt<\/b>).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/SchnelleSucheMitKlasse-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Entwurf des Suchformulars f&uuml;r Datenbl&auml;tter<\/span><\/b><\/p>\n<p>Die Prozedur, die durch das Eingeben eines Zeichens in das Textfeld <b>txtSuche <\/b>ausgel&ouml;st wird, sieht in diesem Fall wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-36-anchor\">Listing 1<\/a><\/span> aus. Der erste wesentliche Unterschied ist der ge&auml;nderte Bezug auf das zu filternde Formular (hier <b>Me!sfmSchnellsucheDatenblatt.Form<\/b>). Der zweite ist, dass das Suchfeld beim Einstellen des Filters nicht den Fokus verliert und so einige Zeilen eingespart werden k&ouml;nnen.<\/p>\n<p class=\"listingueberschrift\">Listing 1: Code zum Aktualisieren des Filters auf Basis des Suchbegriffs<\/p>\n<pre>Private Sub txtSuche_Change()\r\n    Dim strFilter As String\r\n    If Not Len(Me!txtSuche.Text) = 0 Then\r\n        strFilter = &quot;Artikelname LIKE ''&quot; &amp; Me!txtSuche.Text &amp; &quot;*''&quot;\r\n        Me!sfmSchnellsucheDatenblatt.Form.Filter = strFilter\r\n        Me!sfmSchnellsucheDatenblatt.Form.FilterOn = True\r\n    Else\r\n        Me!sfmSchnellsucheDatenblatt.Form.Filter = &quot;&quot;\r\n        Me!sfmSchnellsucheDatenblatt.Form.FilterOn = False\r\n    End If\r\nEnd Sub<\/pre>\n<p><b>Variationen der Schnellsuche<\/b><\/p>\n<p>Nun m&ouml;chten Sie eine Suche wie diese gegebenenfalls in mehreren Formularen einsetzen und dabei auch noch Varianten einbauen. Diese k&ouml;nnten so aussehen:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Sie m&ouml;chten mit einem Suchfeld gleich mehrere Felder der Datenherkunft durchsuchen, also beispielsweise <b>Vorname<\/b>, <b>Nachname <\/b>und <b>Firma <\/b>eines Kunden. In diesem Fall sollen die einzelnen Filterkriterien mit dem <b>Oder<\/b>-Operator verkn&uuml;pft werden.<\/li>\n<li class=\"aufz-hlung\">Sie m&ouml;chten mehrere Suchfelder einsetzen, um gezielt Felder wie <b>Vorname<\/b>, <b>Nachname <\/b>oder <b>Firma <\/b>zu durchsuchen. In diesem Fall ist der <b>Und<\/b>-Operator zur Verkn&uuml;pfung der einzelnen Filterkriterien zu verwenden.<\/li>\n<\/ul>\n<p>Beim Einsatz in mehreren Formularen einer Anwendungen m&uuml;ssten Sie gleichartig aufgebauten Code mehrfach verwenden. G&uuml;nstiger w&auml;re es, wenn man die ben&ouml;tigten Funktionen an einem einzigen Ort unterbringen k&ouml;nnte und im jeweiligen Formular nur noch die Such-Steuerelemente unterbringt und die Einstellungen f&uuml;r die gew&uuml;nschte Suchfunktion vornimmt.<\/p>\n<p><b>Einsatz der Schnellsuche<\/b><\/p>\n<p>Bevor wir auf die technischen Details der nachfolgend beschriebenen L&ouml;sung eingehen, schauen wir uns die Funktionsweise und die Konfiguration an. Dabei gibt es die folgenden Varianten:<\/p>\n<ul>\n<li class=\"aufz-hlung\">ein Suchfeld soll ein Feld filtern (zwei M&ouml;glichkeiten),<\/li>\n<li class=\"aufz-hlung\">ein Suchfeld soll mehrere Felder filtern oder<\/li>\n<li class=\"aufz-hlung\">mehrere Suchfelder sollen jeweils ein Feld filtern.<\/li>\n<\/ul>\n<p>Bei allen Konfigurationen sind die folgenden Schritte n&ouml;tig:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Die beiden Klassen <b>clsFastSearch <\/b>und <b>clsFastSearchField <\/b>m&uuml;ssen in die Zieldatenbank importiert werden.<\/li>\n<li class=\"aufz-hlung\">Im Formular, dass das Textfeld zur Eingabe des Suchbegriffes enth&auml;lt, wird eine <b>Beim Laden<\/b>-Ereignisprozedur angelegt, welche die Suche aktiviert und konfiguriert.<\/li>\n<li class=\"aufz-hlung\">Das Klassenmodul des Hauptformulars enth&auml;lt die folgende Deklaration:<\/li>\n<\/ul>\n<p class=\"quellcodeaufzaehlung\">Dim objFastsearch As clsFastSearch<\/p>\n<ul>\n<li class=\"aufz-hlung\">Die zu durchsuchenden Felder k&ouml;nnen sich im gleichen Formular oder auch in einem Unterformular befinden.<\/li>\n<li class=\"aufz-hlung\">Sie k&ouml;nnen eine Schaltfl&auml;che hinzuf&uuml;gen, die alle Suchfelder leert und den Filter zur&uuml;cksetzt.<\/li>\n<\/ul>\n<p><b>Ein Suchfeld filtert ein Feld, Variante I<\/b><\/p>\n<p>Dieses Beispiel finden Sie im Formular <b>frmEinSuchfeldEinErgebnisfeldOder<\/b>. Die Eingabe von Text in das Textfeld <b>txtSuche<\/b> soll die im Endlosformular angezeigten Datens&auml;tze nach dem Artikelnamen filtern. Dazu f&uuml;gen Sie die folgenden Prozedur f&uuml;r das Ereignis <b>Beim Laden <\/b>des Formulars hinzu:<\/p>\n<pre>Private Sub Form_Load()\r\n    Set objFastsearch = New clsFastSearch\r\n    With objFastsearch\r\n        Set .Resultform = Me\r\n        .AddSearchField Me!txtSuche\r\n        .AddResultField &quot;Artikelname&quot;\r\n    End With\r\nEnd Sub<\/pre>\n<p><!--30percent--><\/p>\n<p>Die Prozedur erzeugt zun&auml;chst eine Instanz der Klasse <b>clsFastSearch<\/b>. Dann weist sie ihren Eigenschaften einige Werte zu:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>Resultform <\/b>erwartet einen Verweis auf das Formular, dass die zu filternden Datens&auml;tze anzeigt. Dies kann das gleiche Formular sein wie in diesem Fall oder auch ein Unterformular. In diesem Fall w&uuml;rde man einen Verweis wie <b>Me!sfmSchnellsuche.Form <\/b>&uuml;bergeben.<\/li>\n<li class=\"aufz-hlung\"><b>AddSearchField <\/b>f&uuml;gt einen Verweis auf das Textfeld hinzu, in das der Suchbegriff eingegeben werden soll.<\/li>\n<li class=\"aufz-hlung\"><b>AddResultfield <\/b>erwartet die Angabe des Feldnamens der zu filternden Datens&auml;tze, der in das Filterkriterium einbezogen werden soll.<\/li>\n<\/ul>\n<p><b>Ein Suchfeld filtert ein Feld, Variante I<\/b><\/p>\n<p>Bei der ersten Variante haben Sie den Verweis auf das Suchfeld sowie den Namen des zu durchsuchenden Feldnamen mit separaten Methoden &uuml;bergeben. Sie k&ouml;nnen auch beide Werte mit der Methode <b>AddSearchField <\/b>&uuml;bergeben. Dazu tragen Sie den Namen des zu durchsuchenden Feldes einfach als zweiten Parameter dieser Methode ein:<\/p>\n<pre>Private Sub Form_Load()\r\n    Set objFastsearch = New clsFastSearch\r\n    With objFastsearch\r\n        Set .Resultform = Me\r\n        .AddSearchField Me!txtSuche, &quot;Artikelname&quot;\r\n    End With\r\nEnd Sub<\/pre>\n<p>Dieses Beispiel finden Sie im Formular <b>frmEinSuchfeldEinErgebnisfeldUnd<\/b>.<\/p>\n<p><b>Ein Suchfeld filtert mehrere Felder<\/b><\/p>\n<p>Wenn Sie ein Suchfeld verwenden m&ouml;chten, um damit mehrerer Felder zu filtern, k&ouml;nnen Sie dies mit der Konfiguration aus dem folgenden Listing erledigen:<\/p>\n<pre>Private Sub Form_Load()\r\n    Set objFastsearch = New clsFastSearch\r\n    With objFastsearch\r\n        Set .Resultform = Me\r\n        .AddSearchField Me!txtSuche\r\n        .AddResultField &quot;Artikelname&quot;\r\n        .AddResultField &quot;Einzelpreis&quot;\r\n    End With\r\nEnd Sub<\/pre>\n<p>Hier werden die ersten drei Eigenschaften wie in den vorherigen Beispielen eingestellt. Allerdings folgen dann gleich zwei Aufrufe der Methode <b>AddResultField<\/b>. Im Beispielformular <b>frmEinSuchfeldMehrereErgebnisfelderOder <\/b>k&ouml;nnen Sie so sowohl die ersten Buchstaben eines Artikels als auch die ersten Ziffern eines Preises eingeben.<\/p>\n<p><b>Mehrere Suchfelder filtern je ein Feld<\/b><\/p>\n<p>Schlie&szlig;lich fehlt noch die M&ouml;glichkeit, mehrere Suchfelder zu verwenden, wobei jedes Suchfeld genau ein Feld der Datenherkunft der zu filternden Daten durchsucht. Dieses Beispiel finden Sie im Formular <b>frmEinSuchfeldMehrereErgebnisfelderOder<\/b>. Der Code sieht wie folgt aus:<\/p>\n<pre>Private Sub Form_Load()\r\n    Set objFastsearch = New clsFastSearch\r\n    With objFastsearch\r\n        Set .Resultform = Me\r\n        .AddSearchField Me!txtSuche, &quot;Artikelname&quot;\r\n        .AddSearchField Me!txtEinzelpreis, &quot;Einzelpreis&quot;\r\n        Set .Clearbutton = Me!cmdZuruecksetzen\r\n    End With\r\nEnd Sub<\/pre>\n<p>Hier wurde zus&auml;tzlich noch eine Schaltfl&auml;che namens <b>cmdZuruecksetzen <\/b>hinzugef&uuml;gt. Wenn Sie diese der Eigenschaft <b>ClearButton<\/b> hinzuf&uuml;gen, k&ouml;nnen Sie damit die bisherigen Eingaben in die Suchfelder l&ouml;schen und den Filter zur&uuml;cksetzen. Sie brauchen dazu keinen weiteren Code einzugeben. Das Formular sieht wie in Bild 5 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2011_04\/SchnelleSucheMitKlasse-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Formular mit zwei Suchfeldern und einer Zur&uuml;cksetzen-Schaltfl&auml;che<\/span><\/b><\/p>\n<p><b>Suche im Unterformular<\/b><\/p>\n<p>Wenn Sie die oben beschriebenen L&ouml;sungen in einer Kombination aus Haupt- und Unterformular einsetzen m&ouml;chten, legen Sie f&uuml;r das <b>Beim Laden<\/b>-Ereignis des Hauptformular die folgende Prozedur an:<\/p>\n<pre>Private Sub Form_Load()\r\n    Set objFastsearch = New clsFastSearch\r\n    With objFastsearch\r\n        Set .Resultform =\r\n        Me!sfmBeispielUnterformular.Form\r\n        .AddSearchField Me!txtSuche\r\n        .AddResultField &quot;Artikelname&quot;\r\n    End With\r\nEnd Sub<\/pre>\n<p>Ein Beispiel hierf&uuml;r finden Sie in den beiden Formularen <b>frmBeispielUnterformular <\/b>und <b>sfmBeispielUnterformular<\/b>.<\/p>\n<p><b>Programmierung der L&ouml;sung<\/b><\/p>\n<p>Nachdem Sie nun wissen, wie Sie die L&ouml;sung in eigene Anwendungen einbauen, m&ouml;chten Sie vielleicht noch erfahren, wie diese im Detail funktioniert. Auf diese Weise k&ouml;nnen Sie gegebenenfalls eigene Anpassungen vornehmen. F&uuml;r jedes Formular erstellen Sie eine Instanz der Klasse <b>clsFastSearch<\/b>. Jede Instanz dieser Klasse kann eine oder mehrere Instanzen der Klasse <b>clsFastSearchField <\/b>erzeugen, wobei diese die einzelnen Suchfelder repr&auml;sentieren.<\/p>\n<p><b>Zu filterndes Formular festlegen<\/b><\/p>\n<p>Der Instanz der Klasse <b>clsFastSearch <\/b>&uuml;bergibt das aufrufende Formular zun&auml;chst einen Verweis auf das Formular, das die zu filternden Daten enth&auml;lt. Diese werden in dieser Variablen gespeichert:<\/p>\n<pre>Dim m_Resultform As Form<\/pre>\n<p>Den Verweis auf das Formular nimmt die folgende <b>Property Set<\/b>-Methode entgegen und speichert ihn in der Variablen <b>m_Resultform<\/b>:<\/p>\n<pre>Public Property Set Resultform(frm As Form)\r\n    Set m_Resultform = frm\r\nEnd Property<\/pre>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Suchfelder mit Funktion versehen<\/p>\n<p>Das beziehungsweise die Suchfelder werden &uuml;ber die Methode <b>AddSearchField <\/b>an die Klasse <b>clsFastSearch <\/b>&uuml;bergeben.<\/p>\n<p>Diese Methode (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-31-anchor\">Listing 2<\/a><\/span>) erwartet einen Verweis auf ein Textfeld und optional den Namen des Feldes, das nach dem in das Suchfeld eingegebenen Wert gefiltert werden soll. Sie erstellt dann eine neue Instanz des Objekts <b>clsFastSearchField <\/b>&#8211; einer Klasse, welche die Eigenschaften eines Such-Textfelds speichert und die Funktionalit&auml;t bereitstellt (mehr dazu weiter unten).<\/p>\n<p class=\"listingueberschrift\">Listing 2: Suchfeld zur Klasse clsFastSearch hinzuf&uuml;gen<\/p>\n<pre>Public Sub AddSearchField(txtSearchfield As TextBox, Optional strResultfield As String)\r\n    Dim objFastsearchfield As clsFastSearchField\r\n    Set objFastsearchfield = New clsFastSearchField\r\n    With objFastsearchfield\r\n        Set .FastSearch = Me\r\n        Set .Searchfield = txtSearchfield\r\n        .Resultfield = strResultfield\r\n    End With\r\n    colSearchfields.Add objFastsearchfield\r\nEnd Sub<\/pre>\n<p>Das Objekt <b>objFastSearchField <\/b>bekommt folgende Informationen geliefert: einen Verweis auf das instanzierende Objekt, also <b>objFastSearch<\/b>, einen Verweis auf das Textfeld und gegebenenfalls den Namen des zu durchsuchenden Feldes der Datenherkunft. Nach dem Erstellen und F&uuml;llen des Objekts wird dieses in der Collection <b>colSearchfields <\/b>gespeichert, die zuvor wie folgt deklariert wird:<\/p>\n<pre>Dim colSearchfields As Collection<\/pre>\n<p>Diese und eine weitere, weiter unten vorgestellte Collection werden &uuml;brigens beim Initialisieren eines Objekts auf Basis der Klasse <b>clsFastSearch <\/b>erzeugt:<\/p>\n<pre>Private Sub Class_Initialize()\r\n    Set colSearchfields = New Collection\r\n    Set colResultfields = New Collection\r\nEnd Sub<\/pre>\n<p><b>Zu durchsuchende Felder speichern<\/b><\/p>\n<p>Die Namen der zu durchsuchenden Felder werden durch die Prozedur <b>AddResultField <\/b>entgegengenommen: <\/p>\n<pre>Public Sub AddResultField(str As String)\r\n    colResultfields.Add str\r\nEnd Sub<\/pre>\n<p>Dort werden sie gleich als neuer Eintrag der Collection <b>colResultfield <\/b>gespeichert, deren Deklaration so aussieht:<\/p>\n<pre>Dim colResultfields As Collection<\/pre>\n<p><b>Suchfelder leeren und Filter aufheben<\/b><\/p>\n<p>Bevor wir zu den interessanten Elementen kommen, schauen wir uns noch schnell an, wie eine eventuell vorhandene Schaltfl&auml;che zum Leeren der Suchfelder und zum Zur&uuml;cksetzen des Filters mit Leben gef&uuml;llt wird. Zun&auml;chst wird eine Objektvariable mit dem Datentyp <b>CommandButton <\/b>erzeugt, der mit dem Schl&uuml;sselwort <b>WithEvents <\/b>deklariert ist &#8211; sprich: Sie k&ouml;nnen in dieser Klasse Ereignisprozeduren f&uuml;r dieses Objekt festlegen:<\/p>\n<pre>Dim WithEvents m_Clearbutton As CommandButton<\/pre>\n<p>Der Verweis auf die betroffene Schaltfl&auml;che wird &uuml;ber die <b>Property Set<\/b>-Prozedur <b>Clearbutton <\/b>entgegengenommen. Diese speichert den Verweis in m_Clearbutton und legt fest, dass in dieser Klasse nach einer Ereignisprozedur <b>OnClick <\/b>f&uuml;r diese Schaltfl&auml;che gesucht werden soll, wenn diese angeklickt wird:<\/p>\n<pre>Public Property Set Clearbutton(cmd As CommandButton)\r\n    Set m_Clearbutton = cmd\r\n    With m_Clearbutton\r\n        .OnClick = &quot;[Event Procedure]&quot;\r\n    End With\r\nEnd Property<\/pre>\n<p>Diese Prozedur sieht schlie&szlig;lich so aus:<\/p>\n<pre>Private Sub m_Clearbutton_Click()\r\n    Dim objFastsearchfield As clsFastSearchField\r\n    Dim i As Integer\r\n    For i = 1 To colSearchfields.Count\r\n        Set objFastsearchfield = colSearchfields.Item(i)\r\n        objFastsearchfield.Clear\r\n    Next i\r\n    m_Resultform.Filter = &quot;&quot;\r\n    m_Resultform.FilterOn = False\r\n    colSearchfields.Item(1).Searchfield.SetFocus\r\nEnd Sub<\/pre>\n<p>Sie durchl&auml;uft alle Eintr&auml;ge der Collection <b>colSearchfields<\/b>, die jeweils einen Verweis auf die Objekte auf Basis der Klasse <b>clsFastSearchField <\/b>enthalten, welche die Suchfelder repr&auml;sentieren und deren Funktion bereitstellen. Unter anderem liefert diese Klasse eine Methode namens <b>Clear<\/b>, die &#8211; um dies vorwegzunehmen &#8211; das jeweilige Suchfeld leert.<\/p>\n<p>Danach wird der Filter des zu durchsuchenden Formulars geleert und deaktiviert. Schlie&szlig;lich landet der Fokus wieder im ersten Suchfeld der Collection.<\/p>\n<p><b>Die Klasse clsFastSearchField<\/b><\/p>\n<p>Ein Objekt auf Basis der zweiten Klasse <b>clsFastSearchField <\/b>repr&auml;sentiert, wie bereits erw&auml;hnt, jeweils ein Suchfeld.<\/p>\n<p>Diese Klasse speichert in zun&auml;chst einmal einige Verweise und Daten:<\/p>\n<ul>\n<li class=\"aufz-hlung\">einen Verweis auf das Such-Textfeld:<\/li>\n<\/ul>\n<p class=\"quellcodeaufzaehlung\">Dim WithEvents m_txt As TextBox<\/p>\n<ul>\n<li class=\"aufz-hlung\">Den Namen des zu durchsuchenden Feldes:<\/li>\n<\/ul>\n<p class=\"quellcodeaufzaehlung\">Dim m_Resultfield As String<\/p>\n<ul>\n<li class=\"aufz-hlung\">Einen Verweis auf das instanzierende Objekt auf Basis der Klasse <b>clsFastSearch<\/b>:<\/li>\n<\/ul>\n<p class=\"quellcodeaufzaehlung\">Dim m_FastSearch As clsFastSearch<\/p>\n<p>Au&szlig;erdem wird noch eine Variable ben&ouml;tigt, um den im Such-Textfeld eingegebenen Text tempor&auml;r zu speichern:<\/p>\n<pre>Dim m_Text As String<\/pre>\n<p><b>Zuweisen der Verweise und Werte<\/b><\/p>\n<p>Das Zuweisen des Such-Textfeldes geschieht &uuml;ber die <b>Property Set<\/b>-Prozedur <b>Searchfield<\/b>.<\/p>\n<p>Diese Prozedur nimmt den Verweis entgegen und legt fest, dass die Klasse beim &auml;ndern des Inhalts des Textfeldes eine Ereignisprozedur ausf&uuml;hren kann:<\/p>\n<pre>Public Property Set Searchfield(txt As TextBox)\r\n    Set m_txt = txt\r\n    With m_txt\r\n        .OnChange = &quot;[Event Procedure]&quot;\r\n    End With\r\nEnd Property<\/pre>\n<p>Sp&auml;ter ben&ouml;tigen wir Zugriff auf das in der Klasse referenzierte Textfeld. Den verschafft uns die folgende <b>Property Get<\/b>-Prozedur:<\/p>\n<pre>Public Property Get Searchfield() As TextBox\r\n    Set Searchfield = m_txt\r\nEnd Property<\/pre>\n<p>Der Name des zu durchsuchenden Feldes soll ebenfalls in der Klasse gespeichert werden und sp&auml;ter verf&uuml;gbar sein. Daf&uuml;r sorgen die folgenden beiden Prozeduren:<\/p>\n<pre>Public Property Let Resultfield(str As String)\r\n    m_Resultfield = str\r\nEnd Property\r\nPublic Property Get Resultfield() As String\r\n    Resultfield = m_Resultfield\r\nEnd Property<\/pre>\n<p>Sp&auml;ter wird es eine Interaktion zwischen der Klasse <b>clsFastSearch <\/b>und den in der Collection <b>colFastSearchFields <\/b>gespeicherten Instanzen der Klasse <b>clsFastSearchField <\/b>geben.<\/p>\n<p>Damit diese sich mit dem Objekt auf Basis von <b>clsFastSearch <\/b>verst&auml;ndigen k&ouml;nnen, erh&auml;lt <b>clsFastSearchField <\/b>eine Referenz darauf. Dies geschieht wiederum &uuml;ber eine <b>Property Set<\/b>-Prozedur:<\/p>\n<pre>Public Property Set FastSearch(objFastsearch As clsFastSearch)\r\n    Set m_FastSearch = objFastsearch\r\nEnd Property<\/pre>\n<p>In diesem Zusammenhang soll auch der aktuelle Text des jeweils referenzierten Textfeldes verf&uuml;gbar gemacht werden.<\/p>\n<p>Dies geschieht &uuml;ber die folgende <b>Property Get<\/b>-Prozedur:<\/p>\n<pre>Public Property Get CurrentText() As String\r\n    CurrentText = m_Text\r\nEnd Property<\/pre>\n<p><b>Reagieren auf die Eingabe von Suchbegriffen<\/b><\/p>\n<p>Nun folgt der interessante Teil: Was geschieht, wenn der Benutzer in eines der Such-Textfelder, die jeweils in einem Objekt der Klasse <b>clsFastSearchField <\/b>gespeichert sind, einen Buchstaben eingibt Dies l&ouml;st die Ereignisprozedur <b>Bei &auml;nderung <\/b>aus, die in der Klasse <b>clsFastSearchField<\/b> wie folgt implementiert wird:<\/p>\n<pre>Private Sub m_txt_Change()\r\n    m_Text = m_txt.Text\r\n    m_FastSearch.Search Me\r\nEnd Sub<\/pre>\n<p>Diese Prozedur schreibt zun&auml;chst den aktuell im Such-Textfeld enthaltenen Suchbegriff in die Variable <b>m_Text<\/b>. Dann ruft sie die Methode <b>Search <\/b>des Objekts auf Basis der Klasse <b>clsFastSearch <\/b>auf und &uuml;bergibt einen Verweis auf sich selbst als Parameter.<\/p>\n<p>Diese Methode f&uuml;hrt schlie&szlig;lich den eigentlichen Suchvorgang durch.<\/p>\n<p>Bevor wir uns diese ansehen, werfen wir noch einen Blick auf die Methode <b>Clear<\/b>, die wir bereits oben angesprochen haben.<\/p>\n<p>Sie leert lediglich den Inhalt des in diesem Objekt referenzierten Textfeldes, wenn der Benutzer eine eventuell vorhandene Schaltfl&auml;che zum Leeren der Suchfelder angegeben hat:<\/p>\n<pre>Public Sub Clear()\r\n    m_txt.Value = &quot;&quot;\r\nEnd Sub<\/pre>\n<p><b>Der Suchvorgang<\/b><\/p>\n<p>Die Suche selbst l&auml;uft in zwei Prozeduren der Klasse <b>clsFastSearch <\/b>ab. Die erste ist die oben erw&auml;hnte Prozedur <b>Search<\/b>, die durch eine der Objekte auf Basis der Klasse <b>clsFastSearchField <\/b>aufgerufen wird (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-32-anchor\">Listing 3<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 3: Diese Prozedur f&uuml;hrt den eigentlichen Suchvorgang durch.<\/p>\n<pre>Public Sub Search(objFastsearchfield As clsFastSearchField)\r\n    Dim strFilter As String\r\n    Dim intStart As Integer\r\n    Dim txtSearchfield As TextBox\r\n    Set txtSearchfield = objFastsearchfield.Searchfield\r\n    intStart = txtSearchfield.SelStart\r\n    strFilter = GetFilterstring\r\n    If Not Len(strFilter) = 0 Then\r\n         m_Resultform.Filter = strFilter\r\n        m_Resultform.FilterOn = True\r\n        txtSearchfield.SelStart = intStart\r\n    Else\r\n         m_Resultform.Filter = &quot;&quot;\r\n        m_Resultform.FilterOn = False\r\n        txtSearchfield.SetFocus\r\n    End If\r\nEnd Sub<\/pre>\n<p>Diese Prozedur holt sich zun&auml;chst einen Verweis auf das in dem aufrufenden Objekt referenzierte Textfeld und speichert diesen in der Variablen <b>txtSearchfield<\/b>. Damit der Cursor nach dem Filtern wieder an der gleichen Position landet wie vor dem Filtern, wird dessen Position in der Variablen <b>intStart <\/b>gespeichert. Dann setzt die Funktion <b>GetFilterstring<\/b>, die gleich im Anschluss beschrieben wird, den Suchfilter zusammen &#8211; dies ist die Hauptarbeit w&auml;hrend des Filtervorgangs.<\/p>\n<p>Wenn der Filterausdruck eine L&auml;nge gr&ouml;&szlig;er <b>0 <\/b>hat, wird die <b>Filter<\/b>-Eigenschaft des Formulars mit den zu durchsuchenden Daten auf diesen eingestellt. Au&szlig;erdem werden der Filter mit der Eigenschaft <b>FilterOn <\/b>aktiviert und der Cursor im Textfeld auf die zuvor gespeicherte Position verschoben.<\/p>\n<p>Fall der Filterausdruck leer ist, wird die <b>Filter<\/b>-Eigenschaft geleert, der Filter mit <b>FilterOn = False <\/b>deaktiviert und der Fokus zur&uuml;ck auf das Such-Textfeld gesetzt.<\/p>\n<p><b>Filterausdruck zusammenstellen<\/b><\/p>\n<p>Die Funktion <b>GetFilterstring <\/b>aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-34-anchor\">Listing 4<\/a><\/span> stellt den Filterausdruck zusammen. Dabei durchl&auml;uft diese zun&auml;chst alle in der Collection <b>colSearchfields <\/b>gespeicherten Instanzen der Klasse <b>clsFastSearchfield<\/b>. Innerhalb dieser Schleife weist sie jedes Exemplar zun&auml;chst der Objektvariablen <b>objFastSearchfield <\/b>zu, um aus diesem zu ermitteln, ob f&uuml;r das entsprechende Such-Textfeld auch explizit ein zu durchsuchendes Feld der Datenherkunft angegeben wurde. Falls ja, wird ein Z&auml;hler namens <b>intResultfields <\/b>um eins erh&ouml;hat.<\/p>\n<p class=\"listingueberschrift\">Listing 4: Die Funktion GetFilterstring stellt die Filterbedingung zusammen.<\/p>\n<pre>Private Function GetFilterstring() As String\r\n    Dim objFastsearchfield As clsFastSearchField\r\n    Dim txtSearchfield As TextBox\r\n    Dim strFilter As String\r\n    Dim i As Integer\r\n    Dim intResultfields As Integer\r\n    For i = 1 To colSearchfields.Count\r\n        Set objFastsearchfield = colSearchfields.Item(i)\r\n        If Len(objFastsearchfield.Resultfield) &gt; 0 Then\r\n            intResultfields = intResultfields + 1\r\n        End If\r\n    Next i\r\n    If intResultfields = 0 Then\r\n        Set objFastsearchfield = colSearchfields.Item(1)\r\n        Set txtSearchfield = objFastsearchfield.Searchfield\r\n        For i = 1 To colResultfields.Count\r\n            strFilter = strFilter &amp; &quot; OR &quot; &amp; colResultfields.Item(i) &amp; &quot; LIKE ''&quot; &amp; txtSearchfield.Text &amp; &quot;*''&quot;\r\n        Next i\r\n        If Len(strFilter) &gt; 0 Then\r\n            strFilter = Mid(strFilter, 4)\r\n        End If\r\n    Else\r\n        For i = 1 To colSearchfields.Count\r\n            Set objFastsearchfield = colSearchfields.Item(i)\r\n            Set txtSearchfield = objFastsearchfield.Searchfield\r\n            strFilter = strFilter &amp; &quot; AND &quot; &amp; objFastsearchfield.Resultfield _\r\n                &amp; &quot; LIKE ''&quot; &amp; objFastsearchfield.CurrentText &amp; &quot;*''&quot;\r\n        Next i\r\n        If Len(strFilter) &gt; 0 Then\r\n            strFilter = Mid(strFilter, 6)\r\n        End If\r\n    End If\r\n    GetFilterstring = strFilter\r\nEnd Function<\/pre>\n<p>Enth&auml;lt keines dieser Objekte ein explizit angegebenes zu durchsuchendes Feld (<b>intResultfields = 0<\/b>), geht die Funktion davon aus, dass es zwar nur ein Such-Textfeld gibt, aber eines oder mehrere zu durchsuchende Felder.<\/p>\n<p>Sie speichert dann nur das erste in der Collection <b>colSearchfields <\/b>enthaltene Objekt in der Objektvariablen <b>objFastsearchfield<\/b>. Anschlie&szlig;end weist sie der Variablen <b>txtSearchfield <\/b>den in <b>objFastsearchfield<\/b>.Searchfield enthaltenen Verweis auf das Such-Textfeld zu.<\/p>\n<p>Da es keine explizit mit dem Such-Textfeld verkn&uuml;pftes zu durchsuchendes Feld in der Datenherkunft gibt, sollten ein oder mehrere Elemente in der Collection <b>colResultfields <\/b>vorliegen, die jeweils die Namen der zu durchsuchenden Felder enthalten.<\/p>\n<p>Die Eintr&auml;ge von <b>colResultfields <\/b>werden durchlaufen und f&uuml;r jeden Eintrag ein Ausdruck wie <b>OR Artikelname LIKE &#8220;ABC*&#8220;<\/b> erstellt. Das f&uuml;hrende <b>OR <\/b>wird sp&auml;ter abgeschnitten und der resultierende Ausdruck an die aufrufende Prozedur <b>Search <\/b>zur&uuml;ckgegeben.<\/p>\n<p>Wenn eines der <b>clsFastsearchfield<\/b>-Objekte hingegen einen Wert f&uuml;r die Eigenschaft <b>Resultfield <\/b>enth&auml;lt und somit ein zu durchsuchendes Feld explizit angegeben wurde, dann muss auch jedes Objekt ein solches aufweisen (anderenfalls w&uuml;rde durch eine hier aus Platzgr&uuml;nden nicht abgebildete Meldung darauf hingewiesen, dass die Konfiguration in der Prozedur <b>Form_Load <\/b>des entsprechenden Formulars korrigiert werden muss).<\/p>\n<p>In diesem Falle werden diesmal alle Elemente der Collection <b>colSearchfields <\/b>durchlaufen. Die darin enthaltenen Objekte auf Basis der Klasse <b>clsFastSearchField <\/b>werden dann nacheinander in der Objektvariablen <b>objFastsearchfield <\/b>gespeichert.<\/p>\n<p>Innerhalb der entsprechenden <b>For&#8230;Next<\/b>-Schleife werden dann Filterausdr&uuml;cke zusammengesetzt, die wie folgt aussehen:<\/p>\n<pre>AND Artikelname LIKE ''ABC*''<\/pre>\n<p>Beim Zusammensetzen dieses Ausdrucks wird der Feldname (in diesem Beispiel <b>Artikelname<\/b>) aus der Eigenschaft <b>Resultfield <\/b>des Objekts <b>objFastsearchfield <\/b>gewonnen. Die Eigenschaft <b>CurrentText <\/b>hingegen liefert den Vergleichswert.<\/p>\n<p>Warum aber beziehen wir diesen Vergleichswert aus der Eigenschaft <b>CurrentText <\/b>der Klasse <b>clsFastSearchField<\/b>, der in der Variablen <b>m_Text <\/b>zwischengespeichert wird, wenn dieser doch auch &uuml;ber die Eigenschaft <b>Text <\/b>des jeweiligen Such-Textfeldes ermittelt werden kann Nun: Diese Eigenschaft hat den Haken, dass das zu untersuchende Steuerelement den Fokus besitzen muss, damit Sie diese auslesen k&ouml;nnen.<\/p>\n<p>Also speichern wir die Werte aller Such-Textfelder in entsprechenden Variablen zwischen und suchen diese sp&auml;ter beim Zusammenstellen des Filterausdrucks wieder zusammen.<\/p>\n<p>Das f&uuml;hrende <b>AND <\/b>wird nach dem Durchlaufen der Schleife abgeschnitten, sodass die Funktion einen g&uuml;ltigen Filterausdruck an die aufrufende Prozedur <b>Search <\/b>zur&uuml;ckgeben kann.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Diese L&ouml;sung ist ein tolles Beispiel daf&uuml;r, wie sich Funktionalit&auml;t in Klassen kapseln und sp&auml;ter beliebig oft wiederverwendet werden kann. Sie brauchen lediglich die beiden Klassen in die Zielanwendung zu importieren und jedem Formular, dass Sie mit der Filterfunktion ausstatten m&ouml;chten, einige Zeilen Code hinzuzuf&uuml;gen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>SchnelleSucheMitKlasse.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{DBAF3571-0E65-46CB-A623-3E27E5C28F89}\/aiu_784.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sie kennen sicher die Art von Schnellsuche, bei der direkt bei der Eingabe von Zeichen gefiltert wird. Diese kann sich auf eines oder mehrere Felder beziehen, arbeitet aber sonst prinzipiell immer gleich: Das Eingeben eines Zeichens l&ouml;st ein Ereignis aus, dass den aktuellen Suchbegriff ermittelt, eine SQL-Where-Bedingung zusammenstellt und diese dem Filter-Kriterium des Formulars zuweist.  Wie Sie eine solche Suche ganz leicht implementieren, zeigt dieser Beitrag.<\/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":[662011,66042011,44000023],"tags":[],"class_list":["post-55000784","post","type-post","status-publish","format-standard","hentry","category-662011","category-66042011","category-Mit_Formularen_arbeiten"],"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>Schnelle Suche mit 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\/Schnelle_Suche_mit_Klasse\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Schnelle Suche mit Klasse\" \/>\n<meta property=\"og:description\" content=\"Sie kennen sicher die Art von Schnellsuche, bei der direkt bei der Eingabe von Zeichen gefiltert wird. Diese kann sich auf eines oder mehrere Felder beziehen, arbeitet aber sonst prinzipiell immer gleich: Das Eingeben eines Zeichens l&ouml;st ein Ereignis aus, dass den aktuellen Suchbegriff ermittelt, eine SQL-Where-Bedingung zusammenstellt und diese dem Filter-Kriterium des Formulars zuweist. Wie Sie eine solche Suche ganz leicht implementieren, zeigt dieser Beitrag.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Schnelle_Suche_mit_Klasse\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:56:41+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg03.met.vgwort.de\/na\/5a1eb766d72b4b028a60e984c156185b\" \/>\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\\\/Schnelle_Suche_mit_Klasse\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnelle_Suche_mit_Klasse\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Schnelle Suche mit Klasse\",\"datePublished\":\"2020-05-22T21:56:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnelle_Suche_mit_Klasse\\\/\"},\"wordCount\":3407,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnelle_Suche_mit_Klasse\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg03.met.vgwort.de\\\/na\\\/5a1eb766d72b4b028a60e984c156185b\",\"articleSection\":[\"2011\",\"4\\\/2011\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnelle_Suche_mit_Klasse\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnelle_Suche_mit_Klasse\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnelle_Suche_mit_Klasse\\\/\",\"name\":\"Schnelle Suche mit Klasse - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnelle_Suche_mit_Klasse\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnelle_Suche_mit_Klasse\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg03.met.vgwort.de\\\/na\\\/5a1eb766d72b4b028a60e984c156185b\",\"datePublished\":\"2020-05-22T21:56:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnelle_Suche_mit_Klasse\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnelle_Suche_mit_Klasse\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnelle_Suche_mit_Klasse\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg03.met.vgwort.de\\\/na\\\/5a1eb766d72b4b028a60e984c156185b\",\"contentUrl\":\"http:\\\/\\\/vg03.met.vgwort.de\\\/na\\\/5a1eb766d72b4b028a60e984c156185b\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Schnelle_Suche_mit_Klasse\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Schnelle Suche mit 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":"Schnelle Suche mit 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\/Schnelle_Suche_mit_Klasse\/","og_locale":"de_DE","og_type":"article","og_title":"Schnelle Suche mit Klasse","og_description":"Sie kennen sicher die Art von Schnellsuche, bei der direkt bei der Eingabe von Zeichen gefiltert wird. Diese kann sich auf eines oder mehrere Felder beziehen, arbeitet aber sonst prinzipiell immer gleich: Das Eingeben eines Zeichens l&ouml;st ein Ereignis aus, dass den aktuellen Suchbegriff ermittelt, eine SQL-Where-Bedingung zusammenstellt und diese dem Filter-Kriterium des Formulars zuweist. Wie Sie eine solche Suche ganz leicht implementieren, zeigt dieser Beitrag.","og_url":"https:\/\/access-im-unternehmen.de\/Schnelle_Suche_mit_Klasse\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:56:41+00:00","og_image":[{"url":"http:\/\/vg03.met.vgwort.de\/na\/5a1eb766d72b4b028a60e984c156185b","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\/Schnelle_Suche_mit_Klasse\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Schnelle_Suche_mit_Klasse\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Schnelle Suche mit Klasse","datePublished":"2020-05-22T21:56:41+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Schnelle_Suche_mit_Klasse\/"},"wordCount":3407,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Schnelle_Suche_mit_Klasse\/#primaryimage"},"thumbnailUrl":"http:\/\/vg03.met.vgwort.de\/na\/5a1eb766d72b4b028a60e984c156185b","articleSection":["2011","4\/2011","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Schnelle_Suche_mit_Klasse\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Schnelle_Suche_mit_Klasse\/","url":"https:\/\/access-im-unternehmen.de\/Schnelle_Suche_mit_Klasse\/","name":"Schnelle Suche mit Klasse - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Schnelle_Suche_mit_Klasse\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Schnelle_Suche_mit_Klasse\/#primaryimage"},"thumbnailUrl":"http:\/\/vg03.met.vgwort.de\/na\/5a1eb766d72b4b028a60e984c156185b","datePublished":"2020-05-22T21:56:41+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Schnelle_Suche_mit_Klasse\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Schnelle_Suche_mit_Klasse\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Schnelle_Suche_mit_Klasse\/#primaryimage","url":"http:\/\/vg03.met.vgwort.de\/na\/5a1eb766d72b4b028a60e984c156185b","contentUrl":"http:\/\/vg03.met.vgwort.de\/na\/5a1eb766d72b4b028a60e984c156185b"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Schnelle_Suche_mit_Klasse\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Schnelle Suche mit 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\/55000784","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=55000784"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000784\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000784"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000784"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000784"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}