在表单过滤器中使用OR

问题描述 投票:0回答:2

我的目标是获取人名与过滤器匹配的记录,并且销售月份匹配或支付月份匹配。

我的过滤器为所有人提供结果,而不是按人名过滤。

If Not IsNull(Me.Filter3) Then
    strWhere = strWhere & "([PERSONNAME] Like ""*" & Me.Filter3 & "*"") AND "
End If
If Not IsNull(Me.Filter4) Then
    strWhere = strWhere & "([SaleMonth] Like ""*" & Me.Filter4 & "*"") OR "
End If
If Not IsNull(Me.Filter5) Then
    strWhere = strWhere & "([PAIDMONTH] Like ""*" & Me.Filter5 & "*"") AND "
End If
ms-access access-vba
2个回答
0
投票

需要一对围绕两个OR标准的parens(所有那些原始的parens都没有必要)。这意味着如果您只想提供其中一个OR条件,则需要更多条件代码。由于你使用LIKE和通配符,为什么要干扰条件呢?我更喜欢撇号分隔符。

strWhere = "[PERSONNAME] Like '*" & Me.Filter3 & "*' AND ([SaleMonth] Like '*" & Me.Filter4 & "*' OR [PAIDMONTH] Like '*" & Me.Filter5 & "*')" 

第二个想法,这可能不适用于OR。如果标准仅使用AND然后它会。尝试:

If Not IsNull(Me.Filter3) Then
    strWhere = strWhere & "[PERSONNAME] Like '*" & Me.Filter3 & "*' AND "
End If
If Not IsNull(Me.Filter4) And Not IsNull(Me.Filter5) Then
    strWhere = strWhere & "([SaleMonth] Like '*" & Me.Filter4 & "*' OR [PAIDMONTH] Like '*" & Me.Filter5 & "*') AND "
ElseIf Not IsNull(Me.Filter4) Then
    strWhere = strWhere & "[SaleMonth] Like '*" & Me.Filter4 & "*' AND "
ElseIf Not IsNull(Me.Filter5) Then
    strWhere = strWhere & "[PAIDMONTH] Like '*" & Me.Filter5 & "*' AND "
End If

0
投票

虽然它看起来很乱,但我认为您可能需要执行以下操作以确保括号在所有情况下都是正确的,并在保持正确的SQL时考虑到三个变量的NullNot Null的所有可能组合:

If Not IsNull(Me.Filter3) Then
    strWhere = strWhere & "([PERSONNAME] Like '*" & Me.Filter3 & "*') "
    If (Not IsNull(Me.Filter4)) Or (Not IsNull(Me.Filter5)) Then 
        strWhere = strWhere & "AND "
    End If
End If
If (Not IsNull(Me.Filter4)) And (Not IsNull(Me.Filter5)) Then
    strWhere = strWhere & "(([SaleMonth] Like '*" & Me.Filter4 & "*') OR ([PAIDMONTH] Like '*" & Me.Filter5 & "*')) "
ElseIf Not IsNull(Me.Filter4) Then
    strWhere = strWhere & "([SaleMonth] Like '*" & Me.Filter4 & "*') "
ElseIf Not IsNull(Me.Filter5) Then
    strWhere = strWhere & "([PAIDMONTH] Like '*" & Me.Filter5 & "*') "
End If

但是,请注意以这种方式构建SQL代码当然可以使用SQL注入。

© www.soinside.com 2019 - 2024. All rights reserved.