Schnelles Filtern in Unterformularen

Unterformulare zeigen meist mehrere Felder mit Daten in der Datenblatt- oder Endlosansicht an. Der vorliegende Beitrag zeigt, wie Sie schnell nach Begriffen in den im Unterformular angezeigten Daten suchen – ohne zwischendurch die Eingabetaste oder eine Suchen-Schaltfläche betätigen zu müssen.

Warum soll man eigentlich Daten in Unterformularen vom Hauptformular aus filtern oder durchsuchen können Die Antwort ist einfach: Wenn das Unterformular die Daten etwa in der Datenblattansicht zeigt, ist die Unterbringung der für die Filter- oder Suchfunktion notwendigen Steuerelemente schlicht unmöglich, weil Access Kopf- und Fußbereiche von Formularen in der Datenblattansicht ausblendet.

Also bringt man Daten, die man in der Datenblattansicht anzeigen möchte, in einem eigenen Formular unter, das als Unterformular eines weiteren Formulars mit den notwendigen Steuerelementen dient. Bild 1 zeigt das in diesem Beitrag vorgestellte Formular samt Unterformular.

pic001.tif

Bild 1: Haupt- und Unterformular mit Suchfunktion

Beispieldaten

Die Daten für dieses Beispiel stammen aus der Tabelle tblParameter, die für das Speichern von Anwendungseinstellungen verantwortlich ist. In diesem Fall stammt diese Tabelle aus der Vertragsverwaltung [1] und enthält einige Konfigurationsdaten für einen Scanner (siehe Bild 2). Das Unterformular enthält diese Tabelle als Datenherkunft und heißt sfmParameter; ziehen Sie alle Felder aus der Feldliste in den Detailbereich und stellen Sie außerdem die Standardansicht auf Datenblatt ein. Gegebenenfalls passen Sie noch die Bezeichnungsfelder an, deren Inhalt in die Kopfzeile der Datenblattansicht übernommen wird. Für eine bessere Optik empfiehlt sich die Anpassung an die Schriftgröße im Hauptformular (Schriftgröße 8). Fügen Sie das Unterformular in ein weiteres Formular namens frmParameter ein und statten Sie dieses mit einem zusätzlichen Textfeld namens txtSuchbegriff aus.

pic002.tif

Bild 2: Das Unterformular sfmParameter

Filterfunktion hinzufügen

Nun fehlt nur noch die Filterfunktion: Dazu legen Sie für das Ereignis Bei änderung des Textfeldes txtSuchbegriff einfach die Routine aus Listing 1 an. Das Ereignis Bei änderung wird bei jeder änderung des im Textfeld angezeigten Textes ausgelöst – also sowohl beim Eingeben als auch beim Löschen eines Buchstabens.

Listing 1: Auswerten des Filterkriteriums und filtern des Unterformulars

Private Sub txtSuchbegriff_Change()
     Dim strSuchbegriff As String
     strSuchbegriff = Me!txtSuchbegriff.Text
     If Len(strSuchbegriff) > 0 Then
         Me!sfmParameter.Form.Filter = _
"Parameter LIKE "*" _
& strSuchbegriff _
& "*' OR Wert LIKE "*"
& strSuchbegriff & "*'" Me!sfmParameter.Form.FilterOn = True Else Me!sfmParameter.Form.FilterOn = False End If End Sub

Der Clou ist nun, dass Sie nicht den Wert des Textfeldes txtSuchbegriff über die Eigenschaft Value abfragen (die im übrigen die Standardeigenschaft von Textfeldern ist und daher nicht explizit angegeben werden müsste), sondern mit der Eigenschaft Text den aktuell im Textfeld befindlichen Text – und das ist sehr wohl ein Unterschied. Die Eigenschaft Value wird nämlich erst nach dem Aktualisieren des Textfeldes – etwa durch das Verlassen des Textfeldes per Eingabetaste, Tabulator-Taste oder durch Anklicken eines anderen Steuerelements mit der Maus – auf den im Textfeld angezeigten Wert geändert. Bis dahin lässt sich dieser Inhalt nur über die Eigenschaft Text abfragen. Die Verwendung der Ereigniseigenschaft Bei änderung hat einen weiteren Vorteil: Um sie auszulösen, müssen Sie das Textfeld nicht verlassen und können direkt weitere änderungen am Filterkriterium vornehmen.

Die Routine liest also den aktuellen Inhalt des Textfeldes ein und speichert ihn in einer Variablen, da dieser Wert noch an drei Stellen benötigt wird und der Zugriff auf eine Variable an dieser Stelle schneller ist als das wiederholte Abfragen des Steuerelements. Wenn die Länge des Suchbegriffs größer als 0 ist, aktiviert die Routine den Filter des Unterformulars, und zwar mit einem Filterkriterium, das in diesem Fall die Felder Parameter und Wert nach dem angegebenen Suchkriterium untersucht. Dabei wird jedes Vorkommen – auch innerhalb der Feldinhalte – berücksichtigt. Das Setzen der Eigenschaft FilterOn auf den Wert True aktiviert schließlich den Filter. Wenn das Textfeld txtSuchbegriff eine leere Zeichenkette enthält, deaktiviert die Routine den Filter einfach – ein Leeren der Filter-Eigenschaft ist nicht nötig.

Probieren Sie diesen schnellen Filter einmal aus – es hilft manchmal ungemein, die Daten einfach einmal auf die Schnelle einzuschränken, um zum gesuchten Datensatz zu kommen.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar