{"id":55000858,"date":"2012-10-01T00:00:00","date_gmt":"2020-05-22T21:49:01","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=858"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Kundensuche_mit_Komfort","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Kundensuche_mit_Komfort\/","title":{"rendered":"Kundensuche mit Komfort"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/a5acaa28232e4a37b00b168ca57fd9fc\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn man Daten aus einer Liste nach verschiedenen Kriterien filtern m&ouml;chte, kann man gar nicht genug Komfort haben. In diesem Beitrag stellen wir Ihnen eine L&ouml;sung vor, mit der Sie in einem Unterformular in der Datenblattansicht suchen k&ouml;nnen &#8211; und zwar mit allen Finessen. Das hei&szlig;t, dass Sie entweder zuerst alle Suchparameter eingeben und dann die Suche ansto&szlig;en k&ouml;nnen oder auch gleich mit Eingabe eines jeden Zeichens ein aktualisiertes Suchergebnis erhalten. Oder dass Sie entscheiden k&ouml;nnen, ob die Daten nur nach genauen Treffern durchsucht werden sollen.<\/b><\/p>\n<p>Es gibt verschiedene Ans&auml;tze, wie sich Suchfunktionen in Datenbankanwendungen implementieren lassen. Einige finden direkt in dem Formular Platz, das auch die zu durchsuchenden Daten anzeigt, andere erscheinen als eigenes Formular, das auch gleich die Suchergebnisse pr&auml;sentiert. In unserem Fall soll die &Uuml;bersichtsliste der zu durchsuchenden Daten in einem Formular und das Suchformular als Popup-Formular erscheinen. Auf diese Weise k&ouml;nnen Sie das Formular mit den Suchkriterien an beliebiger Stelle platzieren, die Suchbegriffe eingeben, &auml;ndern oder entfernen und zu jeder Zeit das Suchergebnis aktualisieren lassen. Im Detail sieht das wie in Bild 1 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_05\/KundensucheMitKomfort-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Suchformular und zu durchsuchende Daten im &Uuml;berblick<\/span><\/b><\/p>\n<p><b>Funktionen des Suchformulars<\/b><\/p>\n<p>Der Benutzer soll beliebige Suchbegriffe in die Suchfelder eingeben k&ouml;nnen. Kombinationsfelder dienen zur direkten Auswahl von Suchbegriffen &#8211; im Beispiel etwa die Anrede, f&uuml;r die es nur zwei M&ouml;glichkeiten gibt. Bei der Eingabe der Suchbegriffe kann der Benutzer entweder erst alle gew&uuml;nschten Suchbegriffe in die Textfelder eingeben beziehungsweise aus den Kombinationsfeldern ausw&auml;hlen und dann die Suche mit einem Klick auf die Schaltfl&auml;che <b>Suchen <\/b>starten. Oder er aktiviert die Option <b>Schnellsuche <\/b>oben im Formularkopf: Dann f&uuml;hrt die Eingabe eines jeden Zeichens und die Auswahl eines jeden Kombinationsfeldeintrags zur Anzeige der gefundenen Eintr&auml;ge in der zu durchsuchenden Liste.<\/p>\n<p>Eine weitere Option legt fest, ob die Textfelder nur nach genauen Treffern durchsucht werden sollen (<b>Andre <\/b>zeigt dann nur Datens&auml;tze mit <b>Andre<\/b>, aber keine mit <b>Andreas <\/b>an), ob auch Treffer ausgegeben werden sollen, die mit dem eingegebenen Suchbegriff beginnen oder ob das Suchergebnis sogar solche Treffer liefern soll, bei denen der Suchbegriff irgendwo im Text enthalten ist (<b>An <\/b>liefert dann sowohl <b>Andre <\/b>als auch <b>Hermann<\/b>).<\/p>\n<p>Die Schaltfl&auml;che <b>Leeren <\/b>soll alle Suchbegriffe wieder auf den Anfangszustand zur&uuml;cksetzen, die Schaltfl&auml;che <b>Abbrechen<\/b> schlie&szlig;t den Dialog.<\/p>\n<p><b>Aufruf des Suchformulars<\/b><\/p>\n<p>Das Formular mit dem zu durchsuchenden Datenblatt wird mit einer Schaltfl&auml;che namens <b>cmdSuchen <\/b>ausgestattet, die folgende Ereignisprozedur ausl&ouml;st:<\/p>\n<pre>Private Sub cmdSuche_Click()\r\n    DoCmd.OpenForm &quot;frmKundensuche&quot;, OpenArgs:=&quot;sfmKundenuebersicht&quot;\r\nEnd Sub<\/pre>\n<p>Dies &ouml;ffnet das Formular namens <b>frmKundensuche <\/b>und &uuml;bergibt den Namen des zu durchsuchenden Unterformulars als &Ouml;ffnungsargument. Die Programmierung der hier verwenden Kunden&uuml;bersicht finden Sie im Beitrag <b>Programmierung der KVA <\/b>(<b>www.access-im-unternehmen.de\/857<\/b>).<\/p>\n<p><b>Anlegen des Suchformulars<\/b><\/p>\n<p>Das Suchformular sieht im Entwurf wie in Bild 2 aus. Es enth&auml;lt alle Felder, die Sie auch im Unterformular mit den zu durchsuchenden Daten finden, n&auml;mlich die Felder der Tabelle <b>tblKundenBase<\/b> der Beispielanwendung <b>KVA.mdb<\/b>.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_05\/KundensucheMitKomfort-web-images\/pic012.png\" alt=\"pic012.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Entwurf des Suchformulars<\/span><\/b><\/p>\n<p>Die Suchfelder sollen Namen erhalten, die aus dem Feldnamen und einem Pr&auml;fix bestehen &#8211; <b>txt <\/b>f&uuml;r Textfelder und <b>cbo <\/b>f&uuml;r Kombinationsfelder. Die Bezeichnungsfelder weisen auf den Inhalt des jeweils zu durchsuchenden Feldes hin. Wenn Sie die Felder nicht alle von Hand anlegen m&ouml;chten, k&ouml;nnen Sie dies mit einem kleinen Trick erledigen. Stellen Sie dazu die Datenherkunft eines leeren Formulars auf die Tabelle ein, welche die zu durchsuchenden Daten enth&auml;lt &#8211; hier <b>tblKundenBase<\/b> &#8211; und ziehen Sie alle ben&ouml;tigten Felder aus der Feldliste in den Detailbereich des Formulars (s. Bild 3).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_05\/KundensucheMitKomfort-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Anlegen der Suchfelder<\/span><\/b><\/p>\n<p>Danach passen Sie, sofern die Eigenschaft <b>Beschriftung <\/b>der Felder im Tabellenentwurf nicht bereits mit entsprechenden Beschriftungen versehen war, die Beschriftungsfelder an (zum Beispiel von <b>EMail <\/b>zu <b>E-Mail<\/b>).<\/p>\n<p>Nun versehen Sie die Eigenschaftsnamen noch mit entsprechenden Pr&auml;fixen, also <b>txt <\/b>f&uuml;r die Textfelder und <b>cbo <\/b>f&uuml;r die als Nachschlagefelder ausgelegten Suchfelder. Sie k&ouml;nnen das manuell erledigen oder Sie nutzen das Add-In <b>Control Renamer<\/b>, das im Beitrag <b>Access-Add-Ins <\/b>(<b>www.access-im-unternehmen.de\/643<\/b>) vorgestellt wird. Damit k&ouml;nnen Sie die Steuerelemente mit einem Mausklick um das gew&uuml;nschte Pr&auml;fix erweitern. Achtung: Dies gelingt nur, solange die Steuerelemente noch gebunden sind &#8211; erledigen Sie dies also vor dem folgenden Schritt, wenn Sie den <b>Control Renamer <\/b>einsetzen m&ouml;chten.<\/p>\n<p>Nun ben&ouml;tigen wir allerdings keine gebundenen Felder, sondern nur einfache Textfelder. Gl&uuml;cklicherweise k&ouml;nnen Sie Eigenschaften immer f&uuml;r mehrere Steuerelemente gleichzeitig &auml;ndern. Also markieren Sie durch Aufziehen eines entsprechenden Rahmens alle Textfelder und k&uuml;mmern sich um die Eigenschaft <b>Steuerelementinhalt<\/b>. Diese wird bereits als leer angezeigt, aber nur, weil die Eigenschaft f&uuml;r alle markierten Steuerelemente unterschiedliche Werte aufweist. Wie aber leeren wir eine bereits als leer dargestellte Eigenschaft Ganz einfach: Sie tippen ein beliebiges Zeichen in die Eigenschaft, was alle vorhandenen Werte &uuml;berschreibt, und l&ouml;schen dieses wieder. Nun ist die Eigenschaft <b>Steuerelement <\/b>tats&auml;chlich leer, wie die Kontrolle der Eigenschaft f&uuml;r ein einzelnes Steuerelement belegt.<\/p>\n<p><b>Anpassen der Kombinationsfelder<\/b><\/p>\n<p>Die Kombinationsfelder <b>cboAnredeID <\/b>und <b>cboPersoenlicheAnredeID <\/b>bieten, wenn Sie die entsprechenden Felder der Tabelle <b>tblKundenBase <\/b>als Nachschlagefelder eingerichtet haben, alle Datens&auml;tze der zugrunde liegenden Tabellen zur Auswahl an. Um den Komfort der Suchfunktion zu erh&ouml;hen, sollen diese gleich beim Anzeigen des Suchformulars Eintr&auml;ge wie <b>&lt;Alle&gt; <\/b>anzeigen. Dazu passen wir die Datensatzherkunft der beiden Steuerelemente etwas an. F&uuml;r das Steuerelement <b>cboAnredeID <\/b>hinterlegen Sie hier den folgenden Ausdruck:<\/p>\n<pre>SELECT 0 AS AnredeID, ''&lt;Alle&gt;'' AS Anrede\r\nFROM tblAnreden\r\nUNION\r\nSELECT AnredeID, Anrede FROM tblAnreden;<\/pre>\n<p>Der Ausdruck f&uuml;r die Eigenschaft <b>Datensatzherkunft <\/b>des Steuerelements <b>cboPersoenlicheAnredeID <\/b>ist &auml;hnlich aufgebaut:<\/p>\n<pre>SELECT 0 as PersoenlicheAnredeID,\r\n''&lt;Alle&gt;'' AS PersoenlicheAnrede\r\nFROM tblPersoenlicheAnreden\r\nUNION\r\nSELECT PersoenlicheAnredeID, PersoenlicheAnrede FROM tblPersoenlicheAnreden;<\/pre>\n<p><b>Weitere Steuerelemente<\/b><\/p>\n<p>F&uuml;gen Sie dem Formular nun die &uuml;brigen Steuerelemente hinzu:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Kontrollk&auml;stchen mit dem Namen <b>chkSchnellsuche <\/b>und der Beschriftung <b>Schnellsuche<\/b><\/li>\n<li class=\"aufz-hlung\">Optionsgruppe namens <b>ogrSuchoptionen <\/b>und drei Optionen mit den Beschriftungen <b>Nur genaue Treffer <\/b>(Wert <b>1<\/b>), <b>Text beginnt mit &#8230; <\/b>(Wert <b>2<\/b>) und <b>Text enth&auml;lt &#8230; <\/b>(Wert <b>3<\/b>)<\/li>\n<li class=\"aufz-hlung\">Schaltfl&auml;che <b>cmdSuchen <\/b>mit der Beschriftung <b>Suchen<\/b><\/li>\n<li class=\"aufz-hlung\">Schaltfl&auml;che <b>cmdLeeren <\/b>mit der Beschriftung <b>Leeren<\/b><\/li>\n<li class=\"aufz-hlung\">Schaltfl&auml;che <b>cmdAbbrechen <\/b>mit der Beschriftung <b>Abbrechen<\/b><\/li>\n<\/ul>\n<p><b>Programmierung der Suchfunktion<\/b><\/p>\n<p>Bei den folgenden Ausf&uuml;hrungen ist es wichtig zu wissen, dass das Suchformular daf&uuml;r konzipiert ist, von einem anderen Formular per Schaltfl&auml;che ge&ouml;ffnet zu werden. Au&szlig;erdem muss dieses Formular das Unterformular in der Datenblattansicht enthalten, dessen Datens&auml;tze mithilfe des Suchformulars gefiltert werden sollen.<\/p>\n<p>Es gibt also eine Interaktion zwischen dem aufrufenden Formular sowie dem aufgerufenen Suchformular &#8211; nicht nur in einer Richtung:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Das Suchformular soll die Daten im aufrufenden Formular aktualisieren, wenn der Benutzer die Suche startet.<\/li>\n<li class=\"aufz-hlung\">Andersherum soll das Suchformular geschlossen werden, wenn der Benutzer das zu durchsuchende Formular schlie&szlig;t, ohne das Suchformular vorher geschlossen zu haben.<\/li>\n<\/ul>\n<p>F&uuml;r diese Interaktion ben&ouml;tigt das Suchformular einen Verweis auf das Hauptformular. Diesen speichert das Suchformular in einer Variablen namens <b>frmParent<\/b>. Damit das Suchformular auf das Schlie&szlig;en des zu durchsuchenden Formulars reagieren kann, wird diese Objektvariable mit dem Schl&uuml;sselwort <b>WithEvents <\/b>deklariert:<\/p>\n<pre>Private WithEvents frmParent As Form<\/pre>\n<p>Um das im aufrufenden Formular enthaltene Unterformular in der Datenblattansicht aktualisieren beziehungsweise filtern zu k&ouml;nnen, ben&ouml;tigen wir auch einen Verweis auf dieses Element.<\/p>\n<p>Dieses speichern wir in der folgenden Variable &#8211; <b>WithEvents <\/b>ist hier nicht n&ouml;tig, da wir nicht auf Ereignisse im Unterformular reagieren m&uuml;ssen:<\/p>\n<pre>Private frmDataSheet As Form<\/pre>\n<p>Damit kommen wir zu der Prozedur, die durch das Ereignis <b>Beim &Ouml;ffnen <\/b>des Formulars ausgel&ouml;st wird und wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-62-anchor\">Listing 1<\/a><\/span> aussieht.<\/p>\n<p class=\"listingueberschrift\">Listing 1: Die Prozedur, die durch das Ereignis Beim &Ouml;ffnen ausgef&uuml;hrt wird<\/p>\n<pre>Private Sub Form_Open(Cancel As Integer)\r\n    Dim ctl As control\r\n    If IsNull(Me.OpenArgs) Then\r\n        MsgBox &quot;Das Suchformular kann nur von einem Formular mit zu durchsuchendem Unterformular &quot; _\r\n            &amp; &quot;ge&ouml;ffnet werden. Dessen Name ist als &Ouml;ffungsargument zu &uuml;bergeben.&quot;\r\n        Cancel = True\r\n    Else\r\n        Set ctl = Screen.ActiveControl\r\n        Set frmParent = ctl.Parent\r\n        frmParent.OnUnload = &quot;[Event Procedure]&quot;\r\n        Set frmDataSheet = frmParent(Me.OpenArgs).Form\r\n    End If\r\nEnd Sub<\/pre>\n<p>Die Prozedur hat zun&auml;chst die Aufgabe, das Formular sofort mit einer entsprechenden Meldung wieder zu schlie&szlig;en, wenn dieses &uuml;ber einen anderen Weg als &uuml;ber die daf&uuml;r vorgesehene Schaltfl&auml;che ge&ouml;ffnet wird. Dazu pr&uuml;ft die Prozedur zun&auml;chst, ob beim Aufruf des Formulars mit der <b>DoCmd.OpenForm<\/b>-Methode ein &Ouml;ffnungsargument &uuml;bergeben wurde.<\/p>\n<p>Ist dies der Fall, holt sich die Prozedur zun&auml;chst einen Verweis auf das Steuerelement, das beim Aufrufen des Formulars aktiv ist &#8211; in diesem Fall also die Schaltfl&auml;che <b>cmdSuchen <\/b>des zu durchsuchenden Formulars.<\/p>\n<p>Dieses Steuerelement wiederum hat eine <b>Parent<\/b>-Eigenschaft, die auf das <b>Form<\/b>-Objekt verweist, in dem sich die Schaltfl&auml;che befindet. Ein Verweis auf dieses Formular landet in der bereits erw&auml;hnten Variablen <b>objParent<\/b>.<\/p>\n<p><!--30percent--><\/p>\n<p>Das mit <b>Me.OpenArgs <\/b>abgefragte &Ouml;ffnungsargument liefert den Namen des zu durchsuchenden Unterformulars, zu dem sich die Prozedur mit <b>frmParent(Me.OpenArgs).Form <\/b>ebenfalls einen Verweis holt und diesen diesmal in der Variablen <b>frmDataSheet <\/b>speichert.<\/p>\n<p>F&uuml;r das in <b>frmParent <\/b>gespeicherte Formular soll eine Ereignisprozedur im Klassenmodul des Formulars <b>frmKundensuche <\/b>implementiert werden, das durch das Ereignis <b>Beim Entladen<\/b> ausgel&ouml;st wird. Dies gibt die Prozedur <b>Form_Open <\/b>mit der folgenden Zeile zun&auml;chst bekannt:<\/p>\n<pre>frmParent.OnUnload = &quot;[Event Procedure]&quot;<\/pre>\n<p>Die Implementierung der Ereignisprozedur sieht schlie&szlig;lich so aus:<\/p>\n<pre>Private Sub frmParent_Unload(Cancel As Integer)\r\n    DoCmd.Close acForm, Me.Name\r\nEnd Sub<\/pre>\n<p>Damit haben wir zwar noch keine Suchfunktion programmiert, aber zumindest ist sichergestellt, dass das Suchformular zusammen mit dem aufrufenden Formular auch wieder geschlossen wird. Dies k&ouml;nnte n&auml;mlich wiederum zu Problemen f&uuml;hren, wenn der Benutzer das Suchformular noch einsetzt, obwohl das zu durchsuchende Formular l&auml;ngst geschlossen ist.<\/p>\n<p>Kommen wir nun zur Ereignisprozedur, die durch das Ereignis <b>Beim Laden <\/b>des Steuerelements ausgel&ouml;st wird.<\/p>\n<p>Dies sieht wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-60-anchor\">Listing 2<\/a><\/span> aus und enth&auml;lt f&uuml;r den aktuellen Zeitpunkt nur zwei wichtige Anweisungen &#8211; n&auml;mlich diejenigen, welche die Werte der beiden Kombinationsfelder <b>cboAnredeID <\/b>und <b>cboPersoenlicheAnredeID <\/b>auf den jeweils ersten Eintrag einstellen &#8211; also auf <b>&lt;Alle&gt;<\/b>. Auf die &uuml;brigen Anweisungen kommen wir im sp&auml;teren Verlauf zur&uuml;ck.<\/p>\n<p class=\"listingueberschrift\">Listing 2: Die Prozedur, die durch das Ereignis Beim Laden ausgef&uuml;hrt wird<\/p>\n<pre>Private Sub Form_Load()\r\n    Dim objSuchformularControl As clsSuchformularControl\r\n    Set colSuchformularsteuerelemente = New Collection\r\n    Me!cboAnredeID = Me!cboAnredeID.ItemData(0)\r\n    Me!cboPersoenlicheAnredeID = Me!cboPersoenlicheAnredeID.ItemData(0)\r\n    Dim ctl As control\r\n    For Each ctl In Me.Controls\r\n        Select Case ctl.ControlType\r\n            Case acTextBox, acComboBox\r\n                Set objSuchformularControl = New clsSuchformularControl\r\n                With objSuchformularControl\r\n                    Set .SearchControl = ctl\r\n                End With\r\n                colSuchformularsteuerelemente.Add objSuchformularControl\r\n        End Select\r\n    Next ctl\r\nEnd Sub<\/pre>\n<p><b>Aufrufen der Suchfunktion<\/b><\/p>\n<p>Das Programmieren der Suchfunktion w&auml;re einfach, wenn diese nur &uuml;ber die Schaltfl&auml;che <b>cmdSuchen <\/b>gestartet werden k&ouml;nnte (beziehungsweise das Bet&auml;tigen der Eingabe-Taste &#8211; durch Einstellen der Eigenschaft <b>Standard <\/b>der Schaltfl&auml;che <b>cmdSuchen <\/b>auf den Wert <b>Ja <\/b>l&ouml;st auch die Eingabe-Taste die Ereignisprozedur <b>cmdSuchen_Click <\/b>aus).<\/p>\n<p>Aber um die Suche noch etwas komfortabler zu gestalten, haben wir entschieden, dass der Benutzer durch Aktivieren der Option <b>Schnellsuche <\/b>daf&uuml;r sorgen kann, dass die Suche nach der Eingabe eines jeden Zeichens in eines der Textfelder beziehungsweise der Auswahl eines Eintrags der Kombinationsfelder erneut durchgef&uuml;hrt werden soll.<\/p>\n<p>Damit ergeben sich kleinere Probleme: Wenn Sie n&auml;mlich beispielsweise einen Buchstaben in das Textfeld <b>txtVorname <\/b>eingeben, soll der Filter entsprechend zusammengestellt werden (etwa <b>Vorname LIKE &#8220;A&#8220;<\/b>). Dazu muss die Prozedur, die den Filterausdruck zusammenstellt, den im Suchfeld angegebenen Text einlesen. Dies gelingt, ohne die Eingabe in das Textfeld abzuschlie&szlig;en, nur &uuml;ber die <b>Text<\/b>-Eigenschaft des Textfeldes. Bei Feldern, die gerade nicht bearbeitet werden, reicht das Abfragen der <b>Value<\/b>-Eigenschaft aus.<\/p>\n<p>In der Schleife, die alle Steuerelemente durchl&auml;uft, um den Filterausdruck zusammenzustellen, m&uuml;ssten wir also auch noch pr&uuml;fen, ob das aktuell durchlaufene Steuerelement eventuell gerade in Bearbeitung ist, und dementsprechend entweder auf die <b>Value<\/b>&#8211; oder die <b>Text<\/b>-Eigenschaft zugreifen, um den aktuellen Inhalt des Steuerelements zu ermitteln.<\/p>\n<p>Da dies sehr unpraktisch ist, sorgen wir daf&uuml;r, dass der Inhalt der Textfelder nach jeder &auml;nderung in der sonst nicht verwendeten Eigenschaft <b>Tag <\/b>gespeichert wird. Dazu m&uuml;ssten wir nun f&uuml;r jedes Textfeld eine Ereignisprozedur anlegen, die beispielsweise wie folgt aussieht:<\/p>\n<pre>Private Sub txtVorname_Change()\r\n    txtVorname.Tag = txtVorname.Text\r\n    If Me!chkSchnellsuche Then\r\n        Suchen\r\n    End If\r\nEnd Sub<\/pre>\n<p>Die Prozedur tr&auml;gt den aktuellen Text des Textfeldes (nicht zu verwechseln mit dem Wert) in die Eigenschaft <b>Tag <\/b>ein. Au&szlig;erdem pr&uuml;ft sie, ob die Option <b>chkSchnellsuche <\/b>aktiviert ist, und ruft gleich noch die Prozedur <b>Suchen <\/b>auf, um das Suchergebnis zu aktualisieren (mehr zu dieser Prozedur weiter unten).<\/p>\n<p>Nun macht es erstens keinen Spa&szlig;, f&uuml;r jedes Steuerelement eine solche Prozedur anzulegen, und zweitens m&uuml;ssen Sie dies f&uuml;r eventuell hinzukommende Steuerelemente auch noch jedesmal wiederholen. Also programmieren wir eine kleine Klasse namens <b>clsSuchformularControl<\/b>, die jeweils den Verweis auf eines der Steuerelemente speichert und auch noch die oben beschriebene Ereignisprozedur enth&auml;lt, die den Suchbegriff zwischenspeichert und die Suchfunktion aufruft.<\/p>\n<p>Der komplette Code dieser Klasse sieht wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-63-anchor\">Listing 3<\/a><\/span> aus. Die Funktion dieser Klasse schauen wir uns in Zusammenhang mit den Anweisungen der Prozedur an, die beim Laden des Formulars ausgel&ouml;st wird und die wir weiter oben noch nicht besprochen haben.<\/p>\n<p class=\"listingueberschrift\">Listing 3: Inhalt des Klassenmoduls clsSuchformularControl<\/p>\n<pre>Option Compare Database\r\nOption Explicit\r\nDim m_ctl As control\r\nDim WithEvents m_txt As TextBox\r\nDim WithEvents m_cbo As ComboBox\r\nPublic Property Set SearchControl(ctl As control)\r\n    Set m_ctl = ctl\r\n    Select Case m_ctl.ControlType\r\n        Case acTextBox\r\n            Set m_txt = m_ctl\r\n            With m_txt\r\n                .OnChange = &quot;[Event Procedure]&quot;\r\n            End With\r\n        Case acComboBox\r\n            Set m_cbo = m_ctl\r\n            With m_cbo\r\n                .AfterUpdate = &quot;[Event Procedure]&quot;\r\n            End With\r\n    End Select\r\nEnd Property\r\nPrivate Sub m_cbo_AfterUpdate()\r\n    If m_cbo.Parent.chkSchnellsuche Then\r\n        m_cbo.Parent.Suchen\r\n    End If\r\nEnd Sub\r\nPrivate Sub m_txt_Change()\r\n    m_txt.Tag = m_txt.Text\r\n    If m_txt.Parent.chkSchnellsuche Then\r\n        m_txt.Parent.Suchen\r\n    End If\r\nEnd Sub<\/pre>\n<p>Eine wichtige Rolle spielt dabei das wie folgt im Kopf des Klassenmoduls <b>Form_frmSuchformular <\/b>deklarierte <b>Collection<\/b>-Objekt, das alle Instanzen der Klasse <b>clsSuchformularControl <\/b>aufnehmen soll:<\/p>\n<pre>Dim colSuchformularsteuerelemente As Collection<\/pre>\n<p>Dieses <b>Collection<\/b>-Objekt wird in der Prozedur <b>Form_Load <\/b>zun&auml;chst instanziert:<\/p>\n<pre>Set colSuchformularsteuerelemente = New Collection<\/pre>\n<p>Danach durchl&auml;uft diese Prozedur eine <b>For Each<\/b>-Schleife &uuml;ber alle Steuerelemente des Suchformulars, wobei sie zun&auml;chst anhand der Eigenschaft <b>ControlType <\/b>pr&uuml;ft, ob es sich um ein Textfeld oder ein Kombinationsfeld handelt. In diesem Fall erstellt die Prozedur f&uuml;r das Steuerelement eine neue Instanz der Klasse <b>clsSuchformularControl<\/b>. Diese bietet eine Eigenschaft namens <b>SearchControl <\/b>an, der die Prozedur einen Verweis auf das aktuelle mit <b>ctl <\/b>referenzierte Steuerelement &uuml;bergibt. Anschlie&szlig;end wird der Verweis auf die neu erzeugte Instanz <b>objSuchformularControl <\/b>in der Collection <b>colSuchformularSteuerelemente <\/b>gespeichert.<\/p>\n<pre>For Each ctl In Me.Controls\r\n    Select Case ctl.ControlType\r\n        Case acTextBox, acComboBox\r\n            Set objSuchformularControl = New clsSuchformularControl\r\n            With objSuchformularControl\r\n                Set .SearchControl = ctl\r\n            End With\r\n            colSuchformularsteuerelemente.Add objSuchformularControl\r\n    End Select\r\nNext ctl<\/pre>\n<p>Nun schauen wir uns an, was in dieser Zeit in der Klasse <b>clsSuchformularControl <\/b>geschieht. Beim Erzeugen der Klasse geschieht noch nichts, aber das Zuweisen eines Steuerelements an die Eigenschaft <b>SearchControl <\/b>l&ouml;st die <b>Property Set<\/b>-Prozedur <b>SearchControl <\/b>aus. Diese nimmt den Verweis auf das Steuerelement entgegen und speichert es zun&auml;chst in der Objektvariablen <b>m_ctl<\/b>.<\/p>\n<p>Dann pr&uuml;ft sie, ob es sich bei dem mit <b>m_ctl <\/b>referenzierten Steuerelement um ein Textfeld oder ein Kombinationsfeld handelt, und f&auml;hrt mit dem entsprechenden Zweig einer <b>Select Case<\/b>-Anweisung fort. Handelt es sich um ein Textfeld, wird der Verweis auf das Steuerelement an die Variable <b>m_txt <\/b>weitergereicht, die im Kopf des Klassenmoduls mit dem Schl&uuml;sselwort <b>WithEvents <\/b>deklariert wurde:<\/p>\n<pre>Dim WithEvents m_txt As TextBox<\/pre>\n<p>Die Prozedur gibt durch Zuweisen des Wertes <b>[Event Procedure] <\/b>f&uuml;r die Eigenschaft <b>OnChange <\/b>der Variablen <b>m_txt <\/b>an, dass es in der gleichen Klasse noch eine Ereignisprozedur geben k&ouml;nnte, die gegebenenfalls ausgel&ouml;st werden soll. Dabei handelt es sich um das <b>Bei &auml;nderung<\/b>-Ereignis, das bei jeder Eingabe eines Zeichens ausgel&ouml;st wird.<\/p>\n<p>In diesem Fall soll die folgende Prozedur aufgerufen werden, die erstens den aktuellen Text im Textfeld in der Eigenschaft <b>Tag<\/b> speichert und zweitens die Suchfunktion ausl&ouml;st, falls die Option <b>chkSchnellsuche <\/b>im Formular des Textfeldes aktiviert ist:<\/p>\n<pre>Private Sub m_txt_Change()\r\n    m_txt.Tag = m_txt.Text\r\n    If m_txt.Parent.chkSchnellsuche Then\r\n        m_txt.Parent.Suchen\r\n    End If\r\nEnd Sub<\/pre>\n<p>Gleiches geschieht, wenn die Prozedur <b>SearchControl <\/b>in der <b>For Each<\/b>-Schleife auf ein Kombinationsfeld st&ouml;&szlig;t. Hier wird allerdings nicht der aktuelle Wert zwischengespeichert, denn in Kombinationsfeldern ist die Eingabe ja mit der Auswahl eines der Eintr&auml;ge bereits abgeschlossen. Allerdings soll auch hier automatisch die Suche durchgef&uuml;hrt werden, wenn das Ereignis <b>Nach Aktualisierung <\/b>ausgel&ouml;st wird und die Option <b>chkSchnellsuche <\/b>aktiviert ist:<\/p>\n<pre>Private Sub m_cbo_AfterUpdate()\r\n    If m_cbo.Parent.chkSchnellsuche Then\r\n        m_cbo.Parent.Suchen\r\n    End If\r\n End Sub<\/pre>\n<p><b>Suchfunktion programmieren<\/b><\/p>\n<p>Nun k&ouml;nnen wir uns endlich der eigentlichen Suchfunktion zuwenden.<\/p>\n<p>Diese hei&szlig;t <b>Suchen <\/b>und wird im einfachsten Fall durch einen Mausklick auf die Schaltfl&auml;che <b>cmdSuchen <\/b>ausgel&ouml;st:<\/p>\n<pre>Private Sub cmdSuchen_Click()\r\n    Suchen\r\nEnd Sub<\/pre>\n<p>Dies geschieht, nachdem f&uuml;r diese Schaltfl&auml;che die Eigenschaft <b>Standard <\/b>auf <b>Ja <\/b>eingestellt ist, auch beim Bet&auml;tigen der Eingabe-Taste innerhalb des Suchformulars.<\/p>\n<p>Die Prozedur <b>Suchen <\/b>sieht wie folgt aus:<\/p>\n<pre>Public Sub Suchen()\r\n    Dim strSuchfilter As String\r\n    strSuchfilter = SuchfilterErstellen\r\n    If Len(strSuchfilter) &gt; 0 Then\r\n         frmDataSheet.Filter = strSuchfilter\r\n        frmDataSheet.FilterOn = True\r\n    Else\r\n         frmDataSheet.Filter = &quot;&quot;\r\n        frmDataSheet.FilterOn = False\r\n    End If\r\nEnd Sub<\/pre>\n<p>Sie ruft zun&auml;chst die Funktion <b>SuchfilterErstellen <\/b>auf und speichert das Ergebnis in der Variablen <b>strSuchfilter<\/b>. Eine <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft, ob die Variable <b>strSuchfilter <\/b>leer ist. Ist das der Fall, wird der Eigenschaft <b>Filter <\/b>des mit <b>frmDatasheet <\/b>referenzierten Unterformulars eine leere Zeichenkette zugewiesen und die Eigenschaft <b>FilterOn<\/b> auf <b>False <\/b>eingestellt. Anderenfalls weist die Prozedur der Eigenschaft <b>Filter <\/b>den ermittelten Filterausdruck zu, der beispielsweise wie folgt aussehen kann:<\/p>\n<pre>Vorname LIKE ''A*''<\/pre>\n<p>Das Einstellen der Eigenschaft <b>FilterOn <\/b>auf den Wert <b>True <\/b>aktiviert den Filter und sorgt daf&uuml;r, dass das Unterformular nur noch Datens&auml;tze anzeigt, die diesem Filterkriterium entsprechen. Die Schwerstarbeit in dieser Prozedur verrichtet nun die Funktion <b>SuchfilterErstellen<\/b>, die Sie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-66-anchor\">Listing 4<\/a><\/span> finden.<\/p>\n<p class=\"listingueberschrift\">Listing 4: Die Funktion zum Erstellen des Suchfilters<\/p>\n<pre>Private Function SuchfilterErstellen() As String\r\n    Dim strFilter As String\r\n    Dim strFeldname As String\r\n    Dim ctl As control\r\n    For Each ctl In Me.Controls\r\n        Select Case ctl.ControlType\r\n            Case acTextBox, acComboBox\r\n                strFeldname = Mid(ctl.Name, 4)\r\n                If ctl.ControlType = acTextBox Then\r\n                    If Len(ctl.Tag) &gt; 0 Then\r\n                        Select Case Me!ogrSuchoptionen\r\n                            Case 1\r\n                                strFilter = strFilter &amp; &quot; AND &quot; &amp; strFeldname &amp; &quot; LIKE ''&quot; _\r\n                                    &amp; Replace(ctl.Tag, &quot;''&quot;, &quot;''''&quot;) &amp; &quot;''&quot;\r\n                            Case 2\r\n                                strFilter = strFilter &amp; &quot; AND &quot; &amp; strFeldname &amp; &quot; LIKE ''&quot; _\r\n                                    &amp; Replace(ctl.Tag, &quot;''&quot;, &quot;''''&quot;) &amp; &quot;*''&quot;\r\n                            Case 3\r\n                                strFilter = strFilter &amp; &quot; AND &quot; &amp; strFeldname &amp; &quot; LIKE ''*&quot; _\r\n                                    &amp; Replace(ctl.Tag, &quot;''&quot;, &quot;''''&quot;) &amp; &quot;*''&quot;\r\n                        End Select\r\n                    End If\r\n                Else\r\n                    Select Case Left(ctl.Name, 3)\r\n                        Case &quot;cbo&quot;\r\n                            If Not ctl.Value = 0 Then\r\n                                strFilter = strFilter &amp; &quot; AND &quot; &amp; strFeldname &amp; &quot; = &quot; &amp; ctl.Value\r\n                            End If\r\n                        Case &quot;chk&quot;\r\n                            If Not ctl.Value = 1 Then\r\n                                strFilter = strFilter &amp; &quot; AND &quot; &amp; strFeldname &amp; &quot; = &quot; &amp; ctl.Value\r\n                            End If\r\n                    End Select\r\n                End If\r\n        End Select\r\n    Next ctl\r\n    If Len(strFilter) &gt; 0 Then\r\n        strFilter = Mid(strFilter, 5)\r\n    End If\r\n    SuchfilterErstellen = strFilter\r\nEnd Function<\/pre>\n<p>Die Funktion durchl&auml;uft in einer <b>For Each<\/b>-Schleife alle Steuerelemente des Formulars <b>frmKundensuche<\/b>. Innerhalb dieser Schleife pr&uuml;ft die Funktion zun&auml;chst, um welchen Steuerelementtyp es sich bei dem aktuell mit <b>ctl<\/b> referenzierten Steuerelement handelt.<\/p>\n<p>Der Suchfilter soll nur auf Basis der Text- und Kombinationsfelder zusammengesetzt werden.<\/p>\n<p>Da es sich bei allen anderen Steuerelementen des Formulars um andere Steuerelementtypen handelt, ist dies so machbar &#8211; sollten Sie jedoch noch Text- und Kombinationsfelder f&uuml;r andere Zwecke als der Eingabe von Suchkriterien zum Formular hinzuf&uuml;gen, m&uuml;ssen Sie diese durch eine entsprechende Pr&uuml;fung vom Durchlaufen der Such-Steuerelemente ausschlie&szlig;en.<\/p>\n<p>Zum Zusammenstellen eines Suchausdrucks wie <b>Vorname LIKE &#8220;A*&#8220; <\/b>ben&ouml;tigen wir einige Informationen, allen voran den Namen des zu untersuchenden Feldes. Zum Gl&uuml;ck haben wir alle Steuerelemente zur Eingabe beziehungsweise Auswahl von Suchbegriffen genauso benannt wie die Felder, auf die sich der Suchbegriff beziehen soll &#8211; wir haben ja lediglich aus drei Buchstaben bestehende Pr&auml;fixe vorangestellt (<b>txt <\/b>und <b>cbo<\/b>).<\/p>\n<p>Also brauchen wir, um die zu durchsuchenden Felder zu ermitteln, auch nur die ersten drei Buchstaben abzuschneiden, um den Feldnamen zu ermitteln. Dies erledigt die folgende Anweisung:<\/p>\n<pre>strFeldname = Mid(ctl.Name, 4)<\/pre>\n<p>Danach folgt die Unterscheidung nach Steuerelementtyp. Im Falle eines Textfeldes pr&uuml;ft die Prozedur, ob die <b>Tag<\/b>-Eigenschaft einen Vergleichsausdruck enth&auml;lt. Nur wenn die <b>Tag<\/b>-Eigenschaft nicht leer ist, wird f&uuml;r dieses Steuerelement ein Suchkriterium zusammengestellt.<\/p>\n<p>Ist <b>Tag <\/b>nicht leer, pr&uuml;ft die Prozedur, welche der im Steuerelement <b>ogrSuchoptionen <\/b>angebotenen Optionen gew&auml;hlt wurde.<\/p>\n<p>Im Falle der Option <b>1 <\/b>(<b>Nur genaue Treffer<\/b>) wird der Vergleichsausdruck einfach in Anf&uuml;hrungszeichen gesetzt, sodass bei Eingabe von <b>A <\/b>im Suchfeld <b>txtVorname <\/b>der folgende Ausdruck entsteht:<\/p>\n<pre>AND Vorname LIKE ''A''<\/pre>\n<p>Bei Verwendung der Option <b>2 <\/b>(<b>Text beginnt mit &#8230;<\/b>) f&uuml;gt die entsprechende Zeile noch ein Sternchen als Platzhalter hinzu:<\/p>\n<pre>AND Vorname LIKE ''A*''<\/pre>\n<p>Und schlie&szlig;lich folgt Variante <b>3 <\/b>(<b>Text enth&auml;lt &#8230;<\/b>), bei der vorn und hinten Sternchen hinzugef&uuml;gt werden:<\/p>\n<pre>AND Vorname LIKE ''*A*''<\/pre>\n<p>Auf diese Weise f&uuml;gt die Funktion Steuerelement f&uuml;r Steuerelement die Suchkriterien f&uuml;r die Textfelder zusammen.<\/p>\n<p>Bei den Kombinationsfeldern ist dies etwas einfacher: Hier pr&uuml;ft die Prozedur nur, ob es sich um ein Kombinationsfeld auf Basis eines Tabellenfeldes mit Nachschlagefeld oder um ein Tabellenfeld mit Kontrollk&auml;stchen handelt (letzterer Fall taucht in der Beispielanwendung leider nicht auf &#8211; in diesem Fall sollte das Kombinationsfeld die Werte <b>&lt;Alle&gt;<\/b>, <b>Ja <\/b>und <b>Nein <\/b>anzeigen).<\/p>\n<p>Der Filter wird dann einfach aus dem Feldnamen und dem aktuellen Wert des Kombinationsfeldes zusammengestellt &#8211; aber nur, wenn dieser nicht den Wert <b>0 <\/b>enth&auml;lt, was der Auswahl von <b>&lt;Alle&gt;<\/b> entsprechen w&uuml;rde:<\/p>\n<pre>AND AnredeID = 1<\/pre>\n<p>Nach dem Durchlaufen aller Steuerelemente pr&uuml;ft die Funktion, ob <b>strFilter <\/b>&uuml;berhaupt einen Ausdruck enth&auml;lt. Falls ja, kann man davon ausgehen, dass zu Beginn ein &uuml;berfl&uuml;ssiges <b>AND <\/b>steht, das in diesem Fall noch weggek&uuml;rzt wird:<\/p>\n<pre>strFilter = Mid(strFilter, 5)<\/pre>\n<p>Danach wird der so zusammengestellte Ausdruck an die aufrufende Prozedur zur&uuml;ckgegeben, die den Filter des Zielformulars entsprechend einstellt.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Suchfelder leeren<\/p>\n<p>Mit einem Klick auf die Schaltfl&auml;che <b>Leeren<\/b> sollen alle Suchfelder wieder zur&uuml;ckgesetzt werden.<\/p>\n<p>Dazu gibt es zwei M&ouml;glichkeiten: Wenn das Suchfeld ein Textfeld ist, soll es einfach geleert werden. Handelt es sich hingegen um ein Kombinationsfeld, soll der Wert <b>0 <\/b>eingestellt und der Ausdruck <b>&lt;Alle&gt; <\/b>angezeigt werden.<\/p>\n<p>Wir als Programmierer sind grunds&auml;tzlich faul, also schreiben wir nicht f&uuml;r jedes Steuerelement eine eigene Anweisung zum Zur&uuml;cksetzen des Inhalts, sondern erledigen dies in einer Schleife &uuml;ber alle Steuerelemente.<\/p>\n<p>Die folgende Prozedur wird durch einen Klick auf die Schaltfl&auml;che <b>cmdLeeren <\/b>ausgel&ouml;st und durchl&auml;uft alle Elemente der Auflistung <b>Controls<\/b> des aktuellen Formulars, wobei das jeweils aktuelle Steuerelement mit der Variablen <b>ctl <\/b>referenziert wird.<\/p>\n<p>Dabei pr&uuml;ft eine <b>Select Case<\/b>-Bedingung innerhalb der Schleife, ob es sich beim aktuellen Steuerelement um ein Textfeld oder ein Kombinationsfeld handelt.<\/p>\n<p>Beim einem Textfeld werden der Wert und die <b>Tag<\/b>-Eigenschaft geleert, bei einem Kombinationsfeld wird der erste Eintrag ausgew&auml;hlt. Schlie&szlig;lich wird der Filter des Unterformulars in der Datenblattansicht zur&uuml;ckgesetzt:<\/p>\n<pre>Private Sub cmdLeeren_Click()\r\n    Dim ctl As control\r\n    For Each ctl In Me.Controls\r\n        Select Case ctl.ControlType\r\n            Case acTextBox\r\n                ctl.Value = Null\r\n                ctl.Tag = &quot;&quot;\r\n            Case acComboBox\r\n                ctl = ctl.ItemData(0)\r\n        End Select\r\n    Next ctl\r\n    frmDataSheet.Filter = &quot;&quot;\r\n    frmDataSheet.FilterOn = False\r\nEnd Sub<\/pre>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">Suchformular schlie&szlig;en<\/p>\n<p>Das Schlie&szlig;en des Suchformulars erledigt der Benutzer entweder selbst durch einen Mausklick auf die Schaltfl&auml;che <b>cmdAbbrechen <\/b>oder das Suchformular wird beim Schlie&szlig;en des aufrufenden Formulars automatisch mitgeschlossen. Klickt der Benutzer auf <b>Abbrechen<\/b>, l&ouml;st dies folgende Prozedur aus:<\/p>\n<pre>Private Sub cmdAbbrechen_Click()\r\n    DoCmd.Close acForm, Me.Name\r\nEnd Sub<\/pre>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Diese Suchfunktion bietet eine Menge Komfort. Sie k&ouml;nnen damit gleichzeitig Suchbegriffe eingeben und sich zur Laufzeit das Suchergebnis ausgeben lassen.<\/p>\n<p>In der Beispieldatenbank fehlt noch ein Suchfeld auf Basis eines <b>Ja\/Nein<\/b>-Feldes. Sollten Sie diese Suchfunktion in einer eigenen Anwendung verwenden wollen, die auch noch ein <b>Ja\/Nein<\/b>-Feld wie etwa <b>Mehrwertsteuerpflichtig <\/b>enth&auml;lt, k&ouml;nnen Sie auch dieses einfach pr&uuml;fen. Legen Sie dieses wie die &uuml;brigen Felder im Formular <b>frmKundensuche <\/b>an. Stellen Sie es von einem Kontrollk&auml;stchen auf ein Kombinationsfeld um (behalten Sie aber das Pr&auml;fix <b>chk <\/b>statt <b>cbo <\/b>bei &#8211; sonst funktioniert es nicht) und weisen Sie der Eigenschaft <b>Datensatzherkunft <\/b>den folgenden Ausdruck zu:<\/p>\n<p><b>1;&quot;&lt;Alle&gt;;-1;&quot;Ja&quot;;0;&quot;Nein&quot;<\/b><\/p>\n<p>Stellen Sie au&szlig;erdem die Eigenschaft <b>Herkunftsart <\/b>auf <b>Wertliste <\/b>ein. Schlie&szlig;lich f&uuml;gen Sie der Prozedur <b>Form_Load <\/b>eine Zeile hinzu, die auch f&uuml;r dieses Kombinationsfeld die erste Zeile ausw&auml;hlt, also diejenige mit dem Ausdruck <b>&lt;Alle&gt;<\/b>.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>KA_BE.mdb<\/p>\n<p>KVA_2007.accdb<\/p>\n<p>KVA_2010.accdb<\/p>\n<p>Readme.txt<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{86303706-965C-4B1C-ADF9-9543914176CB}\/aiu_858.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn man Daten aus einer Liste nach verschiedenen Kriterien filtern m&ouml;chte, kann man gar nicht genug Komfort haben. In diesem Beitrag stellen wir Ihnen eine L&ouml;sung vor, mit denen Sie in einem Unterformular in der Datenblattansicht suchen k&ouml;nnen &#8211; und zwar mit allen Finessen. Das hei&szlig;t, dass Sie entweder zuerst alle Suchparameter eingeben und dann die Suche ansto&szlig;en k&ouml;nnen oder auch gleich mit Eingabe eines jeden Zeichens ein aktualisiertes Suchergebnis erhalten. Oder dass Sie entscheiden k&ouml;nnen, ob die Daten nur nach genauen Treffern durchsucht werden sollen.<\/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":[662012,66052012,44000023],"tags":[],"class_list":["post-55000858","post","type-post","status-publish","format-standard","hentry","category-662012","category-66052012","category-Mit_Formularen_arbeiten"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Kundensuche mit Komfort - 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\/Kundensuche_mit_Komfort\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kundensuche mit Komfort\" \/>\n<meta property=\"og:description\" content=\"Wenn man Daten aus einer Liste nach verschiedenen Kriterien filtern m&ouml;chte, kann man gar nicht genug Komfort haben. In diesem Beitrag stellen wir Ihnen eine L&ouml;sung vor, mit denen Sie in einem Unterformular in der Datenblattansicht suchen k&ouml;nnen - und zwar mit allen Finessen. Das hei&szlig;t, dass Sie entweder zuerst alle Suchparameter eingeben und dann die Suche ansto&szlig;en k&ouml;nnen oder auch gleich mit Eingabe eines jeden Zeichens ein aktualisiertes Suchergebnis erhalten. Oder dass Sie entscheiden k&ouml;nnen, ob die Daten nur nach genauen Treffern durchsucht werden sollen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Kundensuche_mit_Komfort\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:49:01+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg05.met.vgwort.de\/na\/a5acaa28232e4a37b00b168ca57fd9fc\" \/>\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=\"22\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundensuche_mit_Komfort\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundensuche_mit_Komfort\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Kundensuche mit Komfort\",\"datePublished\":\"2020-05-22T21:49:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundensuche_mit_Komfort\\\/\"},\"wordCount\":3658,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundensuche_mit_Komfort\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/a5acaa28232e4a37b00b168ca57fd9fc\",\"articleSection\":[\"2012\",\"5\\\/2012\",\"Mit Formularen arbeiten\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundensuche_mit_Komfort\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundensuche_mit_Komfort\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundensuche_mit_Komfort\\\/\",\"name\":\"Kundensuche mit Komfort - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundensuche_mit_Komfort\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundensuche_mit_Komfort\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/a5acaa28232e4a37b00b168ca57fd9fc\",\"datePublished\":\"2020-05-22T21:49:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundensuche_mit_Komfort\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundensuche_mit_Komfort\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundensuche_mit_Komfort\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/a5acaa28232e4a37b00b168ca57fd9fc\",\"contentUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/a5acaa28232e4a37b00b168ca57fd9fc\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundensuche_mit_Komfort\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kundensuche mit Komfort\"}]},{\"@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":"Kundensuche mit Komfort - 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\/Kundensuche_mit_Komfort\/","og_locale":"de_DE","og_type":"article","og_title":"Kundensuche mit Komfort","og_description":"Wenn man Daten aus einer Liste nach verschiedenen Kriterien filtern m&ouml;chte, kann man gar nicht genug Komfort haben. In diesem Beitrag stellen wir Ihnen eine L&ouml;sung vor, mit denen Sie in einem Unterformular in der Datenblattansicht suchen k&ouml;nnen - und zwar mit allen Finessen. Das hei&szlig;t, dass Sie entweder zuerst alle Suchparameter eingeben und dann die Suche ansto&szlig;en k&ouml;nnen oder auch gleich mit Eingabe eines jeden Zeichens ein aktualisiertes Suchergebnis erhalten. Oder dass Sie entscheiden k&ouml;nnen, ob die Daten nur nach genauen Treffern durchsucht werden sollen.","og_url":"https:\/\/access-im-unternehmen.de\/Kundensuche_mit_Komfort\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:49:01+00:00","og_image":[{"url":"http:\/\/vg05.met.vgwort.de\/na\/a5acaa28232e4a37b00b168ca57fd9fc","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"22\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Kundensuche_mit_Komfort\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Kundensuche_mit_Komfort\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Kundensuche mit Komfort","datePublished":"2020-05-22T21:49:01+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Kundensuche_mit_Komfort\/"},"wordCount":3658,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Kundensuche_mit_Komfort\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/a5acaa28232e4a37b00b168ca57fd9fc","articleSection":["2012","5\/2012","Mit Formularen arbeiten"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Kundensuche_mit_Komfort\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Kundensuche_mit_Komfort\/","url":"https:\/\/access-im-unternehmen.de\/Kundensuche_mit_Komfort\/","name":"Kundensuche mit Komfort - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Kundensuche_mit_Komfort\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Kundensuche_mit_Komfort\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/a5acaa28232e4a37b00b168ca57fd9fc","datePublished":"2020-05-22T21:49:01+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Kundensuche_mit_Komfort\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Kundensuche_mit_Komfort\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Kundensuche_mit_Komfort\/#primaryimage","url":"http:\/\/vg05.met.vgwort.de\/na\/a5acaa28232e4a37b00b168ca57fd9fc","contentUrl":"http:\/\/vg05.met.vgwort.de\/na\/a5acaa28232e4a37b00b168ca57fd9fc"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Kundensuche_mit_Komfort\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Kundensuche mit Komfort"}]},{"@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\/55000858","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=55000858"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000858\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000858"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000858"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000858"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}