我的表单Main
上有子表单Issue
。要在Main
上实施搜索功能,以便用户可以搜索Issue
中具有给定子字符串的记录,Main
有一个文本框keyword
和一个提交按钮{{1 }}。以下是我正在尝试使用的VBA代码:
SubmitBtn
问题是在这一行之后:
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
中只显示一条记录 - 它是原始记录集中的第一条记录,当时至少有20条记录显示我测试的Issue
值。发生这种情况后,keyword
调用不会更改Me.Issue.Form.Requery
的内容。
我知道正在创建正确的Issue
,因为当我输入recordSourceSQL
的“数据”时,我会为keyword
获取此字符串:
recordSourceSQL
当我在Access中创建一个查询并将其设置为SQL时,我会返回所有正确的结果。
根据给定标准搜索子表单的代码有什么问题?
更新:我可以通过将select * from [Issue] where [Details] like '*data*'
设置为Me.Issue.Form.Filter
中的WHERE子句来实现此功能。我不明白为什么recordSourceSql
有效但改变.Filter
没有。
更新2:.RecordSource
解决方案也无效。我在this SO question中描述了这个问题。
答案 0 :(得分:1)
我创建了一个示例,复制了您的代码,并能够复制您的问题并解决它。
如果您的子表单未绑定(即,recordsource为空)并且主表和Issue表的主键具有相同的字段名称(例如,两者都被命名为“ID”等)并且您没有链接任何父或子字段,那么它只有在你特意为每个字段命名时才会起作用:
recordSourceSql = "SELECT Issue.IssueID, Issue.Details FROM Issue WHERE Issue.Details Like '*Data*'"
你是对的!选择中的通配符在此方案中不起作用,包括选择问题。*来自问题。
或者,如果在“问题”表中重命名主键,使其与主表单主表不同,则通配符的工作方式与预期的一样。当我进行此更改时,您的确切代码有效:
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专家会知道原因。
希望这会有所帮助。