web-dev-qa-db-ja.com

プログラムでパラメーターをアクセスレポートに渡すにはどうすればよいですか?

既存のAccess MDBを持っています。既存のレポートを実行する既存のフォームにコマンドボタンを追加しています。行われている変更は、このボタンは、レポートされるレコードのIDを含むパラメーターを渡す必要があることです。現在、レポートはMDBのすべてのレコードで実行されます。

ID値のパラメーターを使用するようにレポートを実行するクエリを変更しました。これにより、ボタンをクリックすると、Accessがレポート対象のレコードIDを要求し、レポートが本来のように表示されます。

ただし、クエリを使用するためにレポートにパラメーターを渡す方法を理解することはできません。これどうやってするの?

15
Electrons_Ahoy

DoCmd.OpenReportメソッドにはさまざまな引数があり、そのうちの1つはWhereステートメントです。

DoCmd.OpenReport"rptReport", acViewPreview,,"ID=" & Me.ID

あれは

expression.OpenReport(ReportName, View, FilterName, WhereCondition, WindowMode, OpenArgs)
22
Fionnuala

このタイプの問題に対する私の一般的なアプローチは、基準をデータベースに保存することです。通常は、1行のコントロールテーブルです。次に、基準を参照するために、必要な基準の1つの値を返すクエリを括弧で囲みます。あなたの場合、それは次のようになります:

(select reportID from control)

この手法の利点は、次回レポートを実行するときに、コントロールテーブルに設定が記憶されることです。もちろん、ReportIDはフォームのフィールドに関連付けられます。また、クエリがフォームから分離されていることも気に入っています。フォームとは独立して実行できます。

3
Knox

Docmd.openreportのWhere句は、SQLステートメントのwhere句と同じ形式を使用する文字列です。

レポートのRecordSourceの代わりにdocmdでクエリをパラメーター化する理由は、柔軟性です。パラメータなしでレポートを開いたり、すべてのレコードを返したり、別のフィールドでフィルタリングしたりする必要があるかもしれません。

2
JeffO

これは古い投稿であることは知っていますが、少し時間がかかりました。エラーは「無効な括弧の使用」でしたが、問題はフィールド名のスペースにありました。私は誰かがよくある間違い、スペースをしたという報告をデータベースから作成していました。

データベースフィールドにスペースがあるときにwhere句を介してクエリにパラメータを渡すには、次の例を使用します。

DoCmd.OpenReport "rptByRegionalOffice", acViewPreview, , "[" & "Regional Office" & "]" & "=" & "'" & cmboOffices.Value & "'"

これについて考えると、これがwhere [Regional Office]='string value'アクセスSQLで期待するのと同じように。

1
john

なぜ誰もがこれをそんなに複雑にしたいのか、私にはわかりません。

  1. パラメータなしでレポートのレコードソースを保存します。

  2. remouによって提案されているように、DoCmd.OpenReportの適切な引数で基準を渡します。

他の方法でそれを行おうとすると、Accessでタスクを実行するための自然な方法に抵抗することになります。

1
David-W-Fenton