Kombinationsfelder mit Suchfunktion

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Kombinationsfelder zeigen normalerweise nur den Inhalt eines Feldes an. An der mangelnden Flexibilität dieses Steuerelements liegt das nicht: Natürlich können Sie auch den Inhalt mehrerer Felder gleichzeitig anzeigen und mit ein wenig Fantasie oder der Lektüre dieses Beitrags erweitern Sie das Kombinationsfeld gleichzeitig zum Suchfeld.

Sinnvolle Beispiele für die Anzeige gleich mehrerer Felder in einem Kombinationsfeld gibt es viele: Das Formular frmBuchungen der Lösung Kassenbuch aus dem gleichnamigen Artikel (s. Shortlink 486) liefert beispielsweise gleich mehrere Einsatzmöglichkeiten. So können Sie dort mit einem Kombinationsfeld schnell nach einem bestimmten Buchungsdatensatz suchen, aber auch Buchungskonten mit einem flexiblen Kombinationfeld auswählen.

Ersteres beschreibt dieser Beitrag im Detail: Sie erfahren, wie Sie das Kombinationsfeld dazu bringen, den Inhalt mehr als eines Feldes gleichzeitig anzuzeigen, und wie Sie darüber hinaus auch noch in den Inhalten der beiden Felder suchen können. Das Formular soll dann den ausgewählten Buchungsdatensatz anzeigen.

Erstmal soll das Kombinationsfeld namens cboGeheZuBeleg aber die gewünschten Daten beim “normalen” Aufklappen liefern – etwa so wie in Bild 1, wo es die Buchungsnummer und den Buchungstext gleichzeitig anzeigt.

abb001.tif

Bild 1: Anzeige des Inhalts zweier Felder beim Aufklappen der Kombinationsfeldeinträge

Das ist an sich noch keine große Kunst. Sie stellen einfach die Eigenschaften Spaltenanzahl und Spaltenbreiten auf 2 beziehungsweise 0cm sowie die Datensatzherkunft des Kombinationsfeldes auf den folgenden Wert ein:

SELECT tblBuchungen.BuchungID, [Belegnummer] 
& ' ' & [Buchungstext] AS Buchung
FROM tblBuchungen

Diese SQL-Anweisung setzt die beiden Felder der Tabelle tblBuchungen, die übrigens wie in Bild 2 aussieht, zu einer per Leerzeichen getrennten Zeichenkette zusammen.

abb002.tif

Bild 2: Diese Tabelle liefert die Daten für das Kombinationsfeld zum Auswählen des aktuellen Buchungsdatensatzes.

Die Ereignisprozedur aus Listing 1 nimmt den einfacheren Teil der Programmierung des Kombinationsfeldes vorneweg. Die erste Anweisung sorgt für die Anzeige des Datensatzes mit der in der gebundenen Spalte des Kombinationsfeldes enthaltenen Buchungs-ID.

Listing 1: Nach dem Aktualisieren des Kombinationsfeldes soll das Formular den passenden Datensatz anzeigen.

Private Sub cboGeheZuBeleg_AfterUpdate()
     Me.Recordset.FindFirst "BuchungID = " & Me.cboGeheZuBeleg
     Me.cboGeheZuBeleg.RowSource = "SELECT BuchungID, Belegnummer & '' '' & Buchungstext " _
"FROM tblBuchungen"
     Me.cboGeheZuBeleg = Null
     bolUpdatedGeheZuBeleg = True
End Sub

Die zweite stellt die RowSource-Eigenschaft, die der Datensatzherkunft-Eigenschaft im Eigenschaftsfenster entspricht, wieder auf den ursprünglichen Wert ein. Warum dies geschieht, erfahren Sie weiter unten. Außerdem leert die Routine noch das Kombinationsfeld und setzt eine Variable, deren Funktion Sie ebenfalls später kennen lernen, auf den Wert True.

Nicht automatisch ergänzen

Die Eigenschaft Automatisch ergänzen des Kombinationsfeldes sorgt dafür, dass dieses direkt den nächsten in der Liste enthaltenen Datensatz anzeigt, der mit der aktuell eingegebenen Zeichenfolge übereinstimmt. Was an sich eine Hilfe ist, wirkt sich hier eher hinderlich aus, wie Sie gleich erfahren werden.

