我正在尝试创建一个选项按钮,该按钮将对已经过滤的记录子表单运行过滤器。
启动选项按钮后,子窗体内创建的过滤器将不再有效。
我试图确定以下两件事,两者都取得了最小的成功:
1-是否可以对已经过滤的表运行过滤器并维护两个过滤器的规则?
2-如果没有,我试图在选项按钮过滤器的代码中加入一个和语句,但收效甚微......
基本上,我希望使用AND
将以下两个语句合并到一个语句中我![frmProjectSubPhase04] .Form.Filter =“[overall_status] ='延迟'”和 我![frmProjectSubPhase04] .Form.Filter =“[exercise] = not null”
我希望很快能听到有人说这个,因为它真的让我烦恼.Thanx
答案 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
。
如果子窗体中存在用户可能已经过滤的字段status
,则可能会导致冲突。在添加自己的条件之前,您需要决定是否应删除该字段上的用户定义条件。 我的解决方案不会对此进行测试。
当用户取消选中optDelayedOnly
按钮时,您需要删除过滤器的此元素。过滤器还可以包括用户先前指定的预先存在的标准,例如[exercise] IS NOT NULL
。
Access习惯在过滤器的某些部分周围添加额外的括号,例如((([status]='delayed'))) AND ([example_table].[exercise] = 'my exercise')
因此,如果您打算让他们在表单中应用自己的过滤器,我会避免尝试实现选项按钮,因为这会导致头痛并需要对各种过滤方案和序列进行全面测试。
这就是说,如果您的情况与我所假设的那样,我已经删除了您可以使用的代码示例。屏幕截图显示了我设置表单的方式以及后面的代码。
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文件发送给您。