{"id":55001178,"date":"2019-02-01T00:00:00","date_gmt":"2020-05-13T21:06:06","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1178"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Mehrere_Felder_gleichzeitig_durchsuchen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Mehrere_Felder_gleichzeitig_durchsuchen\/","title":{"rendered":"Mehrere Felder gleichzeitig durchsuchen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/c4306dd1e5d94bf58179a3ae64fec928\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Normalerweise legen ein Textfeld an, in das Sie einen Suchbegriff eingeben und die Daten dann in einem oder mehreren Feldern nach diesem Suchbegriff durchsuchen. Oder Sie haben mehrere Suchfelder etwa f&uuml;r Vorname, Nachname et cetera. Dieser Beitrag stellt ein Suchsteuerelement vor, mit dem Sie gezielt nach den Inhalten verschiedener Felder gleichzeitig suchen k&ouml;nnen. Dabei gibt es mehrere Vorlagen, die vorab festgelegt werden und die der Benutzer dann einstellt, um die Suchbegriffe einzugeben.<\/b><\/p>\n<h2>Vorbereitung<\/h2>\n<p>Als Vorbereitung statten wir eine Beispieldatenbank mit den Tabellen der Datenbank <b>Suedsturm <\/b>aus, von der wir vor allem die Tabelle <b>tblKunden <\/b>ben&ouml;tigen.<\/p>\n<p>Danach erstellen wir ein Unterformular namens <b>sfmKunden<\/b>, dessen Eigenschaften <b>Datensatzquelle <\/b>wir mit der Tabelle <b>tblKunden <\/b>f&uuml;llen. Danach ziehen wir alle Felder dieser Tabelle aus der Feldliste in den Detailbereich der Entwurfsansicht. Stellen Sie die Eigenschaft <b>Standardansicht <\/b>auf den Wert <b>Datenblatt <\/b>ein und speichern und schlie&szlig;en Sie das Formular.<\/p>\n<p>Anschlie&szlig;end erstellen wir ein weiteres Formular namens <b>frmKundenEinfacheSuche<\/b>. Diesem f&uuml;gen wir ein Kombinationsfeld namens <b>cboEinfacheSuche <\/b>hinzu. Darunter f&uuml;gen wir das Unterformular ein, indem wir das Formular <b>sfmKunden <\/b>aus dem Navigationsbereich in den Formularentwurf ziehen. F&uuml;r dieses Steuer-element stellen wir die beiden Eigenschaften <b>Horizontaler Anker <\/b>und <b>Vertikaler Anker <\/b>auf den Wert <b>Beide <\/b>ein. Das Ergebnis sieht wie in Bild 1 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1178_001.png\" alt=\"Suchkombinationsfeld und Unterformular\" width=\"599,593\" height=\"365,6533\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Suchkombinationsfeld und Unterformular<\/span><\/b><\/p>\n<h2>Einfache Suchfunktion<\/h2>\n<p>Zum Warmwerden bauen wir eine einfache Suchfunktion ein, die nur die Datens&auml;tze des Feldes <b>Firma <\/b>nach dem eingegebenen Begriff durchsucht. Diese soll durch das Bet&auml;tigen der Eingabetaste nach der Eingabe des Suchbegriffs beziehungsweise beim Verlassen des Kombinationsfeldes <b>cboEinfacheSuche <\/b>ausgel&ouml;st werden. Daf&uuml;r ist das Ereignis <b>Nach Aktualisierung <\/b>verantwortlich, f&uuml;r das wir die folgende Ereignisprozedur hinterlegen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboEinfacheSuche_AfterUpdate()\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strVergleichsausdruck<span style=\"color:blue;\"> As String<\/span>\r\n     strVergleichsausdruck = Nz(Me!cboEinfacheSuche, \"\")\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strVergleichsausdruck) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFilter = \"Firma LIKE ''''\" _\r\n             & strVergleichsausdruck & \"''''\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">With<\/span> Me!sfmKunden.Form\r\n         .Filter = strFilter\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>Diese einfache Suche liest den Inhalt des Kombinationsfeldes in die Variable <b>strVergleichs-ausdruck <\/b>ein, wobei der Benutzer Platzhalter wie das Sternchen (<b>*<\/b>) selbst eingeben muss. Dann pr&uuml;ft die Prozedur, ob die L&auml;nge des in <b>strVergleichsausdruck <\/b>enthaltenen Strings gr&ouml;&szlig;er als <b>0 <\/b>ist. Falls ja, wird dieser zu einem Filterausdruck wie <b>Firma LIKE &#8220;&#8220;<Suchausdruck>&#8220;&#8220;<\/b> zusammengesetzt, wobei <b><Suchausdruck> <\/b>dem eingegebenen Ausdruck entspricht. Anderenfalls wird der Filterausdruck in <b>strFilter <\/b>gar nicht gef&uuml;llt. In beiden F&auml;llen wird der Inhalt von <b>strFilter <\/b>der Eigenschaft <b>Filter <\/b>des <b>Form<\/b>-Objekts des Unterformulars zugewiesen und die Eigenschaft <b>FilterOn <\/b>auf <b>True <\/b>eingestellt. Das Ergebnis etwa nach Eingabe des Ausdrucks <b>B* <\/b>sieht wie in Bild 2 aus. Das Leeren des Kombinationsfeldes und das Best&auml;tigen dieser Eingabe zeigt wieder alle Eintr&auml;ge der Datensatzquelle im Unterformular an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1178_002.png\" alt=\"Die einfache Suche in Aktion\" width=\"499,6607\" height=\"304,7111\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Die einfache Suche in Aktion<\/span><\/b><\/p>\n<h2>Zwei Vergleichsausdr&uuml;cke f&uuml;r zwei Felder gleichzeitig<\/h2>\n<p>Nun wollen wir uns dem gew&uuml;nschten Ergebnis ann&auml;hern. Wir wollen ja Vergleichsausdr&uuml;cke f&uuml;r mehrere Felder gleichzeitig eingeben k&ouml;nnen. Dazu f&uuml;gen wir dem Formular ein weiteres Kombinationsfeld namens <b>cboFirmaUndKontaktpersonFiltern <\/b>hinzu.<\/p>\n<p>Das Ergebnis nun soll sein, dass wir zwei durch Komma getrennte Vergleichswerte f&uuml;r das Feld <b>Firma <\/b>und das Feld <b>Kontaktperson <\/b>eingeben k&ouml;nnen und dass die beiden Felder dann nach diesen beiden Ausdr&uuml;cken gefiltert werden. Das Ergebnis soll dann etwa wie in aussehen, wo wir alle Kunden ermitteln wollen, bei denen sowohl die Firma als auch der Name der Kontaktperson mit <b>A <\/b>beginnt (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1178_003.png\" alt=\"Suche nach zwei Begriffen in zwei Feldern\" width=\"499,6607\" height=\"304,7111\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Suche nach zwei Begriffen in zwei Feldern<\/span><\/b><\/p>\n<p>Wie sieht nun die Prozedur aus, die durch das Ereignis <b>Nach Aktualisierung <\/b>des Kombinationsfeldes <b>cboFirmaUndKontaktpersonFiltern <\/b>ausgel&ouml;st wird Diese beginnt &auml;hnlich wie die vorherige Prozedur &#8211; mit der Ausnahme, dass wir ein paar weitere Variablen deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboFirmaUndKontaktpersonFiltern_AfterUpdate()\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strVergleichsausdruck<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFirma<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strKontaktperson<span style=\"color:blue;\"> As String<\/span>\r\n     strVergleichsausdruck =  Nz(Me!cboFirmaUndKontaktpersonFiltern, \"\")<\/pre>\n<p>Enth&auml;lt die Variable <b>strVergleichsausdruck <\/b>einen Wert, weisen wir der Variablen <b>strFirma <\/b>den Teil aus <b>strVergleichsausdruck <\/b>bis zum ersten Leerzeichen zu und stellen den ersten Teil des Filterausdrucks in <b>strFilter <\/b>zusammen:<\/p>\n<pre>     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strVergleichsausdruck) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFirma = <span style=\"color:blue;\">Split<\/span>(strVergleichsausdruck, \" \")(0)\r\n         strFilter = \"Firma LIKE ''''\" & strFirma & \"''''\"<\/pre>\n<p>Dann pr&uuml;fen wir in einer <b>If<\/b>-Bedingung, ob <b>strVergleichsausdruck <\/b>noch einen zweiten Vergleichswert enth&auml;lt. Dazu schauen wir, ob sich darin ein Leerzeichen befindet. Ist das der Fall, k&ouml;nnen wir auf den zweiten Wert des mit der <b>Split<\/b>-Funktion ermittelten Arrays zugreifen und diesen in der Variablen <b>strKontaktperson <\/b>speichern:<\/p>\n<pre>         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">InStr<\/span>(1, strVergleichsausdruck, \" \") &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             strKontaktperson =  <span style=\"color:blue;\">Split<\/span>(strVergleichsausdruck, \" \")(1)\r\n             strFilter = strFilter & \" AND Kontaktperson  LIKE ''''\" & strKontaktperson & \"''''\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Danach aktivieren wir wie gehabt den Filter f&uuml;r diesen Filterausdruck:<\/p>\n<pre>     <span style=\"color:blue;\">With<\/span> Me!sfmKunden.Form\r\n         .Filter = strFilter\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>Nun wei&szlig; der Benutzer im Gegensatz zu uns allerdings nicht, wie man die Suchbegriffe in das Textfeld eingeben muss, damit es das gew&uuml;nschte Ergebnis liefert. Deshalb f&uuml;gen wir nun eine Vorlage zum Kombinationsfeld hinzu, anhand derer der Benutzer erkennen kann, welche Daten er dort eingeben kann. Dazu stellen wir das Kombinationsfeld mit dem Wert <b>Wertliste <\/b>f&uuml;r die Eigenschaft <b>Herkunftsart <\/b>auf die Anzeige einer Wertliste um. Diese geben wir wie folgt f&uuml;r die Eigenschaft <b>Datensatzherkunft <\/b>an:<\/p>\n<pre>\"[Firma] [Ansprechpartner]\"<\/pre>\n<p>Damit das Kombinationsfeld diesen Eintrag nun auch anzeigt, w&auml;hlen wir gleich beim Laden des Formulars den ersten Eintrag des Kombinationsfeldes aus. Dazu hinterlegen wir die folgende Anweisung f&uuml;r das Ereignis <b>Beim Laden <\/b>des Formulars:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     Me!cboFirmaUndKontaktpersonFiltern = _\r\n         Me!cboFirmaUndKontaktpersonFiltern.ItemData(0)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wenn der Benutzer den Fokus auf das Kombinationsfeld verschiebt, soll der Inhalt komplett angezeigt werden. Auf diese Weise kann der Benutzer dann gleich mit der Eingabe des Suchbegriffs beziehungsweise der Suchbegriffe beginnen. Dazu stellen wir den Wert der Eigenschaft <b>SelStart <\/b>des Kombinationsfeldes auf <b>0 <\/b>ein und den Wert der Eigenschaft <b>SelLength <\/b>auf <b>999<\/b>. Das erledigen wir in der Ereignisprozedur, die durch das Ereignis <b>Bei Fokuserhalt <\/b>des Kombinationsfeldes ausgel&ouml;st wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboFirmaUndKontaktpersonFiltern_GotFocus()\r\n     Me!cboFirmaUndKontaktpersonFiltern.SelStart = 0\r\n     Me!cboFirmaUndKontaktpersonFiltern.SelLength = 999\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Ergebnis beim Anzeigen des Formulars sieht nun wie in Bild 4 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1178_004.png\" alt=\"Anzeige des Schemas f&uuml;r den Suchbegriff\" width=\"549,6265\" height=\"326,5485\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Anzeige des Schemas f&uuml;r den Suchbegriff<\/span><\/b><\/p>\n<p>Wenn wir nun die zwei gew&uuml;nschten Suchbegriffe eingeben, erhalten wir das gleiche Ergebnis wie im vorherigen Beispiel.<\/p>\n<h2>Verschiedene Kombinationen f&uuml;r Suchbegriffe <\/h2>\n<p>Nun m&ouml;chte der Benutzer sicher nicht nur nach der Kombination aus <b>Firma <\/b>und <b>Kontaktperson <\/b>suchen, sondern vielleicht auch einmal nach <b>Kunden-Code <\/b>und <b>Firma <\/b>oder <b>Kunden-Code <\/b>und <b>Kontaktperson<\/b>. Damit wird die L&ouml;sung nun interessant, denn wir m&uuml;ssen uns &uuml;berlegen, wie wir mehrere Varianten behandeln.<\/p>\n<p>Die grundlegende Idee ist, dass wir die verschiedenen Kombinationen alle im Kombinationsfeld zur Auswahl anbieten und dass der gew&uuml;nschte Eintrag einfach per <b>Nach oben<\/b>&#8211; und <b>Nach unten<\/b>-Taste angesteuert werden kann. Au&szlig;erdem wollen wir nicht f&uuml;r jede neue Kombination die Eigenschaft <b>Datensatzherkunft <\/b>des Kombinationsfeldes &auml;ndern und schon gar nicht jedes Mal den Code f&uuml;r die neue Kombination anpassen.<\/p>\n<p>Also &uuml;berlegen wir uns, wie wir das Ganze etwas flexibler handhaben k&ouml;nnen. Die erste Idee ist, die verschiedenen Kombinationen plus die beteiligten Felder in einer Tabelle zu hinterlegen, aus der das Kombinationsfeld dann seine Daten zur Auswahl bezieht.<\/p>\n<p>Diese Tabelle k&ouml;nnte im Entwurf etwa wie in Bild 5 aussehen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1178_005.png\" alt=\"Entwurf der Tabelle f&uuml;r die Kombinationen\" width=\"549,6265\" height=\"441,2634\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Entwurf der Tabelle f&uuml;r die Kombinationen<\/span><\/b><\/p>\n<p>Das Feld <b>Kombination <\/b>nimmt den anzuzeigenden Platzhalter an, also etwa <b>[Firma] [Kontaktperson]<\/b>. Die Felder <b>Feld1<\/b>, <b>Feld2 <\/b>und <b>Feld3 <\/b>nehmen die einzelnen Namen der Felder, die durchsucht werden sollen, auf. Damit ist auch klar, dass wir die Anzahl der zu durchsuchenden Felder auf drei begrenzen wollen.<\/p>\n<p>Das Feld <b>Formularname <\/b>soll den Namen des Formulars aufnehmen, in dem diese Kombination zum Einsatz kommt. Auf diese Weise k&ouml;nnen wir Kombinationen f&uuml;r verschiedene Formulare speichern. F&uuml;r die beiden Felder Kombination und Formularname haben wir einen eindeutigen, zusammengesetzten Index hinterlegt, damit jede Kombination nur einmal je Formular angezeigt werden kann.<\/p>\n<p>Wir hinterlegen zun&auml;chst einige Kombinationen wie in Bild 6 in der Tabelle <b>tblKombinationen<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1178_006.png\" alt=\"Beispielkombinationen in der Tabelle tblKombinationen\" width=\"700\" height=\"225,4099\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Beispielkombinationen in der Tabelle tblKombinationen<\/span><\/b><\/p>\n<h2>Kombinationen im Kombinationsfeld anzeigen<\/h2>\n<p>Nun f&uuml;gen wir dem Formular ein neues Kombinationsfeld namens <b>cboSuchkombinationen <\/b>hinzu.<\/p>\n<p>Diese verwendet als <b>Herkunftstyp <\/b>wieder <b>Tabelle\/Abfrage <\/b>und zwar eine Abfrage, die wie in Bild 7 aussieht und alle Felder der Tabelle <b>tblKombinationen <\/b>enth&auml;lt. F&uuml;r das Feld <b>Kombination <\/b>legen wir eine aufsteigende Reihenfolge fest, f&uuml;r das Feld <b>Formularname <\/b>den Namen unseres Formulars als Parameter. Wir wollen wieder in der Ereignisprozedur f&uuml;r das Ereignis <b>Beim Laden <\/b>des Formulars das Kombinationsfeld auf den ersten Eintrag einstellen:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1178_007.png\" alt=\"Datensatzherkunft des Formulars zur Eingabe der Suchkombinationen\" width=\"700\" height=\"336,399\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Datensatzherkunft des Formulars zur Eingabe der Suchkombinationen<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     Me!cboSuchkombinationen = _\r\n         Me!cboSuchkombinationen.ItemData(0)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wenn wir das Formular nun &ouml;ffnen und das Kombinationsfeld aufklappen, sieht dies wie in Bild 8 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1178_008.png\" alt=\"Kombinationsfeld mit Suchkombinationen\" width=\"549,6265\" height=\"278,4532\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Kombinationsfeld mit Suchkombinationen<\/span><\/b><\/p>\n<p>Wir wollen nun zun&auml;chst die Auswahl nur &uuml;ber das Aufklappen uns Selektieren eines Eintrags erledigen &#8211; um das Ausw&auml;hlen mit der <b>Nach oben<\/b>&#8211; und der <b>Nach unten<\/b>-Taste k&uuml;mmern wir uns sp&auml;ter.<\/p>\n<p>Das erste Problem, dem wir uns ausgesetzt sehen, ist die Meldung, die beim Eingeben eines neuen Wertes in das Kombinationsfeld erscheint und die wie in Bild 9 aussieht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1178_009.png\" alt=\"Meldung nach Best&auml;tigung der Eingabe des Suchbegriffs\" width=\"649,559\" height=\"225,627\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Meldung nach Best&auml;tigung der Eingabe des Suchbegriffs<\/span><\/b><\/p>\n<p>Die Meldung ist logisch: Wenn wir in ein Kombinationsfeld, das an eine Datensatzherkunft gebunden ist, einen neuen Wert eingeben und die Eingabe abschlie&szlig;en, pr&uuml;ft Access, ob der eingegebene Eintrag bereits vorhanden ist.<\/p>\n<p>Um diese Meldung zu umgehen, nutzen wir das Ereignis <b>Bei nicht in Liste<\/b>. Hier wollen wir einfach daf&uuml;r sorgen, dass die Meldung nicht angezeigt wird, was wir durch Einstellen des Wertes <b>acDataErrAdded<\/b> f&uuml;r den Parameter <b>Response <\/b>erledigen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboSuchkombinationen_NotInList( _\r\n          NewData<span style=\"color:blue;\"> As String<\/span>, Response<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Response = acDataErrAdded\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies f&uuml;hrt aber auch nicht zu einem zufriedenstellenden Ergebnis, wie Bild 10 zeigt &#8211; wir k&ouml;nnen keinen neuen Wert eingeben und das Kombinationsfeld verlassen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1178_010.png\" alt=\"Der neue Eintrag kann nicht ohne weiteres eingegeben werden.\" width=\"499,6607\" height=\"244,6074\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Der neue Eintrag kann nicht ohne weiteres eingegeben werden.<\/span><\/b><\/p>\n<h2>Inhalt der Tabelle tblKombinationen in Wertliste einlesen<\/h2>\n<p>Beim vorherigen Beispiel, bei dem wir die Vorlage f&uuml;r die Suche als Element einer Wertliste zum Kombinationsfeld hinzugef&uuml;gt haben, war dies jedoch problemlos m&ouml;glich. Also kehren wir doch zum Ansatz mit der Wertliste zur&uuml;ck. Allerdings f&uuml;llen wir diese Wertliste beim Anzeigen des Formulars per VBA-Code. Zun&auml;chst stellen wir jedoch den Wert der Eigenschaft <b>Herkunftsart <\/b>wieder auf <b>Wertliste <\/b>ein. Danach erweitern wir die Ereignisprozedur, die durch das Ereignis <b>Beim Laden <\/b>des Formulars ausgel&ouml;st wird, wie in Listing 1. Hier erstellen wir einen Verweis auf das aktuelle <b>Database<\/b>-Objekt und &ouml;ffnen ein Recordset auf Basis der Tabelle <b>tblKombinationen<\/b>, wobei wir wieder nur die Eintr&auml;ge ber&uuml;cksichtigen, die zum aktuell ge&ouml;ffneten Formular geh&ouml;ren. Dann durchlaufen wir alle Datens&auml;tze dieses Recordsets und f&uuml;gen f&uuml;r jeden durch Semikola separiert die Werte der Felder <b>KombinationID<\/b>, <b>Kombination<\/b>, <b>Feld1<\/b>, <b>Feld2 <\/b>und <b>Feld3 <\/b>hinzu. Falls die Zeichenkette nicht leer ist, schneiden wir dann das f&uuml;hrende Semikolon ab, sodass eine Zeichenkette wie folgt entsteht:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>strRowSource<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblKombinationen WHERE Formularname = ''''\" & Me.Name _\r\n          & \"'''' ORDER BY Kombination\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         strRowSource = strRowSource & \";\" & rst!KombinationID\r\n         strRowSource = strRowSource & \";\" & rst!Kombination\r\n         strRowSource = strRowSource & \";\" & rst!Feld1\r\n         strRowSource = strRowSource & \";\" & rst!Feld2\r\n         strRowSource = strRowSource & \";\" & rst!Feld3\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strRowSource) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strRowSource = <span style=\"color:blue;\">Mid<\/span>(strRowSource, 2)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me!cboSuchkombinationen.RowSource = strRowSource\r\n     Me!cboFirmaUndKontaktpersonFiltern = Me!cboFirmaUndKontaktpersonFiltern.ItemData(0)\r\n     Me!cboSuchkombinationen = Me!cboSuchkombinationen.ItemData(0)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Zusammenstellen der Suchkombinationen beim Laden des Formulars<\/span><\/b><\/p>\n<pre>5;[Firma];Firma;;;6;[Firma] [Kontaktperson];Firma;Kontaktperson;;7;[Kontaktperson];Kontaktperson;;;1;[KundenCode];KundenCode;;;2;[KundenCode] [Firma];KundenCode;Firma;;4;[KundenCode] [Firma] [Kontaktperson];KundenCode;Firma;Kontaktperson;3;[KundenCode] [Kontaktperson];KundenCode;Kontaktperson;<\/pre>\n<p>Diesen Ausdruck weisen wir nun der Eigenschaft <b>RowSource <\/b>des Kombinationsfeldes zu. Die Eigenschaft <b>Spaltenanzahl <\/b>des Kombinationsfeldes stellen wir auf den Wert <b>5 <\/b>ein, die Eigenschaft <b>Spaltenbreiten <\/b>auf <b>0cm;;0cm;0cm;0cm<\/b>. Dadurch werden alle Spalten mit Ausnahme der Spalte mit der Kombination mit der Breite <b>0cm <\/b>angezeigt beziehungsweise ausgeblendet.<\/p>\n<p>Das Ergebnis nach der Eingabe eines Suchbegriffs statt des Platzhalters ist noch immer nicht befriedigend. Nun erscheint n&auml;mlich der Dialog <b>Listenelemente bearbeiten <\/b>aus Bild 11. Warum aber hat es im vorherigen Kombinationsfeld einfach so geklappt Der Grund ist einfach: Weil wir dort die erste Spalte angezeigt und auch bearbeitet haben. In der aktuellen Version jedoch haben wir, genauso wie wir es bei einem gebundenen Kombinationsfeld machen w&uuml;rden, die erste Spalte mit dem Prim&auml;rschl&uuml;sselwert ausgeblendet und die zweite Spalte angezeigt. Wir m&uuml;ssen also die anzuzeigenden Werte in die erste Spalte verlegen, dann gelingt es. Dazu verschieben wir die Spalte mit dem Prim&auml;rschl&uuml;sselwert der Tabelle <b>tblKombinationen <\/b>an die letzte Stelle der Wertliste. Damit die nun in die erste Spalte gerutschte Vorlage f&uuml;r die Kombination auch angezeigt wird, &auml;ndern wir den Wert der Eigenschaft <b>Spaltenbreiten <\/b>wie folgt:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1178_011.png\" alt=\"Beim Versuch, einen Suchbegriff einzugeben, erscheint dieser Dialog.\" width=\"549,6265\" height=\"359,2271\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Beim Versuch, einen Suchbegriff einzugeben, erscheint dieser Dialog.<\/span><\/b><\/p>\n<pre>;0cm;0cm;0cm;0cm<\/pre>\n<p>Auf diese Weise nimmt die erste Spalte die gesamte Breite ein. Au&szlig;erdem passen wir die Reihenfolge in der Prozedur <b>Form_Load <\/b>wie folgt an:<\/p>\n<pre>...\r\nstrRowSource = strRowSource & \";\" & rst!Kombination\r\nstrRowSource = strRowSource & \";\" & rst!Feld1\r\nstrRowSource = strRowSource & \";\" & rst!Feld2\r\nstrRowSource = strRowSource & \";\" & rst!Feld3\r\nstrRowSource = strRowSource & \";\" & rst!KombinationID\r\n...<\/pre>\n<p>Dadurch landet die Spalte mit dem Prim&auml;rschl&uuml;sselwert in der letzten Spalte des Listenfeldes. Durch diese &auml;nderung k&ouml;nnen wir die Ereignisprozedur f&uuml;r das Ereignis <b>Bei nicht in Liste <\/b>wieder entfernen. Wir verwenden nun das Ereignis <b>Nach Aktualisierung <\/b>des Kombinationsfeldes, um den Inhalt des Unterformulars entsprechend den angegebenen Filterkriterien zu filtern.<\/p>\n<h2>Vorbereitungen zum Zusammenstellen des Filters<\/h2>\n<p>Wenn der Benutzer den oder die Suchbegriffe eingegeben hat, wollen wir folgendes tun:<\/p>\n<ul>\n<li>Ermitteln, welche Kombination zuvor im Kombinationsfeld ausgew&auml;hlt war.<\/li>\n<li>Einlesen der Details zu dieser Kombination <\/li>\n<li>Zusammenstellen des Filterausdrucks<\/li>\n<\/ul>\n<p>Der erste Teil ist schon schwierig, denn: Sobald der Benutzer die Suchbegriffe in das Kombinationsfeld eingegeben hat und die Eingabe best&auml;tigt, haben wir einen neuen Eintrag im Kombinationsfeld und k&ouml;nnen nicht mehr auf die Daten zugreifen, die zuvor ausgew&auml;hlt waren. Wir m&uuml;ssen also bereits zuvor die ben&ouml;tigten Daten speichern &#8211; und nach jeder erneuten Auswahl einer der Kombinationen. F&uuml;r welche Ereignisse m&uuml;ssen wir dies also durchf&uuml;hren Zum ersten Mal, wenn das Formular ge&ouml;ffnet wird, also etwa beim Ereignis <b>Beim Laden<\/b>, und jedes weitere Mal, wenn der Benutzer eine der Suchkombinationen aus dem Formular ausw&auml;hlt, also f&uuml;r das Ereignis <b>Nach Aktualisierung <\/b>des Kombinationsfeldes. Hier m&uuml;ssen wir dann pr&uuml;fen, ob die Spalte mit dem Wert des Prim&auml;rschl&uuml;sselfeldes einen Wert enth&auml;lt &#8211; anderenfalls erfolgte die Aktualisierung durch die Eingabe eines oder mehrerer Suchbegriffe.<\/p>\n<p>Beim &ouml;ffnen des Formulars oder nach dem Aktualisieren des Kombinationsfeldes wollen wir die Inhalte der zweiten bis vierten Spalte in einigen Variablen speichern, die wir wie folgt im Kopf des Klassenmoduls deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>strFeld1<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Dim <\/span>strFeld2<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Dim <\/span>strFeld3<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>In der Funktion <b>FelderEinlesen <\/b>wollen wir pr&uuml;fen, ob das Kombinationsfeld <b>cboSuchkombinationen <\/b>gerade einen der Eintr&auml;ge der Wertliste enth&auml;lt oder die durch den Benutzer eingegebenen Suchbegriffe. Ersteres ist der Fall, wenn die vierte Spalte einen Wert enth&auml;lt. Bei einer Benutzereingabe enth&auml;lt diese Spalte den Wert <b>Null<\/b>. In diesem Fall f&uuml;llt die <b>Nz<\/b>-Funktion die Variable <b>lngKombinationID <\/b>mit dem Wert <b>0<\/b>, anderenfalls landet dort der Prim&auml;rschl&uuml;sselwert des jeweiligen Eintrags. Ist <b>lngKombinationID <\/b>danach nicht <b>0<\/b>, werden die Variablen <b>strFeld1<\/b>, <b>strFeld2 <\/b>und <b>strFeld3 <\/b>mit den Werten der zweiten, dritten und vierten Spalte der Wertliste des Kombinationsfeldes gef&uuml;llt:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>FelderEinlesen()<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngKombinationID<span style=\"color:blue;\"> As Long<\/span>\r\n     lngKombinationID = _\r\n         Nz(Me!cboSuchkombinationen.Column(4), 0)\r\n     <span style=\"color:blue;\">If <\/span>lngKombinationID &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFeld1 = Nz(Me!cboSuchkombinationen.Column(1), \"\")\r\n         strFeld2 = Nz(Me!cboSuchkombinationen.Column(2), \"\")\r\n         strFeld3 = Nz(Me!cboSuchkombinationen.Column(3), \"\")\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     FelderEinlesen = lngKombinationID\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Den Aufruf dieser Funktion f&uuml;gen wir an zwei Stellen ein. Als Erstes in der Ereignisprozedur <b>Form_Load<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     ...\r\n     FelderEinlesen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Und dann in der Ereignisprozedur, die nach dem Aktualisieren des Kombinationsfeldes ausgel&ouml;st wird. Hier pr&uuml;fen wir, ob der Benutzer gerade einen der Eintr&auml;ge mit den Kombinationen ausgew&auml;hlt oder ob er Suchbegriffe eingegeben hat. Liefert die Funktion <b>FelderEinlesen <\/b>den Wert <b>0<\/b>, handelt es sich um Suchbegriffe:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboSuchkombinationen_AfterUpdate()\r\n     <span style=\"color:blue;\">If <\/span>FelderEinlesen = 0<span style=\"color:blue;\"> Then<\/span>\r\n         ...\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dieses werden wir allerdings noch weiter aufbohren, indem wir die Stelle mit den drei Punkten (&#8230;) noch mit der Formulierung des Filters f&uuml;llen.<\/p>\n<h2>Filterkriterien zusammenstellen<\/h2>\n<p>Die Filterkriterien werden in der Prozedur zusammengestellt, die durch das Ereignis <b>Nach Aktualisierung <\/b>des Kombinationsfeldes ausgel&ouml;st werden (siehe Listing 2). Hier deklarieren wir zun&auml;chst ein Array namens <b>strVergleichswerte <\/b>sowie zwei weitere <b>String<\/b>-Variablen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboSuchkombinationen_AfterUpdate()\r\n     <span style=\"color:blue;\">Dim <\/span>strVergleichswerte()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intVergleichswerte<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span>FelderEinlesen = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strVergleichswerte = <span style=\"color:blue;\">Split<\/span>(Me!cboSuchkombinationen, \" \")\r\n         intVergleichswerte = <span style=\"color:blue;\">UBound<\/span>(strVergleichswerte) - <span style=\"color:blue;\">LBound<\/span>(strVergleichswerte) + 1\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strFeld1) &gt; 0 And intVergleichswerte &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             strFilter = strFeld1 & \" LIKE ''''\" & strVergleichswerte(0) & \"''''\"\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strFeld2) &gt; 0 And intVergleichswerte &gt; 1<span style=\"color:blue;\"> Then<\/span>\r\n                 strFilter = strFilter & \" AND \" & strFeld2 & \" LIKE ''''\" & strVergleichswerte(1) & \"''''\"\r\n                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strFeld3) &gt; 0 And intVergleichswerte &gt; 2<span style=\"color:blue;\"> Then<\/span>\r\n                     strFilter = strFilter & \" AND \" & strFeld3 & \" LIKE ''''\" & strVergleichswerte(2) & \"''''\"\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me!lblInformationen.Caption = strFilter\r\n     <span style=\"color:blue;\">With<\/span> Me!sfmKunden.Form\r\n         .Filter = strFilter\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: Zusammenstellen des Filterausdrucks f&uuml;r flexible Suchfelder<\/span><\/b><\/p>\n<p>Dann rufen wir, wie bereits oben gesehen, die Funktion <b>FelderEinlesen <\/b>auf. Nur wenn diese den Wert <b>0 <\/b>zur&uuml;ckliefert, hat der Benutzer die Filterkriterien eingegeben. In diesem Fall tragen wir den Inhalt des Kombinationsfeldes in das Array <b>strVergleichswerte <\/b>ein. Das Kombinationsfeld sollte nun ein oder mehrere durch Leerzeichen voneinander getrennte Eintr&auml;ge aufweisen. Die <b>Split<\/b>-Funktion erkennt diese durch die Leerzeichen getrennten Teilzeichenketten und tr&auml;gt diese jeweils als ein Element in das Array ein.<\/p>\n<p>Die Elemente dieses Arrays z&auml;hlen wir, indem wir mit der <b>UBound<\/b>-Funktion den Index des letzten und mit <b>LBound <\/b>den Index des ersten Elements ermitteln, diese voneinander subtrahieren und dann <b>1 <\/b>addieren. Das Ergebnis landet in der Variablen <b>intVergleichswerte<\/b>. Die folgende <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft, ob <b>strFeld1 <\/b>den Namen des zu untersuchenden Feldes enth&auml;lt und ob <b>intVergleichswerte <\/b>gr&ouml;&szlig;er als <b>0 <\/b>ist. Nur dann haben wir das Feld und den Vergleichswert. In diesem Fall stellt die Prozedur den ersten Teil des Filterausdrucks zusammen, indem es den Namen des Feldes aus <b>strFeld1<\/b>, den Vergleichsoperator <b>LIKE <\/b>und den Vergleichswert aus <b>strVergleichswerte(0) <\/b>verkn&uuml;pft. Daraus wird dann etwa der folgende Ausdruck:<\/p>\n<pre>Firma LIKE ''''A*''''<\/pre>\n<p>Sofern die erste Bedingung erf&uuml;llt ist, untersucht die Prozedur in einer verschachtelten <b>If&#8230;Then<\/b>-Bedingung gleich noch den zweiten Filterausdruck. Dazu pr&uuml;ft sie, ob <b>strFeld2 <\/b>ebenfalls einen Wert enth&auml;lt und <b>intVergleichswerte <\/b>gr&ouml;&szlig;er als <b>1 <\/b>ist. Dann f&uuml;gt sie zum ersten Teil des Filterausdrucks noch einen zweiten Teil hinzu. Das sieht dann etwa wie folgt aus:<\/p>\n<pre>Firma LIKE ''''A*'''' AND Kontaktperson LIKE ''''A*''''<\/pre>\n<p>Auf die gleiche Weise untersuchen wir in einem weiteren Schritt auch noch den dritten Teil des Filterausdrucks. Der vollst&auml;ndige Ausdruck aus der Variablen <b>strFilter <\/b>landet dann schlie&szlig;lich in der Eigenschaft <b>Filter <\/b>des <b>Form<\/b>-Elements des Unterformulars. Au&szlig;erdem aktivieren wir mit <b>FilterOn = True <\/b>noch den Filter des Unterformulars.<\/p>\n<p>Zur Kontrolle schreiben wir den Filterausdruck noch in das darunter liegende Bezeichnungsfeld <b>lblInformation<\/b>.<\/p>\n<h2>Test der Filterfunktion<\/h2>\n<p>Testen wir nun die Filterfunktion, gelingt dies ohne Probleme, wenn wir direkt nach dem &ouml;ffnen des Formulars einen Vergleichswert f&uuml;r den voreingestellten Eintrag <b>[Firma] <\/b>angeben (siehe Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_01\/pic_1178_012.png\" alt=\"Erfolgreiche Eingabe des Filterausdrucks\" width=\"499,6607\" height=\"322,7515\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Erfolgreiche Eingabe des Filterausdrucks<\/span><\/b><\/p>\n<p>Wenn wir dann allerdings eine neue Kombination im Kombinationsfeld ausw&auml;hlen und dann direkt den Suchbegriff eingeben, geschieht erst einmal nichts. Erst, wenn wir den Suchbegriff zum zweiten Mal eingeben, wird der Filter ausgef&uuml;hrt.<\/p>\n<p>Offenbar wird der Wert von <b>cboSuchkombinationen <\/b>nach der Eingabe des Filterausdrucks nicht komplett aktualisiert, sondern erst nach der Eingabe eines weiteren Filterausdrucks. Sprich: Die erste Spalte enth&auml;lt bereits den eingegebenen Vergleichswert, aber die &uuml;brigen Spalten speichern noch die Inhalte der Wertliste. Wie k&ouml;nnen wir das so &auml;ndern, dass wir dennoch einen Filterausdruck zusammenstellen k&ouml;nnen Ganz einfach: Alle Kombinationen beginnen mit einer &ouml;ffnenden eckigen Klammer (<b>[<\/b>). Also pr&uuml;fen wir nicht auf den Wert der vierten Spalte, sondern auf das erste Zeichen der ersten Spalte. Die Funktion <b>FelderEinlesen <\/b>sieht nun wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>FelderEinlesen()<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strErstesZeichen<span style=\"color:blue;\"> As String<\/span>\r\n     strErstesZeichen =  <span style=\"color:blue;\">Left<\/span>(Nz(Me!cboSuchkombinationen, 0), 1)\r\n     <span style=\"color:blue;\">If <\/span>strErstesZeichen = \"[\"<span style=\"color:blue;\"> Then<\/span>\r\n         strFeld1 = Nz(Me!cboSuchkombinationen.Column(1), \"\")\r\n         strFeld2 = Nz(Me!cboSuchkombinationen.Column(2), \"\")\r\n         strFeld3 = Nz(Me!cboSuchkombinationen.Column(3), \"\")\r\n         Me!lblInformationen.Caption = Me!cboSuchkombinationen\r\n         FelderEinlesen = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         FelderEinlesen = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>In <b>cboSuchkombinationen_AfterUpdate <\/b>brauchen wir nur die erste <b>If&#8230;Then<\/b>-Bedingung anzupassen:<\/p>\n<pre><span style=\"color:blue;\">If <\/span>FelderEinlesen = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span><\/pre>\n<p>Danach funktioniert die Filterfunktion auch nach der Neuauswahl einer der Filtervorlagen.<\/p>\n<h2>Filtervorlage per Nach oben und Nach unten<\/h2>\n<p>Nun wollen wir die Auswahl des Filtervorlage noch etwas komfortabler gestalten. Dazu soll der Benutzer, wenn er den Fokus in das Kombinationsfeld <b>cboSuchkombinationen <\/b>gesetzt hat, mit den beiden Tasten <b>Nach oben <\/b>und <b>Nach unten <\/b>zwischen den Eintr&auml;gen wechseln k&ouml;nnen.<\/p>\n<p>Die notwendige Funktion haben wir bereits vorbereitet. Im Beitrag <b>Kombinationsfeld per Taste steuern <\/b>(<b>www.access-im-unternehmen.de\/1173<\/b>) finden die Sie notwendigen Erl&auml;uterungen zur Funktionsweise.<\/p>\n<p>Wir schauen uns an dieser Stelle nur an, wie wir die dort vorgestellte Klasse in unsere Datenbank bringen und die enthaltenen Funktionen verf&uuml;gbar machen. <\/p>\n<p>Im ersten Schritt kopieren Sie die Klasse <b>clsKombinationsfeldPerTaste <\/b>in die Zieldatenbank. Dann sind nur noch zwei weitere Schritte n&ouml;tig.<\/p>\n<p>Der erste ist die Deklaration einer Objektvariablen, welche eine Instanz dieser Klasse als Objekt referenziert. Die Deklaration f&uuml;gen wir wie folgt zum Kopf des Klassenmoduls des Formulars <b>frmKundenEinfacheSuche <\/b>hinzu:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objKombinationsfeldMitTaste_cboSuchkombinationenID <span style=\"color:blue;\"> As <\/span>clsKombinationsfeldPerTaste<\/pre>\n<p>Danach erg&auml;nzen wir die Prozedur <b>Form_Load <\/b>um die folgenden Anweisungen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     ...\r\n     <span style=\"color:blue;\">Set<\/span> objKombinationsfeldMitTaste_cboSuchkombinationenID   = <span style=\"color:blue;\">New<\/span> clsKombinationsfeldPerTaste\r\n     <span style=\"color:blue;\">With<\/span> objKombinationsfeldMitTaste_cboSuchkombinationenID\r\n         <span style=\"color:blue;\">Set<\/span> .ComboBox = Me!cboSuchkombinationen\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies erstellt eine neue Instanz der Klasse <b>clsKombinationsfeldPerTaste <\/b>und tr&auml;gt diese in die Variable <b>objKombinationsfeldPerTaste_cboSuchkombinationenID <\/b>ein. Dann weist sie ihrer Eigenschaft <b>ComboBox <\/b>einen Verweis auf das Kombinationsfeld <b>cboSuchkombinationen <\/b>zu. Danach k&ouml;nnen Sie, wenn das Kombinationsfeld den Fokus hat, mit den beiden Tasten <b>Nach oben <\/b>und <b>Nach unten <\/b>zwischen den Eintr&auml;gen navigieren.<\/p>\n<h2>Suchbegriffe mit Leerzeichen<\/h2>\n<p>Interessant wird es, wenn Sie nach Inhalten suchen wollen, die ihrerseits Leerzeichen enthalten. Bisher nutzen wir die Leerzeichen ja als Trennzeichen zwischen den einzelnen Filtervergleichswerten. Was aber, wenn wir etwa nach der Firma M&uuml;ller AG oder nach dem Vornamen Klaus Dieter suchen wollen Wenn wir dies so eingeben, rutscht der zweite Teil zwangsl&auml;ufig in das folgende Filterkriterium und wir erhalten nicht das erwartete Ergebnis. Was k&ouml;nnen wir tun<\/p>\n<p>Als Erstes ben&ouml;tigen wir eine M&ouml;glichkeit, wie der Benutzer Werte, die ein Leerzeichen enthalten, eingeben kann. Das ist einfach: Wir verwenden einfach wie unter Google Anf&uuml;hrungszeichen, um die zusammenh&auml;ngenden Zeichenketten zusammenzufassen. Interessanter wird es dann, diese Informationen sp&auml;ter auseinanderzunehmen und diese f&uuml;r die Bildung der Filterkriterien zu analysieren.<\/p>\n<p>Doch auch das l&auml;sst sich machen, wie wir nun sehen werden. Dazu nutzen wir eine Hilfsfunktion, die in Ausdr&uuml;cken, die Anf&uuml;hrungszeichen enthalten, die Leerzeichen innerhalb der Anf&uuml;hrungszeichen zun&auml;chst durch das Pipe-Zeichen ersetzt. Ein Aufruf dieser Funktion sieht etwa wie folgt aus:<\/p>\n<pre>  LeerzeichenZwischenAnfuehrungszeichenErsetzen(\"\"\"bla bla\"\" bla bla \"\"bla bla bla\"\"\")\r\n\"bla|bla\" bla bla \"bla|bla|bla\"<\/pre>\n<p>Wie Sie sehen, werden alle Vorkommen von Leerzeichen innerhalb von Anf&uuml;hrungszeichen durch das Pipe-Zeichen ersetzt. Das gleiche Ergebnis wollen wir auch erhalten, wenn der Benutzer am Ende vergisst, das schlie&szlig;ende Anf&uuml;hrungszeichen zu setzen. In diesem Fall soll das fehlende Anf&uuml;hrungszeichen sogar noch ersetzt werden, also etwa so:<\/p>\n<pre>  LeerzeichenZwischenAnfuehrungszeichenErsetzen(\"\"\"bla bla\"\" bla bla \"\"bla bla bla\")\r\n\"bla|bla\" bla bla \"bla|bla|bla\"<\/pre>\n<p>Diese Funktion finden Sie in Listing 3. Sie erwartet den zu bearbeitenden Ausdruck als Parameter und gibt den Ausdruck mit den ersetzten Leerzeichen innerhalb der Anf&uuml;hrungszeichen an die aufrufende Prozedur zur&uuml;ck. Dabei ermittelt sie zun&auml;chst das erste Auftreten eines Anf&uuml;hrungszeichens mit der <b>InStr<\/b>-Funktion und speichert die Position in der Variablen <b>intPosStart<\/b>. Damit startet sie in eine <b>Do While<\/b>-Schleife, die erst beendet wird, wenn <b>intPosStart <\/b>nicht mehr gr&ouml;&szlig;er als <b>0 <\/b>ist. Wird im ersten Durchlauf also kein Anf&uuml;hrungszeichen gefunden, ist die Schleife hier direkt beendet und die Funktion gibt den Wert zur&uuml;ck, den sie als Parameter erhalten hat. Anderenfalls steigt die Funktion in die <b>Do While<\/b>-Schleife ein und ermittelt die Position des n&auml;chsten Anf&uuml;hrungszeichens, dass ja dann das schlie&szlig;ende Anf&uuml;hrungszeichen f&uuml;r den ersten Teilausdruck sein sollte. Diese Position speichern wir in der Variablen <b>intPosEnde<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>LeerzeichenZwischenAnfuehrungszeichenErsetzen(strVergleichswerte<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intPosStart<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intPosEnde<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strTempNeu<span style=\"color:blue;\"> As String<\/span>\r\n     intPosStart = <span style=\"color:blue;\">InStr<\/span>(1, strVergleichswerte, \"\"\"\")\r\n     <span style=\"color:blue;\">Do While<\/span> intPosStart &gt; 0\r\n         intPosEnde = <span style=\"color:blue;\">InStr<\/span>(intPosStart + 1, strVergleichswerte, \"\"\"\")\r\n         <span style=\"color:blue;\">If <\/span>intPosEnde &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             strTemp = <span style=\"color:blue;\">Mid<\/span>(strVergleichswerte, intPosStart, intPosEnde - intPosStart + 1)\r\n             strTempNeu = <span style=\"color:blue;\">Replace<\/span>(strTemp, \" \", \"|\")\r\n             strVergleichswerte = <span style=\"color:blue;\">Replace<\/span>(strVergleichswerte, strTemp, strTempNeu)\r\n             intPosStart = <span style=\"color:blue;\">InStr<\/span>(intPosEnde + 1, strVergleichswerte, \"\"\"\")\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             strTemp = <span style=\"color:blue;\">Mid<\/span>(strVergleichswerte, intPosStart)\r\n             strTempNeu = <span style=\"color:blue;\">Replace<\/span>(strTemp, \" \", \"|\")\r\n             strVergleichswerte = <span style=\"color:blue;\">Replace<\/span>(strVergleichswerte, strTemp, strTempNeu) & \"\"\"\"\r\n             intPosStart = 0\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     LeerzeichenZwischenAnfuehrungszeichenErsetzen = strVergleichswerte\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Ersetzen von Leerzeichen innerhalb von Anf&uuml;hrungszeichen<\/span><\/b><\/p>\n<p>Hat <b>intPosEnde <\/b>ebenfalls einen Wert gr&ouml;&szlig;er als <b>0<\/b>, dann tragen wir genau den Ausdruck, der durch beiden Positionen <b>intPosStart <\/b>und <b>intPosEnde <\/b>begrenzt wird, in die Variable <b>strTemp<\/b>. Im obigen Beispiel ist das etwa der erste Ausdruck <b>&#8222;bla bla&#8220;<\/b>. In dieser Zeichenkette ersetzen wir nun die Leerzeichen durch das Pipe-Zeichen. Au&szlig;erdem ersetzen wir den ermittelten Ausdruck, also <b>&#8222;bla bla&#8220;<\/b>, in der Zeichenkette aus <b>strVergleichswerte <\/b>mit dem Ausdruck mit den ersetzten Leerzeichen, in diesem Fall <b>&#8222;bla|bla&#8220;<\/b>.<\/p>\n<p>Anschlie&szlig;end ermittelten wir mit der <b>InStr<\/b>-Funktion die Position des n&auml;chsten Anf&uuml;hrungszeichens in <b>strVergleichswerte<\/b>. Es kann auch sein, dass <b>intPosEnde <\/b>hier den Wert <b>0 <\/b>aufwies. Das bedeutet, dass hinter dem &ouml;ffnenden Anf&uuml;hrungszeichen kein schlie&szlig;endes Anf&uuml;hrungszeichen mehr gefunden wurde.<\/p>\n<p>In diesem Fall gehen wir davon aus, dass der Benutzer mit dem ersten Anf&uuml;hrungszeichen die Eingabe eines Ausdrucks starten wollte, dann aber vergessen hat, das schlie&szlig;ende Anf&uuml;hrungszeichen zu setzen. In diesem Fall gehen wir einfach davon aus, dass das schlie&szlig;ende Anf&uuml;hrungszeichen sich am Ende der Zeichenkette befinden sollte und f&uuml;gen dieses dort ein, nachdem wir die Leerzeichen im Bereich vom &ouml;ffnenden Anf&uuml;hrungszeichen bis zum Ende der Zeichenkette durch Pipe-Zeichen ersetzt haben.<\/p>\n<p>Nach dem Durchlaufen aller durch Anf&uuml;hrungszeichen begrenzten Teilzeichenketten geben wir den aktuellen Inhalt von <b>strVergleichswerte <\/b>als Funktionswert der Funktion <b>LeerzeichenZwischenAnfuehrungszeichenErsetzen <\/b>zur&uuml;ck.<\/p>\n<p>Au&szlig;erdem ben&ouml;tigen wir noch eine kleine Funktion, die sp&auml;ter die Pipe-Zeichen in Leerzeichen zur&uuml;ckverwandelt und die au&szlig;erdem die umschlie&szlig;enden Anf&uuml;hrungszeichen ersatzlos streicht. Diese Funktion sieht wie folgt aus und ist ebenfalls im Modul <b>mdlTools <\/b>zu finden:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AnfuehrungszeichenUndPipeEntfernen(  strAusdruck<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     strAusdruck = <span style=\"color:blue;\">Replace<\/span>(strAusdruck, \"\"\"\", \"\")\r\n     strAusdruck = <span style=\"color:blue;\">Replace<\/span>(strAusdruck, \"|\", \" \")\r\n     AnfuehrungszeichenUndPipeEntfernen = strAusdruck\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Die Ereignisprozedur <b>cboSuchkombination_AfterUpdate <\/b>&auml;ndern wir schlie&szlig;lich noch wie in Listing 4. Hier nutzen wir gleich zu Beginn die Funktion <b>LeerzeichenZwischenAnfuehrungszeichenErsetzen<\/b>, um die Leerzeichen zwischen Anf&uuml;hrungszeichen durch das Pipe-Zeichen zu ersetzen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboSuchkombinationen_AfterUpdate()\r\n     <span style=\"color:blue;\">Dim <\/span>strVergleichswerte()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intVergleichswerte<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFilter<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strVergleichswerteOhneLeerzeichen<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span>FelderEinlesen = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         strVergleichswerteOhneLeerzeichen = _\r\n            LeerzeichenZwischenAnfuehrungszeichenErsetzen(Nz(Me!cboSuchkombinationen, \"\"))\r\n         strVergleichswerte = <span style=\"color:blue;\">Split<\/span>(strVergleichswerteOhneLeerzeichen, \" \")\r\n         intVergleichswerte = <span style=\"color:blue;\">UBound<\/span>(strVergleichswerte) - <span style=\"color:blue;\">LBound<\/span>(strVergleichswerte) + 1\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strFeld1) &gt; 0 And intVergleichswerte &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             strFilter = strFeld1 & \" LIKE ''''\" & AnfuehrungszeichenUndPipeEntfernen(strVergleichswerte(0)) & \"''''\"\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strFeld2) &gt; 0 And intVergleichswerte &gt; 1<span style=\"color:blue;\"> Then<\/span>\r\n                 strFilter = strFilter & \" AND \" & strFeld2 & \" LIKE ''''\" _\r\n                     & AnfuehrungszeichenUndPipeEntfernen(strVergleichswerte(1)) & \"''''\"\r\n                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strFeld3) &gt; 0 And intVergleichswerte &gt; 2<span style=\"color:blue;\"> Then<\/span>\r\n                     strFilter = strFilter & \" AND \" & strFeld3 & \" LIKE ''''\" _\r\n                         & AnfuehrungszeichenUndPipeEntfernen(strVergleichswerte(2)) & \"''''\"\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         Me!lblInformationen.Caption = strFilter\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!lblInformationen.Caption = Me!cboSuchkombinationen\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">With<\/span> Me!sfmKunden.Form\r\n         .Filter = strFilter\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 4: Aktualisieren der gefilterten Daten mit Vergleichswerten mit Leerzeichen<\/span><\/b><\/p>\n<p>Dann in den <b>If&#8230;Then<\/b>-Bedingungen bauen wir die Funktion <b>AnfuehrungszeichenUndPipeEntfernen <\/b>ein, um die vom Benutzer angelegten einschlie&szlig;enden Anf&uuml;hrungszeichen zu entfernen und die Pipe-Zeichen wieder durch Leerzeichen zu ersetzen.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Mit der in diesem Beitrag vorgestellten L&ouml;sung erhalten Sie eine M&ouml;glichkeit des Filterns, der eine flexible Nutzung der betroffenen Felder und der Filterkriterien erlaubt.<\/p>\n<p>Einzige Voraussetzung ist, dass Sie die verschiedenen Kombinationen f&uuml;r die Filterkriterien vorab einmal in der Tabelle <b>tblKombinationen<\/b> hinterlegen und die beschriebenen Anweisungen zum Klassenmodul des Formulars hinzuf&uuml;gen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>MehrereFelderGleichzeitigDurchsuchen.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/40965F07-F12A-411D-94EF-C72409DCDBA5\/aiu_1178.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Normalerweise legen ein Textfeld an, in das Sie einen Suchbegriff eingeben und die Daten dann in einem oder mehreren Feldern nach diesem Suchbegriff durchsuchen. Oder Sie haben mehrere Suchfelder etwa f&uuml;r Vorname, Nachname et cetera. Dieser Beitrag stellt ein Suchsteuerelement vor, mit dem Sie gezielt nach den Inhalten verschiedener Felder gleichzeitig suchen k&ouml;nnen. Dabei gibt es mehrere Vorlagen, die vorab festgelegt werden und die der Benutzer dann einstellt, um die Suchbegriffe einzugeben.<\/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":[66012019,662019,44000027],"tags":[],"class_list":["post-55001178","post","type-post","status-publish","format-standard","hentry","category-66012019","category-662019","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>Mehrere Felder gleichzeitig durchsuchen - 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\/Mehrere_Felder_gleichzeitig_durchsuchen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mehrere Felder gleichzeitig durchsuchen\" \/>\n<meta property=\"og:description\" content=\"Normalerweise legen ein Textfeld an, in das Sie einen Suchbegriff eingeben und die Daten dann in einem oder mehreren Feldern nach diesem Suchbegriff durchsuchen. Oder Sie haben mehrere Suchfelder etwa f&uuml;r Vorname, Nachname et cetera. Dieser Beitrag stellt ein Suchsteuerelement vor, mit dem Sie gezielt nach den Inhalten verschiedener Felder gleichzeitig suchen k&ouml;nnen. Dabei gibt es mehrere Vorlagen, die vorab festgelegt werden und die der Benutzer dann einstellt, um die Suchbegriffe einzugeben.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Mehrere_Felder_gleichzeitig_durchsuchen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-13T21:06:06+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/c4306dd1e5d94bf58179a3ae64fec928\" \/>\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=\"24\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Felder_gleichzeitig_durchsuchen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Felder_gleichzeitig_durchsuchen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Mehrere Felder gleichzeitig durchsuchen\",\"datePublished\":\"2020-05-13T21:06:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Felder_gleichzeitig_durchsuchen\\\/\"},\"wordCount\":4092,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Felder_gleichzeitig_durchsuchen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/c4306dd1e5d94bf58179a3ae64fec928\",\"articleSection\":[\"1\\\/2019\",\"2019\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Felder_gleichzeitig_durchsuchen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Felder_gleichzeitig_durchsuchen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Felder_gleichzeitig_durchsuchen\\\/\",\"name\":\"Mehrere Felder gleichzeitig durchsuchen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Felder_gleichzeitig_durchsuchen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Felder_gleichzeitig_durchsuchen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/c4306dd1e5d94bf58179a3ae64fec928\",\"datePublished\":\"2020-05-13T21:06:06+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Felder_gleichzeitig_durchsuchen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Felder_gleichzeitig_durchsuchen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Felder_gleichzeitig_durchsuchen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/c4306dd1e5d94bf58179a3ae64fec928\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/c4306dd1e5d94bf58179a3ae64fec928\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Mehrere_Felder_gleichzeitig_durchsuchen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mehrere Felder gleichzeitig durchsuchen\"}]},{\"@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":"Mehrere Felder gleichzeitig durchsuchen - 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\/Mehrere_Felder_gleichzeitig_durchsuchen\/","og_locale":"de_DE","og_type":"article","og_title":"Mehrere Felder gleichzeitig durchsuchen","og_description":"Normalerweise legen ein Textfeld an, in das Sie einen Suchbegriff eingeben und die Daten dann in einem oder mehreren Feldern nach diesem Suchbegriff durchsuchen. Oder Sie haben mehrere Suchfelder etwa f&uuml;r Vorname, Nachname et cetera. Dieser Beitrag stellt ein Suchsteuerelement vor, mit dem Sie gezielt nach den Inhalten verschiedener Felder gleichzeitig suchen k&ouml;nnen. Dabei gibt es mehrere Vorlagen, die vorab festgelegt werden und die der Benutzer dann einstellt, um die Suchbegriffe einzugeben.","og_url":"https:\/\/access-im-unternehmen.de\/Mehrere_Felder_gleichzeitig_durchsuchen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-13T21:06:06+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/c4306dd1e5d94bf58179a3ae64fec928","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"24\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Mehrere_Felder_gleichzeitig_durchsuchen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Mehrere_Felder_gleichzeitig_durchsuchen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Mehrere Felder gleichzeitig durchsuchen","datePublished":"2020-05-13T21:06:06+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Mehrere_Felder_gleichzeitig_durchsuchen\/"},"wordCount":4092,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Mehrere_Felder_gleichzeitig_durchsuchen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/c4306dd1e5d94bf58179a3ae64fec928","articleSection":["1\/2019","2019","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Mehrere_Felder_gleichzeitig_durchsuchen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Mehrere_Felder_gleichzeitig_durchsuchen\/","url":"https:\/\/access-im-unternehmen.de\/Mehrere_Felder_gleichzeitig_durchsuchen\/","name":"Mehrere Felder gleichzeitig durchsuchen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Mehrere_Felder_gleichzeitig_durchsuchen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Mehrere_Felder_gleichzeitig_durchsuchen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/c4306dd1e5d94bf58179a3ae64fec928","datePublished":"2020-05-13T21:06:06+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Mehrere_Felder_gleichzeitig_durchsuchen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Mehrere_Felder_gleichzeitig_durchsuchen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Mehrere_Felder_gleichzeitig_durchsuchen\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/c4306dd1e5d94bf58179a3ae64fec928","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/c4306dd1e5d94bf58179a3ae64fec928"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Mehrere_Felder_gleichzeitig_durchsuchen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Mehrere Felder gleichzeitig durchsuchen"}]},{"@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\/55001178","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=55001178"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001178\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001178"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001178"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001178"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}