Die Suche von Daten in den Tabellen einer Datenbank ist eine Aufgabe, die fast jede Datenbankanwendung erfüllen muss. Die grundlegenden Techniken bestehen darin, Suchbegriffe in ein Formular einzugeben und die daraus resultierende Ergebnismenge in einem geeigneten Steuerelement anzuzeigen – beispielsweise in einem Unterformular in der Datenblattansicht, in einem Listenfeld oder auch einfach in einem gefilterten Formular in der Formularansicht. Die wichtigste Grundlagen ist dabei, die Datenherkunft mit den entsprechenden Kriterien zu spicken. Wie es geht, zeigt dieser Beitrag.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 1201_EinfacheSuchfunktion.mdb.
Artikelabfrage
Für die verschiedenen Beispiele dieses Artikels wird die Artikeltabelle der Beispieldatenbank herhalten. Sie liefert diverse Text- und Zahlenfelder, die sich für das Zusammenstellen der benötigten Abfragen eignen. Der Vollständigkeit halber haben wir die ursprüngliche Tabelle noch um Datumsfeld namens AngelegtAm erweitert.
Suchen per Abfrage
Die Grundlagen zum Durchsuchen einer Abfrage nach verschiedenen Kriterien finden Sie beispielsweise in den Artikeln SQL: SELECT-Abfragen, Teil II, Filtern nach Zahlen, Filtern von Textfeldern oder Datum und Zeit. Im vorliegenden Artikel erfahren Sie, wie Sie die in diesen Artikeln gewonnenen Kenntnisse dazu nutzen können, dem Benutzer eine Eingabemöglichkeit für Suchbegriffe zu bieten, eine entsprechende Abfrage zu formulieren und das Ergebnis darzustellen.
Einen der möglichen Bausteine haben Sie bereits im Artikel Einsatz von Parametern kennengelernt. Sie können einer Abfrage einen Parameter in Form eines in eckigen Klammern eingefassten Ausdrucks als Bedingung hinzufügen, der vor dem Anzeigen des Abfrageergebnisses abgefragt und ausgewertet wird.
In Grundzügen bauen wir auf dieser Technik auf, Sie werden jedoch auch anderen Techniken kennenlernen, um das gewünschte Ergebnis zu erhalten.
Aufbau der Formulare
In den Beispielen soll der Benutzer den Namen eines Artikels oder einen Teil des Namens in ein Textfeld eingeben. Nach einem Mausklick auf die Suchen-Schaltfläche soll ein Unterformular in der Datenblattansicht die gefundenen Datensätze als Suchergebnis anzeigen.
Wir erstellen zunächst das Formular an, das später als Unterformular eingesetzt wird. Legen Sie dazu ein neues Formular an und speichern Sie es unter dem Namen sfmArtikelsuche (sfm steht für Subform). Wählen Sie für die Eigenschaft Datenherkunft zunächst die Tabelle tblArtikel aus.
Nach der Auswahl stehen in der Feldliste alle Felder der gewählten Datenherkunft bereit. Ziehen Sie alle Felder in den Detailbereich der Entwurfsansicht des Formulars. Stellen Sie dann die Eigenschaft Standardansicht auf den Wert Datenblatt ein (siehe Bild 1).
Bild 1: Entwurfsansicht des Unterformulars sfmArtikelsuche
Speichern Sie nun das Unterformular und schließen Sie es. Anschließend erstellen Sie ein weiteres neues Formular und speichern es unter dem Namen frmArtikelsuche. Es handelt sich dabei um das Hauptformular, das gleich das Unterformular aufnehmen wird. Zuvor legen Sie jedoch noch die benötigten Steuerelemente an. Das erste ist ein Textfeld namens txtSuche, das zweite eine Schaltfläche namens cmdSuche (siehe Bild 2).
Bild 2: Hauptformular der Artikelsuche
Nun fügen Sie das Unterformular sfmArtikelsuche ein, indem Sie es mit der Maus aus dem Datenbankfenster beziehungsweise dem Navigationsbereich in den Detailbereich des Entwurfs des Formulars frmArtikelsuche ziehen.
Das Formular mit dem Unterformular sieht in der Entwurfsansicht nun wie in Bild 3 aus. Sie können nun noch das Bezeichnungsfeld des Unterformulars mit der Beschriftung Suchergebnis ausstatten und gegebenenfalls Formular und Unterformular noch etwas breiter gestalten, damit der Benutzer mehr Daten auf einen Blick sieht und weniger scrollen muss. Stellen Sie außerdem die Eigenschaften Bildlaufleisten, Navigationsschaltflächen und Datensatzmarkierer auf Nein ein – diese Elemente brauchen Sie für das Hauptformular nicht.
Bild 3: Haupt- und Unterformular in der Entwurfsansicht
Nach einem Wechsel in die Formularansicht können Sie außerdem noch die Schriftgröße im Unterformular anpassen, indem Sie auf einen der Spaltenköpfe klicken und dann in der Symbolleiste oder im Ribbon den gewünschten Wert für die Schriftgröße eingeben. Das Formular ist nun fast fertig und sieht wie in Bild 4 aus.
Bild 4: Ohne weitere Handgriffe zeigt das Unterformular einfach alle Datensätze an.
Suchen per Filter
Die einfachste Möglichkeit, die Datensätze des Unterformulars durch die Eingabe eines Suchbegriffs einzuschränken, ist der Einsatz der Eigenschaft Filter des Unterformulars.
Dies funktioniert folgendermaßen: Der Benutzer gibt einen Suchbegriff in das Textfeld txtSuche ein und betätigt dann die Schaltfläche mit der Beschriftung Suchen. Dies löst eine Ereignisprozedur an, die Sie wie folgt anlegen:
- öffnen Sie das Formular frmArtikelsuche in der Entwurfsansicht.
- Klicken Sie auf die Schaltfläche und aktivieren Sie mit der Taste F4 das Eigenschaftsfenster, sofern noch nicht sichtbar.
- Wählen Sie für die Eigenschaft Beim Klicken auf der Registerseite Ereignis den Eintrag [Ereignisprozedur] für die Eigenschaft Beim Klicken aus und klicken Sie anschließend auf die Schaltfläche rechts mit den drei Punkten (…).
- Im VBA-Editor erscheint nun die leere Prozedur, die Sie wie folgt füllen (siehe auch Bild 5):
Bild 5: Diese Prozedur führt den Suchvorgang durch.
Private Sub cmdSuche_Click() Dim strFilter As String If Len(Me!txtSuche) > 0 Then strFilter = "Artikelname LIKE '" _ & Me!txtSuche & "'" Me!sfmArtikelsuche.Form.Filter = strFilter Me!sfmArtikelsuche.Form.FilterOn = True Else Me!sfmArtikelsuche.Form.Filter = "" End If End Sub
Wenn Sie nun in die Formularansicht wechseln, können Sie die Prozedur gleich ausprobieren. Geben Sie einen Suchbegriff in das Suchfeld ein, zum Beispiel C*. Klicken Sie dann auf die Schaltfläche Suchen, löst dies die soeben angelegte Prozedur aus.
Die If-Bedingung prüft zunächst, ob die Länge der Zeichenkette im Textfeld txtSuche länger als 0 Zeichen ist, also ob dort überhaupt ein Suchbegriff eingetragen wurde. Falls ja, wird ein Filterkriterium für die Eigenschaft Filter zusammengesetzt, das aus der Angabe des zu durchsuchenden Feldes, dem Vergleichsoperator LIKE und einem Vergleichsausdruck besteht, der sich aus zwei Hochkommata und dem Inhalt des Textfeldes zusammensetzt.
Dieser Ausdruck wird anschließend der Eigenschaft Filter des im Unterformularsteuerelements enthaltenen Formulars zugewiesen. Dies allein bewirkt noch nichts, erst muss noch der Wert der Eigenschaft FilterOn auf den Wert True eingestellt werden. Das Ergebnis sieht wie in Bild 6 aus.
Bild 6: Das Suchformular in Aktion
Andersherum soll das Auslösen der Suche bei nicht vorhandenem Suchbegriff alle Einträge der Tabelle tblArtikel anzeigen. Dies geschieht, wenn die Bedingung der If-Bedingung nicht erfüllt, die Länge der Zeichenkette im Textfeld txtSuche also 0 ist. In diesem Fall wird schlicht der Ausdruck für die Eigenschaft Filter auf eine leere Zeichenkette eingestellt (“”).
Nun ist dies alles nur halb so ergonomisch, wenn der Benutzer jedes Mal auf die Schaltfläche drücken muss, anstatt einfach nur die Eingabetaste zum Absenden des Suchbegriffs zu betätigen.
Damit diese Schaltfläche automatisch beim Betätigen der Eingabetaste ausgelöst wird, stellen Sie die Eigenschaft Standard für diese Schaltfläche auf den Wert Ja ein (siehe Bild 7).
Bild 7: Einstellen der Schaltfläche cmdSuche als Standardschaltfläche des Formulars
Suche per Recordsource
Das Zuweisen der Tabelle tblArtikel zur Eigenschaft Datenherkunft können Sie auch per VBA-Code erledigen. Der Eigenschaft Datenherkunft lassen sich außerdem nicht nur Tabellennamen wie tblArtikel, sondern auch Abfragenamen oder gar SQL-Ausdrücke wie SELECT * FROM tblArtikel zuweisen.
Dies können Sie sich auch für die Programmierung einer Suchfunktion zunutze machen. In diesem Fall stellen Sie in der Ereignisprozedur, die durch die Schaltfläche cmdSuchen ausgelöst wird, einen SQL-Ausdruck zusammen, der anschließend der Eigenschaft Recordsource des im Unterformularsteuerelement sfmArtikelsuche angezeigten Formulars zugewiesen wird:
Private Sub cmdSuche_Click() Dim strSQL As String If Len(Me!txtSuche) > 0 Then strSQL = "SELECT * FROM tblArtikel WHERE " _ & "Artikelname LIKE '" & Me!txtSuche & "'" Else strSQL = "SELECT * FROM tblArtikel" End If Me!sfmArtikelsuche.Form.RecordSource = strSQL End Sub
Sollte hier kein Suchbegriff vorliegen, wird die Abfrage SELECT * FROM tblArtikel als Datenherkunft übergeben. Diese Version der Suchfunktion finden Sie in der Beispieldatenbank im Formular frmArtikelsuche_Recordset.
Suche mit Platzhalter
In der aktuellen Form kann der Benutzer die Platzhalter selbst eingeben, sie werden dann automatisch in die Suche mit einbezogen. Wenn Sie etwa den Ausruck A* verwenden, lautet der Filter des ersten Beispiels
Artikelname LIKE 'A*'
und die SELECT-Anweisung des zweiten Beispiels sieht so aus:
SELECT * FROM tblArtikel WHERE Artikelname LIKE 'A*'
Sie können natürlich auch gleich entsprechende Platzhalter in die Prozeduren zum Zusammenstellen der Filter beziehungsweise der SELECT-Abfrage integrieren.
Beim Zusammenstellen des Filters für das erste Beispiele verwenden Sie dann etwa den folgenden Ausdruck:
strFilter = "Artikelname LIKE '" & Me!txtSuche & "*'"
Entscheidend ist das Sternchen als Platzhalter am Ende des Ausdrucks. Wenn der Filter alle Artikelnamen erfassen soll, welche die angegebene Zeichenkette enthalten, können Sie auch vorn und hinten einen Platzhalter einfügen:
strFilter = "Artikelname LIKE '*" & Me!txtSuche & "*'"
Beim Zusammenstellen der SELECT-Anweisung im zweiten Beispiel würde das so aussehen – hier erst der Ausdruck für alle Artikelnamen, die mit dem angegebenen Suchbegriff beginnen:
strSQL = "SELECT * FROM tblArtikel WHERE " _ & "Artikelname LIKE '" & Me!txtSuche & "*'"
Sollen alle Artikel angezeigt werden, deren Artikelname den Suchbegriff enthält, fügen Sie noch ein Sternchen hinzu:
strSQL = "SELECT * FROM tblArtikel WHERE " _ & "Artikelname LIKE '*" & Me!txtSuche & "*'"
Suche nach Zahlenwerten
Nachdem wir eine Suche nach einer Zeichenkette implementiert haben, fügen wir eine Suche nach Zahlenwerten hinzu – genau genommen die Suche nach Artikeln, deren Einzelpreis sich in bestimmten Grenzen befindet. Für den Start prüfen wir zunächst den genauen Preis des Artikels, später soll dann ein Preisbereich angegeben werden können. In der Beispieldatenbank haben wir das Formular frmArtikelsuche zum Erweitern der Suchfunktion in ein neues Formular namens frmArtikelsucheMitPreis kopiert. Diesem fügen Sie nun zunächst zwei neue Steuerelemente hinzu – ein Textfeld namens txtSucheEinzelpreis und eine Schaltfläche namens cmdSucheEinzelpreis (siehe Bild 8). Für die Schaltfläche hinterlegen Sie die folgende Prozedur, die durch das Ereignis Beim Klicken ausgelöst wird:
Bild 8: Für die Suche nach einem bestimmten Einzelpreis verwenden wir zunächst eine eigene Schaltfläche.
Private Sub cmdSucheEinzelpreis_Click() Dim strFilter As String If Len(Me!txtSucheEinzelpreis) > 0 Then strFilter = "Einzelpreis = " _ & Me!txtSucheEinzelpreis Me!sfmArtikelsuche.Form.Filter = strFilter Me!sfmArtikelsuche.Form.FilterOn = True Else Me!sfmArtikelsuche.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: