Home > Artikel > Ausgabe 6/2014 > Datensätze filtern per Kombinationsfeld

Datensätze filtern per Kombinationsfeld

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Wenn Sie ein Kombinationsfeld etwa zum Filtern von Artikeln nach einer bestimmten Kategorie verwenden, können Sie jeweils eine Gruppe von Artikeln anzeigen. Was aber, wenn Sie anschließend wieder alle Artikel anzeigen möchten? Für diesen Fall können Sie dem Kombinationsfeld einen Eintrag etwa mit dem Wert hinzufügen. Dessen Auswahl führt dann zur Aufhebung des jeweiligen Filters. Wir zeigen Ihnen, wie dies funktioniert.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1406_DatensaetzeFilternPerKombinationsfeld.mdb.

Wenn Sie in einem Unterformular oder in einem Listenfeld die Übersicht über die Daten einer Tabelle oder Abfrage darstellen, die sich nach verschiedenen Kriterien gruppieren lassen, kann es sinnvoll sein, diese nach diesem Kriterium zu filtern. Im Beispiel schauen wir uns eine Übersicht aller Artikel einer Datenbank an, die nach der Kategorie gefiltert werden können.

Das Formular frmArtikeluebersicht zeigt die Artikel im Unterformular sfmArtikeluebersicht in der Datenblattansicht an.

Die Tabelle tblArtikel, die dort als Datenherkunft dient, verwendet ein Nachschlagefeld namens KategorieID zur Auswahl eines der Datensätze der verknüpften Tabelle tblKategorien (weitere Informationen zum Aufbau dieses Formulars erhalten Sie im Artikel Datenübergabe zwischen Formularen).

Kombinationsfeld zum Filtern

Genau nach den Daten dieses Feldes wollen wir nun über ein Kombinationsfeld im Hauptformular filtern. Das bedeutet, dass wir im Kombinationsfeld alle Datensätze der Tabelle tblKategorien anbieten. Dieses Kombinationsfeld platzieren wir wie in Bild 1 oben im Formular und legen die Bezeichnung cboKategorien fest.

Kombinationsfeld zum Filtern nach einer Kategorie

Bild 1: Kombinationsfeld zum Filtern nach einer Kategorie

Damit dieses alle Kategorien anzeigt, stellen wir die Eigenschaft Datensatzherkunft auf eine entsprechende Abfrage ein. Diese sieht wie in Bild 2 aus. Die Abfrage liefert alle Datensätze der Tabelle tblKategorien, wobei diese nach dem Wert des Feldes Kategorie aufsteigend sortiert werden.

Datensatzherkunft des Kombinationsfeldes cboKategorien

Bild 2: Datensatzherkunft des Kombinationsfeldes cboKategorien

Damit das Kombinationsfeld nur das Feld mit den Bezeichnungen der Kategorien anzeigt, aber nicht den Inhalt des Primärschlüsselfeldes, stellen Sie außerdem die Eigenschaft Spaltenanzahl auf den Wert 2 und Spaltenbreiten auf 0cm ein. Dadurch ist das Feld KategorieID zwar Bestandteil der Datensatzherkunft des Kombinationsfeldes und liefert auch den Wert der gebundenen Spalte des ausgewählten Datensatzes, aber es ist nicht sichtbar. Das Kombinationsfeld zeigt seine Daten nun wie in Bild 3 an.

Auswahl einer der Kategorien als Filter für die angezeigten Datensätze im Unterformular

Bild 3: Auswahl einer der Kategorien als Filter für die angezeigten Datensätze im Unterformular

Unterformular filtern

Nun soll das Unterformular nach der Auswahl nur die Artikel anzeigen, die zur ausgewählten Kategorie gehören.

Zum Verständnis sind zwei Hinweise notwendig: Sowohl das Kombinationsfeld zur Auswahl der als Filter zu verwendenden Kategorie als auch das Feld mit der jeweiligen Kategorie der Artikel im Unterformular enthalten nicht die Kategorien, sondern lediglich die Primärschlüsselfelder der Werte der Tabelle tblKategorien.

Wir müssen also den Filter für die Datenherkunft des Unterformulars so einstellen, dass das Feld KategorieID als Vergleichswert den Zahlenwert aus dem Kombinationsfeld cboKategorien erhält.

Die Kurzfassung erfordert lediglich zwei Befehle (siehe Listing 1). Der erste stellt die Eigenschaft Filter des im Unterformularsteuerelements (sfm­Ar­ti­keluebersicht) enthaltenen For­mulars (Form) im aktuellen Formular (Me) auf den folgenden Ausdruck ein:

Private Sub cboKategorien_AfterUpdate()

     Me!sfmArtikeluebersicht.Form.Filter = "KategorieID = " & Me!cboKategorien

     Me!sfmArtikeluebersicht.Form.FilterOn = True

