多个过滤器选项控制

时间:2014-01-05 12:04:13

标签: vba ms-access

我正在尝试创建一个选项按钮,该按钮将对已经过滤的记录子表单运行过滤器。

启动选项按钮后,子窗体内创建的过滤器将不再有效。

我试图确定以下两件事,两者都取得了最小的成功:

1-是否可以对已经过滤的表运行过滤器并维护两个过滤器的规则?

2-如果没有,我试图在选项按钮过滤器的代码中加入一个和语句,但收效甚微......

基本上,我希望使用AND

将以下两个语句合并到一个语句中

我![frmProjectSubPhase04] .Form.Filter =“[overall_status] ='延迟'”和 我![frmProjectSubPhase04] .Form.Filter =“[exercise] = not null”

我希望很快能听到有人说这个,因为它真的让我烦恼.Thanx

2 个答案:

答案 0 :(得分:2)

如果您的现有过滤器是

Me![frmProjectSubPhase04].Form.Filter = "[overall_status]='delayed'"

并且您想要添加第二个条件,您应该能够使用如下代码

Me![frmProjectSubPhase04].Form.Filter = _
        "(" & Me![frmProjectSubPhase04].Form.Filter & ") " & _
            "AND ([exercise] IS NOT NULL)"

答案 1 :(得分:1)

根据建议,您需要将现有的.Form.Filter与选项按钮中的新条件相结合。但是,有些情况可能会导致最简单的解决方案出现问题。我假设主表单上的选项按钮为optDelayedOnly,标题为Delayed Records Only

  1. 如果子窗体中存在用户可能已经过滤的字段status,则可能会导致冲突。在添加自己的条件之前,您需要决定是否应删除该字段上的用户定义条件。 我的解决方案不会对此进行测试

  2. 当用户取消选中optDelayedOnly按钮时,您需要删除过滤器的此元素。过滤器还可以包括用户先前指定的预先存在的标准,例如[exercise] IS NOT NULL

  3. Access习惯在过滤器的某些部分周围添加额外的括号,例如((([status]='delayed'))) AND ([example_table].[exercise] = 'my exercise')

  4. 因此,如果您打算让他们在表单中应用自己的过滤器,我会避免尝试实现选项按钮,因为这会导致头痛并需要对各种过滤方案和序列进行全面测试。

    这就是说,如果您的情况与我所假设的那样,我已经删除了您可以使用的代码示例。屏幕截图显示了我设置表单的方式以及后面的代码。

    Private Sub Form_Open(Cancel As Integer)
    
        Me.sfexample_table.Form.Filter = ""
    
    End Sub
    
    Private Sub optDelayedOnly_AfterUpdate()
    
        Dim strFilter As String, strDelayedOnlyFilter As String
    
        strFilter = Me.sfexample_table.Form.Filter          ' get the current filter from the form
        strDelayedOnlyFilter = "[status] = 'delayed'"       ' define the new status filter
    
        If Me.optDelayedOnly = False Then
            strFilter = Replace(strFilter, strDelayedOnlyFilter, "")    ' remove the DelayedOnly filter if it exists
            Do Until InStr(strFilter, "()") = 0                         ' remove any empty parentheses if they exist
                strFilter = Replace(strFilter, "()", "")
            Loop
            strFilter = Trim(strFilter)
            If Left(strFilter, 3) = "AND" Then strFilter = Trim(Right(strFilter, Len(strFilter) - 3)) ' remove a leading AND
            If Right(strFilter, 3) = "AND" Then strFilter = Trim(Left(strFilter, Len(strFilter) - 3)) ' remove a trailing AND
        Else
            ' this is when the option box is selected so apply a filter on top of the existing (user-specified) filter
            ' test the existing filter
            If Len(strFilter) > 0 Then
                strFilter = strFilter & " AND " & strDelayedOnlyFilter  ' tag our DelayedOnly filter on the end (AND is required)
            Else
                strFilter = strDelayedOnlyFilter                        ' just use the DelayedOnly filter (AND is not required)
            End If
        End If
        ' MsgBox strFilter - used for debugging
    
        ' now assign the new filter to the subform and apply it
        Me.sfexample_table.Form.Filter = strFilter
        Me.sfexample_table.Form.FilterOn = True
    
    End Sub
    

    如果我的假设错误,请随时发表评论以进一步澄清。请注意,我没有使用相同的表单名称,我的字段名为status而不是overall_status。如果需要,我可以将您使用的Access文件发送给您。