- PR -

CrystalReportsのデータソース先の動的に変更できない?

投稿者投稿内容
ケイ
大ベテラン
会議室デビュー日: 2004/04/20
投稿数: 100
投稿日時: 2005-05-24 09:53
返信が遅れて申し訳ありません。

GTG様にはお礼と謝罪をしなければなりません。

GTG様から教えて頂いた方法で、ConnectionPropertiesだけでなく、SetLogOnInfoでも
データソースを変更できる事が分かりました。

ただし、テーブルが両方に存在する時に限り。ですが・・・・

私が作成しているプログラムでは、
下記の手順でクリスタルレポートを呼び出して表示しています。

1,クリスタルレポートで使用するテーブルを作成
2,作成したテーブルにデータを登録
3,クリスタルレポートを呼出。
4,終了の際にテーブルを削除。

テーブル名は可変ではないのですが、テーブルは常に存在する訳ではなく、
クリスタルレポートの表示時にだけ作成する為、
ConnectionPropertiesもSetLogOnInfoの時もLocationでテーブルを指定する際に、
(local)と変更先DBのテーブルの置換を行うが、
(local)にテーブルがない為にエラーが発生しているようでした。

上記の事をふまえた上で、プログラムの見直しを考えてみます。

GTG様色々と申し訳ありませんでした。
そして本当にありがとうございました。
GTG
常連さん
会議室デビュー日: 2004/08/26
投稿数: 43
投稿日時: 2005-05-24 10:31
ケイ様

あらま、テーブルを削除していたとは想像していませんでした。
試したことはないですが、以下のような記述ではどうでしょうか。
これは既存のものに変更するのではなく、新規に作成するようなイメージかと思います。
データベースの接続方法を変更するときに利用できます。
(例)
With m_Report
.Database.Tables.Item(1).ConnectionProperties.DeleteAll
.Database.Tables.Item(1).ConnectionProperties.Add "Provider","SQLOLEDB"
.Database.Tables.Item(1).ConnectionProperties.Add "Data Source","SQLサーバー名"
.Database.Tables.Item(1).ConnectionProperties.Add "User ID","ユーザー名"
.Database.Tables.Item(1).ConnectionProperties.Add "Password","パスワード"
.Database.Tables.Item(1).ConnectionProperties.Add "Initial Catalog","データベース名"
.Database.Tables.Item(1).Location = "dbo.テーブル名"
End With

GTG
常連さん
会議室デビュー日: 2004/08/26
投稿数: 43
投稿日時: 2005-05-24 12:37
.Database.Tables.Item(1).Location = "dbo.テーブル名" は、必要ないかもしれません。
ケイ
大ベテラン
会議室デビュー日: 2004/04/20
投稿数: 100
投稿日時: 2005-05-24 13:23
既存変更ではなく新規に作成するようなプロパティも存在するんですね。
勉強になります。

しかし残念ながら、同じようにLocationで「テーブルがありません」と
エラーになってしまいますね。

やはりレポートの登録内容とプロパティで設定した内容が別の場合、
チェックし、一致した場合に置換が行われるのでしょうね。

レポート作成する際にテーブルが無い事には作成できないのですし、
存在している事が前提なんでしょうね。

ありがとうございました。
GTG
常連さん
会議室デビュー日: 2004/08/26
投稿数: 43
投稿日時: 2005-05-24 13:57
ケイ様

Locationプロパティのコード無しでもだめですか。

あと、ADOレコードセットを利用すること方法はどうでしょう。この場合、物理的なデータベースに接続なしでレポートをデザインすることができます。VBプログラム内でADOレコードセットを生成して、そのレコードセットをレポートに渡すことで表示が可能です。VBプログラム内でテーブルを生成しているなら、この方法でも実現できるかもしれませんよ。
ケイ
大ベテラン
会議室デビュー日: 2004/04/20
投稿数: 100
投稿日時: 2005-05-24 18:06
>ADOレコードセットを利用すること方法はどうでしょう。
>この場合、物理的なデータベースに接続なしでレポートを
>デザインすることができます。VBプログラム内でADOレコードセットを生成して、
>そのレコードセットをレポートに渡すことで表示が可能です。
そうですね。
この方法でもいいかもしれませんね。
ただ問題は、ほとんどプログラムは完成に近い状態で
今まで作成されたレポートの個数が結構あるという事です・・・・

色々話てみて、修正しやすい方向を選ぶ事になるとは思います。

では。
GTG
常連さん
会議室デビュー日: 2004/08/26
投稿数: 43
投稿日時: 2005-05-24 23:11
ケイ様

OLEDB接続で作成したレポートは、ADOレコードセットを利用した以下のコードで
接続先を変更することができます。
(例)
Dim rs As ADODB.Recordset
Dim cn As ADODB.Connection
Dim sSQL As String
Set cn = CreateObject("ADODB.Connection")
'SQLサーバーの接続
cn.ConnectionString = "Provider=SQLOLEDB.1;" & _
"Data Source=SQLサーバー名;" & _
"Persist Security Info=False;" & _
"User ID=ユーザー名;" & _
"Password=パスワード;" & _
"Initial Catalog=データベース名;"
cn.Open
'Recordsetオブジェクトの生成
Set rs = New ADODB.Recordset
sSQL = "Select * from テーブル名"
rs.Open sSQL, cn, adOpenDynamic, adLockOptimistic

そして、既存のCrystal Reportsの処理の中でデータベースの接続は行わず、
以下のコードを利用します。

m_Report.DiscardSavedData
m_Report.Database.SetDataSource rs, 3, 1

ご参考まで・・

スキルアップ/キャリアアップ(JOB@IT)