Home > Artikel > Ausgabe 4/2013 > Filterkriterien für Formulare, Teil I

Filterkriterien für Formulare, Teil I

  PDF ansehen

  Download PDF und Beispieldatenbank

Was helfen Artikel-, Kunden-, Bestell- und sonstige Daten, wenn Sie diese zwar schön in einem Formular darstellen, aber diese nicht entsprechend filtern können? In diesem Artikel zeigen wir Ihnen, wie Sie verschiedene individuelle Filterkriterien mithilfe entsprechender Steuerelemente im Formular festlegen können. Damit filtern Sie dann die in einem Unterformular enthaltenen Daten – in diesem Fall Artikelstammdaten.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1304_FilterkriterienFuerFormulare.mdb.

Basisaufbau

Die Grundlage für die nachfolgend beschriebenen Beispiele zum Filtern von Daten besteht aus einem Haupt- und einem Unterformular. Im Hauptformular befinden sich die Steuerelemente, mit denen Sie die Filterkriterien eingeben, das Unterformular zeigt die zu durchsuchenden Daten an. Alternativ können Sie statt eines Unterformulars auch ein Listenfeld oder ein ListView-Steuerelement verwenden – beides ist mit geringen Änderungen verbunden, die wir an anderer Stelle erläutern.

Das Unterformular der Beispieldatenbank heißt frmArtikelFiltern. Stellen Sie für die Eigenschaft Datenherkunft dieses Formulars die Tabelle tblArtikel ein. Ziehen Sie dann alle Felder der Datenherkunft aus der Feldliste in den Detailbereich der Entwurfsansicht des Formulars. Sie brauchen diese nicht ordentlich anzuordnen, denn das Unterformular soll seine Daten ohnehin in der Datenblattansicht anzeigen. Dazu stellen Sie die Eigenschaft Standardansicht des Formulars auf den Wert Datenblatt ein (siehe Bild 1).

Entwurf des Unterformulars mit den zu filternden Daten

Bild 1: Entwurf des Unterformulars mit den zu filternden Daten

Nun müssen Sie das Formular nur noch speichern und schließen, den Rest erledigen wir vom Hauptformular auf.

Das Hauptformular der Beispieldatenbank heißt frmArtikelFiltern und nimmt zunächst nur das Unterformular auf. Wenn Sie das Hauptformular in der Entwurfsansicht geöffnet haben, ziehen Sie das Unterformular aus dem Datenbankfenster beziehungsweise aus dem Navigationsbereich in den Detailbereich des Formulars.

Es darf den Detailbereich komplett ausfüllen, die Steuerelemente zum Einstellen der Filterkriterien platzieren wir später im Formularkopf. Sollten Sie Access 2007 oder neuer verwenden (was ich hoffe), stellen Sie außerdem die Eigenschaften Horizontaler Anker und Vertikaler Anker auf Beide ein. Damit stellen Sie sicher, dass das Unterformular beim Vergrößern des Hauptformulars ebenfalls vergrößert wird.

Da das Hauptformular nicht selbst Daten anzeigt, benötigen wir die entsprechenden Elemente nicht – stellen Sie daher die Eigenschaften Trennlinien, Datensatzmarkierer und Navigationsschaltflächen auf Nein ein. Außerdem legen Sie für die Eigenschaft Automatisch zentrieren den Wert Ja und für Bildlaufleisten den Wert Nein fest.

Das Formular sieht nun wie in Bild 2 aus.

Haupt- und Unterformular in der Entwurfsansicht

Bild 2: Haupt- und Unterformular in der Entwurfsansicht

Steuerelemente für Filterkriterien

Filterkriterien können Sie mit den verschiedensten Steuerelementen eingeben. In den meisten Fällen ist die Art des Steuerelements bereits vorgegeben. Wenn Sie beispielsweise nach dem Artikelnamen filtern möchten, verwenden Sie dazu ein Textfeld. In diesem können Sie nach Wunsch Platzhalter vordefinieren, damit nach allen Ausdrücken gesucht wird, die mit der angegebenen Zeichenkette beginnen oder enden oder die diese einfach an irgendeiner Stelle enthalten. Oder Sie überlassen dem Benutzer, die notwendigen Platzhalter Sternchen (*) oder Fragezeichen (?) zu platzieren.

