【问题标题】:Search functionality on form not working properly表单上的搜索功能无法正常工作
【发布时间】:2014-05-17 08:57:54
【问题描述】:

我有一个表单Main,上面有一个子表单Issue。为了在Main 上实现搜索功能,以便用户可以在Issue 中搜索具有给定子字符串的记录,Main 有一个文本框keyword 和一个提交按钮SubmitBtn。这是我用来尝试完成这项工作的 VBA 代码:

Private Sub SubmitBtn_Click()   
 Dim keyword As String
 Dim recordSourceSql As String

 keyword = Nz(Me.keyword.value)
 recordSourceSql = "select * from [Issue] where [Details] like " & quoteWrap(keyword)  
 Me.Issue.Form.RecordSource = recordSourceSql
 Me.Issue.Form.Requery
End Sub

Private Function quoteWrap(value As String) As String
 quoteWrap = "'*" & value & "*' "
End Function

问题在于这一行之后:

Me.Issue.Form.RecordSource = recordSourceSql

Issue 中只有一条记录显示——它是原始记录集中的第一条记录,而我测试的值应该至少有 20 条记录显示为keyword。一旦发生这种情况,Me.Issue.Form.Requery 调用不会更改Issue 的内容。

我知道正在创建正确的recordSourceSQL,因为当我输入keyword 的“数据”时,我得到recordSourceSQL 的这个字符串:

select * from [Issue] where [Details] like '*data*'

当我在 Access 中创建查询并将其设置为 SQL 时,我得到了返回的所有正确结果。

根据给定条件搜索子表单的代码有什么问题?

更新:我可以通过将Me.Issue.Form.Filter 设置为recordSourceSql 中的WHERE 子句来实现此功能。我不明白为什么 .Filter 有效,但更改 .RecordSource 无效。

更新 2:.Filter 解决方案也不起作用。我已经在this SO question 中描述了这个问题。

【问题讨论】:

  • Requery 之后添加Me.Issue.Form.Refresh 有效吗?
  • @enderland,不,结果相同。同样,在调用 Requery 之前,表单的内容已经发生了变化。
  • 另外 - 这甚至是如何运行的?此行对 VBA 代码 recordSourceSql = "select * from [Issue] where "[Details] like " & quoteWrap(keyword) 无效——它与 " 不匹配。我不确定它是如何工作的,你有一个来自 [详细信息] 的额外信息。
  • @enderland,抱歉,打错了。我将删除 [Details] 前面的 "。
  • 您的子表单是否以某种方式绑定到父表单?未显示的记录是否因为您正在进行的绑定而被过滤掉?

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


【解决方案1】:

我创建了一个示例,复制了您的代码,并且能够复制您的问题并解决它。

如果您的子表单未绑定(即,记录源为空)并且您的主表和问题表的主键具有相同的字段名称(例如,两者都被命名为“ID”等)并且您没有链接任何父或子字段,那么只有在您像这样专门命名每个字段时它才会起作用:

recordSourceSql = "SELECT Issue.IssueID, Issue.Details FROM Issue WHERE Issue.Details Like '*Data*'"

你是对的! select 中的通配符在这种情况下不起作用,包括 Select Issue.* From Issue。

或者,如果您重命名问题表中的主键,使其与主表单主表不同,则通配符将按预期工作。当我进行此更改时,您的确切代码有效:

recordSourceSql = "SELECT * FROM Issue WHERE Details Like " & quoteWrap(Keyword)

注意 Me.Issue.Form.Requery 不是必需的。只需设置或更改 RecordSource 自动请求。

将两个主键字段拖到主窗体还是子窗体似乎无关紧要。它也无助于使子表单数据绑定,但在“Select * from Issue Where 1=2”的属性表中使用初始记录源为空(创建空记录集的一种方法,但保持表单绑定)。

我不知道这是 MS-Access 的怪癖还是故意的。在我看来,我必须多次遇到这种情况(主键是“ID”,子表单未绑定,没有链接子字段),但我不记得遇到过这个限制。也许我没有使用通配符。当我用谷歌搜索时,我没有发现其他人报告了这一点,但毫无疑问,那里的一些 MS-Access 专家会知道原因。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    相关资源
    最近更新 更多