Die Suche nach Datensätzen mit bestimmten Werten in Text- oder Zahlenfeldern haben wir in Acces [basics] bereits bearbeitet. Aber was ist, wenn es um Kombinationsfelder geht, welche die Daten aus einer Lookup-Tabelle anzeigen So wie im einfachsten Fall bei den Anreden einer Kundentabelle Dann werden Sie in der Regel erstmal nicht an die Eingabe eines Suchetextes denken, sondern dem Benutzer die Möglichkeit geben wollen, den gesuchten Datensatz auch im Suchfeld per Kombinationsfeld auszuwählen. Dieser Artikel zeigt, wie das gelingt.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 1706_Lookupsuche.accdb.
Artikel nach Kategorie durchsuchen
Die Datenblattansicht von Access bietet seit einigen Access-Versionen die Möglichkeit, über den Pfeil nach unten ein Menü zu öffnen, mit dem Sie alle Einträge des aktuellen Feldes anhaken und damit die Suche nach Datensätzen mit diesem Inhalt im entsprechenden Feld starten können (siehe Bild 1).
Bild 1: Eingebaute Suche nach einem Eintrag
Das Ergebnis entspricht dann wie in Bild 2 genau den Erwartungen. Was aber nun, wenn wir diese Suche nicht anbieten können oder wollen und eine eigene Suche implementieren müssen, die so ähnlich arbeitet – und in diesem Fall zumindest ein Kombinationsfeld anbieten soll, um die passenden Datensätze zu ermitteln
Bild 2: Suchergebnis mit eingebauter Suche
Dann benötigen wir zunächst ein Formular, welches das Datenblatt mit den zu durchsuchenden Datensätzen in einem Unterformular anzeigt. Dazu erstellen Sie zunächst ein Unterformular namens sfmLookupsuche und weisen der Eigenschaft Datenherkunft die Tabelle tblArtikel zu.
Ziehen Sie dann alle Felder dieser Tabelle aus der Feldliste in den Detailbereich des Formularentwurfs und stellen Sie noch die Eigenschaft Standardansicht auf den Wert Datenblatt ein. Speichern und schließen Sie das Formular nun.
Legen Sie ein neues Formulars namens frmLookupsuche an, welches als Hauptformular dienen soll. Ziehen Sie das Unterformular sfmLookupsuche aus dem Navigationsbereich in den Detailbereich des neuen Formulars. Stellen Sie die Eigenschaften Navigationsschaltflächen, Datensatzmarkierer, Bildlaufleisten und Trennlinien des Hauptformulars auf Nein und die Eigenschaft Automatisch zentrieren auf Ja ein. Fügen Sie über dem Unterformular schließlich noch das Kombinationsfeld hinzu, mit dem wir die Suchbegriffe festlegen wollen (siehe Bild 3). Das Kombinationsfeld nennen wir cboSucheLieferant.
Bild 3: Suchformular mit Kombinationsfeld
Filterausdruck ermitteln
Wenn Sie wissen wollen, welchen Filterausdruck Access automatisch einstellt, wenn Sie mit der eingebauten Filtermöglichkeit arbeiten wollen, welche wir eingangs vorgestellt haben, brauchen Sie nur das Formular zu öffnen und den Filter festzulegen.
Nun öffnen Sie den VBA-Editor und geben im Direktbereich einen Ausdruck ein, der den aktuellen Wert der Filter-Eigenschaft des Unterformulars ausgibt:
Forms(0).sfmLookupsuche.form.filter
Die Ausgabe lautet wie folgt:
([Lookup_LieferantID].[Firma]="Bigfoot Breweries")
Was ist nun [Lookup_LieferantID].[Firma] für ein Ausdruck Wir konnten es nicht herausfinden. Selbst wenn wir den Code des Formulars mit der folgenden Methode in eine Textdatei exportiert haben, konnten wir diese Zeichenfolge nicht finden:
SaveAsText acForm, "sfmLookupsuche", CurrentProject.Path & "\form.txt"
Fest steht jedenfalls, dass Access wohl hier irgendwie auf ein Recordset zugreift, das sich hinter dem Kombinationsfeld zur Auswahl des Lieferanten verbirgt und diesen als Feld im Filterausdruck einsetzt.
Kombinationsfeld mit Daten füllen
Wie auch immer: Wir können uns nicht auf irgendwelche nirgends offensichtlich definierten Feldnamen beziehen, wenn wir programmieren, und füllen zunächst unser Kombinationsfeld mit den Daten, die wir zur Suche nach den Lieferanten auswählen wollen.
Dazu stellen wir die Eigenschaft Datensatzherkunft des Kombinationsfeldes auf die Abfrage aus Bild 4 ein. Damit es das Primärschlüsselfeld als gebundene Spalte verwendet und diese aber ausblendet, stellen sie die Eigenschaft Spaltenanzahl auf den Wert 2 und die Eigenschaft Spaltenbreiten auf den Wert 0cm ein. Das Zwischenergebnis sieht dann wie in Bild 5 aus.
Bild 4: Das Kombinationsfeld im Einsatz
Bild 5: Abfrage als Datensatzherkunft für das Such-Kombinationsfeld
Nun müssen wir noch eine Ereignisprozedur hinzufügen, die nach der Auswahl eines der Einträge des Kombinationsfeldes ausgelöst wird und die Daten des Datenblatts entsprechend des Filterkriteriums filtert.
Dazu stellen Sie für die Eigenschaft Nach Aktualisierung des Kombinationsfeldes den Wert [Ereignisprozedur] ein und klicken auf die Schaltfläche mit den drei Punkten (…) neben der Eigenschaft.
Dies öffnet den VBA-Editor und zeigt gleich die neue, leere Prozedur cboSucheLieferanten_AfterUpdate an (siehe Bild 6). Diese füllen wir nun wie folgt:
Bild 6: Neue Ereignisprozedur im VBA-Editor
Private Sub cboSucheLieferant_AfterUpdate() Dim lngLieferantID As Long Dim strSQL As String lngLieferantID = Nz(Me!cboSucheLieferant, 0) If Not lngLieferantID = 0 Then strSQL = "LieferantID = " & lngLieferantID Me!sfmLookupsuche.Form.Filter = strSQL Me!sfmLookupsuche.Form.FilterOn = True Else Me!sfmLookupsuche.Form.Filter = "" End If End Sub
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: