Использование оператора Like "*" в операторе If - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь создать фильтр на основе четырех полей со списком, которые фильтруют записи в подчиненной форме. Проблема в том, что одно значение из списков RowSource в полях со списком не существует в базовом запросе. Это значение "All". Я планировал использовать один и тот же код для всех событий поля со списком AfterUpdate. Пожалуйста, смотрите мой подход ниже и советы, где это необходимо. В настоящее время я получаю ошибку несоответствия типов на Me.Combobox1.Value = "Like "*""

If IsNull(Me.combo1.Value) Or IsNull(Me.combo2.Value) Or IsNull(Me.combo3.Value) Or 
IsNull(Me.combo4.Value) Then
Exit Sub
End If

If Not IsNull(Me.combo1.Value) Or Not IsNull(combo2.Value) Or Not IsNull(combo3.Value) Or Not 
IsNull(combo4.Value) Then

If Me.combo1 = "All" Then
Me.combo1.Value = "Like " * ""
ElseIf Me.combo2.Value = "All" Then
Me.combo2.Value = "Like " * ""
ElseIf Me.combo3.Value = "All" Then
Me.combo3.Value = "Like " * ""
ElseIf Me.combo4.Value = "All" Then
Me.combo4.Value = "Like " * ""

Task1 = "SELECT * FROM qryBase WHERE [Quarter] = '" & Me.combo1.Value & "' AND [CurrentArea] = '" & 
Me.combo2.Value & "' AND [CurrentStatus] = '" & Me.combo3.Value & "' AND [MainUser] = '" & 
Me.combo4.Value & "'"

End If

End If

1 Ответ

0 голосов
/ 30 апреля 2020

Ваш запрос не может работать, так как LIKE предназначен для замены = в условных выражениях. Однако LIKE без подстановочных знаков ведет себя как =. Поэтому поместите оператор LIKE в оператор SQL.

Dim cbo1, cbo2, cbo3, cbo4 As String
...
If Me.combo1 = "All" Then
    cbo1 = "*"
ElseIf Me.combo2.Value = "All" Then
    cbo2 = "*"
ElseIf Me.combo3.Value = "All" Then
    cbo3 = "*"
ElseIf Me.combo4.Value = "All" Then
    cbo4 = "*"
End If

Task1 = "SELECT * FROM qryBase WHERE [Quarter] LIKE '" & cbo1 & "'" _
         & " AND [CurrentArea] LIKE '" & cbo2 & "'" _
         & " AND [CurrentStatus] LIKE '" & cbo3 & "'" _
         & " AND [MainUser] LIKE '" & cbo4 & "'"

Me.frmDatasheet.Form.Recordsource = Task1
Me.frmDatasheet.Form.Requery

Однако, поскольку в комбинированных полях могут быть апострофы, рассмотрите возможность параметризации, чтобы избежать необходимости объединять значения VBA непосредственно в SQL, но связывать их в качестве параметров:

Dim qdef As QueryDef
Dim rst As Recordset
Dim sql AS String
Dim cbo1, cbo2, cbo3, cbo4 As String

sql = "PARAMETERS cbo1 TEXT, cbo2 TEXT, cbo3 TEXT, cbo4 TEXT;" _
        & "SELECT * FROM qryBase WHERE [Quarter] LIKE [cbo1]" _
        & " AND [CurrentArea] LIKE [cbo2]" _
        & " AND [CurrentStatus] LIKE [cbo3]" _
        & " AND [MainUser] LIKE [cbo4]"

If Me.combo1 = "All" Then
    cbo1 = "*"
ElseIf Me.combo2.Value = "All" Then
    cbo2 = "*"
ElseIf Me.combo3.Value = "All" Then
    cbo3 = "*"
ElseIf Me.combo4.Value = "All" Then
    cbo4 = "*"
End If

' INITIALIZE QUERY OBJECT
Set qdef = CurrentDb.CreateQueryDef("", sql)
' Set qdef = CurrentDb.QueryDefs("mySavedParamQuery")

' BIND PARAMS
qdef!cbo1 = cbo1
qdef!cbo2 = cbo2
qdef!cbo3 = cbo3
qdef!cbo4 = cbo4

' SET FORM RECORDSET TO EXECUTED QUERY 
Set rst = qdef.OpenRecordset()    
Set Me.frmDatasheet.Form.Recordset = rst

Set rst = Nothing: Set qdef = Nothing
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...