表单上的搜索功能无法正常工作

时间:2014-05-01 17:06:27

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

我的表单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中描述了这个问题。

1 个答案:

答案 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专家会知道原因。

希望这会有所帮助。