- PR -

CrystalReports Viewerでのサブレポートの表示方法。

投稿者投稿内容
やまやま
会議室デビュー日: 2004/04/28
投稿数: 8
投稿日時: 2004-04-29 21:54
現在、VB.NET 2003 + Crystal Reports for Visual Studio .NET(以下、クリレポ) で開発を行っております。

クリレポのReportViewでサブレポートを含む帳票を表示させたいのですが、ヘルプ、ネット等探しまわったのですが、方法がわかりません。

ちなみに、サブレポートを含まない普通の帳票の場合、
ViewにSQLを渡し、View内でデータテーブルを作成します。
その後、
レポート.SetDataSource(データテーブル)
Viewer名.ReportSource = レポート
と行うことで、きちんと表示されます。

よろしくお願いします。
bubunya
大ベテラン
会議室デビュー日: 2003/01/16
投稿数: 124
投稿日時: 2004-04-30 00:02
>Viewer名.ReportSource = レポート

の前に、
ReportDocument crSubRptDoc;
crSubRptDoc = レポート.OpenSubReport(サブレポート名)
crSubRptDoc.いろいろ

で、
レポート.SetDataSource(データテーブル)
Viewer名.ReportSource = レポート
となります。Viewer.ReportSourceにサブレポートを指定する必要ありません。

MSDNでOpenSubReportを検索するか、http://support.businessobjects.com/search/でOpenSubReportを検索してみてください。
くんちん
常連さん
会議室デビュー日: 2002/10/07
投稿数: 46
投稿日時: 2004-04-30 01:40
bubunyaさんの方法を見つける事ができなかったので(今後参考にさせていただきます)
私は下記のようにサブレポートの作成方法しました。

@一つのデータセット内に【メイン用DataTable】と【サブレポートDataTable】
 を作成しておく。

A各DataTableにSQLで作成したデータをADDしていく。
BメインレポートのみにデータセットをSetする
メインレポート.SetDataSource(データセット)
Cレポート呼出
Viewer名.ReportSource = メインレポート
Viewer名.Show()

です。
***********************************************************************
余談になるのかもしれないですが、帳票の出力時にデータテーブル・データセット等
使用している場合は、xsdのデザイン等をそのまま使用してますか?
それとも、各PG内でデータセット等を作成し、必要なデータテーブルをその時その時で
作成して、帳票を出力してますか?
どちらが、大量のデータを出力する際に速度的に早いものなんでしょうか?
かわらないんでしょうか?
一つのxsdにいくつかのデータテーブルを作成し、それを使用して、帳票を出力す
ると、それが原因でソリューションが起動するのが遅い気がするのは気のせいでしょうか?***********************************************************************
やまやま
会議室デビュー日: 2004/04/28
投稿数: 8
投稿日時: 2004-04-30 22:47
bubunyaさん、くんちんさん、返答ありがとうございます。

結局、bubunyaさんの方法で出力することができました。
くんちんさんの方法ですと、サブレポートのみが出力されて、
本体(?)のレポートが出力されませんでした。

ありがとうございました。
くんちん
常連さん
会議室デビュー日: 2002/10/07
投稿数: 46
投稿日時: 2004-05-01 09:09
あれ。。。?
サブレポートのみが出力されるという
結果にはならないと思うのですが、、、
(メインレポートにのみにデータセットして、メインレポートを呼出しているので、、、)
各レポートに設定してあるDataTableの関係なのでしょうか?
ムムム。こちらでは、うまくいったんですけど。。。(泣)
私も、今後はbubunyaさんの方法でサブレポートの帳票を出力
します。
bubunya
大ベテラン
会議室デビュー日: 2003/01/16
投稿数: 124
投稿日時: 2004-05-01 12:35
>私も、今後はbubunyaさんの方法でサブレポートの帳票を出力
>します。

データベースからデータ取得をCrystal Reportsに任せ*ない*ので
あれば、多分この方法しかないはずです。
うまく動いているように見える場合は、
1.データ取得はCrystal Reports側にやらせている(ADO.NETを利用しない)
2.サブレポートがデータと共に保存されている
かのどちらかだと思います。
くんちん
常連さん
会議室デビュー日: 2002/10/07
投稿数: 46
投稿日時: 2004-05-10 17:37
久しぶりに拝見してたところbubunyaさんより御指摘がありましたので
返答とご質問させていただきます。

>データベースからデータ取得をCrystal Reportsに任せ*ない*ので
>あれば、多分この方法しかないはずです。
え・・・そうなんですか?
確かに、bubunyaさんの使っている手法が一般的で、スマートな方法だと
思うのですが。。。。(ですので、今後は、bubunyaさんの手法を取ります)

>うまく動いているように見える場合は、
>1.データ取得はCrystal Reports側にやらせている(ADO.NETを利用しない)
>2.サブレポートがデータと共に保存されている

