1

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

我有FirstName字段,LastName字段和State字段。

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

搜索按钮单击后将执行以下代码。

Private Sub mySearchQuery_Click()

Dim filter As String

Dim rtFirstName As String
Dim rtLastName As String
Dim rtState As String

rtFirstName = Me.searchFirst.Value
rtLastName = Me.searchLast.Value
rtState = Me.searchState.Value

If Not IsNull(rtFirstName) Then
        If Not IsNull(filter) Then filter = filter & " AND "
        filter = filter & "(FirstName like""*" & rtFirstName & "*"")"
End If


If Not IsNull(rtLastName) Then
        If Not IsNull(filter) Then filter = filter & " AND "
        filter = filter & "(LastName like""*" & rtLastName & "*"")"
End If

If Not IsNull(rtState) Then
        If Not IsNull(filter) Then filter = filter & " AND "
        filter = filter & "(State LIKE""*" & rtState & "*"")"
End If

' Now re-construct the SQL query '
Dim sql As String
sql = "SELECT * FROM MainData"

If Not IsNull(filter) Then
        sql = sql & " WHERE " & filter
End If

Me.RecordSource = sql
'SubForm.Form.RecordSource = sql

End Sub

我在下面收到以下错误。

运行时错误 '3075':查询表达式 'AND (FirstName like"*tracy*") AND (lastName like"*Smith*") AND (State LIKE"*ga*")' 中的语法错误(缺少运算符)。

我不确定为什么AND包含在搜索查询的开头?

4

1 回答 1

0

我不确定为什么 AND 包含在搜索查询的开头?

既然你有Dim filter As Stringfilter就永远不能包含 Null。这意味着这些If条件…… If Not IsNull(filter)将永远为真。

同样,Not IsNull(rtFirstName)Not IsNull(rtLastName)Not IsNull(rtState)将始终为真。

最终结果是代码将另一个条件片段添加到您的filter字符串中,无论相应的搜索文本框是否包含任何内容,并且每个片段都带有前缀" AND "

考虑到这些要点,您可以重构代码以filter仅在相应的搜索文本框中有内容并决定何时包含" AND ". 但是,我发现将" AND "它们中的每一个都包含在内,然后在将其添加到子句之前删除第一个" AND "更简单filterWHERE

Private Sub mySearchQuery_Click()
    Dim strSelect As String
    Dim strWhere As String

    If Len(Trim(Me!searchFirst.Value) & vbNullString) > 0 Then
        strWhere = strWhere & " AND FirstName Like ""*" & Me!searchFirst.Value & "*"""
    End If

    If Len(Trim(Me!searchLast.Value) & vbNullString) > 0 Then
        strWhere = strWhere & " AND LastName Like ""*" & Me!searchLast.Value & "*"""
    End If

    If Len(Trim(Me!searchState.Value) & vbNullString) > 0 Then
        strWhere = strWhere & " AND State Like ""*" & Me!searchState.Value & "*"""
    End If

    ' Now re-construct the SQL query
    strSelect = "SELECT * FROM MainData"

    ' only add WHERE clause if we have something in strWhere    
    If Len(strWhere) > 0 Then
        ' use Mid() to ignore leading " AND "
        strSelect = strSelect & " WHERE " & Mid(strWhere, 6)
    End If
    Debug.Print strSelect ' <- inspect this in Immediate window; Ctrl+g will take you there

    ' enable one of these RecordSource lines after confirming Debug.Print shows you what you need
    'Me.RecordSource = sql
    'SubForm.Form.RecordSource = sql
End Sub
于 2016-02-16T18:52:01.233 回答