Быстрые фильтры в разделенной форме - PullRequest
0 голосов
/ 09 апреля 2020

Создание базы данных доступа для работы. Пользователи будут использовать разделенную форму только с таблицей данных, видимой для просмотра и обработки числовых данных c. В форму я встроил быстрые фильтры, которые состоят из текстовых полей, в которых значения либо повышаются, либо понижаются с помощью кнопок со стрелками, которые имеют события нажатия. В настоящее время у меня есть текстовые поля, связанные с критериями запроса к источнику записей.

Учитывая все вышесказанное, проблема, с которой я столкнулся, заключается в том, что мне нужно, чтобы фильтр действовал следующим образом:

Если значение в текстовом поле равно 0, я хочу увидеть все записи. Если значение больше 0, я хочу, чтобы все записи были больше или равны значению текстового поля. Наконец, если значение в текстовом поле меньше 0, я хочу, чтобы все значения были меньше или равны 0.

Я рассмотрел попытку использовать несколько операторов sql, но у меня обычно около 3 из этих быстрых фильтров на каждой форме, и мой проект в конечном итоге будет иметь около 20 форм. Это много sql заявлений, которые могут испортить.

Какие у вас, ребята, идеи, чтобы решить эту проблему? Мне действительно нужна помощь.

Ответы [ 3 ]

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

Учитывая текстовое поле управления CriteriaField1 и соответствующее поле для фильтрации Field1 в источнике записи, я бы использовал это:

Private Sub CriteriaField1_AfterUpdate()
    Const FIELD_NAME As String = "Field1"

    Dim value As Long
    value = Nz(Me("Criteria" & FIELD_NAME).Value, 0)

    Dim condition As String
    condition = FIELD_NAME & IIf(value < 0, " <= 0", " >= " & value)

    Me.FilterOn = value <> 0
End Sub

Если вам нужно объединить несколько полей в условие фильтра, вам придется использовать и устанавливать глобальные переменные формы вместо локальных.

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

Вы можете вызвать вспомогательную функцию, которая содержит набор массивов, строит и динамически устанавливает фильтр:

Private Sub Filter0_AfterUpdate()

    SetFilter

End Sub


Private Sub Filter1_AfterUpdate()

    SetFilter

End Sub


Private Sub Filter2_AfterUpdate()

    SetFilter

End Sub


Private Sub SetFilter()

    Dim FieldNames()    As Variant
    Dim TextboxNames()  As Variant
    Dim Criteria()      As String

    Dim Index           As Integer
    Dim Value           As Long

    ' Specify the field names to filter on.
    FieldNames = Array("Quantity", "Stock", "Size")
    ' Specify the names of the textboxes to enter filter values.
    TextboxNames() = Array("Filter0", "Filter1", "Filter2")

    ReDim Criteria(LBound(TextboxNames) To UBound(TextboxNames))

    For Index = LBound(Criteria) To UBound(Criteria)
        Value = Val(Nz(Me(TextboxNames(Index)).Value))
        If Value < 0 Then
            Criteria(Index) = FieldNames(Index) & " <= 0"
        ElseIf Value > 0 Then
            Criteria(Index) = FieldNames(Index) & " >= " & CStr(Value)
        Else
            Criteria(Index) = "True"
        End If
    Next

    ' Assemble and apply the filter.
    Me.Filter = Join(Criteria, " And ")
    Me.FilterOn = True

    Debug.Print Me.Filter

End Sub
0 голосов
/ 09 апреля 2020

Если у вас есть только одно текстовое поле в каждой форме, вы можете рассмотреть возможность использования свойства Filter формы:

Private Sub txtFilter_AfterUpdate()
    On Error GoTo E_Handle
    If Not IsNull(Me!txtFilter) Then
        If IsNumeric(Me!txtFilter) Then
            Select Case Me!txtFilter
                Case Is < 0
                    Me.Filter = "Price<=0"
                    Me.FilterOn = True
                Case 0
                    Me.FilterOn = False
                Case Is > 0
                    Me.Filter = "Price>=" & Me!txtFilter
                    Me.FilterOn = True
            End Select
        End If
    End If
sExit:
    On Error Resume Next
    Exit Sub
E_Handle:
    MsgBox Err.Description & vbCrLf & vbCrLf & "Form2!txtFilter_AfterUpdate", vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume sExit
End Sub

Если вам нужно иметь несколько фильтров, рассмотрите возможность перемещения создания фильтра в процедуру сам по себе обрабатывает все случаи и просто вызывает эту процедуру из каждого текстового поля. Возможно, вам придется подумать о логике c, что происходит, если одно текстовое поле равно 0 (без фильтра), а другое текстовое поле равно 5 (показать все значения> = 5), а другое текстовое поле равно -3 (показать все значения <= 0): </p>

Private Sub txtFilter2_AfterUpdate()
    On Error GoTo E_Handle
    Call sFilterForm2
sExit:
    On Error Resume Next
    Exit Sub
E_Handle:
    MsgBox Err.Description & vbCrLf & vbCrLf & "Form2!txtFilter2_AfterUpdate", vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume sExit
End Sub

Private Sub sFilterForm2()
    On Error GoTo E_Handle
    Dim strSQL As String
    If Not IsNull(Me!txtFilter) Then
       If IsNumeric(Me!txtFilter) Then
           Select Case Me!txtFilter
               Case Is < 0
                   strSQL = " AND Price<=0 "
               Case 0
               Case Is > 0
                   strSQL = strSQL & " AND Price>=" & Me!txtFilter
           End Select
       End If
    End If

    If Not IsNull(Me!txtFilter2) Then
       If IsNumeric(Me!txtFilter2) Then
           Select Case Me!txtFilter2
               Case Is < 0
                   strSQL = " AND Price<=0 "
               Case 0
               Case Is > 0
                   strSQL = strSQL & " AND Price>=" & Me!txtFilter2
           End Select
       End If
    End If

    If Len(strSQL) > 0 Then
        strSQL = Mid(strSQL, 5)
        Me.Filter = strSQL
        Me.FilterOn = True
    Else
        Me.FilterOn = False
    End If
sExit:
    On Error Resume Next
    Exit Sub
E_Handle:
    MsgBox Err.Description & vbCrLf & vbCrLf & "Form2!sFilterForm2", vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume sExit
End Sub

С уважением

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