- PR -

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

投稿者投稿内容
ケイ
大ベテラン
会議室デビュー日: 2004/04/20
投稿数: 100
投稿日時: 2005-05-18 19:44
現在VB6.0+CrystalReports9.2+MSDEで開発を行っています。

レポートを作成する時にデータソースを(local)に指定しました。
で、下記で接続した場合は、正しく表示されます。

//処理(レポートで使用するテーブルを作成)

Dim m_Report As CRAXDRT.Report
Dim objApplication As New CRAXDDRT.Application

Set m_Report = objApplication.OpenReport("レポート指定")
m_Report.Database.Tables(1).SetLogOnInfo "(local)","TES","sa",""

if m_Report.PrintingStatus.NumberOfPages < 2 Then
//処理(Crviewer9を使って表示)

しかし、ネットワーク上にある、別のマシンのMSDEに同じTESのDBが存在し、
そちらに接続して、表示しようとした場合に、
テーブルが作成されていませんのエラーが発生します。

上記の処理のうち下記の部分だけを別のマシン名(HENKO)に変えました。
m_Report.Database.Tables(1).SetLogOnInfo "HENKO","TES","sa",""

そうした場合、
if m_Report.PrintingStatus.NumberOfPages < 2 Then
の部分でエラーが発生します。

しかし、HENKOのマシンのTESのDBの中では、
確かに、使用するテーブルは作成されています。

レポートのデータソースを(local)から
HENKOに置換した場合は、
m_Report.Database.Tables(1).SetLogOnInfo "HENKO","TES","sa",""
でも正しくレポートは表示されます。

しかし、これではいちいち、レポートを開いて、データソースを変更しないと
いけないです。

プログラムから接続するデータソースを指定する方法はないのでしょうか?

教えて下さい。お願いします。

GTG
常連さん
会議室デビュー日: 2004/08/26
投稿数: 43
投稿日時: 2005-05-19 06:00
ケイ様

データベースの接続先を変更する場合、以下のLocationプロパティを指定してみてください。
(例) m_Report.Database.Tables.Item(1).Location = "TES.dbo.テーブル名"
ケイ
大ベテラン
会議室デビュー日: 2004/04/20
投稿数: 100
投稿日時: 2005-05-19 09:23
返信ありがとうございます。

>データベースの接続先を変更する場合、以下のLocationプロパティを
>指定してみてください。
>(例) m_Report.Database.Tables.Item(1).Location = "TES.dbo.テーブル名"
上記は、
レポートで使用するテーブルをLocationで設定するのでよろしいでしょうか?

試して見ましたが、上記の文でテーブルがありません。のエラーになります。

データソースを指定する事は出来ないのでしょうか?

他にも何かご存知の方は教えて下さい。
GTG
常連さん
会議室デビュー日: 2004/08/26
投稿数: 43
投稿日時: 2005-05-19 14:41
ケイ様

説明が不足していましたが、SetLogOnInfoの後にLocationを実行してください。
ケイ
大ベテラン
会議室デビュー日: 2004/04/20
投稿数: 100
投稿日時: 2005-05-19 15:47
返信ありがとうございます。

setLogOnInfoの後にlocationを実行しましたが、やはりテーブルがありませんの
エラーは変わりませんでした。

最悪、レポートのデータソースをいちいち置換するしか方法は
ないのでしょうか・・・

同じような状況で、やはり自分はレポートのデータソースを
置換しているという方はいますか?
GTG
常連さん
会議室デビュー日: 2004/08/26
投稿数: 43
投稿日時: 2005-05-21 02:51
ケイ様

接続方法は、ODBCですか、ODBCなら、以下のコードで変更できると思いますが・・
実際に試してデータ内容が変更されていることは確認しました。
(例)
m_Report.Database.Tables(1).SetLogOnInfo "変更先ODBC名","データベース名","ユーザー名","パスワード"
m_Report.Database.Tables.Item(1).Location = "データベース名.dbo.テーブル名"
ここで設定する値は、デザイナから変更先のデータベースに接続した時に「SQLクエリーの表示」で表示されるSQL文の内容を参考にするといいと思います。
ケイ
大ベテラン
会議室デビュー日: 2004/04/20
投稿数: 100
投稿日時: 2005-05-23 09:52
返信が遅れて申し訳ありません。

接続は、ADO接続です。

ODBCなら変更できるというのは、DBがMSDEでもODBC接続なら、
データの内容が変更されていたという事ですよね?
※この時のデータの内容が変更されているというのは、
プログラムで、(例)setlogoninfoで変更先ODBC名を、切り換えた場合で
クリレポに表示された内容が、それぞれのmsdeの内容で表示されたという事ですよね?

また、locationで設定される値は、デザイナから変更先のデータベースに接続した時に
「SQLクエリーの表示」で表意されるSQL文の内容を参考にするとよいとの事ですが、
クリスタルレポートのデータベース>データベースの保存場所から、
(local)から変更先のデータベースに置換した後、
「SQLクエリーの表示」で表示されるSQL文の内容を見ましたが、
(local)の時とまったく変更がされていませんでした。
※データソース場所が違うだけで、DB名、テーブル名は一緒ですので。

変更はありませんでしたが、「SQLクエリーの表示」で表示されたテーブル名を
m_Report.Database.Tables.Item(1).Location = "TES.dbo.テーブル名"
のように設定しましたが、やはりテーブルが存在しませんのエラーは
変わる事はありませんでした。

ODBC接続では上手く行くという事は、ファイルDSN等で、別マシンへの接続情報が
しっかりと登録されているから上手く変更できているのでしょうか??
GTG
常連さん
会議室デビュー日: 2004/08/26
投稿数: 43
投稿日時: 2005-05-23 15:29
ケイ様

デザイナ画面からOLE DB Providerを利用しているわけですよね。
この場合、以下のSetLogOnInfoメソッドでなく、ConnectionPropertiesを利用してみてください。記述は以下の通りです。
(例)
m_Report.Database.Tables(1).ConnectionProperties.Item("Provider")="SQLOLEDB"
m_Report.Database.Tables(1).ConnectionProperties.Item("Data Source")="SQLサーバー名"
m_Report.Database.Tables(1).ConnectionProperties.Item("User ID")="ユーザー名"
m_Report.Database.Tables(1).ConnectionProperties.Item("Password")="パスワード"
m_Report.Database.Tables(1).ConnectionProperties.Item("Initial Catalog")="データベース名"
m_Report.Database.Tables.Item(1).Location="dbo.テーブル名"

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