none
複数明細を持つ帳票出力のCrystal Reportsでの実装方法について RRS feed

  • 質問

  • 複数の明細が存在する場合のCrystal Reportsでの実装についてご教授いただければ、と思います。

    データが格納されたMDBからCrystal Reportsにて以下のように明細行が複数存在する帳票を作成しようとしています。

    帳票レイアウトの例
     ヘッダ情報 管理番号 管理データA 管理データB  作成日
            00001    AAA     BBB    2016/8/20
    --------------------------------------------
     明細情報1  都道府県 コード 店舗数       
    --------------------------------------------
             東京都  0010  200
             ---------------------------
             京都府  0029  150
             ---------------------------
             福岡県  0040  101
             ---------------------------
                 ・
                 ・
                 ・
    --------------------------------------------
     明細情報2   情報A   情報B  情報C
    --------------------------------------------
             ああ    いい  うう
             ---------------------------
             かか    きき  くく  
             ---------------------------
             ささ    しし  すす
             ---------------------------
                 ・
                 ・ 
                 ・
    -----------------------------------------------------
     明細情報3   詳細情報A  詳細情報B 詳細情報C
    -----------------------------------------------------
             AAA     BBB    CCC 
             ------------------------------------
             DDD     EEE    FFF
             ------------------------------------
             GGG     HHH    III
             ------------------------------------
                 ・
                 ・ 
                 ・
    上記のような帳票となります。
    MDBはヘッダ情報テーブル、明細情報1,2,3と4つのテーブルがあり、管理番号を
    キーとしてリンクされています。
    明細情報1,2,3ともにMAX出力は100明細で可変(0件~100件まで)です。
    1ページに収まらない場合は改ページしてヘッダ情報を先頭に印字して
    明細情報の続きを印字します。

    Crystal Reportsで実現させるにはどうすればよろしいでしょうか?
    簡単な帳票(明細データは1つだけ)しか作成したことがないのでどのように作成したらよいか
    悩んでおります。
    詳細セクションは1つしか作成できないと思いますのでサブレポートを3つ作成する方法しかないでしょうか?
    (サブレポートを使用したことはないのですが・・・)

    具体的な実装方法がわかると助かります。

    製品VerはCrystal Reports2013です。

    宜しくお願いします。

    2016年8月21日 6:29

回答

  • 改ページ時にヘッダ情報を印刷する場合、グループを使うのが簡単です。Crystal Reportsで印刷しやすいようにデータを整えることを私はよくやります。例えば以下のようにデータを整形し、Crystal Reportsのデータソースとします。
    SQLのunionを使えば、そんなに難しいことではないと思います。

    ヘッダ情報 管理番号 管理データA 管理データB 作成日 明細1 明細2 明細3 区分
    -----------------------------------------------------------------------------------------------
    00001 AAA BBB 2016/8/20 東京都 0010 200 1
    00001 AAA BBB 2016/8/20 京都府 0029 150 1
    00001 AAA BBB 2016/8/20 福岡県 0040 101 1
    00001 AAA BBB 2016/8/20 ああ いい うう 2
    00001 AAA BBB 2016/8/20 かか きき くく 2
    00001 AAA BBB 2016/8/20 ささ しし すす 2
    00001 AAA BBB 2016/8/20 AAA BBB CCC 3
    00001 AAA BBB 2016/8/20 DDD EEE FFF 3
    00001 AAA BBB 2016/8/20 GGG HHH III 3

    それぞれの行の最後は明細情報の区分です。
    Crystal Reportsは詳細セクションを複数作成することができます。あらかじめ明細情報1、2、3を印刷するための3つの詳細セクションを作成しておきます。それぞれの詳細セクションを、区分によって表示、非表示をコントロールします。例えば明細情報1用の詳細セクションは、区分が1以外は非表示にします。

    ヘッダに関しては、グループセクションで対応します。グループの列タイトルはページヘッダでも良いと思います。明細情報の列タイトルは明細情報毎(つまり区分毎)にグループセクションを作成し、そこに書けば良いと思います。このグループセクションの表示、非表示はやはり区分でコントロールします。

    改ページにおけるタイトルや列タイトルが要らなければサブレポートやテーブル同士のリンクを利用して印刷するなどもできますが、要るのであれば、やはりグループの機能を使うのが簡単のように思います。
    ただ、実際に試したわけではないので、上に書いたことが本当にうまくいくかどうかはわかりません。手直しが必要になるかもしれません。その場合は、またご相談下さい。

    #上記でうまくいかなければ、グループ機能は使わず、Crystal Reportsのテーブルのリンクの機能を使って印刷し、ページの先頭にヘッダと列タイトルを表示する詳細セクションを作成し、ページの最初の行の印刷時のみ、それらを表示し、それ以外は非表示にするということもできるかなぁと思ったりはします。思い付きレベルで申し訳ないですが・・・


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク 星 睦美 2016年8月30日 1:07
    2016年8月22日 2:58
    モデレータ

