Access 2007 VBA - фильтр отчетов не работает до перезагрузки отчета - PullRequest
0 голосов
/ 07 июля 2011

Я использую 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

Я все еще хотел бы знать, почему другой способ ведет себя так странно, если у кого-то есть какие-то идеи ...

1 Ответ

1 голос
/ 11 июля 2011

Как предложил @ 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

Обратите внимание также, что DoCmd.OutputTo без аргумента ObjectName использует активный объект ... который в этом случае будет отчетом "Test".

...