Rubrik: Datenbanken · DAO | VB-Versionen: VB4, VB5, VB6 | 19.03.02 |
Eingabe autom. vervollständigen Ein Beispiel für eine Autovervollständigungs-Funktion für Eingabefelder. | ||
Autor: Dieter Otter | Bewertung: | Views: 21.609 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Die "AutoComplete"-Funktion kennt man i.a.R. nur vom Internet-Explorer - genauer gesagt von der Adresszeile, bei der versucht wird, die Eingabe automatisch zu vervollständigen.
Eine solche Funktion lässt sich sehr leicht auch für ein normales Text-Eingabefeld nachbauen, wobei die Inhalte in unserem Beispiel in einer Datenbank gespeichert sind. Nehmen wir an, Sie verwalten eine große Provisionsdatenbank mit sehr vielen Vertretern. Wird ein neuer Auftrag geschrieben, geben Sie in einer Textbox zunächst den Namen des Vertreters ein. Jetzt wäre es doch schön, wenn das Programm bereits während der Eingabe versucht, den Namen zu "erraten", indem es in der Datenbank nach dem bisher eingegebenen Anfangsnamen sucht, und Ihre Eingabe autom. vervollständigt.
Also - worauf warten wir noch
Nehmen wir an, der Name ist in der Datenbank in zwei Feldern gespeichert - "Name" und "Vorname".
Die Eingabe in der TextBox soll hierbei in der Form Name, Vorname erfolgen.
Hier der Code
Im Allgemein-Teil der Form werden die Datenbank-Objektvariablen deklariert:
Option Explicit ' Datenbank-Objektvariablen Private Db As Database Private Rs As Recordset
Beim Laden der Form öffnen wir die Datenbank und erstellen das Recordset - und zwar als Dynaset, da wir dann eine Suchanfrage bequem über die FindFirst-Methode starten können.
Private Sub Form_Load() ' Datenbank öffnen Set Db = DBEngine.OpenDatabase(App.Path & "\VERTRETER.MDB") ' Recordset öffnen (Dynaset) Set Rs = Db.OpenRecordset("Vertreter", dbOpenDynaset) End Sub
Um die Eingabe des Vertreter-Namens automatisch vervollständigen zu können, müssen wir im Change-Event der TextBox nach dem ersten Eintrag suchen, der mit der bisherigen Eingabe übereinstimmt. Wird ein Eintrag gefunden, so vervollständigen wir die bisherige Eingabe und markieren genau diesen Teil der Eingabe, so dass der durch das Programm vervollständigte Rest beim nächsten Tastendruck überschrieben wird - ganz wie unser Vorbild - die Adresszeile des Internet Explorers.
' Eingabe autom. vervollständigen Private Sub txtVertreter_Change() Dim SQL As String Dim lPos As Long Dim sName As String Dim sVorname As String Dim sPos As Long With txtVertreter If Trim$(.Text) = "" Or _ .Tag = "NoAction" Then Exit Sub ' aktuelle Eingabeposition merken sPos = .SelStart ' Komma vorhanden? lPos = InStr(.Text, ",") If lPos > 0 Then sName = Left$(.Text, lPos - 1) sVorname = Trim$(Mid$(.Text, lPos + 1)) Else sName = .Text: sVorname = "" End If ' SQL-Kommando erstellen If sVorname = "" Then SQL = "Name LIKE '" & sName & "*'" Else SQL = "Name = '" & sName & "' AND " & _ "Vorname LIKE '" & sVorname & "*'" End If ' Abfrage! Rs.FindFirst SQL If Not Rs.NoMatch Then ' Eintrag gefunden! .Tag = "NoAction" ' Vollständigen Namen in die TextBox schreiben .Text = Rs("Name") & ", " & Rs("Vorname") ' Eingabe markieren: von der aktuellen ' Eingabeposition bis zum Ende der Eingabe .SelStart = sPos .SelLength = Len(.Text) - sPos .Tag = "" End If End With End Sub
Wird die Form geschlossen, schließen wir die Datenbank und setzen die Objektvariablen zurück:
Private Sub Form_Unload(Cancel As Integer) ' Datenbank schlißen Rs.Close Db.Close Set Rs = Nothing Set Db = Nothing End Sub