Wenn Sie nach einem Datum filtern, setzen Sie zwei Textfelder ein, um ein Start- und gegebenenfalls noch ein Enddatum für ein Datumsbereich eingeben zu können.

Wenn Sie nach einem Feld filtern möchten, dessen Werte mit einem Nachschlagefeld ausgewählt wurden, wird es bereits interessant. Dann enthält das Nachschlagefeld in der Regel nicht den angezeigten Ausdruck als Wert, sondern den Wert des Primärschlüsselfeldes der Tabelle, aus der die Daten des Nachschlagefeldes stammen. Sie können dann auf zwei Arten nach den Daten dieses Feldes filtern: erstens nach dem Wert der gebundenen Spalte, also dem tatsächlich gespeicherten Wert, oder nach dem angezeigten Wert.

Bei der ersten Variante stellen Sie zur Eingabe des Filterkriteriums ein Kombinationsfeld zur Verfügung, das einfach alle Einträge anbietet, die auch im zu durchsuchenden Feld vorliegen. Wenn Sie also alle Artikel suchen, die zur Kategorie Getränke gehören, würden Sie im Kombinationsfeld zum Filtern den Wert Getränke auswählen.

Es kann natürlich auch sein, dass Sie alle Artikel ermitteln möchten, deren Lieferant mit dem Buchstaben A beginnt. Dies ist etwas aufwendiger, weil wir hier nicht mehr nur die Daten der Tabelle tblArtikel benötigen, sondern auch die Daten der Tabelle tblLieferanten, welche die im Kombinationsfeld angezeigten Daten liefert.

Schließlich gibt es noch die Ja/Nein-Felder. Nach Ja/Nein-Feldern zu filtern, ist komplizierter, als es scheint: Naiverweise mag man davon ausgehen, dass ein einfaches Kontrollkästchen ausreicht, um nach solchen Werten zu filtern. Damit können Sie allerdings normalerweise nur den Wert Ja oder Nein beziehungsweise Wahr oder Falsch einstellen.

Was aber, wenn die zu durchsuchende Datenherkunft alle Datensätze liefern soll, also sowohl solche mit dem Wert Ja als auch die mit dem Wert Nein?

