- - PR -
CrystalReports Viewerでのサブレポートの表示方法。
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-04-29 21:54
現在、VB.NET 2003 + Crystal Reports for Visual Studio .NET(以下、クリレポ) で開発を行っております。
クリレポのReportViewでサブレポートを含む帳票を表示させたいのですが、ヘルプ、ネット等探しまわったのですが、方法がわかりません。 ちなみに、サブレポートを含まない普通の帳票の場合、 ViewにSQLを渡し、View内でデータテーブルを作成します。 その後、 レポート.SetDataSource(データテーブル) Viewer名.ReportSource = レポート と行うことで、きちんと表示されます。 よろしくお願いします。 | ||||||||
|
投稿日時: 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を検索してみてください。 | ||||||||
|
投稿日時: 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-30 22:47
bubunyaさん、くんちんさん、返答ありがとうございます。
結局、bubunyaさんの方法で出力することができました。 くんちんさんの方法ですと、サブレポートのみが出力されて、 本体(?)のレポートが出力されませんでした。 ありがとうございました。 | ||||||||
|
投稿日時: 2004-05-01 09:09
あれ。。。?
サブレポートのみが出力されるという 結果にはならないと思うのですが、、、 (メインレポートにのみにデータセットして、メインレポートを呼出しているので、、、) 各レポートに設定してあるDataTableの関係なのでしょうか? ムムム。こちらでは、うまくいったんですけど。。。(泣) 私も、今後はbubunyaさんの方法でサブレポートの帳票を出力 します。 | ||||||||
|
投稿日時: 2004-05-01 12:35
>私も、今後はbubunyaさんの方法でサブレポートの帳票を出力
>します。 データベースからデータ取得をCrystal Reportsに任せ*ない*ので あれば、多分この方法しかないはずです。 うまく動いているように見える場合は、 1.データ取得はCrystal Reports側にやらせている(ADO.NETを利用しない) 2.サブレポートがデータと共に保存されている かのどちらかだと思います。 | ||||||||
|
投稿日時: 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サブレポートがデータと共に保存されているという手法にあたるのでしょうか? ご教授お願い致します。 | ||||||||
|
投稿日時: 2004-05-11 15:26
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にデータを取ってこらすか、プログラムからデータを直接渡すわけです。
微妙ですね。もしかしたら、非公開のやり方なのか、それともたまたま動いているのか... 心配であれば、サポートに聞かれて方が良いと思います。私の知っている限りでは、メインレポートに渡したレコードセットをサブレポートが勝手に使ってくれるという事は無いと思います。 |