In den ersten beiden Teilen dieser Artikelreihe haben Sie erfahren, wie Sie Felder der verschiedenen Datentypen filtern. Nun geht es ans Eingemachte: Wir filtern nach dem Inhalt von Kombinationsfeldern. Eigentlich könnte dies ganz leicht sein: Der Benutzer wählt einfach eine Wert des Kombinationsfeldes aus und die Datenherkunft wird nach dem Wert im entsprechenden Feld gefiltert. Allerdings kann es ja auch geschehen, dass man nicht nach dem Wert des gebundenen Feldes im Kombinationsfeld, sondern nach dem angezeigten Wert filtern möchte. Wir schauen uns beide Fälle an.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 1306_FilterkriterienFuerFormulare.mdb.
Beispielformular
Das Beispielformular sieht wie in Bild 1 aus. Es heißt frmFilternNachKombinationsfeld und enthält im Formularkopf ein Kombinationsfeld namens cboLieferantNachID und ein Textfeld namens txtLieferantNachName.
Bild 1: Formular zum Filtern nach Kombinationsfeldern und ihren Inhalten
Im Detailbereich haben wir ein Unterformular namens frmFilternNachKombinationsfeld eingerichtet, das die Daten der Tabelle tblArtikel anzeigt.
Filtern nach der gebundenen Spalte
Das Kombinationsfeld cboLieferantNachID soll nach der Auswahl eines Eintrags direkt diejenigen Artikel im Unterformular anzeigen, die vom angegebenen Lieferanten geliefert werden. Dazu muss das Kombinationsfeld allerdings erst einmal alle Lieferanten anzeigen. Diese können Sie auf zwei Arten beziehen:
- Erstens über die Tabelle tblLieferanten. Dies würde alle Lieferanten liefern, die überhaupt vorhanden sind.
- Zweitens über eine Abfrage, welche die Tabellen tblArtikel und tblLieferanten verknüpft. Auf diese Weise würde das Kombinationsfeld nur diejenigen Lieferanten anzeigen, die aktuell einem Artikel zugeordnet sind.
Da beide Varianten interessant sind, schauen wir uns beide an. Im ersten Fall weisen Sie der Eigenschaft Datensatzherkunft des Kombinationfeldes die folgende SQL-Anweisung zu:
SELECT LieferantID, Firma FROM tblLieferanten ORDER BY Firma;
Die Datensätze der Tabelle tblLieferanten werden durch die Klausel ORDER BY Firma direkt nach dem Firmennamen des Lieferanten sortiert.
Damit das Kombinationsfeld nur die Werte des zweiten Feldes anzeigt, aber den Wert aus dem Feld LieferantID aus dem ersten Feld als gebundene Spalte verwendet, stellen Sie noch die beiden folgenden Eigenschaften ein:
- Spaltenanzahl: 2
- Spaltenbreiten: 0cm
Das Filtern selbst ist relativ leicht – Sie brauchen nur eine Ereignisprozedur für die Ereigniseigenschaft Nach Aktualisierung des Formulars zu hinterlegen, welche den Filterausdruck des Unterformulars einstellt. Diese Ereignisprozedur finden Sie in Listing 1.
Private Sub cboLieferantNachID_AfterUpdate() With Me!sfmFilternNachKombinationsfeld.Form .Filter = "LieferantID = " & Me!cboLieferantNachID .FilterOn = True End With End Sub
Listing 1: Lieferanten nach ID filtern
Nach der Auswahl eines der Einträge aus dem Kombinationsfeld zeigt das Unterformular nun bereits alle verfügbaren Einträge an (siehe Bild 2).
Bild 2: Filtern von Datensätzen nach der gebundenen Spalte des Nachschlagefeldes
Alle Artikel anzeigen
Was aber geschieht, wenn Sie wieder alle Datensätze anzeigen möchten Das Leeren des Kombinationsfeldes hilft an dieser Stelle nicht weiter. Genau genommen löst dies nach der Aktualisierung des Kombinationfeldes etwa durch Betätigen der Eingabetaste sogar einen Fehler aus – und zwar Fehler 3075, Syntaxfehler (fehlender Operator) in Abfrageausdruck ‘LieferantID = ‘. Da cboLieferantNachID leer ist, stellt die Prozedur also einen ungültigen Ausdruck zusammen. Dies können Sie mit einer einfachen Prüfung umgehen: Sie fragen einfach vor dem Setzen des Filters den Wert des Kombinationfseldes ab. Ist dieser Null, wird der Inhalt durch 0 ersetzt. In diesem Fall leert die neue Version der Prozedur aus Listing 2 den Filter und das Unterformular zeigt wieder alle Datensätze an. Anderenfalls führt das Formular den Filter wie gewohnt aus.
Private Sub cboLieferantNachID_AfterUpdate() With Me!sfmFilternNachKombinationsfeld.Form If Not Nz(Me!cboLieferantNachID, 0) = 0 Then .Filter = "LieferantID = " & Me!cboLieferantNachID .FilterOn = True Else .Filter = "" End If End With End Sub
Listing 2: Berücksichtigung eines geleerten Kombinationsfeldes zur Auswahl der Artikel
Eine weitere Alternative ist ein spezieller Eintrag im Kombinationsfeld, der die Bezeichnung
Dieser Wert sollte außerdem als erster Eintrag des Kombinationsfeldes angezeigt werden. Dazu ist ein kleiner Trick nötig, der den Einsatz des UNION-Schlüsselworts erforderlich macht.
Solche Abfragen können Sie nicht über den Abfrageentwurf, sondern nur über die SQL-Ansicht eingeben. Also gehen Sie folgendermaßen vor (im Beispielformular unter cboLieferantNachIDUndAlle zu finden):
- Markieren Sie die Eigenschaft Datensatzherkunft des Kombinationsfeldes und klicken Sie auf die Schaltfläche mit den drei Punkten.
- Es erscheint die Entwurfsansicht der Abfrage. Aktivieren Sie nun die SQL-Ansicht (unter Access 2010 beispielsweise wie in Bild 3).
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: