DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ActiveReportのサブレポート処理について

環境/言語:[Win2000 VB.NET ActiveReport for .NET]
分類:[.NET]

いつも参考にさせてもらっています。

早速ですが質問があります。ActiveReport for NETを使用して下記の様な
帳票を作成したいと思っております。

実現したい機能
 ヘッダの情報があり、その情報に対応した明細が4つあります。
 ヘッダの情報と各明細の情報はキー項目で対応しています。
 キー項目は、伝票番号、伝票NOです。

わかりずらいかと思いますが、伝票をイメージして頂くとよいと思います。伝票は、ヘッダの情報と明細の情報は1対1ですが、今回作成を行いたいのは、1対4になっています。4つの明細にわけずに、詳細部分に全ていれてしまえばよいのですが帳票のレイアウト上それはできません。

明細が4つ存在する為、現在サブレポートを使用して制御しようと思っています。

不明箇所
 ページを切り替えると、各明細も対応した情報に切り替わってほしい。サブレポート
 の情報とヘッダの情報を対応させる方法がわかりません。サブレポートの情報が2ペ
 ージにわたる場合、ヘッダの情報も2レコード必要となるのですよね?キー項目を使
 用してヘッダとサブレポートを対応させる方法を教えてください。

よろしくお願い致します。
2005/02/23(Wed) 09:27:45 編集(投稿者)

こんにちは、じゃんぬねっと です。

■No9313に返信(178さんの記事)
> わかりずらいかと思いますが、伝票をイメージして頂くとよいと思います。
> 伝票は、ヘッダの情報と明細の情報は1対1ですが、今回作成を行いたいのは、1対4になっています。
> 4つの明細にわけずに、詳細部分に全ていれてしまえばよいのですが帳票のレイアウト上それはできません。

それは何故なんでしょう?
Detail セクションに自由に配置する以上、レイアウト上の問題は発生しようがないですよね。
「逆」だったら、あり得ますけども。

> 明細が4つ存在する為、現在サブレポートを使用して制御しようと思っています。

サブレポートを使わず、Detail セクション上のイベントで動的に作成した方が良いでしょうね。
ここに書いてある内容だけで判断する限りは... ですが。

私が、サブレポートを使わなければいけない場面と考えるのは、
テーブル上、他の帳票と完全に独立している (まったく関与していない) 場合、
または、印刷ジョブを 1 つにしたい時だけだと思っております。
返信ありがとうございます。じゃんぬねっとさん。
昨日、誰からも返信がない為不安でした。

下記のご質問の回答ですが、
>>わかりずらいかと思いますが、伝票をイメージして頂くとよいと思います。
>>伝票は、ヘッダの情報と明細の情報は1対1ですが、今回作成を行いたいのは、1対4になっています。
>>4つの明細にわけずに、詳細部分に全ていれてしまえばよいのですが帳票のレイアウト上それはできません。
>
> それは何故なんでしょう?
> Detail セクションに自由に配置する以上、レイアウト上の問題は発生しようがないですよね。
> 「逆」だったら、あり得ますけども。

明らかに、私の説明不足ですね。すみません。

例えば、伝票番号”100”を抽出条件とした場合
明細A・・テーブルAより取得する。取得データ件数10件
明細B・・テーブルBより取得する。取得データ件数5件
明細C・・テーブルCより取得する。取得データ件数3件
明細D・・テーブルDより取得する。取得データ件数7件
各明細の件数が異なる為、サブレポートを使用するしかないと
思っております。

昨夜、一日中ネットとヘルプを調査した結果サブレポートと
対応させるには、親子レポートにするとよいという事が記述
されていました。早速、朝プログラムをした所エラーが発生
してしまい悩んでいます。

エラー内容
 これらの列には現在一意の値が含まれていません。

エラー箇所
clsDB.DataSet.Relations.Add("KeyD35", _
clsDB.DataSet.Tables("rptMain").Columns("D35_CODE"), _
clsDB.DataSet.Tables("rptD35").Columns("D35_CODE"))

*clsDB・・データベースアクセス用のクラス

指定したテーブル名の確認と、フィールドの確認はしましたが間違っていませんでした。
Tablesには、作成したデータテーブル名、Columnsには、フィールド名を記述すると
いう事で間違っていないでしょうか。

よろしくお願いいたします。自分でも引き続き調査します。
おそらく、固定行印刷の為、設定が難しいと感じているのでしょう。
で、邪道かもしれませんが、
簡単な方法として、ひとつのデータにするのです。
え?どうゆう事?と思います。
つまり、ヘッダー情報も明細情報も全てをひとつのレコードとしてデータを加工するのです。
そうする事で、固定した情報として表記する事が可能です。
また、ヘッダーが変わった場合は、別のレコードなので改ページのタイミングが楽です。

あくまで参考として...
返信ありがとうございます。ぺがらぼさん。

> 簡単な方法として、ひとつのデータにするのです。
> え?どうゆう事?と思います。
> つまり、ヘッダー情報も明細情報も全てをひとつのレコードとしてデータを加工するのです。

