【问题标题】:Dynamically Coding Filters on Access Form访问表单上的动态编码过滤器
【发布时间】:2013-03-12 03:15:17
【问题描述】:

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

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 优秀。起初认为它不起作用但忘记在最后添加Call Filton(me.name,fstr)。非常感谢!
    • 没有看到已删除的评论,但没有vbnullstring 也能正常工作。
    【解决方案2】:

    您可以在组合框上创建更新后事件。这是一个 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
    

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

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

    【讨论】:

    • 对不起,我应该说上面的代码是在每个组合框更新后触发的
    • 好的,我坚持我的立场。单独的 AfterUpdate() 设置 form_level 变量,用于更改过滤器的常用子程序。
    • 组合框没有分层,用户可以选择 1、2 或 3 任意组合。
    • 对不起,第二个选项。现在没时间更改示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 2014-09-13
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    相关资源
    最近更新 更多