2017-06-22 87 views
0

我有一個與用戶記錄綁定的主窗體,其中一個窗體與用戶「擁有的」多個Client對象綁定。所以,用戶和客戶之間有一對多的關係。在Microsoft Access數據表上自定義自動完成功能

當子窗體存在時,用戶可以添加,刪除和編輯客戶子窗體中的條目。當用戶向子表單數據表中添加一個條目時,會有一個自動完成功能,用於鍵入與客戶機數據庫中的任何名稱匹配的客戶機名稱部分,從而爲用戶節省幾個鍵盤輸入,並確保用戶輸入名稱與客戶端數據庫中的名稱完全匹配。

客戶表中要注意的一件事是,除了每個客戶擁有唯一的數字ID之外,每個客戶都有一個完整的公司名稱(Test Agency,Inc.),一個通俗名稱(Test Agency)和一個縮寫名稱(TA)。

我正在嘗試編輯子窗體,以便自動完成功能將匹配上面列出的三個字段(全名,通俗名稱和縮寫名稱)中的任何一個。現在,自動完成只能對全名起作用,因爲這是鏈接到子表單的字段。我希望用戶能夠鍵入字符串的一部分,子表單嘗試將其匹配到三個字段中的任何一個(全名,通俗名稱,縮寫名稱),並將可能的匹配列表返回給任何三個領域。當用戶爲客戶選擇正確的潛在匹配時,他們正在嘗試搜索,然後完整的公司名稱將被輸入到數據表中。基本上,這些附加字段只是讓用戶更容易找到他們正在尋找的客戶端(想象一下,用AMD代替Advanced Micro Devices公司)。簡單的數據表?我研究過使用查找字段和多值查找字段,但我不確定這是否是正確的方法。或者我需要建立一個自定義控件,在多個字段上進行匹配?

回答

2

做了一個這樣的查詢

SELECT * 
FROM Company 
WHERE fullName LIKE '*' & pCompany & '*' 
    OR Colloquial LIKE '*' & pCompany & '*' 
    OR Abbr LIKE '*' & pCompany & '*' 

和我的形式我這樣做

Private Sub cboCompany_KeyUp(KeyCode As Integer, Shift As Integer) 
    ClearCombo cboCompany 

    Dim sql As String 

    Dim rs As DAO.Recordset 
    Dim companySearch As DAO.QueryDef 
    Set companySearch = CurrentDb.QueryDefs("CompanySearch") 
    companySearch.Parameters("pCompany") = cboCompany.Text 

    Set rs = companySearch.OpenRecordset 

    Do While Not rs.EOF 
     cboCompany.AddItem rs("ID") & ";" & rs("FullName") & ";" & rs("Colloquial") & ";" & rs("Abbr") 
     rs.MoveNext 
    Loop 
End Sub 

Private Sub ClearCombo(cbo) 
    For i = cbo.ListCount - 1 To 0 Step -1 
      cbo.RemoveItem i 
    Next i 
End Sub 

這不是超快的所有,但它的工作原理。我認爲,一旦用戶開始在該字段中輸入內容,會使速度更快的不是關閉KeyUp事件,而是定時器。然後關閉計時器,當他們停止鍵入或焦點離開組合框。

1

因此,您已經能夠使用部分字符串進行搜索 - 可能通過具有類似條件的查詢進行搜索。 下一步很簡單。搜索每個字段,按UNION組合它們,並通過SELECT DISTINCT刪除重複項。 希望這個簡潔的答案就足夠了?