すべての返信

  • 改ページ時にヘッダ情報を印刷する場合、グループを使うのが簡単です。Crystal Reportsで印刷しやすいようにデータを整えることを私はよくやります。例えば以下のようにデータを整形し、Crystal Reportsのデータソースとします。
    SQLのunionを使えば、そんなに難しいことではないと思います。

    ヘッダ情報 管理番号 管理データA 管理データB 作成日 明細1 明細2 明細3 区分
    -----------------------------------------------------------------------------------------------
    00001 AAA BBB 2016/8/20 東京都 0010 200 1
    00001 AAA BBB 2016/8/20 京都府 0029 150 1
    00001 AAA BBB 2016/8/20 福岡県 0040 101 1
    00001 AAA BBB 2016/8/20 ああ いい うう 2
    00001 AAA BBB 2016/8/20 かか きき くく 2
    00001 AAA BBB 2016/8/20 ささ しし すす 2
    00001 AAA BBB 2016/8/20 AAA BBB CCC 3
    00001 AAA BBB 2016/8/20 DDD EEE FFF 3
    00001 AAA BBB 2016/8/20 GGG HHH III 3

    それぞれの行の最後は明細情報の区分です。
    Crystal Reportsは詳細セクションを複数作成することができます。あらかじめ明細情報1、2、3を印刷するための3つの詳細セクションを作成しておきます。それぞれの詳細セクションを、区分によって表示、非表示をコントロールします。例えば明細情報1用の詳細セクションは、区分が1以外は非表示にします。

    ヘッダに関しては、グループセクションで対応します。グループの列タイトルはページヘッダでも良いと思います。明細情報の列タイトルは明細情報毎(つまり区分毎)にグループセクションを作成し、そこに書けば良いと思います。このグループセクションの表示、非表示はやはり区分でコントロールします。

    改ページにおけるタイトルや列タイトルが要らなければサブレポートやテーブル同士のリンクを利用して印刷するなどもできますが、要るのであれば、やはりグループの機能を使うのが簡単のように思います。
    ただ、実際に試したわけではないので、上に書いたことが本当にうまくいくかどうかはわかりません。手直しが必要になるかもしれません。その場合は、またご相談下さい。

    #上記でうまくいかなければ、グループ機能は使わず、Crystal Reportsのテーブルのリンクの機能を使って印刷し、ページの先頭にヘッダと列タイトルを表示する詳細セクションを作成し、ページの最初の行の印刷時のみ、それらを表示し、それ以外は非表示にするということもできるかなぁと思ったりはします。思い付きレベルで申し訳ないですが・・・


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク 星 睦美 2016年8月30日 1:07
    2016年8月22日 2:58
    モデレータ
  • ご回答有難うございます。

    trapemiya様の仰るように3つの明細テーブルを1つのテーブルに集約させてみました。

    詳細セクションを3明細分を用意し、区分で表示/非表示設定を行ったのですが以下のように印字されます。

    【データ内容】

    ヘッダ情報 管理番号 管理データA 管理データB 作成日 明細1 明細2 明細3 区分
    -----------------------------------------------------------------------------------------------
    00001 AAA BBB 2016/8/20 東京都 0010 200 1

    00001 AAA BBB 2016/8/20 ああ いい うう 2

    00001 AAA BBB 2016/8/20 AAA BBB CCC 3

    【セクション】

    詳細a 区分”01” 以外は非表示

    詳細b 区分”02” 以外は非表示

    詳細c 区分”03” 以外は非表示

    【結果】

    --------------------------------------------
     明細情報1  都道府県 コード 店舗数       
    --------------------------------------------

    --------------------------------------------
     明細情報2   情報A   情報B  情報C
    --------------------------------------------

    -----------------------------------------------------
     明細情報3   詳細情報A  詳細情報B 詳細情報C
    -----------------------------------------------------

    東京都 0010 200 1

    東京都 0010 200 1

    東京都 0010 200 1

    ああ いい うう 2

    ああ いい うう 2

    ああ いい うう 2

    AAA BBB CCC 3

    AAA BBB CCC 3

    AAA BBB CCC 3

    列タイトルが3つ連続で印字されてその後にデータがそれぞれ3レコードずつ印字されました。

    上手くいきそうと思ったのですが・・・・

    ちなみに詳細セクションはセクションエクスパートの詳細のところで挿入ボタンを

    押下して詳細a,b,cを作成しました。

    根本的に間違えているところがあればご教授いただけると助かります。

    宜しくお願いします。

    2016年8月23日 11:36
  • 非表示の制御がうまく行っていないのだと思います。私の方でテストしてみましたが、うまく動作しているようです。
    文章で説明しにくいので以下の画像を参考にしてみて下さい。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2016年8月24日 2:42
    モデレータ
  • 動作中の画像も貼っておきます。おそらくこんな感じですよね?
    ヘッダ情報や、詳細のヘッダは全てグループセクションで作成していますので、改ページ時には再表示されるはずです。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2016年8月24日 2:52
    モデレータ
  • 返信遅くなりました。

    期待するレイアウトになりました。

    そもそもグループの定義が誤っていたのと仰るように非表示制御の式にも誤りがありました。

    経験がないサブレポートはあまり使用したくなかったので大変助かりました。

    お忙しい中すぐにご回答をいただき、感謝いたします。

    有難うございました。

    2016年8月25日 4:32