結局、一時テーブルにデータを入れるしかない
.net開発でActive Reportを使っていた時、Oracleから取得したデータ(Datasetオブジェクト)をレポートのオブジェクトに直接セットするだけで、帳票にデータがセット可能でした。
それと同じイメージで、DAOのRecordsetをAccessのReportプロパティにセットできればAccess内部の作りがシンプルになるかな…と考えましたが、無理のようです。
Accessのクエリを使用するとパフォーマンスが悪く(クエリ参照元テーブルの全データを取得しに行くらしい)、Oracleに直接SQLを投げる(パススルークエリ)方法に変更。
パススルークエリはレポートのRecordSourceに対しては記述できないので(Access内部のテーブルなら可能だけど)、一旦、データを一時テーブルに入れる必要があります。
ただ、「ADO(もしくはDAO)のレコードセットをレポートのRecordsetプロパティにセットできれば一時テーブルなんていらなくね?」と思い、ググると以下のページを見つけました。
レポートを 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などの用語については別ページにまとめましたので、ご参考までに。
また、入力フォームを使ったレポート出力アプリ作成のポイントをまとめた記事もありますので、ご参考までに。
以上です。