私自身も初めは、ひとつのデータとして扱おうと思いましたが
問題点がいくつかある為、断念しました。

1、明細という表現をしておりますが、1明細あたりのフィールド数が多いです。
  1明細あたり10フィールドぐらいあります。4明細×10フィールド=
  40フィールドになります。

2、改ページの際にページ番号算出と、データ加工が必要になります。
  今回のややこしい点は、テーブルの行NO=帳票印字箇所の明細の行NOでは
  ないという事です(データ加工が大変になりそうかなと)。

確かに開発可能ではあるのですが、メンテ(修正)がしずらいかなと思い断念しました。

いろいろな人の考えを聞けるので、大変勉強になります。また、解決策がありましたら
教えてください。
こんにちは、じゃんぬねっと です。

■No9331に返信(178さんの記事)
> 私自身も初めは、ひとつのデータとして扱おうと思いましたが
> 問題点がいくつかある為、断念しました。

先にも書いたように、最初から 1 つのデータにしなくとも、
ActiveReports 内のイベントで加工するという柔軟な手もあります。
それこそ、動的にフィールドも作成できますので、可変だろうと大丈夫です。
多用すると、ソース上の可読性を損なうのでお勧めはできませんが...
(もちろん、ある程度データを加工する分には使うべきだと思います)
では、別の方法です。
といっても、私は.NET版ActiveReportを使った事が無いので、何とも言えませんが、おそらく考え方はCrystalReportsと似てると思うので、紹介しておきます。

1.ページヘッダーを分ける。上側のヘッダーは今までどおりのヘッダーでかまいません。
2.下側のヘッダーに罫線を引いてください。(固定行の部分です)
3.下側のヘッダーの書式設定で「続くセッションをアンダーレイ」にチェックを入れます。それで、固定行ができます。
4.詳細セクションに明細データを出力させます。

あとは改ページのタイミングなので、グループなんかを利用して改ページさせてください。
こんにちは、じゃんぬねっと です。

■No9339に返信(ぺがらぼさんの記事)
> といっても、私は.NET版ActiveReportを使った事が無いので、何とも言えませんが、
> おそらく考え方はCrystalReportsと似てると思うので、紹介しておきます。

じゃあ、一応フォローしときます。(^-^;)

> 1.ページヘッダーを分ける。上側のヘッダーは今までどおりのヘッダーでかまいません。
> 2.下側のヘッダーに罫線を引いてください。(固定行の部分です)
> 3.下側のヘッダーの書式設定で「続くセッションをアンダーレイ」にチェックを入れます。それで、固定行ができます。
> 4.詳細セクションに明細データを出力させます。

残念ながら、ActiveReports for .NET は CrystalReports と違って、
ページヘッダ・フッタ、レポートヘッダ・フッタの分割はできません。
ですが、内部的なロジックにより論理的に分割することは可能です。
グループヘッダで代用するためには、ヘッダのイベントに色々細工する必要があります。
(先の説明で、その辺りを触れるべきでした)
また、アンダーレイもイベントで実装する必要があります。

いずれにしても、イベントで多少の細工は必要ですね。
CR でのみ使えるオプションの代わりに、イベントで実装と言った感じでしょうか。
CR に比べて柔軟性は高いですから、案としては、ぺがらぼさんの案で良いと思います。
じゃんぬねっとさん、ぺがらぼさん

色々と相談にのってくださり、ありがとうございます。
返信が遅くなり申し訳ありませんでした。

ヘルプやネットを見て、プログラムを書いては悩み何とかできそうです。
詳細は、できましたら投稿いたします。まぁ、できたらのお話ですが・・。

私の説明不足と言語表現不足がある為、再度補足致します。

今回下記の様な帳票を作成したいです。

------------ヘッダーの情報--------------
------明細A---------ヘッダーの情報------
(最大行数10行固定)---ヘッダーの情報------
-----------------明細B----------------
       (最大行数10行固定)
-----------------明細C----------------
       (最大行数10行固定)
-----------------明細D----------------
       (最大行数10行固定)
------------フッターの情報--------------

このような感じのレイアウトです。余計わかりにくなったらすみません。
どれかの明細データが、最大行以上のデータを取得した場合は改ページします。
明細データの取得件数に関しましては、各明細により異なります。

よろしくお願いいたします。
じゃんぬねっとさん、ぺがらぼさん

こんにちは。長い時間かかりましたが、解決しました。

解決方法

1、データベース内にワークテーブルを作成する。ワークテーブルのデータの追加には、ヘッダの情報とサブレポートの情報とページ番号を算出する。

2、レポートのFormatイベントにて、サブレポートのデータソースを入れ替える(1で作成した、ワークテーブルを参照する)。抽出条件は、ヘッダのページ番号とする。

以上。

助言していただいた通り、ヘッダの情報とサブレポートの情報を抽出するという点と、レポートのイベントを活用するという事で解決しました。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板