Kontrollkästchen besitzen zwar den sogenannten Dreifachstatus, aber der ist eher weniger intuitiv zu bedienen (mit drei Mausklicks durchlaufen Sie dabei die drei Werte -1 (Ja), 0 (Nein) und Null, wobei man Null mit Alle anzeigen belegen könnte.

Alternativ könnte man die drei Werte Ja, Nein und Alle auch mit einem Kombinationsfeld oder mit einer Optionsgruppe abdecken.

Bei Zahlenwerten gibt es schließlich auch verschiedene Möglichkeiten: Entweder Sie prüfen nur auf exakte Übereinstimmungen oder Sie verwenden auch hier, genau wie beim Datum, zwei Textfelder zur Eingabe von Wertebereichen.

Natürlich kann es auch sein, dass ein beliebiges Feld mit Texten, Zahlen oder Datums­angaben viele gleichartige Werte enthält.

In diesem Fall ist es vielleicht sinnvoll, statt eines Textfeldes ein Kombinationsfeld zum Filtern einzusetzen.

Diese könnte dann alle möglichen Werte in einer sinnvollen Reihenfolge zur Auswahl bereitstellen, um schnell die betroffenen Datensätze zu ermitteln – so sparen Sie dem Benutzer sogar noch die Eingabe des Suchbegriffs.

Filtern nach Textfeldern

Beginnen wir mit dem Filtern der Datensätze nach dem Inhalt eines Textfeldes, in diesem Fall Artikelname.

Zur Eingabe des Vergleichswertes legen Sie im Formularkopf ein Textfeld namens txtArtikelnameFilter an (siehe Bild 3).

Textfeld zur Eingabe eines Filterkriteriums für den Artikelnamen

Bild 3: Textfeld zur Eingabe eines Filterkriteriums für den Artikelnamen

Es gibt nun ein paar Fragen zu klären. Die erste ist: Soll der Benutzer selbst Platzhalter eingeben können oder möchten Sie entsprechende Elemente zur Benutzeroberfläche hinzufügen?

Eine weitere Möglichkeit wäre, standardmäßig bestimmte Platzhalter festzulegen, um beispielsweise alle Einträge zu filtern, deren Artikelname mit dem eingegebenen Ausdruck beginnt oder deren Artikelnamen den Ausdruck an beliebiger Stelle enthält.

Die zweite Frage ist: Wann soll gefiltert werden – nach der Eingabe eines jeden Zeichens oder erst nach Abschluss der Eingabe etwa durch Betätigen der Eingabetaste? Wir schauen uns beide Varianten an.

Einfacher Filter

Am einfachsten ist es, den Benutzer mit einem Textfeld zu konfrontieren, in das er den Vergleichswert für das zu filternde Feld einträgt. Wenn er die Eingabetaste betätigt, soll eine Ereignisprozedur ausgelöst werden, welche das Recordset des Unterformulars mit einem entsprechenden Filter versieht.

Ein passendes Ereignis für diesen Fall ist Nach Aktualisierung. Wechseln Sie also in den Entwurf des Formulars, markieren Sie das Textfeld txtArtikelnameFilter und wählen Sie für die Eigenschaft Nach Aktualisierung den Wert [Ereignisprozedur] aus.

Klicken Sie dann auf die Schaltfläche mit den drei Punkten (...), damit Access die Prozedur txtArtikelnameFilter_AfterUpdate anlegt. Diese ergänzen Sie wie in Bild 4 mit den folgenden Zeilen:

Diese Prozedur wird nach dem Aktualisieren des Inhalts des Textfeldes ausgelöst.

Bild 4: Diese Prozedur wird nach dem Aktualisieren des Inhalts des Textfeldes ausgelöst.

With Me!sfmArtikelFiltern.Form

     .Filter = "Artikelname = '" & Me!txtArtikelnameFilter & "'"

     .FilterOn = True

End With

Beim Definieren des Filterkriteriums, dass direkt der Filter-Eigenschaft des Unterformulars zugewiesen wird, gibt es nur wenig zu beachten: Es besteht aus dem Feldnamen, nach dem gefiltert werden soll, dem Vergleichsoperator (hier dem Gleichheitszeichen) und dem Vergleichswert. Bei Vergleichen mit Feldern, die Texte enthalten, müssen Sie den Vergleichswert in Anführungszeichen setzen. Dann setzt sich der Vergleichsausdruck so zusammen:

"Artikelname = '" & Me!txtArtikelnameFilter & "'"

Der Vergleichsausdruck muss insgesamt in Anführungszeichen eingefasst werden, da er als Literal an die Filter-Eigenschaft übergeben wird. Da der Vergleichsausdruck seinerseits in Anführungszeichen eingefasst werden muss, haben wir ein kleines Problem. Sie können es nämlich nicht einfach in die bereits in Anführungszeichen eingefassten Teile des Vergleichsausdrucks integrieren:

"Artikelname = "" & Me!txtArtikelnameFilter & """

Wenn Sie auf der Verwendung von Anführungszeichen bestehen, müssen Sie diese innerhalb von Anführungszeichen verdoppeln, also so:

"Artikelname = """ & Me!txtArtikelnameFilter & """"

In den meisten Fällen ist dies die einzige Möglichkeit. In diesem Fall wird der Vergleichsausdruck jedoch von der Jet-Engine verarbeitet, die etwa für die Bereitstellung von Daten aus Tabellen und Abfragen zuständig ist.

Und da die Filter-Eigenschaft letztlich ein SQL-Ausdruck ist, der von der Jet-Engine zur Bereitstellung der Daten verwendet wird, können Sie dort die unter Access-SQL zulässigen Zeichen verwenden.

Für das Anführungszeichen bedeutet dies, dass es auch durch ein Hochkomma ersetzt werden kann – dies erhöht in vielen Fällen die Übersicht und spart die Eingabe von teilweise bis zu sechs aufeinanderfolgenden Anführungszeichen.

Nach dem Auswerten des Ausdrucks entsteht etwa für den Vergleichswert Chai der folgende Vergleichs­ausdruck:

Artikelname = 'Chai'

Dies liefert beispielsweise genau den Datensatz zurück, dessen Feld Artikelname den Wert Chai enthält.

Platzhalter erlauben

Ein Wechsel in die Formularansicht und die Eingabe einiger Filterkriterien mit Platzhaltern zeigt, dass das Unterformular tatsächlich nur Datensätze für exakt übereinstimmende Vergleichsausdrücke liefert.

Das bedeutet, dass beispielsweise Platzhalter wirkungslos bleiben – siehe Bild 5.

Der einfache Vergleich akzeptiert keine Platzhalter.

Bild 5: Der einfache Vergleich akzeptiert keine Platzhalter.

Es wäre aber schon praktisch, wenn der Benutzer Platzhalter wie das Sternchen (*) einsetzen könnte. Dies lässt sich durch eine kleine Änderung erreichen.

Wir legen ein neues Textfeld namens txtArtikelnameMitPlatzhalter im Formularkopf an und erstellen auch für dieses eine Ereignisprozedur, die durch das Ereignis Nach Aktualisierung ausgelöst wird.

Der einzige Unterschied ist, dass wir im Vergleichsausdruck das Gleichheitszeichen durch den LIKE-Operator ersetzen:

.Filter = "Artikelname LIKE '" & Me!txtArtikelnameFilter & "'"

Dies führt dazu, dass ein Suchbegriff wie C* alle Datensätze liefert, deren Artikelnamen mit C beginnen (siehe Bild 6).

Mit Platzhaltern macht das Suchfeld mehr Sinn.

Bild 6: Mit Platzhaltern macht das Suchfeld mehr Sinn.

Leeres Suchfeld

Gelegentlich möchte der Benutzer nach erfolgtem Suchen wieder alle Datensätze auf einen Blick sehen. Dazu gibt es wiederum mehrere Möglichkeiten. Die benutzerfreundlichste ist sicher die, bei der Sie diesem eine Schaltfläche mit der Beschriftung Alle anzeigen anbieten. Diese Schaltfläche heißt dann cmdAlleAnzeigen und löst eine Prozedur für das Ereignis Beim Klicken aus. Diese sieht wie folgt aus:

Private Sub cmdAlleAnzeigen_Click()

     Me!sfmArtikelFiltern.Form.Filter = ""

End Sub

Damit leeren Sie die Filter-Eigenschaft und das Unterformular zeigt wieder alle Datensätze an. Um die Eigenschaft FilterOn brauchen Sie sich nicht zu kümmern: Diese stellt Access automatisch auf den Wert False ein, wenn die Filter-Eigenschaft geleert wird.

Sie werden jedoch nicht umhin kommen, für den Fall vorzusorgen, dass der Benutzer das Textfeld für den Suchbegriff leert und so wieder alle Datensätze anzeigen möchte.

Im aktuellen Zustand sorgt das Leeren etwa des Textfeldes txtArtikelnameMitPlatzhalter dafür, dass folgender Ausdruck als Filter verwendet wird:

Artikelname LIKE ''

Dies entspricht allen Artikeln, deren Feld Artikelname eine leere Zeichenkette enthält. Solche Artikel gibt es nicht, also liefert das Unterformular eine leere Ergebnismenge.

Sie müssen also vor dem Filtern prüfen, ob der Benutzer überhaupt einen Wert eingegeben hat. Dazu fügen Sie der Prozedur eine If...Then...Else-Bedingung hinzu, die wie folgt aussieht:

If Not Len(strFilter) = 0 Then

     'Anweisungen bei vorhandenem Vergleichsausdruck

Else

     Me!sfmArtikelFiltern.Form.Filter = ""

End If

Die Bedingung prüft, ob strFilter mindestens ein Zeichen enthält (Länge größer als 0). Falls ja, werden die bereits bekannten Anweisungen zum Einstellen des Filters durchgeführt. Falls nicht, stellt die Prozedur den Filter auf eine leere Zeichenkette ein, was zur Anzeige aller Datensätze der Datenherkunft führt.

Vergleichsausdruck in Variable speichern

Mitunter werden Vergleichsausdrücke sehr komplex. Manchmal funktionieren aber auch einfachste Vergleichsausdrücke unerwarteterweise nicht wie erwartet. Es ist also immer sinnvoll, den Vergleichsausdruck in einer Variablen zu speichern.

Sie können diesen dann leicht überwachen oder per Debug.Print ausgeben lassen. Die Ereignisprozedur für das Textfeld txtArtikelnameMitPlatzhalter würden Sie dann beispielsweise wie folgt anpassen:

Private Sub txtArtikelnameMitPlatzhalter_AfterUpdate()

     Dim strFilter As String

     strFilter = "Artikelname LIKE '" & Me!txtArtikelnameMitPlatzhalter & "'"

     With Me!sfmArtikelFiltern.Form

         .Filter = strFilter

         .FilterOn = True

     End With

End Sub

Die Variable strFilter nimmt den kompletten Vergleichsausdruck auf und übergibt diesen dann an die Filter-Eigenschaft des Unterformulars. Mit der folgenden Zeile, eingefügt hinter der Zeile mit der Zuweisung, könnten Sie diesen dann im Direktfenster ausgeben:

Debug.Print strFilter

Die Ausgabe im Direktfenster sähe dann so aus:

Artikelname LIKE 'C*'

Filtern per Schaltfläche

Wenn Sie später einmal mehrere Kriterien festlegen, soll die Suche nicht gleich nach der Eingabe eines Vergleichsausdrucks für eines der Kriterien ausgeführt werden. Stattdessen fügen Sie eine Schaltfläche ein, die den Filtervorgang auslöst. Bild 7 zeigt, wie dies für ein einfaches Suchfeld und eine entsprechende Schaltfläche aussieht.

Suchen per Schaltfläche

Bild 7: Suchen per Schaltfläche

Die Schaltfläche heißt cmdFiltern und erhält eine Ereignisprozedur, die durch das Ereignis Beim Klicken ausgelöst wird. Die Prozedur führt prinzipiell genau die gleichen Schritte aus wie die aus dem vorherigen Beispiel. Der einzige Unterschied ist, dass sie durch ein anderes Ereignis ausgelöst wird.

Im Suchfeld bleiben

Wenn Sie die Eingabetaste betätigen, löst dies zwar die Suche aus – allerdings springt der Fokus auch zum nächsten Steuerelement. Wenn Sie jedoch den Suchbegriff schrittweise anpassen möchten, wäre es hilfreich, wenn die Einfügemarke im Suchfeld verbleibt und Sie den Filterausdruck direkt weiterbearbeiten können.

Dazu müssen Sie auf irgendeine Weise verhindern, dass die eigentlich durch das Betätigen der Eingabetaste ausgelöste Aktion, nämlich das Abschließen der Eingabe und somit der Sprung zum nächsten Steuerelement, ausgeführt wird. Die folgenden Schritte haben wir am Beispiel des Textfeldes txtArtikelnameFokusBehalten durchgeführt.

Wenn Sie einmal in die Liste der Ereigniseigenschaften dieses Textfeldes schauen, finden Sie dort unter anderem die beiden Einträge Bei Taste ab und Bei Taste auf. Das erste Ereignis wird ausgelöst, wenn das Textfeld den Fokus besitzt und der Benutzer eine Taste herunterdrückt, die zweite wird beim Loslassen der Taste ausgelöst. Nun müssen wir noch ermitteln, wann genau der Fokus beim Drücken der Eingabetaste auf das nächste Steuerelement verschoben wird. Dies finden wir experimentell heraus und stellen fest: Schon beim Niederdrücken der Eingabetaste springt Access zum nächsten Steuerelement. Also verwenden wir dieses Ereignis, um das Verhalten zu ändern. Sprich: Der Fokus soll nicht zum nächsten Steuerelement verschoben, der Filtervorgang jedoch dennoch durchgeführt werden.

Die notwendige Prozedur sieht wie in Listing 1 aus. Die Prozedur nimmt den Parameter KeyCode entgegen, der einen der gedrückten Taste entsprechenden Zahlenwert enthält. Im Falle der Eingabetaste ist dies die Zahl 13. Hat der Benutzer also die Eingabetaste gedrückt, werden die im entsprechenden Zweig der Select Case-Anweisung enthaltenen Befehle ausgeführt.

Private Sub txtArtikelnameFokusBehalten_KeyDown(KeyCode As Integer, Shift As Integer)

     Select Case KeyCode

         Case 13

             txtArtikelnameFokusBehalten_AfterUpdate

             KeyCode = 0

     End Select

End Sub

Listing 1: Eingabetasteverhalten unterbinden

Der erste sorgt dafür, dass der Filtervorgang ausgeführt wird. Dazu ruft er die gleiche Prozedur auf, die sonst nach dem Aktualisieren des Textfeldinhalts ausgelöst wird. Im zweiten Schritt stellt die Prozedur den Wert des Parameters KeyCode auf den Wert 0 ein. Dadurch wird der Tastendruck unterdrückt und der Fokus wird nicht an das folgende Steuerelement weitergegeben. Dies ist nun nur noch mit der Tab-Taste möglich.

In der Prozedur txtArtikelnameFokusBehalten sind auch noch zwei kleine Anpassungen nötig. Dies ist in der Tatsache begründet, dass der Wert dieses Textfeldes erst nach der Aktualisierung über die Referenz Me!txtArtikelnameFokusBehalten möglich ist (was eigentlich eine Abkürzung für Me!txtArtikelnameFokusBehalten.Value ist).

Wenn sie aber das Betätigen der Eingabetaste wie in diesem Beispiel ins Leere laufen lassen, wird der enthaltene Wert auch nicht aktualisiert. Das ist aber kein Problem: Sie können dann über die Text-Eigenschaft des Textfeldes auf seinen Inhalt zugreifen, also mit dem Ausdruck Me!txtArtikelnameFokusBehalten.Text. Die entsprechenden Stellen sind im Listing aus Listing 2 fett markiert.

Private Sub txtArtikelnameFokusBehalten_AfterUpdate()

     Dim strFilter As String

     If Not Len(Me!txtArtikelnameFokusBehalten.Text) = 0 Then

         strFilter = "Artikelname LIKE '" & Me!txtArtikelnameFokusBehalten.Text & "'"

         With Me!sfmArtikelFiltern.Form

             .Filter = strFilter

             .FilterOn = True

         End With

     Else

         Me!sfmArtikelFiltern.Form.Filter = ""

     End If

End Sub

Listing 2: Durchführen des Filtervorgangs

Schnelle Suche

Eine weiterer Option ist die schnelle Suche, die bei der Eingabe eines jeden Zeichen im Textfeld txtArtikelnameSchnell das Suchergebnis aktualisiert.

Das Setzen des Filters wird in diesem Beispiel einmal durch ein anderes Ereignis angestoßen. Es handelt sich dabei um das Ereignis Bei Änderung, dass bei jeder Änderung des enthaltenen Ausdrucks ausgelöst wird.

Hinterlegen Sie für diese Ereigniseigenschaft eine Prozedur wie in Listing 3.

Private Sub txtArtikelnameSchnell_Change()

     Dim strFilter As String

     Dim strSuche As String

     strSuche = Me!txtArtikelnameSchnell.Text

     If Not Len(strSuche) = 0 Then

         strFilter = "Artikelname LIKE '" & strSuche & "'"

         With Me!sfmArtikelFiltern.Form

             .Filter = strFilter

             .FilterOn = True

         End With

     Else

         Me!sfmArtikelFiltern.Form.Filter = ""

     End If

End Sub

Listing 3: Schnelle Suche

Die Prozedur liest zunächst den aktuellen Text des Textfeldes in die Variable strSuche ein und prüft, ob diese überhaupt einen Suchbegriff enthält. Falls ja, stellt sie auf gewohnte Weise den Filterausdruck zusammen und wendet diesen auf das Unterformular an.

In diesem Fall wäre es natürlich sinnvoll, den Vergleichswert standardmäßig mit einem Platzhalter auszustatten. Anderenfalls liefert das Unterformular etwa bei Eingabe eines einfachen Buchstaben direkt eine leere Artikelliste (außer, es gibt einen Artikel, dessen Name genau auf diesen Buchstaben lautet). Sie würden dann den Filterausdruck etwas anders formulieren – nämlich mit einem geeigneten Platzhalter am Ende des Ausdrucks:

strFilter = "Artikelname LIKE '" & strSuche & "*'"

Wenn der Benutzer nun beispielsweise den Buchstaben C als Vergleichswert eingibt, lautet der Filterausdruck so:

Artikelname LIKE 'C*'

Dies liefert alle Artikel, deren Name mit dem Buchstaben C beginnt.

Position des Vergleichsausdrucks festlegen

Im letzten Beispiel bieten wir dem Benutzer die Möglichkeit, die Position des Vergleichsausdrucks im Artikelnamen ohne Einsatz von Platzhaltern festzulegen. Er kann dann angeben, ob der Ausdruck zu Beginn, am Ende oder irgendwo enthalten sein soll. Dazu legen Sie wie in Bild 8 eine Optionsgruppe namens ogrPosition an. Diese enthält die drei in der Abbildung erkennbaren Optionen, wobei diese von links nach rechts mit den Werten -1, 1 und 0 ausgestattet werden (Eigenschaft Optionswert des jeweiligen Optionsfeldes). Das Textfeld für dieses Beispiel heißt txtArtikelnamePosition.

Position des Platzhalters per Optionsgruppe einstellen

Bild 8: Position des Platzhalters per Optionsgruppe einstellen

Damit das Suchergebnis beim Ändern der Einstellung der Optionsgruppe angepasst wird, rufen Sie in der Ereignisprozedur, die durch das Ereignis Nach Aktualisierung der Optionsgruppe ausgelöst wird, die Prozedur txtArtikelnamePosition auf:

Private Sub ogrPosition_AfterUpdate()

     txtArtikelnamePosition_AfterUpdate

End Sub

Diese Prozedur ist grundsätzlich so aufgebaut wie die entsprechende Prozedur der übrigen Textfelder. Allerdings muss hier ja noch die in der Optionsgruppe ogrPosition festgelegte Option ausgewertet und bei der Zusammenstellung des Filterausdrucks berücksichtigt werden.

Dabei speichert auch diese Prozedur (siehe Listing 4) wieder den Vergleichswert aus dem Textfeld in der Variablen strSuche zwischen. Enthält diese Variable eine Zeichenkette mit einer Länge größer als 0, ruft die Prozedur als nächstes eine Select Case-Bedingung auf. Diese prüft den Wert der Optionsgruppe ogrPosition und fügt je nach Ergebnis einen oder mehrere Platzhalter an den Vergleichswert an.

Private Sub txtArtikelnamePosition_AfterUpdate()

     Dim strFilter As String

     Dim strSuche As String

     strSuche = Me!txtArtikelnamePosition

     If Not Len(strSuche) = 0 Then

         Select Case Me!ogrPosition

             Case -1

                 strSuche = strSuche & "*"

             Case 1

                 strSuche = "*" & strSuche

             Case 0

                 strSuche = "*" & strSuche & "*"

         End Select

         strFilter = "Artikelname LIKE '" & strSuche & "'"

         With Me!sfmArtikelFiltern.Form

             .Filter = strFilter

             .FilterOn = True

         End With

     Else

         Me!sfmArtikelFiltern.Form.Filter = ""

     End If

End Sub

Listing 4: Verarbeiten der Optionsgruppe beim Zusammenstellen des Filterausdrucks

Hat die Optionsgruppe den Wert -1, was darauf hindeutet, dass der Benutzer den Eintrag Am Anfang gewählt hat, fügt die Prozedur dem Wert in strSuche ein Sternchen am Ende hinzu. Aus C wird so C*.

Hat die Optionsgruppe den Wert 1, wird das Sternchen vorn an strSuche angefügt und der Filter liefert alle Datensätze, deren Artikelname mit der angegebenen Zeichenkette endet. Und falls der Wert der Optionsgruppe 0 ist, soll das Unterformular alle Datensätze anzeigen, die den Suchbegriff an beliebiger Stelle enthalten. Zu diesem Zweck wird strSuche vorn und hinten um ein Sternchen ersetzt.

Zusammenfassung und Ausblick

In diesem Teil der Artikelreihe haben Sie einige Möglichkeiten kennengelernt, um Datensätze nach dem Inhalt eines Textfeldes zu filtern. In den folgenden Teilen kümmern wir uns um die Vorgehensweise beim Filtern nach Datumswerten, nach Zahlen und nach Ja/Nein-Feldern. Und zum Schluss kombinieren wir die verschiedenen Filterarten.