- PR -

CrystalReportで2つ以上のデータソースからの反映について

1
投稿者投稿内容
ケンタ
会議室デビュー日: 2003/07/17
投稿数: 6
投稿日時: 2003-07-28 00:52
お世話になります。

現在、Visual Studio.NETでCrystalReport for .NETを利用してWindowsアプリを
開発中です。(開発言語はVB.NETです)
方法としては、DatasetにデータをセットしてからデータをCrystalReportファイル
に反映させています。
1つのDatasetからデータを読み込んで帳票に出力する方法はわかったのですが、
2つのDatasetから読み込んで帳票に出力する方法がわかりません。

やりたいことは、ヘッダー情報とその詳細の情報を別のDatasetに読み込んで、この
2つのDatasetを、ヘッダー部分にヘッダー情報、詳細部分に詳細データ情報を反映
して一覧を帳票出力したいのです。

この2つのDatasetへのデータが反映されていることは確認しています。が、Crystal
ReportViewerに表示してみるとヘッダー情報は反映されているのですが、詳細データ
情報は一切反映されていません。
※ちなみに、ヘッダー情報部分をソースと、CrystalReportファイルから削除すると
 詳細データ情報部分が反映されます。

CrystalReportは、2つ以上のDatasetからのデータを反映させることはできないので
しょうか?それとも、CrystalReportファイルで何か設定が必要なのでしょうか?

↓↓↓ソースはこのように書いています↓↓↓

Dim cr1 As New CrystalReport1()

   'ヘッダー情報読み込み&セット
Dim Ds1 As New DataAdapter()    ← 独自で作ったデータベースアダプタ
Dim ds_h As New ヘッダー情報()

Ds.SelectCommand = "SELECT * from ヘッダー情報テーブル " _
& "WHERE id like '" & Select_ID & "%' "

Ds1.Fill(ds_h, "HEADER")
cr1.SetDataSource(ds_h)
CrystalReportViewer1.ReportSource = cr1


   '詳細データ情報読み込み&セット
Dim Ds2 As New DataAdapter()    ← 独自で作ったデータベースアダプタ
Dim ds_k As New 詳細データ情報()

Ds2.SelectCommand = "SELECT * FROM 詳細データ情報テーブル " _
& "WHERE id like '" & Select_ID & "%' "

Ds2.Fill(ds_k, "SYOUSAI")
cr1.SetDataSource(ds_k)
CrystalReportViewer1.ReportSource = cr1


過去のログを見てがんばってみたのですが、この部分で躓いています。
どなたかご教授願えないでしょうか。

よろしくお願いします。
ケンタ
会議室デビュー日: 2003/07/17
投稿数: 6
投稿日時: 2003-08-01 00:30
自己レスです。

2つのデータセット(ヘッダー情報、詳細情報)から、にデータを読み込み、帳票を出力する実験をいろいろ試してみましたが、結局、2つのデータセットをドッキングさせて、鬼のようなSQL文を書き、1つのデータセットからCrystalReportにデータをセットする方法で帳票出力するようにしました。

もし考えてくれていた方がいましたら、申し訳ありませんが解決してしまいました。
方法がわかった方がいたら、ご教授願いえたら幸いです。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2003-08-01 09:44
こんにちは。
取り敢えずは解決しているようですが...。

引用:

ケンタさんの書き込み (2003-07-28 00:52) より:
CrystalReportは、2つ以上のDatasetからのデータを反映させることはできないので



MSDNライブラリでDataSetクラスについて調べると、以下のような記述があります。

引用:

DataSet は、 DataRelation オブジェクトと相互に関連付けることができるDataTable オブジェクトのコレクションで構成されます。



つまり、1つのDataSetに、複数のDataTableを持たせる事が出来る、という事ですから、ヘッダー情報用と詳細情報用の2つのDataTableを1つのDataSetに持たせて、Reportのデータソースに指定すれば良いと思います。
みのる
大ベテラン
会議室デビュー日: 2003/07/03
投稿数: 100
投稿日時: 2003-08-01 16:53
こんにちはー。
別のスレッドに書き込んだほうがいいかもしれませんが、
既にできていらっしゃる方に質問したほうが早いかなと
思い、質問させていただきます。