1.につきましては、ADO.NETを使用しております。
 Crystal Reports側にやらせているとは、どういう事になるのでしょうか?
 直接データベースをみにいく事はしてません。。。
2.につきましてはどういう事になるのでしょうか?
 サブレポートにつきましても、メインレポート同様にADO.NETを使用しております。

もし、よろしければ教えて頂けませんでしょうか?
いまいち、きちんと理解ができておりません。

私の詳細環境です。間違いがあれば教えていただけませんでしょうか?

T:デザイン
@データセット.xsdを作成
    ↓
Aデータセット.xsd 内に、【メインレポート用データテーブル】【サブレポート用データテーブル】を作成(例)

Bメインレポートのデザイン
 データベースの追加と削除でADO.Netを指定
 ADO.Netに【メインレポート用データテーブル】を指定
    ↓
 メインレポートのデザイン開始(【メインレポート用データテーブル】のフィールドの貼付)
    ↓
Cサブレポートのデザイン
 データベースの追加と削除でADO.Netを指定
 ADO.Netに【サブレポート用データテーブル】を指定
    ↓
 サブレポートのデザイン開始(【サブレポート用データテーブル】のフィールドの貼付)
    ↓
Dメインレポートにサブレポートを挿入する。(同時にKeyのリンクを貼る)


U:プログラム

Dim dstObj As New dstReport   '【データセット.xsd】Class
Dim dtlObj As DataTable     'データテーブル

@【メインデータレポート用テーブル参照】
 dtlObj = dstObj.Tables("メインレポート用データテーブル名")
    ↓
A【メインレポート用データテーブル】にSQLで作成したデータをADDしていく。
 dtlObj.Rows.Add(SQLで取得したデータ)
    ↓
B【メインデータレポート用テーブル参照】
 dtlObj = dstObj.Tables("サブレポート用データテーブル名")
    ↓
C【サブレポート用データテーブル】にSQLで作成したデータをADDしていく。
    ↓
 dtlObj.Rows.Add(SQLで取得したデータ)
    ↓
DメインレポートのみにdstObj をセットする
メインレポート.SetDataSource(dstObj)

Cレポート呼出
Viewer名.ReportSource = メインレポート
Viewer名.Show()

一つのデータセットに【メインレポート用データテーブル】と【サブレポート用データテーブル】があり
両方のデータテーブルにSQLで取得したデータが入っています。
今まで、偶然に何も問題がなかっただけなのでしょうか。。。(心配になってきました)

この手法ですと、
@データベースからデータ取得をCrystal Reportsに任せ「てる」
 手法にあたるのでしょうか?
Aサブレポートがデータと共に保存されているという手法にあたるのでしょうか?

ご教授お願い致します。
bubunya
大ベテラン
会議室デビュー日: 2003/01/16
投稿数: 124
投稿日時: 2004-05-11 15:26
引用:

この手法ですと、
@データベースからデータ取得をCrystal Reportsに任せ「てる」
 手法にあたるのでしょうか?
Aサブレポートがデータと共に保存されているという手法にあたるのでしょうか?


ADO.NETを利用しているのでまかせていません。また、説明を見る限りではCR for VS.NETしか利用されていないようなので、「データと共に保存」は利用できません。

レポートの作成時にado.netを使わずに、例えばODBC/OledbのAccessやSQL Serverを指定した場合、レポートの実行時にはCrystal Reportsが勝手にデータを取ってきてくれます。つまり、自分でDatasetを作って渡す必要はないのですから、データ取得を「任せる」形になります。

残念ながらCR for VS.NETでは出来ないのですが、製品のCrystal Reportsではレポート作成時にレポートのプレビューが出来ます。そして、そのデータをレポートに保存することが出来ます。データを保存することで次にレポートを開く際にはDBにアクセスする必要がありません。このレポートをプログラムから使用する場合、意図的に既存データを破棄してデータを取得し直さないと、そのデータをそのまま表示します。(はず)

で、これではデータを見せたくない人にデータが見えてしまう場合や、更新し忘れて古いままのデータを見てしまう可能性があるため、レポートの保存時に「データと共に保存」をオフにする事で、レポートファイルはレポートの定義だけとなります。そしてこのレポートを実行する為には必ずDBへのアクセスする必要があるので、適切なログイン情報を渡してCrystal Reportsにデータを取ってこらすか、プログラムからデータを直接渡すわけです。

引用:

一つのデータセットに【メインレポート用データテーブル】と【サブレポート用データテーブル】があり
両方のデータテーブルにSQLで取得したデータが入っています。
今まで、偶然に何も問題がなかっただけなのでしょうか。。。(心配になってきました)


微妙ですね。もしかしたら、非公開のやり方なのか、それともたまたま動いているのか... 心配であれば、サポートに聞かれて方が良いと思います。私の知っている限りでは、メインレポートに渡したレコードセットをサブレポートが勝手に使ってくれるという事は無いと思います。

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