Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 访问表单上的动态编码过滤器_Ms Access_Filter_Ms Access 2007_Vba - Fatal编程技术网

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

Ms access 访问表单上的动态编码过滤器,ms-access,filter,ms-access-2007,vba,Ms Access,Filter,Ms Access 2007,Vba,我在access中有一个连续表单,在标题中有3个组合框来过滤数据。目前,我有一个相当长的嵌套IF-to来检查使用了多少个组合框,并覆盖了所有8个渗透。有3个盒子还不错,但我可能会加上第4个甚至第5个,在这种情况下,它会变得很可笑 是否有更简单的方法为连续表单设置组合框过滤器 当前代码 Private Sub filters() Dim fstr As String, rgS As String, piS As String, hcS As String rgS = "resear

我在access中有一个连续表单,在标题中有3个组合框来过滤数据。目前,我有一个相当长的嵌套IF-to来检查使用了多少个组合框,并覆盖了所有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

您可以在组合框上创建更新后事件。下面是一个三层继承权的示例,其中在加载时禁用父组合框和子组合框

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
这是一个单记录表单,但如果您想更改组合框,应该可以开始


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

将带有
和“
的每个条件添加到筛选器字符串中。然后,从该字符串中丢弃前导的
和“
”。这种方法应该很容易适应任何数量的标准

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

如果不为空(Me.fRG),则
fstr=fstr&“和”&rgS
如果结束
如果不是IsNull(Me.fPI),那么
fstr=fstr&“和”&piS
如果结束
如果不为空(Me.fHC),则
fstr=fstr&“和”&hcS
如果结束
如果Len(fstr)>0,则
“放弃前导”和
fstr=Mid(fstr,6)
如果结束

对不起,我应该说上述代码是在每个组合框更新后触发的OK,我支持我的立场。Individual AfterUpdate()设置form_level变量,公共子例程以更改筛选器。组合框没有分层。用户可以选择1、2或3的任意组合。抱歉,第二个选项。现在没有时间改变这个例子。太好了。起初并不认为它有效,但忘记在最后添加
callfilton(me.name,fstr)
。谢谢!没有看到已删除的注释,但在没有
vbnullstring
的情况下,它可以正常工作。