{"id":55000965,"date":"2014-12-01T00:00:00","date_gmt":"2020-05-22T21:14:11","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=965"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Flexible_Suche_in_Formularen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Flexible_Suche_in_Formularen\/","title":{"rendered":"Flexible Suche in Formularen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/5ba29ab1f3cc4179ab6a984699a178e2\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Es gibt viele M&ouml;glichkeiten, eine Suche &uuml;ber die Datens&auml;tze einer Tabelle zu programmieren. Wir wollen in diesem Beitrag eine sehr flexible Variante vorstellen. Damit k&ouml;nnen Sie sowohl einfach Suchbegriffe eingeben, mit denen dann alle f&uuml;r die Suche angegebenen Felder durchsucht werden. Andererseits soll die Suche auch das gezielte Ermitteln von Datens&auml;tzen erm&ouml;glichen, deren Felder bestimmte Werte enthalten. Um die Angabe der Feldnamen zu vereinfachen, haben wir der Suche auch noch eine Funktion zur Autovervollst&auml;ndigung hinzugef&uuml;gt.<\/b><\/p>\n<p>Vorweg ist zu erw&auml;hnen, dass wir hier keine Suchfunktion mit nicht &uuml;berschaubaren M&ouml;glichkeiten produzieren m&ouml;chten. Vielmehr soll sie sich an der Praxis orientieren &#8211; in diesem Fall an meiner Praxis. Mein Bedarf an einer Suchfunktion, speziell an der hier vorgestellten, resultiert aus einer wachsenden Kundendatenbank.<\/p>\n<p>Fr&uuml;her verwendete ich eine Suchfunktion, die bestimmte Felder nach dem angegebenen Suchbegriff durchforstete. Wenn ich also die ersten Buchstaben des Nachnamens eines Kunden eingegeben habe, sollte das Formular nach den Kunden mit diesem Nachnamen gefiltert werden.<\/p>\n<p>Da ich aber nicht nur das Feld <b>Nachname<\/b>, sondern auch noch andere Felder nach dem eingegebenen Suchbegriff durchsuchte, erschienen pl&ouml;tzlich Such-treffer, bei denen etwa der Stra&szlig;enname mit den gleichen Buchstaben begann wie der Nachname.<\/p>\n<p>Bei einer &uuml;berschaubaren Anzahl von Kundendatens&auml;tzen ist da kein Problem: Man bl&auml;ttert halt schnell durch die gefilterten Datens&auml;tze und landet so schnell bei dem gesuchten Kunden. Mit einer kleinen Anzahl Kunden klappte das recht gut. Mit wachsender Anzahl funktionierte es allerdings immer schlechter, da auch die Anzahl der Suchtreffer wuchs.<\/p>\n<p>Da ich keine Lust hatte, schon wieder eine neue Suchfunktion zu programmieren, machte ich aus der Not eine Tugend und suchte fortan nach Elementen in den Kundendaten, die eine kleinere Treffermenge versprachen.<\/p>\n<p>Wenn ein Kunde also etwa den Nachnamen <b>Meier <\/b>tr&auml;gt, habe ich erst gar nicht mehr nach dem Nachnamen gesucht, sondern den Vornamen als Suchbegriff eingegeben. Dumm nur, wenn der gesuchte Kunde etwa <b>Michael Meier <\/b>hei&szlig;t &#8211; so waren auf jeden Fall eine Menge Treffer zu erwarten.<\/p>\n<p>Auch interessant waren Kunden mit einem Nachnamen, der auch als Vorname verwendet wird &#8211; auch hier fallen eine Reihe Treffer mehr an als man eigentlich durchbl&auml;ttern m&ouml;chte.<\/p>\n<p>Also musste eine neue Suchfunktion her: Eine, die zwar immer noch die flexible Suche &uuml;ber alle festgelegten Suchfelder erlaubte, aber die auch die konkrete Angabe der zu durchsuchenden Felder erlaubte (s. Bild 1). Wenn man also etwa einfach den Nachnamen <b>Meier <\/b>eingibt, sollten alle festgelegten Felder nach dieser Zeichenkette durchsucht werden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_06\/pic_965_001.png\" alt=\"Beispiel f&uuml;r die Suche in einem Formular in der Formularansicht\" width=\"575\" height=\"326,0045\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Beispiel f&uuml;r die Suche in einem Formular in der Formularansicht<\/span><\/b><\/p>\n<p>Um nur solche Datens&auml;tze zu finden, die den Wert <b>Meier<\/b> nur im Feld <b>Nachname <\/b>enthalten, soll der Benutzer diesen Ausdruck angeben k&ouml;nnen:<\/p>\n<pre>Nachname:Meier<\/pre>\n<p>Wenn die Suche zu viele Treffer liefert, kann der Benutzer das Ergebnis weiter einschr&auml;nken &#8211; etwa durch zus&auml;tzliche Angabe des Vornamens:<\/p>\n<pre>Vorname:Michael Nachname:Meier<\/pre>\n<p><b>&#8222;Und&#8220; oder &#8222;Oder&#8220;<\/b><\/p>\n<p>Die gro&szlig;e Frage, die sich nun stellt, ist folgende: Ben&ouml;tigen wir eine Und-Verkn&uuml;pfung f&uuml;r alle Vergleichskriterien oder eine Oder-Verkn&uuml;pfung &#8211; oder gar beide Und sollte man gegebenenfalls sogar Klammern zum Einstellen der Priorit&auml;t der Verkn&uuml;pfungen hinzuf&uuml;gen k&ouml;nnen Normalerweise sollte eine Und-Verkn&uuml;pfung ausreichen. Wenn man zus&auml;tzlich zum gesuchten Nachnamen noch den Vornamen eingibt, soll das Suchergebnis auch nur die Datens&auml;tze enthalten, bei denen beide Suchkriterien zutreffen. Dies gilt zumindest dann, wenn man nach genau einem Kundendatensatz sucht. Aber auch hier gibt es Ausnahmen: Es kann ja zum Beispiel sein, dass Sie nicht wissen, ob der Nachname des Kunden nun in der Lieferadresse (etwa im Feld <b>Nachname_Liefer<\/b>) oder in der Rechnungsadresse (zum Beispiel <b>Nachname_Rechnung<\/b>) gespeichert ist. Dann w&auml;re es nat&uuml;rlich sinnvoll, wenn die Suchfunktion die beiden Suchausdr&uuml;cke per <b>Or <\/b>verkn&uuml;pfen w&uuml;rde. Also enth&auml;lt die L&ouml;sung die M&ouml;glichkeit, <b>And <\/b>und <b>Or <\/b>als Verkn&uuml;pfungsoperatoren zu verwenden.<\/p>\n<p><b>In allen Feldern suchen<\/b><\/p>\n<p>Und die Suchfunktion soll noch ein weiteres interessantes Feature liefern &#8211; n&auml;mlich die Suche &uuml;ber alle m&ouml;glichen Felder. Dies soll immer dann geschehen, wenn der Benutzer einen Suchbegriff ohne Angabe des zu durchsuchenden Feldes angibt.<\/p>\n<p>Die Eingabe des Ausdrucks <b>Chai <\/b>ohne vorheriges <b>Artikelname: <\/b>soll also alle Felder nach diesem Ausdruck durchsuchen.<\/p>\n<p><b>Automatische Erg&auml;nzung<\/b><\/p>\n<p>Eine der wichtigsten Funktionen der Suche ist die automatische Erg&auml;nzung bei der Eingabe der zu durchsuchenden Felder. Wenn die Datenherkunft also etwa ein Feld namens <b>Artikelname <\/b>enth&auml;lt und der Benutzer gibt die Buchstaben <b>Art <\/b>ein, dann soll das Suchtextfeld automatisch die fehlenden Buchstaben (hier <b>ikelname<\/b>) anzeigen und gegebenenfalls nach Bet&auml;tigen der <b>Tab<\/b>-Taste oder nach Eingabe des Doppelpunkts (<b>:<\/b>) hinzuf&uuml;gen (s. Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_06\/pic_965_004.png\" alt=\"Automatische Erg&auml;nzung von Suchfeldern\" width=\"575\" height=\"198,9189\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Automatische Erg&auml;nzung von Suchfeldern<\/span><\/b><\/p>\n<p><b>Einschr&auml;nkung<\/b><\/p>\n<p>In der aktuellen Version funktioniert die Suche nach Textpassagen in Feldern des Datentyps <b>Text <\/b>oder <b>Memo <\/b>problemlos. Auch die Suche nach Zahlen oder Datumsangaben gelingt, allerdings nur f&uuml;r den Gleich-Operator. Gr&ouml;&szlig;er\/Kleiner und &auml;hnliche Operatoren sind hier noch nicht umgesetzt.<\/p>\n<p><b>Einsatz der L&ouml;sung<\/b><\/p>\n<p>Ein Beispiel f&uuml;r den Einsatz der L&ouml;sung liefert das Formular <b>frmFormularansicht<\/b>. Hier haben wir ein Formular, das die Datens&auml;tze der Tabelle <b>tblArtikel<\/b> in der Formularansicht anzeigt, mit einem Suchfeld versehen. Im Beispiel soll die Suche alle Artikel liefern, deren Feld <b>Artikelname <\/b>den Wert <b>Chai <\/b>enth&auml;lt &#8211; was genau einen Treffer bringt (siehe unten in der Abbildung: <b>Datensatz 1 von 1<\/b>).<\/p>\n<p>Welche Schritte sind zum Anwenden der L&ouml;sung n&ouml;tig In Kurzfassung sind es die folgenden:<\/p>\n<ul>\n<li>Hinzuf&uuml;gen eines Textfeldes zur Eingabe des Suchbegriffs<\/li>\n<li>Erstellen einer Abfrage, die alle zu durchsuchenden Felder enth&auml;lt<\/li>\n<li>Anlegen einer Ereignisprozedur f&uuml;r das Ereignis <b>Beim Laden<\/b>, das die Suchfunktion initialisiert<\/li>\n<li>Anlegen einer Ereignisprozedur f&uuml;r das Ereignis <b>Beim Entladen<\/b>, um die Suchfunktion zu beenden<\/li>\n<li>Anlegen einer Ereignisprozedur, die nach dem Start der Suche ausgel&ouml;st wird und die Aktion zum Filtern des Formulars, Unterformulars oder Listenfeldes enth&auml;lt<\/li>\n<\/ul>\n<p><b>Textfeld f&uuml;r die Suche hinzuf&uuml;gen<\/b><\/p>\n<p>Im ersten Schritt f&uuml;gen Sie dem Formular an der gew&uuml;nschten Stelle ein Textfeld hinzu, das Sie zur Eingabe des Suchbegriffs nutzen m&ouml;chten &#8211; beispielsweise im oberen Bereich des Formulars. Im ersten Beispiel des Formulars <b>frmFormularansicht<\/b>, das die Daten der Tabelle <b>tblArtikel <\/b>anzeigt, nennen wir dieses Steuerelement <b>txtSucheNach <\/b>(s. Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_06\/pic_965_002.png\" alt=\"Hinzuf&uuml;gen eines Suchfeldes zum Formular\" width=\"575\" height=\"435,1616\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Hinzuf&uuml;gen eines Suchfeldes zum Formular<\/span><\/b><\/p>\n<p><b>Abfrage mit den zu durchsuchenden Feldern erstellen<\/b><\/p>\n<p>Neben der Datenherkunft f&uuml;r das Formular ben&ouml;tigen wir noch eine Abfrage, welche die zu durchsuchenden Felder enth&auml;lt. Warum aber sollte man nicht einfach die gleiche Abfrage verwenden, die auch als Datenherkunft f&uuml;r das zu durchsuchende Formular dient Aus einem ganz einfachen Grund: Im Beispiel des Formulars <b>frmFormular-ansicht <\/b>etwa werden nur Daten der Tabelle <b>tblArtikel <\/b>angezeigt. Nun k&ouml;nnte man annehmen, dass dies auch f&uuml;r die Ermittlung der zu durchsuchenden Felder gilt. Das ist manchmal der Fall, aber nicht hier: Die Datenherkunft des Formulars liefert n&auml;mlich mit den beiden Feldern <b>LieferantID <\/b>und <b>KategorieID <\/b>zwei Nachschlagefelder, die ja nur die Werte der Prim&auml;rschl&uuml;sselfelder der verkn&uuml;pften Eintr&auml;ge aus den Tabellen <b>tblLieferanten <\/b>und <b>tblKategorien<\/b> enthalten. Wenn wir nun als Suchbegriff etwa f&uuml;r die Kategorie den Wert <b>Getr&auml;nke <\/b>eingeben, finden wir in der Datenherkunft des Formulars nat&uuml;rlich keinen passenden Datensatz, weil das Feld <b>KategorieID <\/b>dort nur Zahlenwerte wie <b>1<\/b>, <b>2<\/b>, <b>3 <\/b>et cetera enth&auml;lt.<\/p>\n<p>Wenn wir aber nach den eigentlichen Werten hinter den als Nachschlagefeld definierten Feldern suchen m&ouml;chten, m&uuml;ssen wir die verkn&uuml;pften Tabellen noch zur Datenherkunft f&uuml;r die Suchfunktion hinzuf&uuml;gen. Dies sieht dann wie in Bild 4 aus: Hier haben wir einer neuen Abfrage namens <b>qryArtikelsuche <\/b>nicht nur die Tabelle <b>tblArtikel<\/b>, sondern auch noch die beiden verkn&uuml;pften Tabellen <b>tblKategorien <\/b>und <b>tblLieferanten <\/b>hinzugef&uuml;gt. Nachdem alle ben&ouml;tigten Tabellen in der Abfrage enthalten sind, ist es wichtig, nur die Felder zum Entwurfsraster hinzuzuf&uuml;gen, die auch f&uuml;r die Suche herangezogen werden sollen &#8211; plus dem Prim&auml;rschl&uuml;sselfeld der eigentlich zu durchsuchenden Tabelle, also <b>ArtikelID<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_06\/pic_965_003.png\" alt=\"Abfrage mit den zu durchsuchenden Feldern\" width=\"700\" height=\"263,0261\" \/><\/p>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Abfrage mit den zu durchsuchenden Feldern<\/span><\/b><\/p>\n<p>In diesem Fall f&uuml;gen wir also zun&auml;chst die Felder <b>ArtikelID <\/b>und <b>Artikelname <\/b>hinzu. Dann folgt in der Tabelle <b>tblArtikel <\/b>das Feld <b>LieferantID<\/b>, welches wir aber nicht zur Datenherkunft hinzuf&uuml;gen &#8211; wir wollen ja nicht nach den Prim&auml;rschl&uuml;sselwerten der Tabelle <b>tblLieferanten <\/b>suchen.<\/p>\n<p>Stattdessen ziehen Sie das Feld <b>Firma <\/b>aus der Tabelle <b>tblLieferanten <\/b>in das Entwurfsraster. Auch das n&auml;chste Feld namens <b>KategorieID <\/b>ben&ouml;tigen wir nicht, sondern das Feld <b>Kategoriename <\/b>der verkn&uuml;pften Tabelle <b>tblKategorien<\/b>. Die &uuml;brigen Felder der Tabelle <b>tblArtikel <\/b>k&ouml;nnen wir dann wieder direkt in das Entwurfsraster der Abfrage ziehen.<\/p>\n<p>Hier fehlt nur noch eine kleine Optimierung: Im Formular wird etwa das Feld <b>KategorieID <\/b>mit der Bezeichnung <b>Kategorie <\/b>angezeigt. Der Name des Feldes in der Abfrage, die f&uuml;r die Suche verwendet werden soll, lautet hingegen <b>Kategoriename<\/b>. &auml;hnlich sieht es f&uuml;r das Feld <b>Lieferant <\/b>aus, das in der verkn&uuml;pften Tabelle <b>Firma <\/b>hei&szlig;t. In beiden F&auml;llen versehen wir die Felder der Suchabfrage mit einem entsprechenden Alias: <b>Kategoriename <\/b>wird durch <b>Kategorie:Kategoriename <\/b>ersetzt, <b>Firma <\/b>durch <b>Lieferant:Firma<\/b> (s. Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_06\/pic_965_005.png\" alt=\"Optimierung: Anpassen der Felder der verkn&uuml;pften Tabellen an den Feldnamen der Haupttabelle\" width=\"575\" height=\"427,9581\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Optimierung: Anpassen der Felder der verkn&uuml;pften Tabellen an den Feldnamen der Haupttabelle<\/span><\/b><\/p>\n<p>Diese Abfrage taucht nirgends im Formular auf. Sie wird lediglich f&uuml;r zwei Zwecke ben&ouml;tigt: Erstens als Lieferant f&uuml;r die Feldnamen, die im Suchtextfeld bei der Eingabe der Anfangsbuchstaben automatisch erg&auml;nzt werden sollen, zweitens als Abfrage, welche zur Ermittlung der gesuchten Datens&auml;tze dient.<\/p>\n<p><b>Beim Laden: Suche initialisieren<\/b><\/p>\n<p>Die Suchfunktion steckt komplett in einem einzigen Klassenmodul. Dieses m&uuml;ssen Sie im Klassenmodul des Formulars instanzieren und ihm einige Informationen &uuml;bergeben, die es f&uuml;r die Implementierung der Suchfunktion f&uuml;r das Formular ben&ouml;tigt.<\/p>\n<p>Dazu sind zwei Schritte n&ouml;tig. Der erste ist die Deklaration einer Objektvariablen namens <b>objFlexSearch <\/b>im Kopf des Klassenmoduls des Formulars:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents objFlexSearch <span style=\"color:blue;\"> As <\/span>clsFlexSearch<\/pre>\n<p>Der zweite ist das Hinzuf&uuml;gen einer Ereignisprozedur, die durch das Ereignis <b>Beim Laden <\/b>des Formulars ausgel&ouml;st wird. F&uuml;r dieses hinterlegen Sie den folgenden Code:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Set<\/span> objFlexSearch = <span style=\"color:blue;\">New<\/span> clsFlexSearch\r\n     <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\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Eigenschaften der Klasse <b>clsFlexSearch<\/b> werden im VBA-Fenster per IntelliSense bereitgestellt und k&ouml;nnen so leicht gef&uuml;llt werden (s. Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_06\/pic_965_006.png\" alt=\"Die Eigenschaften der Klasse clsFlexSearch werden per IntelliSense bereitgestellt.\" width=\"575\" height=\"427,2936\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Die Eigenschaften der Klasse clsFlexSearch werden per IntelliSense bereitgestellt.<\/span><\/b><\/p>\n<p>Die Eigenschaften haben die folgende Bedeutung:<\/p>\n<ul>\n<li><b>Suchabfrage<\/b>: Name der gespeicherten Abfrage, die wir soeben erstellt haben<\/li>\n<li><b>PKFeld<\/b>: Name des Prim&auml;rschl&uuml;sselfeldes in der Suchabfrage, nach der die Datens&auml;tze der im Formular angezeigten Datenherkunft gefiltert werden sollen<\/li>\n<li><b>PKFeldEinschliessen<\/b>: Gibt an, ob das Prim&auml;rschl&uuml;sselfeld als Suchbegriff verwendet werden soll.<\/li>\n<li><b>Suchfeld<\/b>: Verweis auf das Textfeld, in das der Benutzer die Suchausdr&uuml;cke eingibt.<\/li>\n<\/ul>\n<p><b>Beim Entladen: Suchfunktion beenden<\/b><\/p>\n<p>Beim Entwickeln der Suchfunktion gab es &ouml;fters Probleme, wenn das Formular oder die Anwendung geschlossen wurde, wenn die Objektvariable nicht durch Setzen des Wertes <b>Nothing <\/b>geleert wurde &#8211; Access st&uuml;rzte dann einfach ab.<\/p>\n<p>Dies war nat&uuml;rlich besonders &auml;rgerlich, wenn so nicht gespeicherte &auml;nderungen im Code verloren gingen. Also habe ich noch eine Ereignisprozedur hinzugef&uuml;gt, die durch das Ereignis <b>Beim Entladen <\/b>des Formulars ausgel&ouml;st wird und die folgende Anweisung ausf&uuml;hrt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Unload(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Set<\/span> objFlexSearch = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Ereignisprozedur f&uuml;r die Suche<\/b><\/p>\n<p>Mit den bisher angelegten Ereignisprozeduren stellen wir immerhin schon einmal sicher, dass das Such-Textfeld die Eingabe interpretiert und gegebenenfalls automatisch Vorschl&auml;ge zur Vervollst&auml;ndigung der zu durchsuchenden Felder anbietet. Eines fehlt allerdings noch: Wenn der Benutzer nun auf die Eingabetaste klickt, um die Suche durchzuf&uuml;hren, geschieht noch nichts. Das liegt daran, dass wir die Suche m&ouml;glichst flexibel gestalten wollten &#8211; auch, was das Objekt angeht, das die zu durchsuchenden Daten anzeigt. Hier k&ouml;nnen Sie n&auml;mlich beispielsweise ein Formular in der Formularansicht, ein Unterformular in der Datenblattansicht, ein Endlosformular oder auch ein Formular mit einem Listenfeld verwenden.<\/p>\n<p>Um diese Objekte gezielt zu filtern, bietet die Klasse <b>clsFlexSearch <\/b>ein Ereignis namens <b>Suchen <\/b>an. Dieses wird von der Klasse ausgel&ouml;st, wenn der Benutzer im Such-Textfeld die Eingabetaste bet&auml;tigt. Das Ereignis bietet mit <b>strWhere <\/b>einen Parameter an, der die ermittelte Bedingung liefert.<\/p>\n<p>Um die <b>Suchen<\/b>-Ereignisprozedur zu implementieren, w&auml;hlen Sie im linken Kombinationsfeld des Codefensters den Eintrag <b>objFlexSearch <\/b>aus. Das rechte Kombinationsfeld nimmt dann automatisch den Wert <b>Suchen <\/b>an und der VBA-Editor erstellt die folgende Ereignisprozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objFlexSearch_Suchen( _\r\n         strWhere<span style=\"color:blue;\"> As String<\/span>)\r\n     ...\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Nun m&uuml;ssen Sie dieser Prozedur nur noch zwei Anweisungen hinzuf&uuml;gen, was das Ergebnis aus Listing 1 liefert.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objFlexSearch_Suchen(strWhere<span style=\"color:blue;\"> As String<\/span>)\r\n     Me.Filter = strWhere\r\n     Me.FilterOn = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Anwenden der ermittelten Where-Bedingung<\/span><\/b><\/p>\n<p>Die Prozedur weist der Eigenschaft Filter des Formulars also den mit <b>strWhere <\/b>&uuml;bergebenen Ausdruck zu und aktiviert den Filter durch Einstellen der Eigenschaft <b>FilterOn <\/b>des Formulars auf den Wert <b>True<\/b>.<\/p>\n<p>Fertig &#8211; damit haben Sie bereits das erste Formular mit der Suchfunktion ausgestattet.<\/p>\n<p>Bevor wir einen Blick auf die Funktion der Klasse werfen, schauen wir uns noch zwei weitere Implementierungen an.<\/p>\n<p><b>Durchsuchen eines Unterformulars<\/b><\/p>\n<p>Den Inhalt eines Formulars in der Formularansicht zu filtern, ist nat&uuml;rlich nur sinnvoll, wenn Sie direkt den gesuchten Datensatz finden.<\/p>\n<p>Sollte die Suche jedoch mehr als einen Datensatz liefern, muss der Benutzer gegebenenfalls erst noch alle Suchergebnisse durchbl&auml;ttern, um den gew&uuml;nschten Eintrag zu finden. Also schauen wir uns an, wie wir die Suchergebnisse in einem Unterformular in der Datenblattansicht anzeigen k&ouml;nnen.<\/p>\n<p>Dazu legen Sie ein Formular namens <b>frmUnterformular <\/b>an und f&uuml;gen diesem das Textfeld zur Eingabe der Suchergebnisse hinzu. Au&szlig;erdem erstellen Sie ein Unterformular namens <b>sfmKunden<\/b>, das alle Felder der Tabelle <b>tblKunden <\/b>anzeigt. Die fertige Konstellation sieht wie in Bild 7 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_06\/pic_965_007.png\" alt=\"Durchsuchen eines Unterformulars in der Datenblattansicht\" width=\"700\" height=\"217,5069\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Durchsuchen eines Unterformulars in der Datenblattansicht<\/span><\/b><\/p>\n<p>Damit das Suchfeld nur die gew&uuml;nschten Felder der Datenherkunft als Kriterienfelder anzeigt, legen Sie eine Anfrage namens <b>qryKundensuche <\/b>an. Diese enth&auml;lt alle Felder der Tabelle <b>tblKunden<\/b>.<\/p>\n<p>Die Konfiguration der Klasse <b>clsFlexSearch <\/b>nehmen wir wiederum in der Ereignisprozedur <b>Form_Load <\/b>auf:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Set<\/span> objFlexSearch = _\r\n         <span style=\"color:blue;\">New<\/span> clsFlexSearch\r\n     <span style=\"color:blue;\">With<\/span> objFlexSearch\r\n         .Suchabfrage = \"qryKundensuche\"\r\n         .PKFeld = \"KundeID\"\r\n         .PKFeldEinschliessen = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> .Suchfeld = Me!txtSuche\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Fehlt noch das Ausf&uuml;hren der Suche: Diese l&ouml;st die Ereignisprozedur aus Listing 2 aus. In diesem Fall stellt die Prozedur nicht die Eigenschaft <b>Filter <\/b>des Formulars selbst ein, sondern die des Unterformulars. Gleiches gilt f&uuml;r die Eigenschaft <b>FilterOn<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objFlexSearch_Suchen(strWhere<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">With<\/span> Me!sfmKunden.Form\r\n         .Filter = strWhere\r\n         .FilterOn = <span style=\"color:blue;\">True<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Anwenden der ermittelten Where-Bedingung f&uuml;r ein Unterformular<\/span><\/b><\/p>\n<p><b>Durchsuchen eines Listenfeldes<\/b><\/p>\n<p>Schlie&szlig;lich schauen wir uns noch an, wie Sie ein Listenfeld mit der hier vorgestellten Suchfunktion filtern k&ouml;nnen.<\/p>\n<p>Dazu f&uuml;gen Sie dem Formular neben dem Such-Textfeld das zu durchsuchende Listenfeld hinzu und versehen es mit der entsprechenden Datensatzherkunft, hier die Abfrage <b>qryLstArtikel<\/b>. Das resultierende Formular <b>frmListenfeld<\/b> sieht nun wie in Bild 8 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_06\/pic_965_008.png\" alt=\"Durchsuchen eines Listenfeldes nach den Artikeln einer bestimmten Kategorie\" width=\"650\" height=\"323,7978\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Durchsuchen eines Listenfeldes nach den Artikeln einer bestimmten Kategorie<\/span><\/b><\/p>\n<p>Es ist an dieser Stelle wichtig, dass Sie die Datensatzherkunft f&uuml;r das Listenfeld als gespeicherte Abfrage unter dem Namen <b>qryLstArtikel <\/b>anlegen und nicht nur den entsprechenden SQL-Ausdruck als Wert der Eigenschaft <b>Datensatzherkunft <\/b>hinterlegen.<\/p>\n<p>Der Grund ist die fehlende <b>Filter<\/b>-Eigenschaft beim Listenfeld. Wenn der Benutzer den Suchausdruck eingegeben hat und die Eingabetaste bet&auml;tigt, l&ouml;st dies wieder das Ereignis <b>Suchen <\/b>des Objekts <b>objFlexSearch <\/b>aus.<\/p>\n<p>Wir k&ouml;nnen dem mit <b>strWhere <\/b>gelieferten Ausdruck daher nicht wie bei den Formularen oder Unterformularen direkt einer <b>Filter<\/b>-Eigenschaft zuweisen, sondern m&uuml;ssen die Eigenschaft <b>RowSource <\/b>verwenden.<\/p>\n<p>Diese erwartet aber nicht nur eine Where-Klausel, sondern eine komplette SQL-Abfrage. Also setzen wir diese aus dem Ausdruck <b>SELECT * FROM qryLstArtikel WHERE <\/b>und dem Inhalt des Parameters <b>strWhere<\/b> zusammen (s. Listing 3). Dies geschieht allerdings nur, wenn <b>strWhere <\/b>auch einen Ausdruck enth&auml;lt, was wir mit der Bedingung <b>Len(strWhere) > 0 <\/b>pr&uuml;fen. Anderenfalls weist die Prozedur der Eigenschaft <b>RowSource <\/b>einfach die Abfrage <b>qryLstArtikel <\/b>zu.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objFlexSearch_Suchen(strWhere<span style=\"color:blue;\"> As String<\/span>)\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         Me!lstArtikel.RowSource = \"SELECT * FROM qryLstArtikel WHERE \" & strWhere\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!lstArtikel.RowSource = \"qryLstArtikel\"\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 3: Anwenden der ermittelten Where-Bedingung f&uuml;r ein Listenfeld<\/span><\/b><\/p>\n<p><b>Listenfeldsuche plus Detailansicht<\/b><\/p>\n<p>Wenn Sie nun noch die Details zu dem aktuell im Listenfeld markierten Datensatz anzeigen m&ouml;chten, k&ouml;nnen Sie eine Kombination der beiden Beispielformulare <b>frmFormularansicht <\/b>und <b>frmListenfeld <\/b>programmieren.<\/p>\n<p>Dabei w&uuml;rde das Anklicken eines Eintrags im Listenfeld <b>lstArtikel <\/b>dazu f&uuml;hren, dass der aktuell ausgew&auml;hlte Eintrag in den gebundenen Steuerelementen des Formulars angezeigt wird.<\/p>\n<p>Das Ergebnis sieht dann wie in Bild 9 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_06\/pic_965_009.png\" alt=\"Vollst&auml;ndige Suche mit Listenfeld f&uuml;r Ergebnisse und Anzeige eines einzelnen Eintrags\" width=\"650\" height=\"409,7826\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Vollst&auml;ndige Suche mit Listenfeld f&uuml;r Ergebnisse und Anzeige eines einzelnen Eintrags<\/span><\/b><\/p>\n<p>Der Code des Klassenmoduls des Formulars muss an drei Stellen erweitert werden. Als Erstes soll die Datenherkunft des Formulars gleich nach dem &ouml;ffnen nach dem aktuell im Listenfeld markierten Eintrag gefiltert werden.<\/p>\n<p>Dazu muss nat&uuml;rlich erst mal ein Listenfeldeintrag markiert werden. Beides erledigen wir mit drei zus&auml;tzlichen Anweisungen in der Ereignisprozedur <b>Form_Load <\/b>aus Listing 4.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Set<\/span> objFlexSearch = <span style=\"color:blue;\">New<\/span> clsFlexSearch\r\n     <span style=\"color:blue;\">With<\/span> objFlexSearch\r\n         .Suchabfrage = \"qryArtikelsuche\"\r\n         ...\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     Me!lstArtikel = Me!lstArtikel.ItemData(0)\r\n     Me.Filter = \"ArtikelID = \" & Me!lstArtikel\r\n     Me.FilterOn = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Erweiterung von Form_Load um die Anzeige des ersten Datensatzes im Listenfeld<\/span><\/b><\/p>\n<p>Danach m&uuml;ssen wir daf&uuml;r sorgen, dass das Hauptformular nach der Auswahl eines neuen Eintrags im Listenfeld den jeweiligen Datensatz anzeigt. Dies erledigen wir mit einer neuen Ereignisprozedur, die durch das Ereignis <b>Nach Aktualisierung <\/b>des Listenfeldes ausgel&ouml;st wird und die wie in Listing 5 aussieht.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstArtikel_AfterUpdate()\r\n     Me.Filter = \"ArtikelID = \" & Me!lstArtikel\r\n     Me.FilterOn = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Aktualisieren der Details nach Auswahl eines Eintrags im Listenfeld<\/span><\/b><\/p>\n<p>Schlie&szlig;lich soll auch nach dem Ausf&uuml;hren der Suche der erste Eintrag im Listenfeld markiert und das Formular nach dem entsprechenden Datensatz gefiltert werden. Dies erledigen einige zus&auml;tzliche Anweisungen in der Ereignisprozedur <b>objFlexSearch_Suchen<\/b> wie in Listing 6.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objFlexSearch_Suchen(strWhere<span style=\"color:blue;\"> As String<\/span>)\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         Me!lstArtikel.RowSource = \"SELECT * FROM qryLstArtikel WHERE \" & strWhere\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!lstArtikel.RowSource = \"qryLstArtikel\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me!lstArtikel = Me!lstArtikel.ItemData(0)\r\n     Me.Filter = \"ArtikelID = \" & Me!lstArtikel\r\n     Me.FilterOn = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Aktualisieren der Details nach der Suche<\/span><\/b><\/p>\n<p><b>Weitere M&ouml;glichkeiten<\/b><\/p>\n<p>In vielen F&auml;llen dient das Prim&auml;rschl&uuml;sselfeld eines Datensatzes nur dazu, einen Datensatz eindeutig zu kennzeichnen und die Verkn&uuml;pfung mit anderen Tabellen zu erm&ouml;glichen. Das hei&szlig;t, dass Sie dieses Feld normalerweise nicht zum Durchsuchen der Datens&auml;tze verwenden werden. Gelegentlich ist dies jedoch dennoch notwendig &#8211; etwa, wenn Sie die Kundennummer in diesem Feld speichern und danach suchen wollen.<\/p>\n<p>In diesem Fall stellen Sie die Eigenschaft <b>PKFeldEinschliessen<\/b>, die in den vorherigen Beispielen immer den Wert <b>False<\/b> aufwies, auf den Wert <b>True <\/b>ein. Das bedeutet, dass auch der Prim&auml;rschl&uuml;sselwert der Datenherkunft als Suchbegriff verwendet wird.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Dieser Beitrag zeigt, wie Sie die Klasse <b>clsFlexSearch <\/b>in verschiedenen Formular-Konstellationen einsetzen und so eine beeindruckend flexible Suchfunktion zu einem Formular hinzuf&uuml;gen.<\/p>\n<p>In einem weiteren Beitrag namens <b>Suchen mit der Klasse clsFlexSearch <\/b>(<b>www.access-im-unternehmen.de\/964<\/b>) zeigen wir Ihnen, wie diese Klasse im Detail funktioniert.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>FlexibleSuche.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{959AD827-80A7-447A-9D95-49159E9E0025}\/aiu_965.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Es gibt viele M&ouml;glichkeiten, eine Suche &uuml;ber die Datens&auml;tze einer Tabelle zu programmieren. Wir wollen in diesem Beitrag eine sehr flexible Variante vorstellen. Damit k&ouml;nnen Sie sowohl einfach Suchbegriffe eingeben, mit denen dann alle f&uuml;r die Suche angegebenen Felder durchsucht werden. Andererseits soll die Suche auch das gezielte Ermitteln von Datens&auml;tzen erm&ouml;glichen, deren Felder bestimmte Werte enthalten. Um die Angabe der Feldnamen zu vereinfachen, haben wir der Suche auch noch eine Funktion zur Autovervollst&auml;ndigung hinzugef&uuml;gt.<\/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,44000027],"tags":[],"class_list":["post-55000965","post","type-post","status-publish","format-standard","hentry","category-662014","category-66062014","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Flexible Suche in Formularen - 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\/Flexible_Suche_in_Formularen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flexible Suche in Formularen\" \/>\n<meta property=\"og:description\" content=\"Es gibt viele M&ouml;glichkeiten, eine Suche &uuml;ber die Datens&auml;tze einer Tabelle zu programmieren. Wir wollen in diesem Beitrag eine sehr flexible Variante vorstellen. Damit k&ouml;nnen Sie sowohl einfach Suchbegriffe eingeben, mit denen dann alle f&uuml;r die Suche angegebenen Felder durchsucht werden. Andererseits soll die Suche auch das gezielte Ermitteln von Datens&auml;tzen erm&ouml;glichen, deren Felder bestimmte Werte enthalten. Um die Angabe der Feldnamen zu vereinfachen, haben wir der Suche auch noch eine Funktion zur Autovervollst&auml;ndigung hinzugef&uuml;gt.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Flexible_Suche_in_Formularen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:14:11+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/5ba29ab1f3cc4179ab6a984699a178e2\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"17\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Suche_in_Formularen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Suche_in_Formularen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Flexible Suche in Formularen\",\"datePublished\":\"2020-05-22T21:14:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Suche_in_Formularen\\\/\"},\"wordCount\":3160,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Suche_in_Formularen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/5ba29ab1f3cc4179ab6a984699a178e2\",\"articleSection\":[\"2014\",\"6\\\/2014\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Suche_in_Formularen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Suche_in_Formularen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Suche_in_Formularen\\\/\",\"name\":\"Flexible Suche in Formularen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Suche_in_Formularen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Suche_in_Formularen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/5ba29ab1f3cc4179ab6a984699a178e2\",\"datePublished\":\"2020-05-22T21:14:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Suche_in_Formularen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Suche_in_Formularen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Suche_in_Formularen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/5ba29ab1f3cc4179ab6a984699a178e2\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/5ba29ab1f3cc4179ab6a984699a178e2\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Flexible_Suche_in_Formularen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Flexible Suche in Formularen\"}]},{\"@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":"Flexible Suche in Formularen - 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\/Flexible_Suche_in_Formularen\/","og_locale":"de_DE","og_type":"article","og_title":"Flexible Suche in Formularen","og_description":"Es gibt viele M&ouml;glichkeiten, eine Suche &uuml;ber die Datens&auml;tze einer Tabelle zu programmieren. Wir wollen in diesem Beitrag eine sehr flexible Variante vorstellen. Damit k&ouml;nnen Sie sowohl einfach Suchbegriffe eingeben, mit denen dann alle f&uuml;r die Suche angegebenen Felder durchsucht werden. Andererseits soll die Suche auch das gezielte Ermitteln von Datens&auml;tzen erm&ouml;glichen, deren Felder bestimmte Werte enthalten. Um die Angabe der Feldnamen zu vereinfachen, haben wir der Suche auch noch eine Funktion zur Autovervollst&auml;ndigung hinzugef&uuml;gt.","og_url":"https:\/\/access-im-unternehmen.de\/Flexible_Suche_in_Formularen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:14:11+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/5ba29ab1f3cc4179ab6a984699a178e2","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Flexible_Suche_in_Formularen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_Suche_in_Formularen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Flexible Suche in Formularen","datePublished":"2020-05-22T21:14:11+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_Suche_in_Formularen\/"},"wordCount":3160,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_Suche_in_Formularen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/5ba29ab1f3cc4179ab6a984699a178e2","articleSection":["2014","6\/2014","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Flexible_Suche_in_Formularen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Flexible_Suche_in_Formularen\/","url":"https:\/\/access-im-unternehmen.de\/Flexible_Suche_in_Formularen\/","name":"Flexible Suche in Formularen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_Suche_in_Formularen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_Suche_in_Formularen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/5ba29ab1f3cc4179ab6a984699a178e2","datePublished":"2020-05-22T21:14:11+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Flexible_Suche_in_Formularen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Flexible_Suche_in_Formularen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Flexible_Suche_in_Formularen\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/5ba29ab1f3cc4179ab6a984699a178e2","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/5ba29ab1f3cc4179ab6a984699a178e2"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Flexible_Suche_in_Formularen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Flexible Suche in Formularen"}]},{"@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\/55000965","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=55000965"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000965\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000965"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000965"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000965"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}