Im Beitrag „Filterbedingungen einfach zusammenstellen“ erfahren Sie weiter hinten in dieser Ausgabe, wie Sie den fehleranfälligen Code für die Zusammenstellung von Filterausdrücken in eine Klasse auslagen und übersichtlicher gestalten. Der vorliegende Beitrag zeigt nun anhand eines Praxisbeispiels, wie Sie die gewonnenen Erkenntnisse und die verwendete Klasse in Access-Formularen zum Filtern der enthaltenen Daten einsetzen.
Praxisbeispiel
In der Suedsturm-Datenbank gibt es die Tabelle tblBestellungen. Die Daten aus dieser Tabelle sollen in einem Bestellübersichtsformular angezeigt und gefiltert werden. Filtern wollen wir nach Kundenname, Lieferadresse, Bestelldatum, Lieferdatum, Versanddatum, offene Lieferung und bestellte Artikel.
Für die Darstellung der Suchmaske und der Ergebnisliste wählen wir ein ungebundenes Hauptformular (frmBestell-uebersicht) mit ungebundenen Steuerelementen für die Filtereingabe. In das Hauptformular fügen wir ein Formular in Datenblattansicht (frmBestellUebersicht_SF_Bestellungen) als Unterformular ein.
Als Datenquelle für das Unterformular verwenden wir die Abfrage qryBestellListe. Für die Eingabe der Filterwerte fügen wir im Formularkopf des Hauptformulars entsprechende Steuerelemente ein. Eine Schaltfläche dient zum Anwenden der Filterwerte.
Als Alternative zur Schaltfläche fügen wir noch eine Checkbox ein, mit der wir eine automatische Filterung nach jeder Filterwert-änderung aktivieren können. Zum Entfernen aller eingegeben Filterwerte dient eine weitere Schaltfläche. In Bild 1 sehen Sie das Filterformular direkt nach dem öffnen. Damit im Unterformular direkt nach dem öffnen keine Datensätze angezeigt werden, ist in der Formular-Eigenschaft Filter der Ausdruck 1=0 eingetragen.
Bild 1: Filterformular
Die Namen der Filtersteuerelemente beginnen alle mit dem Präfix fctl. Das erleichtert uns später im Code das Ansprechen der Steuerelemente in For Each-Schleifen.
Variante I: Filtern ohne Hilfsklasse
Erstellen wir als erste Variante den Code zum Filtern ohne Verwendung von Hilfsklassen. Wenn auf die Schaltfläche Filter anwenden geklickt wird, soll das Unterformular gefiltert werden.
Damit der Code im Formular übersichtlich bleibt, erstellen wir die Prozedur UseFilter zum Starten des Filtervorgangs und rufen diese in der Beim Klicken-Ereignisbehandlung der Schaltfläche auf.
In der UseFilter-Prozedur übergeben wir den über eine weitere Prozedur erzeugten Filterausdruck an das Unterformular.
Den vollständigen Inhalt der Prozedur CreateFilterString zur Filtertext-Erstellung werden wir später ergänzen. Zuerst geben wir zum Testen nur den Filterausdruck für den Filterwert in Firma zurück. Mit diesem Code können wir bereits einen ersten Test durchführen.
Dabei ruft die Ereignisprozedur, die durch das Ereignis Beim Klicken der Schaltfläche cmdUseFilter ausgelöst wird, eine weitere Routine namens UseFilter auf:
Private Sub cmdUseFilter_Click() UseFilter End Sub
Diese startet eine weitere Prozedur namens SetSubFormFilter und übergibt als Parameter einen Wert, der von der Funktion CreateFilterString beigesteuert wird und wie folgt aussieht:
Private Sub UseFilter() '' Diese Prodedur startet die Filterung mit den Werten '' in den Filter-Steuerelementen Call SetSubFormFilter(CreateFilterString) End Sub
Diese sieht wie in Listing 1 aus.
Private Function CreateFilterString() As String ''Diese Prozedur erzeugt den Filterausdruck ''aus den Filter-Steuerelementen With Me.fctlKundeFirma If Len(.Value) > 0 Then CreateFilterString = "Kunde_Firma LIKE ''" _ & Replace(.Value, "''", "''''") & "''" Else CreateFilterString = vbNullString End If End With End Function
Listing 1: Zusammensetzen des Filterausdrucks
Die Funktion prüft, ob das Filter-Textfeld fctlKundeFirma einen Wert enthält (Len(.Value) > 0). Falls ja, stellt sie einen Filterausdruck zusammen und gibt diesen als Funktionswert zurück.
Die Prozedur SetSubFormFilter nimmt diesen Filterstring entgegen und prüft, ob dieser bereits angewendet wurde. Dazu vergleicht sie den Wert der Eigenschaft Filter mit FilterString.
Nur wenn es sich um einen neuen Filter-Ausdruck handelt, wird FilterString der Eigenschaft Filter zugewiesen und der Filter mit der Eigenschaft FilterOn aktiviert oder deaktiviert – je nachdem, ob FilterString einen Ausdruck enthält oder nicht (s. Listing 2).
Private Sub SetSubFormFilter(ByVal FilterString As String) ''Diese Prozedur kapselt die Datenfilterung im ''Unterformular ''Vorteil: wenn man auf eine andere Variante filtern ''will, muss man nur diese Prozedur ändern With Me.sfrBestellListe.Form If .Filter <> FilterString Then ''eine änderung ist nur notwendig, ''wenn der Filtertext nicht gleich ist .Filter = FilterString .FilterOn = (Len(FilterString) > 0) End If End With End Sub
Listing 2: Die Prozedur zum Setzen des Filters
Wenn Sie im Textfeld für den Firma-Filterwert einen Text eintragen, wird nach diesem Text gefiltert, sobald Sie auf die Schaltfläche Filter anwenden klicken. Sie können das Textfeld auch leer lassen und filtern. Dann werden alle Datensätze aus der Tabelle angezeigt.
Als Nächstes ergänzen wir den Code zum Leeren der Filtersteuerelemente. Da wir die Namen der Filtersteuerelemente mit dem Präfix fctl versehen haben, können wir die Formularsteuerelemente mittels For Each-Schleife durchlaufen und alle Filterfelder leeren.
Außerdem wollen wir nach dem Löschen der Filterwerte nicht alle Datensätze anzeigen, sondern im Unterformular keine Daten anzeigen, damit erkennbar ist, dass noch nicht gefiltert wurde.
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