Ms access 创建表单以基于多个条件搜索记录

Ms access 创建表单以基于多个条件搜索记录,ms-access,ms-access-2016,Ms Access,Ms Access 2016,我正在尝试创建一个表单,允许您根据多个条件返回结果 我有FirstName字段、LastName字段和State字段 我还有一个名为searchFirst,searchLast,searchState的文本框,用户可以在其中输入条件 单击“搜索”按钮后,将执行以下代码 Private Sub mySearchQuery\u Click() 将筛选器设置为字符串 将firstname设置为字符串 Dim rtLastName作为字符串 将状态设置为字符串 rtFirstName=Me.search

我正在尝试创建一个表单,允许您根据多个条件返回结果

我有
FirstName
字段、
LastName
字段和
State
字段

我还有一个名为
searchFirst
searchLast
searchState
的文本框,用户可以在其中输入条件

单击“搜索”按钮后,将执行以下代码

Private Sub mySearchQuery\u Click()
将筛选器设置为字符串
将firstname设置为字符串
Dim rtLastName作为字符串
将状态设置为字符串
rtFirstName=Me.searchFirst.Value
rtLastName=Me.searchLast.Value
rtState=Me.searchState.Value
如果不是IsNull(rtFirstName),则
如果不是IsNull(filter),则filter=filter&“和”
filter=filter&“(类似于“*”的FirstName&rtFirstName&“*”)
如果结束
如果不是IsNull(rtLastName),则
如果不是IsNull(filter),则filter=filter&“和”
filter=filter&“(类似于“*”的LastName&rtLastName&“*”)
如果结束
如果不是IsNull(rtState),则
如果不是IsNull(filter),则filter=filter&“和”
filter=filter&“(类似于“*”的状态&rtState&“*”)
如果结束
'现在重新构造SQL查询'
将sql设置为字符串
sql=“从主数据中选择*”
如果不是IsNull(过滤器),则
sql=sql&“WHERE”&过滤器
如果结束
Me.RecordSource=sql
'SubForm.Form.RecordSource=sql
端接头
我得到下面的错误

运行时错误“3075”:查询中出现语法错误(缺少运算符) 表达式“AND”(姓氏如“*tracy*”)和(姓氏如“*Smith*”) 和(状态如“*ga*”)

我不知道为什么搜索查询的开头包含了

我不知道为什么,并且在搜索开始时被包括在内 询问

由于
Dim filter是字符串
filter
不能包含Null。这意味着这些
如果
条件<代码>如果不为空(过滤器)
。。。永远都是真的

类似地,
非IsNull(rtFirstName)
非IsNull(rtLastName)
非IsNull(rtState)
将始终为真

最终结果是,代码将另一个条件片段添加到
过滤器
字符串中,而不管相应的搜索文本框是否包含任何内容,并且每个条件片段都以
和“
作为前缀

考虑到这些要点,只有在相应的搜索文本框中有内容并决定何时包含
和“
时,才可以重构代码以添加
过滤器
段。然而,我发现更简单的方法是为它们中的每一个包含
”和“
”,然后从
过滤器中去掉第一个
”和“
,然后再将其添加到
WHERE
子句中

Private Sub mySearchQuery\u Click()
Dim strSelect As字符串
作为字符串的Dim strWhere
如果Len(Trim(Me!searchFirst.Value)&vbNullString)>0,则
strWhere=strWhere&“和像“*”这样的名字&Me!searchFirst.Value&“*”“”
如果结束
如果Len(Trim(Me!searchLast.Value)&vbNullString)>0,则
strWhere=strWhere&“LastName像”*“&Me!searchLast.Value&“*”“”
如果结束
如果Len(Trim(Me!searchState.Value)&vbNullString)>0,则
strWhere=strWhere&“并且像”*“&Me这样的状态!searchState.Value&“*”“”
如果结束
'现在重新构造SQL查询
strSelect=“从主数据中选择*
'仅当strWhere中有内容时才添加WHERE子句
如果Len(strWhere)>0,则
'使用Mid()忽略前导的“AND”
strSelect=strSelect&“WHERE”和Mid(strWhere,6)
如果结束
调试。打印strSelect'
我不知道为什么,并且在搜索开始时被包括在内
询问

由于
Dim filter是字符串
filter
不能包含Null。这意味着这些
如果
条件<代码>如果不为空(过滤器)
。。。永远都是真的

类似地,
非IsNull(rtFirstName)
非IsNull(rtLastName)
非IsNull(rtState)
将始终为真

最终结果是,代码将另一个条件片段添加到
过滤器
字符串中,而不管相应的搜索文本框是否包含任何内容,并且每个条件片段都以
和“
作为前缀

考虑到这些要点,只有在相应的搜索文本框中有内容并决定何时包含
和“
时,才可以重构代码以添加
过滤器
段。然而,我发现更简单的方法是为它们中的每一个包含
”和“
”,然后从
过滤器中去掉第一个
”和“
,然后再将其添加到
WHERE
子句中

Private Sub mySearchQuery\u Click()
Dim strSelect As字符串
作为字符串的Dim strWhere
如果Len(Trim(Me!searchFirst.Value)&vbNullString)>0,则
strWhere=strWhere&“和像“*”这样的名字&Me!searchFirst.Value&“*”“”
如果结束
如果Len(Trim(Me!searchLast.Value)&vbNullString)>0,则
strWhere=strWhere&“LastName像”*“&Me!searchLast.Value&“*”“”
如果结束
如果Len(Trim(Me!searchState.Value)&vbNullString)>0,则
strWhere=strWhere&“并且像”*“&Me这样的状态!searchState.Value&“*”“”
如果结束
'现在重新构造SQL查询
strSelect=“从主数据中选择*
'仅当strWhere中有内容时才添加WHERE子句
如果Len(strWhere)>0,则
'使用Mid()忽略前导的“AND”
strSelect=strSelect&“WHERE”和Mid(strWhere,6)
如果结束

调试。打印strSelect'非常感谢!是的!这是我们的初衷。你救了我5个小时的压力!谢谢,谢谢!!非常感谢你!是的!这是我们的初衷。你救了我5个小时的压力!谢谢,谢谢!!