End Sub

Listing 1: Unterformular nach einem Wert eines Steuerelements im Hauptformular filtern

"KategorieID = " & Me!cboKategorien

Wenn das Kombinationsfeld (Me!cboKategorien) beispielsweise den Wert 1 enthält, sieht der Filterausdruck so aus:

KategorieID = 1

Der zweite Befehl aktiviert den Filter, indem er die Eigenschaft FilterOn auf den Wert True einstellt.

Dies ließe sich noch etwas übersichtlicher formulieren (siehe Listing 2). Wenn Sie beginnen, in VBA mit Ausdrücken wie mit diesem Filterausdruck zu arbeiten, sollten Sie den Filterausdruck bei Bedarf im Direktfenster ausgeben können. Dazu verwenden wir hier die Variable strFilter. Diese füllt die Prozedur zunächst mit dem ausgewerteten Ausdruck "Kategorie = " & Me!cboKategorien und gibt dann den Inhalt der Variablen im Direktfenster aus (zum Beispiel Kategorie = 1).

Private Sub cboKategorien_AfterUpdate()

     Dim strFilter As String

     strFilter = "KategorieID = " & Me!cboKategorien

     Debug.Print strFilter

     With Me!sfmArtikeluebersicht.Form

         .Filter = strFilter

         .FilterOn = True

     End With

End Sub

Listing 2: Übersichtlichere Variante mit der Möglichkeit, den Filterausdruck im Direktfenster auszugeben

Anschließend haben wir die beiden doch eher länglichen Ausdrücke zum Zuweisen und Aktivieren des Filters entzerrt, indem wir mit der With-Anweisung das Objekt benennen, auf das sich die folgenden Eigenschaften beziehen. Wie Bild 4 zeigt, funktioniert das Filtern bereits wie gewünscht.

Filtern nach einer der Kategorien

Bild 4: Filtern nach einer der Kategorien

Filter aufheben

Nun kann es allerdings geschehen, dass der Benutzer den Filter wieder aufheben möchte. Aus Mangel an entsprechenden Einträgen wird er vermutlich den Inhalt des Kombinationsfeldes cboKategorien von Hand leeren und die Eingabetaste betätigen.

Dies führt dummerweise zu dem Fehler aus Bild 5. Was ist hier passiert? Nun: Das Kombinationsfeld weist keinen Eintrag auf, dessen Wert in der zweiten Spalte der Datensatzherkunft eine leere Zeichenkette enthält. Daher leert Access das Kombinationsfeld schlicht und einfach. Für die Zusammenstellung des Filterkriteriums in der Variablen strFilter ist das noch kein Problem – dieses sieht dann so aus:

Fehler beim Leeren des Kombinationsfeldes zum Filtern

Bild 5: Fehler beim Leeren des Kombinationsfeldes zum Filtern

KategorieID =

Wenn Sie diesen Ausdruck allerdings der Eigenschaft Filter des Unterformulars zuweisen, löst dies den in der Abbildung dargestellten Syntaxfehler aus. Diese erwartet nämlich einen Vergleichswert, der hier allerdings nicht vorliegt.

Leeres Kombinationsfeld abfangen

Also müssen wir uns etwas überlegen, um diesen Fehler zu verhindern. Die einfachste Methode wäre es, gleich eingangs der Prozedur zu prüfen, ob der Benutzer überhaupt einen Wert für das Kombinationsfeld cboKategorien ausgewählt hat (siehe Listing 3).

Private Sub cboKategorien_AfterUpdate()

     Dim strFilter As String

     If Not IsNull(Me!cboKategorien) Then

         strFilter = "KategorieID = " & Me!cboKategorien

         Debug.Print strFilter

         With Me!sfmArtikeluebersicht.Form

             .Filter = strFilter

             .FilterOn = True

         End With

     Else

         Me!sfmArtikeluebersicht.Form.Filter = ""

     End If

End Sub

Listing 3: Diese Version der Prozedur erlaubt auch das Leeren des Kombinationsfeldes

Das Kombinationsfeld zu leeren bedeutet nämlich, dass dieses den Wert Null aufweist – dies ist gleichbedeutend mit "leer".

Sie können diesen Wert zur Laufzeit über das VBA-Direktfenster abfragen. Schließen Sie das Formular frmArtikeluebersicht und öffnen Sie es erneut, damit das Kombinationsfeld leer ist. Aktivieren Sie nun mit der Tastenkombination Strg + G das Direktfenster und geben Sie die folgende Anweisung ein:

Forms!frmArtikeluebersicht!cboKategorien

Dies liefert wie in Bild 6 den Wert Null als Ergebnis.

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!