[Access] 結局、レポートのRecordsetにはデータをセットできない

Database VBA

結局、一時テーブルにデータを入れるしかない

.net開発でActive Reportを使っていた時、Oracleから取得したデータ(Datasetオブジェクト)をレポートのオブジェクトに直接セットするだけで、帳票にデータがセット可能でした。

それと同じイメージで、DAOのRecordsetをAccessのReportプロパティにセットできればAccess内部の作りがシンプルになるかな…と考えましたが、無理のようです。

Accessのクエリを使用するとパフォーマンスが悪く(クエリ参照元テーブルの全データを取得しに行くらしい)、Oracleに直接SQLを投げる(パススルークエリ)方法に変更。

パススルークエリはレポートのRecordSourceに対しては記述できないので(Access内部のテーブルなら可能だけど)、一旦、データを一時テーブルに入れる必要があります。

ただ、「ADO(もしくはDAO)のレコードセットをレポートのRecordsetプロパティにセットできれば一時テーブルなんていらなくね?」と思い、ググると以下のページを見つけました。

Report.Recordset プロパティ (Access)
OfficeVBAリファレンストピック

レポートを ADO レコードセットにバインドすることはできません。 DAO を使用するか、一時テーブルに ADO レコードセットをダンプしてから、その一時テーブルをレポートにバインドします。

https://docs.microsoft.com/ja-jp/office/vba/api/access.report.recordset

結論から言えば、この情報源には一部誤りがあるようです(少なくともAccess 2016の場合は)。

ADOは無理だとして、これだけ見ると「DAOならいけるじゃん」と思ってしまいますが、実際にはDAOも場合でもセットできません。
(本家サイトなのに正しい情報記載してよ…)

エラーが出て、「使用できません」というメッセージが出るはずです(このプロパティは使用できません、、、だったかな)。

というわけで、一時テーブルを使用することにしました。
(そして、レポートのコントロールソースには一時テーブルの列名を記載する…という)

参考サイト
Report. Recordset プロパティ (Access)

 

ADO、DAOなどの用語については別ページにまとめましたので、ご参考までに。

 

また、入力フォームを使ったレポート出力アプリ作成のポイントをまとめた記事もありますので、ご参考までに。

 

以上です。