1

我有一个连续的表单可以访问,标题中有 3 个组合框来过滤数据。目前我有一个相当长的嵌套 IF 来检查有多少组合框正在使用并涵盖所有 8 个渗透。有 3 个盒子还不错,但我可能会添加第 4 个甚至第 5 个,在这种情况下它会变得很荒谬。

有没有更简单的方法来为连续表单设置组合框过滤器?

当前代码

Private Sub filters()
    Dim fstr As String, rgS As String, piS As String, hcS As String
    rgS = "research_group_id = " & Me.fRG
    piS = "pi_id = " & Me.fPI
    hcS = "healthcat_id = " & Me.fHC
    If IsNull(Me.fRG) Then
        If IsNull(Me.fPI) Then
            If IsNull(Me.fHC) Then
                ' Do Nothing
            Else
                fstr = hcS
                Call filton(Me.Name, fstr)
            End If
        Else
            If IsNull(Me.fHC) Then
                fstr = piS
                Call filton(Me.Name, fstr)
            Else
                fstr = piS & " AND " & hcS
                Call filton(Me.Name, fstr)
            End If
        End If
    Else
        If IsNull(Me.fPI) Then
            If IsNull(Me.fHC) Then
                fstr = rgS
                Call filton(Me.Name, fstr)
            Else
                fstr = rgS & " AND " & hcS
                Call filton(Me.Name, fstr)
            End If
        Else
            If IsNull(Me.fHC) Then
                fstr = rgS & " AND " & piS
                Call filton(Me.Name, fstr)
            Else
                fstr = rgS & " AND " & piS & " AND " & hcS
                Call filton(Me.Name, fstr)
            End If
        End If
    End If
End Sub

更新每个组合框后会触发上述代码。

Public Function filton(frmname As String, fstr As String)
        With Forms(frmname)
            .FilterOn = False
            .Filter = fstr
            .FilterOn = True
        End With
End Function
4

2 回答 2

1

您可以在组合框上创建更新后事件。这是一个 3 层层次结构的示例,其中父和子组合框在加载时被禁用

Private Sub Grandfather_Combo_AfterUpdate()

    Parent_Combo.RowSource="SELECT ...."
    Parent_Combo.Enabled=True
    Child_Combo.Enabled=False     ' the child is invalid until the parent is defined

End Sub

Private Sub Parent_Combo_AfterUpdate()

    Child_Combo.RowSource="SELECT ...."
    Child_Combo.Enabled=True

End Sub

这适用于单记录表单,但如果是您想要更改的组合框,应该可以帮助您入门。

如果它是您要更改的记录过滤器,则使用相同的事件,但是您更改相关字段的过滤器变量,然后调用公共子例程从所有过滤器变量的组合中重新创建表单过滤器。

于 2013-03-22T10:10:18.063 回答
1

将每个标准添加" AND "到您的过滤器字符串中。之后,丢弃该字符串的前导" AND "。这种方法应该很容易适应任何数量的标准。

不确定我是否在下面的代码中正确匹配了所有内容,但希望模式很清楚。

If Not IsNull(Me.fRG) Then
    fstr = fstr & " AND " & rgS
End If
If Not IsNull(Me.fPI) Then
    fstr = fstr & " AND " & piS
End If
If Not IsNull(Me.fHC) Then
    fstr = fstr & " AND " & hcS
End If
If Len(fstr) > 0 Then
    ' discard leading " AND "
    fstr = Mid(fstr, 6)
End If
于 2013-03-22T10:12:54.353 回答