2016-08-03 23 views
0

Ich habe eine Access-Tabelle, die über 500.000 Datensätze verfügt. Ich möchte die Ergebnisse verkleinern, während ich Text in die ComboBox eintippe. Im Grunde benötige ich eine dynamische ComboBox, die Datensätze anzeigt, die auf jedem Zeichen basieren, während ich in die ComboBox eintippe.Hinzufügen von Autocomplete oder typehead-Funktion zu ComboBox in Access 2016

Das Problem ist, die zugrunde liegende Tabelle für die ComboBox hat etwa 500.000 Datensätze. Und das ComboBox-Objekt kann nur 65.000 Datensätze anzeigen, bevor es das Limit erreicht, und eine Vorschau der restlichen Datensätze wird nicht angezeigt. Niemand betrachtet gleichzeitig 65.000 Datensätze, aber wenn eine Zahl in der Mitte des gesamten Datensatzes eingegeben wird, werden die Datensätze überhaupt nicht angezeigt. Weil diese bestimmte Zahl jenseits der 65.000 Grenze liegt. Also brauche ich eine dynamische Combobox für den ganzen Tisch.

Zum Beispiel, wenn Sie eine Reihe von SSNs betrachten, anstatt ComboBox Anzeige aller Datensätze, die es nicht möglich ist, weil zu viele SSNs (mehr als 65.000 ComboBox Grenze) das ist, was ich brauche.

Wenn Sie 5 in der ComboBox eingeben. Die Liste würde nur die 5er-Reihe von Zahlen anzeigen. Wenn Sie 51 eingeben, begrenzt die Liste die Werte der 51er-Reihe. Wenn Sie 512 eingeben, beschränkt es die Listenwerte auf die 512-Folgen von Zahlen und so weiter. Für den gesamten Tisch, nicht nur die ersten 65K.

WAS ICH SO VERSUCHT HABE, implementiert eine zweite ungebundene Textbox, jedoch macht dies die Abfrage eines zweistufigen Prozesses. Ich frage mich, ob ich alles zusammen machen kann.

+0

Nein, ich auch nicht – BenLawal

Antwort

2

David W Fenton lieferte bereits eine ziemlich detaillierte Antwort auf dieses Problem here. Das Wichtigste:

Der einfachste Ansatz besteht darin, die Rowsource des Kombinationsfelds erst nach Eingabe einiger Zeichen zuzuweisen. Sie würden tun, dass in dem OnChange-Ereignisse des Kombinationsfelds

All Browne Combos with Tens of Thousands of Records einige andere Glocken hat und Pfeifen (die Logik in eine Funktion zu abstrahieren, Neuberechnung des RowSource zu verhindern, wenn der Wert nicht geändert hat), aber die Grundidee ist die gleiche:

  1. die RowSource Eigenschaft leer die Combo verlassen.
  2. Erstellen Sie eine Funktion, die die RowSource nach Eingabe einer Mindestanzahl von Zeichen zuweist. Nur Einträge, die mit diesen Anfangsbuchstaben übereinstimmen, werden geladen, sodass die RowSource der Combo nie mehr als ein paar hundert Datensätze enthält.
  3. Rufen Sie diese Funktion im Change-Ereignis der Combo und im Current-Ereignis des Formulars auf.

Wenn Sie wirklich wie jedes Zeichen eingegeben wird, soll sukzessive die RowSource filtern, könnten Sie diese Antworten anzupassen, das zu tun. Sie können beispielsweise die Testbedingung in der David W Fenton-Lösung in If Len(Me!cmbMyCombo.Text) >= 1 ändern. Für die Allen Browne-Lösung können Sie die Konstante auf 1 setzen und die Zeile ändern, die sNewStub auf sNewStub = Nz(sSuburb, "") setzt.

Bis Ihre RowSource-Abfrage jedoch einen Teil der Zahlen zurückgibt, der unter dem Zeilenlimit liegt, werden Sie keinen Vorteil sehen. Aus diesem Grund beginnen beide oben verlinkten Lösungen mit der Filterung, nachdem 2 (oder 3 oder 4) Anfangszeichen eingegeben wurden.