Access 2007 VBA - 在重新加载报表之前,报表过滤器不起作用

时间:2011-07-07 17:04:54

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

我正在使用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.FilterMe.FilterOnLoad 工作,因为从我在MSDN和其他地方看到的所有内容来看,它应该可行。话虽如此,我发现我可以使用DoCmd.ApplyFilter代替:

'Check if VIP - add filter if necessary
If (getGlobal(1) = True) Then
    DoCmd.ApplyFilter , "VIP = True"
End If

我仍然想知道为什么另一种方式表现得如此奇怪,如果有人有任何想法......

1 个答案:

答案 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使用活动对象...在这种情况下将是“测试”报告。