【问题标题】:building a search form in Access 2010在 Access 2010 中构建搜索表单
【发布时间】:2014-11-24 16:02:45
【问题描述】:

我正在尝试为 access 2010 制作搜索客户表单。

我喜欢有一个基于查询搜索的选项组。我做了一个搜索查询,寻找名字或姓氏。表单上还有两个文本框来填写查询输入(名字和姓氏)

我需要选项组,以便我可以选择结果名称进行预订。

过去,我使用子表单和复选框间接地做到了这一点。 然后在子表单和复选框(重新查询)上加载两个结果,因此用户只需在复选框上进行选择。但是这次我希望选项是查询结果本身!请帮忙。

【问题讨论】:

  • 使用组合框或列表框有什么问题?
  • 从结果(选项组)中我可以直接选择任何记录,当我按下“下一步”按钮时,它会将数据转移到下一个表单,这会不会很好。而不是有两个“结果”对象(子表单和复选框)。这是多余的。
  • 我的客户搜索表单的工作方式与此类似:我在顶部有一个搜索文本框。我有一个下面所有客户的连续表格。用户在搜索框中输入文本后,我通过创建基于每个字段名称的条件来过滤记录集,如下所示:FirstName Like *%s* Or LastName Like *%s* 并将%s 替换为搜索框中的文本。我认为它非常漂亮。然后,用户单击联系人姓名右侧的箭头按钮以在新表单中选择或查看该联系人的完整详细信息。

标签: ms-access vba ms-access-2010


【解决方案1】:

这是一个使用列表框的简单示例:

表:客户

ID - 自动编号
姓氏 - 文本 (255)
名字 - 文本(255)
电子邮件 - 文本 (255)

测试数据:

ID  LastName    FirstName       Email
--  ----------  --------------  ------------------
1   Thompson    Gord            gord@example.com
2   Loblaw      Bob             bob@example.com
3   Kingsley    Hank            hank@example.com
4   Thompson    Hunter S.       hunter@example.com
5   Squarepants Spongebob       ss@example.com
6   O'Rourke    P. J.           pj@example.com
7   Aldrin      Edwin "Buzz"    buzz@example.com

表单布局:

此表单的 VBA 模块:

Option Compare Database
Option Explicit

Private Sub Form_Load()
Me.lstSearchResults.RowSource = ""
End Sub

Private Sub btnSearch_Click()
Me.lstSearchResults.SetFocus
Me.lstSearchResults.Value = Null
Me.lstSearchResults.RowSource = _
        "SELECT ID, LastName, FirstName FROM Clients " & _
            "WHERE LastName LIKE ""*" & DQ(Me.txtSearchLastName.Value) & _
                "*"" AND FirstName LIKE ""*" & DQ(Me.txtSearchFirstName.Value) & "*"""
End Sub

Private Function DQ(s As Variant) As String
' double-up double quotes for SQL
DQ = Replace(Nz(s, ""), """", """""", 1, -1, vbBinaryCompare)
End Function

Private Sub btnLookupEmail_Click()
If IsNull(Me.lstSearchResults.Value) Then
    Me.txtEmail.Value = ""
Else
    Me.txtEmail.Value = DLookup("Email", "Clients", "ID=" & Me.lstSearchResults.Value)
End If
End Sub

第一次打开表单时,一切都是空的。

键入“thompson”(不带引号)并单击btnSearch 将使用客户端WHERE LastName LIKE "*thompson*" 填充列表框。 (如果您查看代码,您会发现如果您提供 FirstName,它也会匹配 FirstName。)

选择列表框中的一项并单击btnLookupEmail,电子邮件地址将显示在下面的文本框中。

【讨论】:

  • 这太棒了。我没有意识到它也可以使用列表框来完成。我不太了解使用 SQL 代码,但我确实清楚地理解了代码。
    但是是否可以使用 frameset(option grp) 代替?
    当用户按下“下一步”时,我的程序将隐藏当前表单(假设他选择了一个结果值。这样,我可以使用完整链接表单地址“forms!formname! object.value"。是否可以将列表框的当前值用于下一个表单?
  • @Daytron 回复:“是否可以将列表框的当前值用于下一个表单?” - 我不明白为什么不。如果formname 仍然被加载,forms!formname!lstSearchResults.Value 应该可以工作,即使它是隐藏的。列表框旨在容纳可变数量的可能选择,而选项组实际上旨在容纳固定数量的选择。
  • 谢谢。我很感激帮助。最后一个问题,我发现一些我不明白的行太晚了。
    从Replace函数的语法来看:
    Replace(string1,find,replacement,[start,[count,[compare]]])

    为什么一定要replace为什么字符串是 Nz(s,"")?
  • @Daytron Nz() 函数将 Null 值转换为指定的非 Null 值。在这种情况下,它是说“如果 s 为 Null,则将其视为空字符串”。 Replace() 确保字符串中的任何 " 字符都加倍,因为当字符串本身用双引号括起来时,它们必须是双引号,例如,"Say ""Hello"" for me!"
  • 非常感谢!现在一切都已启动并运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
  • 2015-05-27
  • 1970-01-01
  • 2017-12-02
相关资源
最近更新 更多