Das Kombinationsfeld soll bei der Suche nach Zeichenketten innerhalb der angezeigten Einträge helfen, indem es die angezeigten Einträge dem aktuellen Inhalt des Kombinationsfeldes entsprechend einschränkt.

Sinnvollerweise soll es nach der Eingabe des ersten Zeichens auch noch aufklappen, sodass der Benutzer sieht, welche Einträge in Frage kommen.

Das passende Ereignis heißt Bei änderung – es reagiert auf die Eingabe jedes einzelnen Zeichens. Die Routine aus Listing 2 setzt die obigen Ideen um, indem sie zunächst die Eigenschaft RowSource auf einen SQL-Ausdruck einstellt, der die Datensatzherkunft auf alle Datensätze der Tabelle tblBuchungen reduziert, deren Feld Belegnummer mit dem eingegebenen Text beginnt oder dessen Buchungstext den eingegebenen Text enthält. Anschließend klappt sie das Kombinationsfeld mit der DropDown-Methode auf.

Listing 2: Diese Routine sorgt beim ändern des Kombinationsfeld-Textes für die Aktualisierung der Elemente der Datensatzherkunft.

Private Sub cboGeheZuBuchung_Change()
     Dim strSQL As String
     strSQL = "SELECT BuchungID, Belegnummer & '' '' & Buchungstext FROM tblBuchungen " _
"WHERE Belegnummer LIKE ''" & Me!cboGeheZuBuchung.Text & "*' OR Buchungstext LIKE ''*" _
& Me!cboGeheZuBuchung.Text & "*'"
     Me!cboGeheZuBuchung.RowSource = strSQL
     Me!cboGeheZuBuchung.Dropdown
End Sub

Interessanterweise funktioniert dies aber nicht wie gewünscht: Die Eingabe der Zahl 1 beispielsweise zeigt nur einen Datensatz an, obwohl es in den Beispieldaten mehr als einen Datensatz gibt, dessen Belegnummer mit dieser Zahl beginnt.

Der Grund ist ganz einfach: Die Eigenschaft Automatisch ergänzen sorgt dafür, dass das Kombinationsfeld direkt den ersten zur Zahl passenden Eintrag anzeigt (siehe Bild 3). Die SQL-Anweisung kann dazu natürlich nur einen Datensatz finden – nämlich den, der mit dem durch die automatische Ergänzung im Kombinationsfeld angezeigten Text übereinstimmt.

abb003.tif

Bild 3: Die Eigenschaft Automatisch ergänzen sorgt dafür, dass Access direkt bei der Eingabe den nächsten passenden Wert anzeigt..

Bei der Eingabe eines Textes, der in einem der Buchungstexte enthalten ist, funktioniert es hingegen: Das ist aber auch nicht verwunderlich, da die automatische Ergänzung hier nicht anschlägt.

Für die dem SQL-Ausdruck entsprechende Anzeige der enthaltenen Elemente deaktivieren Sie das automatische Ergänzen also einfach.

Bei der Eingabe eines Ausdrucks, der mit einer der Belegnummern übereinstimmt, markiert Access direkt den passenden Eintrag im aufgeklappten Kombinationsfeld (siehe Bild 4). Geben Sie hingegen einen Ausdruck ein, zeigt das Kombinationsfeld zwar alle passenden Elemente in der ausgeklappten Liste an, aber markiert nicht den ersten Eintrag.

abb004.tif

Bild 4: Beim Eingeben eines Ausdrucks, der mit dem Beginn der Listeneinträge übereinstimmt, wird das erste passende Element markiert.

Der wesentliche Unterschied ist, dass im ersten Fall das Abschließen der Eingabe mit der Eingabetaste oder anderweitiges Verlassen des Kombinationsfeldes den aktuell markierten Eintrag auswählt, das Ereignis Nach Aktualisierung auslöst und wie oben beschrieben die passende Buchung im Formular anzeigt.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar