访问表单上的动态编码过滤器

时间:2013-03-22 09:57:26

标签: ms-access filter ms-access-2007 access-vba

我在访问中有一个连续的表单,标题中有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

2 个答案:

答案 0 :(得分:1)

您可以在组合框上创建After Update事件。以下是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

这是单记录表单,但如果你想要更改组合框,应该让你开始。

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

答案 1 :(得分: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