2016-08-03 59 views
0

我有一個包含大約500,000條記錄的Access表。當我在ComboBox中輸入文本時,我想減少結果。基本上,我需要一個動態ComboBox,當我在ComboBox中輸入內容時,它會顯示基於每個字符的記錄。在Access 2016中向ComboBox添加自動完成或打字頭功能

問題是,ComboBox的基礎表有大約500,000條記錄。 而ComboBox對象只能在達到限制之前顯示65,000條記錄,並且不會預覽其餘記錄。沒有人同時查看65,000條記錄,但是如果輸入整個記錄集中間的任何數字,則記錄根本不會顯示。因爲這個數字超過了65,000的限制。所以我需要一張全桌動態組合框。

例如,如果您正在查看一堆SSN,而不是ComboBox顯示所有不能顯示的記錄,因爲太多的SSN(超過65,000個是ComboBox限制),這就是我所需要的。

如果在組合框中鍵入5。該列表將只顯示5系列數字。如果您鍵入51,則限制列表值是51系列的數字。 如果您輸入512,則將列表值限制爲512系列數字等等。對於整個桌子來說,不僅僅是第一個65K。

我曾經試過的東西所以FAR實現了第二個未綁定的文本框,但是,這使得查詢兩個步驟的過程。我想知道我是否可以一起做這件事。

+0

不,我不是 – BenLawal

回答

2

大衛W芬頓已經提供了一個相當詳細的答案here這個問題。要點:

最簡單的方法是僅在鍵入某些字符後才指定組合框的Rowsource。你會做,在組合框的OnChange事件

艾倫·布朗的Combos with Tens of Thousands of Records有一些其他花俏(抽象邏輯爲功能,防止行來源的重新計算,如果該值沒有變化),但基本思路是一樣的:

  1. 離開組合的行來源屬性空白。
  2. 創建一個函數,在鍵入最少數量的字符後分配行來源。只有與這些初始字符匹配的條目纔會被加載,所以組合的RowSource從不包含超過幾百條記錄。
  3. 在組合的Change事件和窗體的當前事件中調用該函數。

如果你真的想先後篩選行來源爲每個字符被輸入,你能適應這些答案做到這一點。例如,您可以將David W Fenton解決方案中的測試條件更改爲If Len(Me!cmbMyCombo.Text) >= 1。對於Allen Browne解決方案,您可以將常數設置爲1,並將設置爲sNewStub的行更改爲:sNewStub = Nz(sSuburb, "")

但是,直到您的RowSource查詢返回一個小於行限制的數字塊,您將不會看到任何好處。這就是爲什麼上面鏈接的兩個解決方案在輸入2個(或3個或4個)初始字符後開始過濾的原因。