Hallo,
nochmal vorn vorne:
Ich habe eine Datenbank, in der es u.a. die tbl_Kunden gibt.
Nun habe ich weitere Tabellen, wie z.B. tbl_Defekte; tbl_Rücknahme; tbl_Verlust.
In diesen gibt es auch ein Feld KundenID (PK in tbl_Kunden), damit ich für die einzelnen Vorgänge auch einen Kunden zuordnen kann.
Derzeit muss der Benutzer sich noch durch ein Listenfeld navigieren, um die richtige KundenID zu finden.
Dies wird logischerweise mit steigender Datenmenge wiederrum problematisch bzw. benutzerunfreundlich.
Nun kommt es manchmal, aber nicht immer vor, dass ich entweder die Kunden-Nr. oder eben den Namen (den Namen lasse ich meistens als zweite Spalte des Listenfeldes mit anzeigen, während nur die ID gespeichert wird) des Kunden weiß.
Ich suche derzeit nach einer cleveren Lösung, dass wenn ich eines der beiden Dinge weiß, ich dieses eingeben kann und mir dann nur die entsprechenden Datensätze, in diesem Fall ist es ja eh nur die Kunden-ID, angezeigt werden.
Wenn ich beispielsweise einen Kunden mit der ID 111112 habe, und dies eingebe, soll er mir dann als Auswahlmöglichkeit nur KundenNr. 111112 (und in der zweiten Spalte den Namen) anzeigen im Listenfeld. Ähnliches bei dem Namen. Gebe ich z.B. "Müller" ein, soll er mir alle Kunden-Nummern mit den Namen "Müller" angeben.
Wie kann ich das am besten umsetzen?
Oder was ist allgemein die beste Lösung beim Navigieren durch große Datenmengen?
Mir wurde an anderer Stelle das Kombinationsfeld mit automatischer Vervollständigung vorgeschlagen.
Da habe ich nach Ausprobieren allerdings das Problem gesehen, dass mir anfangs, noch vor der Eingabe, gar keine Datensätze zur Auswahl gegeben werden. Das wäre im Fall, dass ich mich durchscrollen will, allerdings nicht ganz praktikabel.
Hi,
ZitatMir wurde an anderer Stelle [...]
warum bist du nicht im ursprünglichen Thread geblieben?
Zitatdass mir anfangs, noch vor der Eingabe, gar keine Datensätze zur Auswahl gegeben werden
Fragt sich wie du das umgesetzt hast.
Wenn du mal nach Nummer und mal nach Namen suchen möchtest, wäre es evtl. sinnvoll ein Textfeld für die Eingabe des Suchbegriffs zu nehmen und das Listenfeld danach zu filtern.
Ok, das mit dem Kombinationsfeld funktioniert soweit.
Ich lass es der Simplizität halber mal so. ;)
Danke für die schnelle und kompetente Hilfe!
Gäbe es dennoch irgendeine Art von Steuerelementen, wo ich mit der laufenden Eingabe die Auswahl im Listenfeld einschränken kann?
Zum Beispiel habe ich Formulare, wo ich ein bestimmtes Warenhaus suchen muss.
Diese haben ID's mit mehreren Abkürzungen, sodass das dann so aussieht: "WH_MOR_DIS".
Ich möchte jetzt am liebsten aber nur "MOR" eingeben, weil das die ABkürzung für den Standort-Namen ist. Und das dann direkt im Listenfeld nur noch die Wanrehäuser stehen, die "MOR" in ihrem Namen haben?
Und das möglichst ohne Zwischenschritt, also am besten direkt in das Listenfeld?
Oder ist dies nur über ein Textfeld möglich, wo ich "Mor" eingebe und dann muss ich über VBA dem Listenfeld sagen, er soll mir nur noch die Datensätze anzeigen die das Geschrieben im Textfeld beinhalten?
In ein Listenfeld kannst du keine Suchbegriffe eingeben, dafür wäre wie gesagt ein Textfeld geeignet. Da kannst du im Change-Ereignis (-> Bei Änderung) auf die Eingabe jedes einzelnen Zeichens reagieren und so die Suche ständig verfeinern.
Hallo,
ja, das klingt nach einem guten Vorgehen.
Was muss ich denn als VBA-Code verwenden?
Mein Textfeld heißt "txtDeparture" und das dazugehörige Listenfeld "lstDeparture".
Würde ich über FindRecord gehen?
Nein, bei einem Listenfeld musst du die Rowsource jeweils neu einstellen.
Zeig mal den SQL-Code der Abfrage und nenne das Datenfeld das du filtern willst.
Das Ganze ist in einem Formular, also keine Abfrage und kein SQL-Code.
Ich habe bisher ein Listenfeld, in dem alle Warenhäuser-ID's drin sind. Das heißt "lstDeparture".
Nun habe ich ein Textfeld "txtDeparture" hinzugefügt.
Da will ich dann zum Beispiel "MOR" eingeben, und dann soll mir in dem Listenfeld mit allen Warenhäusern nur noch die angezeigt werden, die "MOR" in ihrem Namen bzw. ID haben.
Das Listenfeld hat eine Datensatzherkunft, dies ist entweder eine Tabelle oder Abfrage oder ein SQL-String.
Wenn du das Listenfeld nach der Eingabe filtern willst, musst du dynamisch erzeugten SQL-Code einsetzen.
Ah alles klar.
Der SQL-Code der Datensatzherkunft lautet:
SELECT WH_Warehouses.WarehouseID, WH_Warehouses.WarehouseName
FROM WH_Warehouses;
Und was hat nun txtDeparture mit WareHouseName oder gar WareHouseID zu tun?
"txtDeparture" ist das Textfeld, was ich auf deinen Vorschlag hin in das Formular eingefügt habe. Dort gebe ich dann meine Buchstaben ein, um die Auswahl zu verfeinern.
In dem Listenfeld "lstDeparture" sind wie gesagt die Warehouses angezeigt (siehe SQL-Code).
Die WarehouseID gehört zu der Tabelle WH_Warehouses und ist dort PK.
Dort kürze ich die Namen der Warehouses verständlich ab, z.B. "WH_MOR". WareHouseName ist dann der Name des Warehouses ausgeschrieben. Also Warehouse Morogoro in diesem Fall.
Nun würde ich wie gesagt gerne über das Textfeld die Auswahl an Warehouses in lstDeparture einschränken.
Das Ganze heißt "Departure", weil die Warenbewegung von einem Warehouse in ein anderes geht. D.h. ich mache den Prozess dann nochmal mit "txtArrival" bzw. "lstArrival".
Vielen Dank für die Erläuterungen.
Dann könntest du also im Change-Ereignis folgenden Code einsetzen:
Private Sub txtDeparture_Change()
Me!lstDeparture.RowSource = "SELECT WarehouseID, WarehouseName FROM WH_Warehouses WHERE WarehouseName Like '*" & Me!txtDeparture.Text & "*'"
End Sub
Hallo,
ganz vielen Dank! Das klappt einwandfrei! :)