コンポーネントのDataAdapter等を使わず、自分で明記し
DBの内容をCrystalReportsに出力したいのです。

ケンタさんはすでに、1つのデータソースからの反映が
できていらっしゃるようで、もう少し詳しく教えていただきたいです。

「Dim ds_h As New ヘッダー情報()」と書かれていますが、
ヘッダー情報()は、具体的に何を指していらしてるのですか?

ちなみに私はASP.NET(VB.NET)で開発しております。

ケンタ
会議室デビュー日: 2003/07/17
投稿数: 6
投稿日時: 2003-08-05 11:15
こんにちわ。ケンタです。

レス遅くなりました。

きくちゃんさん、調べていただきありがとうございました。
しかし、私もDataSetの中で2つのDataTable(ヘッダー情報用、詳細情報用)
を使って読み込んでみたのですが、結果は同じで、片方のデータしかCrystalReport
に反映されませんでした。
先日までは、SQLを駆使して1つのDataTableに読み込ませていたのですが、紆余
曲折ありまして2つのDataTableにデータを読み込んで(ヘッダー情報用、詳細情報用)
そこからデータを抽出し帳票用に編集して新たに作成したDataTableにセットし、これを
CrystalReportに反映させました。
一度DataTableに読み込んでから新たなDataTableにセットする。2度手間のように
感じますが、データを編集しなければならなくなったので、メンテナンスのことを
考え、単純なこの方法をとりました。
やはり、2つのデータソースをCrystalReportに反映させるのは厳しいのでしょうか...

みのるさん、はじめまして。

>「Dim ds_h As New ヘッダー情報()」と書かれていますが、
>ヘッダー情報()は、具体的に何を指していらしてるのですか?
というご質問でしたが、”ヘッダー情報()”というのはDataSet名です。
このヘッダー情報というDataSetに”HEADER”というDataTableを作成していました。
このレスを立てたときには、ヘッダー情報、詳細情報を別々のDataSetで定義して
いたのでこのように書きました。
現在は、1つのDataSetに複数のDataTableを作成し、ヘッダー情報読み込み用、詳細
情報読み込み用、CrystalReportへの反映用の3つのを作成しています。
こんな回答でよろしいでしょうか?
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2003-08-05 12:58
ケンタさんこんにちは。

引用:

ケンタさんの書き込み (2003-08-05 11:15) より:
しかし、私もDataSetの中で2つのDataTable(ヘッダー情報用、詳細情報用)
を使って読み込んでみたのですが、結果は同じで、片方のデータしかCrystalReport
に反映されませんでした。



どのようなレポートを設計されているのか判りませんが、レポート上で2つのDataTableの間にリンクを設定してグループ化すれば、恐らく期待している結果が得られるのではないかと思います。
場合によっては、サブレポートを使用するという手もあります。
みのる
大ベテラン
会議室デビュー日: 2003/07/03
投稿数: 100
投稿日時: 2003-08-05 13:35
ケンタさん、ありがとうございます。

1つのDataSetに複数のDataTableを作成されていると書かれていますが、
具体的にどのように作られているのですか?
(DataSetとDataTableをあまり分かっていないので)
現在のソースは、このようにしております。
特に問題はないと思いますが。。。。

strSQL = strSQL & "SELECT * FROM TABLEA WHERE A =1"
Dim oleAdapter As New OleDbDataAdapter
Dim oleConn As New OleDbConnection(strODBC)
oleAdapter.SelectCommand = New OleDbCommand(strSQL, oleConn)
oleAdapter.Fill(ds, "aa")
rp.SetDataSource(ds)

これでデータセットをレポートに渡すことができると思いますが
渡してから、CrystalReports側では何かしなくていいのでしょうか?

とても、基本的なことかもしれないのではと思いつつ質問をしていますが
よろしくお願い致します。
1

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