我有一个主要表单绑定到用户记录,子表单绑定到用户拥有的许多客户端对象。"因此,用户和客户之间存在一对多的关系。
由于存在子表单,用户可以在“客户端”子表单中添加,删除和编辑条目。当用户在子表单数据表中添加一个条目时,会有一个自动完成功能,用户可以在客户端名称中输入与客户端数据库中任何名称匹配的部分,从而为用户节省几次击键并确保用户输入与客户端数据库中的名称完全匹配的名称。
Clients表中需要注意的一点是,除了每个客户端都有唯一的数字ID之外,每个客户端都有一个完整的公司名称(Test Agency,Inc。),一个通俗名称(Test Agency)和一个缩写名称(TA)。
我正在尝试编辑子表单,以便自动完成功能与上面列出的三个字段中的任何一个匹配(全名,口语名称和缩写名称)。现在,自动完成功能仅对全名起作用,因为这是链接到子表单的字段。我希望用户能够键入字符串的一部分,子窗体尝试将其匹配到三个字段中的任何一个(全名,口语名称,缩写名称)并返回潜在匹配列表中的任何一个三个领域。当用户为他们试图搜索的客户选择正确的潜在匹配时,则会将完整的公司名称输入到datsheet中。基本上,这些附加字段只是让用户更容易找到他们正在寻找的客户端(想象一下输入AMD而不是Advanced Micro Devices,Inc。)
我的第一个问题 - 这可能与简单的数据表有关吗?我已经研究过使用查找字段和多值查找字段,但我不确定这是否是正确的方法。或者我需要构建一个自定义控件,在多个字段上进行匹配吗?
答案 0 :(得分: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 :(得分:1)
所以你已经能够使用部分字符串进行搜索 - 可能是通过类似条件的查询。 下一步非常简单。搜索每个字段,通过UNION组合它们,并通过SELECT DISTINCT删除重复项。 希望这个简洁的答案足够吗?