0

我有一个与用户记录相关联的主表单,一个与用户“拥有”的多个客户端对象相关联的子表单。因此,用户和客户之间存在一对多的关系。

由于子表单存在,用户可以在 Clients 子表单中添加、删除和编辑条目。当用户向子表单数据表中添加条目时,有一个自动完成功能会在用户键入与客户端数据库中的任何名称匹配的客户端名称的一部分时启动,从而为用户节省一些击键并确保用户输入与客户端数据库中的名称完全匹配的名称。

需要注意的一点是,除了每个客户都有一个唯一的数字 ID 之外,每个客户还有一个完整的公司名称 (Test Agency, Inc.)、一个俗名 (Test Agency) 和一个缩写名称 (TA) .

我正在尝试编辑子表单,以便自动完成功能与上面列出的三个字段(全名、俗名和缩写名)中的任何一个匹配。目前,自动完成功能仅适用于全名,因为这是链接到子表单的字段。我希望用户能够输入字符串的一部分,子表单尝试将其与三个字段(全名、俗名、缩写名)中的任何一个匹配,并返回一个潜在匹配列表到任何一个三个领域。当用户为他们尝试搜索的客户选择正确的潜在匹配项时,然后将完整的公司名称输入到数据表中。基本上,这些附加字段只是让用户更容易找到他们正在寻找的客户端(想象一下输入 AMD 而不是 Advanced Micro Devices, Inc.)

我的第一个问题——这可能与一个简单的数据表有关吗?我已经研究过使用查找字段和多值查找字段,但我不确定这是正确的方法。或者我是否需要自己构建一个自定义控件,在多个字段上进行匹配?

4

2 回答 2

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 事件,而是在用户开始在该字段中输入时启动计时器。然后在他们停止输入或焦点离开组合框时关闭计时器。

于 2017-06-22T20:51:18.380 回答
1

因此,您已经能够使用部分字符串进行搜索 - 可能是通过具有类似条件的查询。下一步非常简单。搜索每个字段,通过 UNION 组合它们,并通过 SELECT DISTINCT 删除重复项。希望这个简洁的答案就足够了吗?

于 2017-06-22T20:43:43.800 回答