2

ユーザーがいくつかのコンボボックスを介してフィルターのプロパティを編集し、レポートを開くことができるフォームがあります。レポートはで開かれます

DoCmd.OpenReport rptName, acViewReport, , whereClause, acWindowNormal
'whereClause = "Building = '005'" for instance

一部のレポートは正常に開きます。つまり、フィルタリングされた情報が入力されます。ただし、同じ社内テンプレートに基づいている場合でも、フィルターをすべて無視して、すべてのデータ(フィルターされたデータではない)に基づいてレポートを表示するものもあります。

レポートがフィルターを無視するのはなぜですか?フォームでレポートを開いた後、デザインモードでレポートを編集すると、次のようになります。

Working Report              |       Non Working Report
Filter: Building = '005'    |       Filter:  
Filter On Load: No          |      Filter On Load: No

動作していないレポートがフィルター引数を登録しない原因は何でしょうか。これらのレポートには、On Load VBAもVBAもありません(PDFへのエクスポートと各レポートのコピーアンドペーストである閉じるボタンを除く)。

編集 以前にチェックしておく必要があります。これは、レポートを駆動するクエリが空であるかどうかに関係なく発生します(つまり、空白に関係なく、一部のレポートにフィルターが適用されることはありません)。

コードが役立つかどうかはわかりませんが、次のようになります。

Private Sub btnOpenSummary_Click()
  If IsNull(Me.cboSummary) Then
      MsgBox "Please select a building for the SUMMARY report."
      Exit Sub
  End If
  strCrit = "Building = '" & Me.cboSummary & "'"
  MsgBox strCrit
  survArray = getSurveyArray()
  For Each Survey In survArray
      DoCmd.OpenReport Survey, acViewReport, , strCrit, acWindowNormal
  Next Survey
  DoCmd.OpenReport "Total Summary", acViewReport, , , , Me.cboSummary
End Sub
4

3 に答える 3

2

私のせい..何らかの理由でコードページのずっと下に行送りされて見えなくなったコードがありました。コントロールソースで遊ぶオンオープンがありました。最終的には役に立たなくなりましたが(コントロールソースは毎回ではなく一度だけ設定する必要があったため)、何らかの理由でフィルターを無効にしていました。この問題を抱えている可能性のある他の人:

レポートの VBA でコントロール ソースが変更されていないことを確認します。

助けてくれた人たちに感謝します、申し訳ありませんが私の情報は間違っていました。

私のOnOpenコード:

Private Sub Form_Open(Cancel as Integer)
   Me.RecordSource = Me.Name
End Sub

クエリの名前に対応するレポートの名前を取得し、それをレコードソースとして配置します。(私はこの方法で約 40 件のレポートを作成したので、異なるアイテムの複製を高速化するには名前に依存しています)。

これを削除すると、Access 2010 を使用して完全に機能するようになりました。これが私のセットアップに固有の問題なのかどうかはわかりませんが、この変更により直接修正されました。

于 2012-08-23T13:21:43.170 に答える
1

これは直接的な解決策ではなく、ほぼ確実に機能する回避策です。レポートにフィルター処理を適用する代わりに、where 句をパラメーターとして渡すことにより、レポート データ ソースを動的に変更します。

レポートを開くには、次を使用します。

DoCmd.OpenReport rptName, acViewReport, , , acWindowNormal, whereClause

whereClause文字列がパラメータとして渡されていることに注意してOpenArgsください。

次に、レポート VB で:

Private Sub Report_Open(Cancel As Integer)
On Error GoTo ReportOpenError

    If Not(IsNull(Me.OpenArgs)) Then
        Me.RecordSource = Replace(Me.RecordSource,";"," WHERE " & Me.OpenArgs & ";")
    End If

    Exit Sub

ReportOpenError:
    MsgBox "Unable to open the specified report"
    Cancel = 1
End Sub

このソリューションは、レポートRecordSourceが (クエリ名ではなく) セミコロンで終了する SQL クエリとして定義されておりWHERE、レコード ソースにGROUP BY, などの句がまだ含まれていないことを前提としています。そのような場合は、クエリを最初から再定義する方が簡単な場合があります。

于 2012-08-23T13:34:17.117 に答える