既存のAccess MDBを持っています。既存のレポートを実行する既存のフォームにコマンドボタンを追加しています。行われている変更は、このボタンは、レポートされるレコードのIDを含むパラメーターを渡す必要があることです。現在、レポートはMDBのすべてのレコードで実行されます。
ID値のパラメーターを使用するようにレポートを実行するクエリを変更しました。これにより、ボタンをクリックすると、Accessがレポート対象のレコードIDを要求し、レポートが本来のように表示されます。
ただし、クエリを使用するためにレポートにパラメーターを渡す方法を理解することはできません。これどうやってするの?
DoCmd.OpenReportメソッドにはさまざまな引数があり、そのうちの1つはWhereステートメントです。
DoCmd.OpenReport"rptReport", acViewPreview,,"ID=" & Me.ID
あれは
expression.OpenReport(ReportName, View, FilterName, WhereCondition, WindowMode, OpenArgs)
このタイプの問題に対する私の一般的なアプローチは、基準をデータベースに保存することです。通常は、1行のコントロールテーブルです。次に、基準を参照するために、必要な基準の1つの値を返すクエリを括弧で囲みます。あなたの場合、それは次のようになります:
(select reportID from control)
この手法の利点は、次回レポートを実行するときに、コントロールテーブルに設定が記憶されることです。もちろん、ReportIDはフォームのフィールドに関連付けられます。また、クエリがフォームから分離されていることも気に入っています。フォームとは独立して実行できます。
Docmd.openreportのWhere句は、SQLステートメントのwhere句と同じ形式を使用する文字列です。
レポートのRecordSourceの代わりにdocmdでクエリをパラメーター化する理由は、柔軟性です。パラメータなしでレポートを開いたり、すべてのレコードを返したり、別のフィールドでフィルタリングしたりする必要があるかもしれません。
これは古い投稿であることは知っていますが、少し時間がかかりました。エラーは「無効な括弧の使用」でしたが、問題はフィールド名のスペースにありました。私は誰かがよくある間違い、スペースをしたという報告をデータベースから作成していました。
データベースフィールドにスペースがあるときにwhere句を介してクエリにパラメータを渡すには、次の例を使用します。
DoCmd.OpenReport "rptByRegionalOffice", acViewPreview, , "[" & "Regional Office" & "]" & "=" & "'" & cmboOffices.Value & "'"
これについて考えると、これがwhere [Regional Office]='string value'
アクセスSQLで期待するのと同じように。
なぜ誰もがこれをそんなに複雑にしたいのか、私にはわかりません。
パラメータなしでレポートのレコードソースを保存します。
remouによって提案されているように、DoCmd.OpenReportの適切な引数で基準を渡します。
他の方法でそれを行おうとすると、Accessでタスクを実行するための自然な方法に抵抗することになります。