我正在使用VBA动态加载报表内容,并且根据我构建的控制面板表单中选择的报表,可能会过滤报表的查询。
在Report_Open函数的开头,我有这个:
Private Sub Report_Open(Cancel As Integer)
Me.Filter = "VIP=True"
Me.FilterOnLoad = True
现在,当我开始这个项目时,这是有效的 - 我已经注释掉这些行,并且在取消注释它们时发现它不再正常工作。我不得不在加载报表时应用过滤器,而是必须重新加载过滤器的报表才能工作 - 通过切换到打印预览并切换回报表视图,或者切换到设计视图然后返回到报表视图(在设计视图中,选定的过滤器会显示在属性窗格中。
我使用命令按钮加载报告,允许用户查看,导出为PDF或打印(在打印预览中打开)。这些命令都不会导致报告在应用过滤器的情况下打开 - 必须重新加载。
我用来加载报告的命令如下:
If (Action = "View") Then
DoCmd.OpenReport "Test", acViewReport
ElseIf (Action = "PDF") Then
DoCmd.OutputTo acOutputReport, "Test", acFormatPDF
ElseIf (Action = "Print") Then
DoCmd.OpenReport "Test", acViewPreview
End If
好的,我不知道为什么Me.Filter
和Me.FilterOnLoad
不工作,因为从我在MSDN和其他地方看到的所有内容来看,它应该可行。话虽如此,我发现我可以使用DoCmd.ApplyFilter
代替:
'Check if VIP - add filter if necessary
If (getGlobal(1) = True) Then
DoCmd.ApplyFilter , "VIP = True"
End If
我仍然想知道为什么另一种方式表现得如此奇怪,如果有人有任何想法......
答案 0 :(得分:1)
正如@ David-W-Fenton建议的那样,使用WhereCondition和OpenReport而不是设置Filter表达式。您的WhereCondition可以与您用于Filter表达式的字符串相同。
另外,如果你给OpenReport一个空字符串作为WhereCondition,效果与没有WhereCondition一样,所以这个(未经测试的)代码应该有效,无论你的getGlobal(1)
是否返回True。
Dim strWhereCondition As String
Dim strReport As String
strReport = "Test"
If (getGlobal(1) = True) Then
strWhereCondition = "VIP = True"
End If
Select Case Action
Case "View"
DoCmd.OpenReport strReport, acViewReport, , strWhereCondition
Case "PDF"
DoCmd.OpenReport strReport, acViewReport, , strWhereCondition
DoCmd.OutputTo acOutputReport, , acFormatPDF
Case "Print"
DoCmd.OpenReport strReport, acViewPreview, , strWhereCondition
End Select
另请注意,没有ObjectName参数的DoCmd.OutputTo使用活动对象...在这种情况下将是“测试”报告。