Access VBA多文本框搜索时日期字段为空报错如何解决?
解决方法
核心思路
动态拼接SQL查询条件,只有当对应输入控件有有效值时,才把该字段的筛选条件加入WHERE子句,避免空输入导致的SQL语法错误。
具体实现代码
Dim SQL As String Dim strWhere As String ' 初始化基础SQL语句 SQL = "SELECT * FROM qryRequestInternal WHERE 1=1 " ' 处理发送日期筛选条件 If Not IsNull(txt_Search_Sdate) And Trim(txt_Search_Sdate) <> "" Then strWhere = strWhere & " AND [DateRequestSent] = #" & Format(txt_Search_Sdate, "yyyy-mm-dd") & "# " End If ' 处理接收日期筛选条件 If Not IsNull(txt_Search_Rdate) And Trim(txt_Search_Rdate) <> "" Then strWhere = strWhere & " AND [DateReceived] = #" & Format(txt_Search_Rdate, "yyyy-mm-dd") & "# " End If ' 处理公司名称模糊筛选,空值时默认匹配所有 If Not IsNull(txt_ScompNa) Then strWhere = strWhere & " AND [companyName] Like ""*" & txt_ScompNa & "*"" " End If ' 拼接完整SQL SQL = SQL & strWhere ' 刷新子窗体数据源 Me.sfrmRequestInternal.Form.RecordSource = SQL Me.sfrmRequestInternal.Form.Requery Me.sfrmRequestInternal_col.Form.RecordSource = SQL Me.sfrmRequestInternal_col.Form.Requery End Sub
逻辑说明
- 开头加
WHERE 1=1是为了后续拼接条件时不用处理第一个条件要不要加AND的问题,简化代码 - 每个日期字段先判断是否为空,为空就跳过对应条件的拼接,相当于忽略该筛选条件
- 日期拼接时加了
Format函数统一转成yyyy-mm-dd格式,避免不同系统地区的日期格式差异导致SQL识别错误 - 如果需要支持空日期搜索(也就是输入框为空时匹配数据库中对应日期字段为Null的记录),可以把对应日期的判断分支改成下面的逻辑:
If IsNull(txt_Search_Sdate) Or Trim(txt_Search_Sdate) = "" Then strWhere = strWhere & " AND [DateRequestSent] Is Null " Else strWhere = strWhere & " AND [DateRequestSent] = #" & Format(txt_Search_Sdate, "yyyy-mm-dd") & "# " End If
内容的提问来源于stack exchange,提问作者Abe etan
相关产品推荐
相关产品推荐

