Microsoft Access 掲示板

パススルーで直接レポートにデータを表示したい

4 コメント
views
4 フォロー

お世話になります。

現在会社でAccess2016を使用してシステムを構築しています。
環境は以下のとおりです。
・Windows 10上でAccess2016を動かし開発
・データはSQL Server2019
・両者をADOのパススルーで接続

フォームや一覧などにはSQL Serverのデータをレコードセット経由で直接表示できるのですが、レポートには同じ方法で表示ができませんでした。
ですので、Accessのテーブルを経由して一時的にAccessテーブル上にデータを展開し、それをレポートで表示させています。

レポートでパススルーのデータを使用するのはこの方法しかないのでしょうか。
この場合ADO接続は変更しないものとお考えいただけると助かります。

よろしくお願いいたします。

すずやん
作成: 2022/07/25 (月) 17:36:59
最終更新: 2022/07/26 (火) 09:24:53
通報 ...
1

フォームや一覧などにはSQL Serverのデータをレコードセット経由で直接表示できるのですが、

フォームではどのように直接表示させているのですか。
そのコードを提示してもらえますか。

レポートの場合は、フォームとは違いますので、フォームの方法をそのままではできないので、レポート用に改変する必要があります。もとのフォームのコードの提示があればそれをもとにアドバイスできると思います。

2
すずやん 2022/07/26 (火) 08:53:25

ご回答ありがとうございます。
なるほど、可能ではあるのですね。それが分かっただけでも嬉しいです。

フォームで表示させる場合はおおよそ以下のような感じです。
ADODBパススルーを行い、レコードセットを取得、「Me.Recordset」でフォームのレコードセットに受け渡し、これを表示させます。
これと同じ内容をレポートで行った場合、空欄になって表示できませんでした。

おそらくレポートでは「Me.Recordset」ではだめなのかと考えたのですが、結局実現できませんでした。


'接続用のクラスです
Dim db As DataBaseAccess

Dim mySQL As String
Dim rs As ADODB.Recordset

'データベースの接続処理
Set db = DatabaseFactory.creater
db.connect

'実行するクエリの文字列をセット。
mySQL = "SELECT " & _
"[取引先マスタ_ID] , [取引先コード], [取引先名]" & _
" FROM [dbo].[取引先マスタ]"

'実行してレコードセットに格納します。
Set rs = db.execute(mySQL)

'ここでデータソースに取得したDBの結果をセット
Set Me.Recordset = rs

'オブジェクト変数を終了、破棄します。
rs.Close
db.disconnect
Set rs = Nothing
Set db = Nothing

3

ADODBパススルーを行い、レコードセットを取得、「Me.Recordset」でフォームのレコードセットに受け渡し、これを表示させます。

Recordsetプロパティを使う方法ですか。その方法は残念ながら、レポートでは使えません。

Report.Recordset プロパティ (Access) | Microsoft Docsに下記の記述があります。

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

DAOなら可能なようです。ADOしかだめということなら、一時テーブルにインポートしてそれと連結するようにとのことです。

一時テーブルを使わずにという方法もありますが、かなり面倒な方法になりますので、一時テーブルを使う方法でいいのではと思います。

4
すずやん 2022/07/26 (火) 10:32:20

ご回答誠にありがとうございます。
やり方的に正しいことが分かってスッキリしました。