none
複数のサブレポートを1枚のレポートに出力する方法を教えてください。 RRS feed

  • 質問

  • お世話になります。

    クリスタルレポートについて、質問があります。

    請求書とその控えを2部、1枚で出す帳票を作成しています。
    (3枚つづりの帳票をイメージしてください。
     明細の内容はほぼ同じでタイトルだけ異なっています。)
    帳票イメージは
    http://social.msdn.microsoft.com/Forums/ja/vsgeneralja/thread/b49c3e7c-91ab-4630-a063-f0182fa61b7b
    のPDFファイルを見てください。
    PDFファイルではほぼ同じ形式の帳票が3ページあるのですが、
    私はそれを1枚で出したいのです。

    メインのレポートにサブレポートを挿入し、実装しています。
     ■メインの詳細aには請求書のサブレポートを挿入
     ■メインの詳細bには請求書の控え1のサブレポートを挿入
     ■メインの詳細cには請求書の控え2のサブレポートを挿入

    また、サブレポート側はキーが変わったら改ページするように作成しています。
    理由としては画面側の抽出条件が日付のため、
    同一日付で請求先の異なる請求書が存在するためです。

    サブレポートの方でキーが変わったら改ページするように
    作成しているために、
    メインのレポート側で3枚のサブレポートが一度に表示されません。

    具体的には1枚目のサブレポートが全て表示された後(次ページ)に、
    2枚目のサブレポートが表示され、2枚目のサブレポート
    が表示された後に3枚目のサブレポートが表示されます。

    請求先が3つなら3枚の帳票が表示されてほしいのに、
    実際は、9枚の帳票が出力されます。

    1枚のレポートに3枚のサブレポートを表示する方法を教えてください。

     

    2011年8月26日 7:41

回答

  • サブレポートにメインレポートのキーがわたっていないだけではないでしょうか?

    利用されている Crystal Reports が何なのかわからないのですが、メインレポートで1明細毎に、サブレポートの1ページ分だけを出力したいんですよね? であれば、サブレポート側に改ページを入れずに、メインレポート側でサブレポートのコンテナ レポート フィールド リンクにユニークなもの(データベースであれば Primary Key) を指定すればよいかと思います。

     

    • 回答としてマーク Ninichi 2011年8月30日 4:54
    2011年8月26日 11:53
  • PDFのリンク私は見れます。質問のタイトルは
    "CrystalReportsで、1枚目/2枚目でレイアウトの違うレポートは作成可能でしょうか?"です
    ごめんなさい。勘違いしてました。見ることができました。

     

    上記にも書きましたが請求先が3件あった場合、
    請求書の1枚目~3枚目までに3つづつサブレポートを表示したいのですが、
    現状では
    1枚目~3枚目までは請求書のサブレポートのみ表示され
    4枚目~6枚目までは請求書控え1のサブレポートのみ表示され
    7枚目~9枚目までは請求書控え2のサブレポートのみ表示されます。

    既にK.Takaokaさんが書かれていますが、サブレポートのリンクを設定すれば良いのではないかと思います。

    (参考)
    [サブレポートのリンク]ダイアログ ボックス
    http://msdn.microsoft.com/ja-jp/library/ms228022(v=VS.90).aspx

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク Ninichi 2011年8月30日 4:54
    2011年8月26日 15:38
    モデレータ
  • Takaokaさん
    trapemiyaさん

    ありがとうございます。
    無事に問題が解決できました。

    今後のためにも、ここにサブレポートの作成の記述しておきたいと思います。

    ★前提:データの表示にxsdを使用し、クリスタルレポートビューワーを使用する場合
    【xsd】
     1.サブレポートのデータとメインレポートにて使用するデータを作成
     
     【サブのクリスタルレポート】
     1.改ページの処理をしないレポートを作成
     
     【メインのクリスタルレポート】
     1.詳細にサブレポートを挿入
     2.サブレポートのリンクを開き、フィールドのリンク先にメイン側のデータのキーとなる項目を設定
       指定のフィールドに基づいてサブレポートのデータを選択のチェックをオン
     3.グループヘッダに改ページの条件となるキーを設定
     
     【クリスタルレポートビューワーがあるフォームの処理】
     
     DataSet main ;
     DataSet sub ;
     
      rptMain Report = new rptMain();//レポートをインスタンス化
     
      ReportDocument crSubRptDoc;
      crSubRptDoc = Report.OpenSubreport("rptSub.rpt");
      crSubRptDoc.SetDataSource(sub);
     
      Report.SetDataSource(main);
     
      レポートビューワー.ReportSource = Report;

    • 回答としてマーク Ninichi 2011年8月30日 4:55
    2011年8月29日 4:55

すべての返信

  • とりあえず、帳票イメージであるPDFのリンク先が違っているようです。

    また、問題となっていることがイメージできません。(私だけかもしれませんが・・・)
    サブレート内で改行が発生することが起因の問題なのでしょうか?

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年8月26日 8:33
    モデレータ
  • 回答ありがとうございます。

    PDFのリンク私は見れます。質問のタイトルは
    "CrystalReportsで、1枚目/2枚目でレイアウトの違うレポートは作成可能でしょうか?"です。

    問題点ですが、
    3つのサブレポート共通で帳票はキーが変わると改ページの処理をしているため
    メインの帳票の1枚に3つのサブレポートが一度に表示されていないことです。

    上記にも書きましたが請求先が3件あった場合、
    請求書の1枚目~3枚目までに3つづつサブレポートを表示したいのですが、
    現状では
    1枚目~3枚目までは請求書のサブレポートのみ表示され
    4枚目~6枚目までは請求書控え1のサブレポートのみ表示され
    7枚目~9枚目までは請求書控え2のサブレポートのみ表示されます。

     

    2011年8月26日 8:57
  • サブレポートにメインレポートのキーがわたっていないだけではないでしょうか?

    利用されている Crystal Reports が何なのかわからないのですが、メインレポートで1明細毎に、サブレポートの1ページ分だけを出力したいんですよね? であれば、サブレポート側に改ページを入れずに、メインレポート側でサブレポートのコンテナ レポート フィールド リンクにユニークなもの(データベースであれば Primary Key) を指定すればよいかと思います。

     

    • 回答としてマーク Ninichi 2011年8月30日 4:54
    2011年8月26日 11:53
  • PDFのリンク私は見れます。質問のタイトルは
    "CrystalReportsで、1枚目/2枚目でレイアウトの違うレポートは作成可能でしょうか?"です
    ごめんなさい。勘違いしてました。見ることができました。

     

    上記にも書きましたが請求先が3件あった場合、
    請求書の1枚目~3枚目までに3つづつサブレポートを表示したいのですが、
    現状では
    1枚目~3枚目までは請求書のサブレポートのみ表示され
    4枚目~6枚目までは請求書控え1のサブレポートのみ表示され
    7枚目~9枚目までは請求書控え2のサブレポートのみ表示されます。

    既にK.Takaokaさんが書かれていますが、サブレポートのリンクを設定すれば良いのではないかと思います。

    (参考)
    [サブレポートのリンク]ダイアログ ボックス
    http://msdn.microsoft.com/ja-jp/library/ms228022(v=VS.90).aspx

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク Ninichi 2011年8月30日 4:54
    2011年8月26日 15:38
    モデレータ
  • ありがとうございます。

    月曜日にさっそく実装してみます。

    また、結果を報告します。

    2011年8月27日 13:44
  • Takaokaさんの内容でサブレポートの改ページ処理を削除し、

    メインレポート側でサブレポートのリンクを開き、
    フィールドのリンク先に改ページするキーを設定し、
    指定のフィールドに基づいたサブレポートのデータを選択のチェックをオンにすることで、

    上記の問題は解決しました。ありがとうございます。
    しかし、また別の問題が発生しました。

    問題としては、明細にn行のデータがある伝票をメインレポートに
    設定した場合、同じ明細がnページ表示されてしまいます。
    (3行明細なら、同内容の帳票が3ページ表示されます。)

    メインのレポートにグループヘッダを追加したり、
    サブレポートのリンクの設定を変えたりしたのですが、
    問題が解決出来ません。


    また、解決策をご教授して頂きたくお願いします。

     

    2011年8月29日 2:15
  • メインレポート側にも3行データがあるのではないでしょうか? データ構造としては、メインレポートに1件、その明細が3件になっていないといけないと思います。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年8月29日 2:34
    モデレータ
  • trapemiyaさん

    内容が理解できなくてすいません。
    どういうことなのでしょうか?

    現状の私が作成しているレポートは
     サブレポート側で印字する全ての内容を設定しています。
     メインレポート側では詳細にそのサブレポートを挿入し、
     サブレポートのリンクを設定しているだけです。
     メインレポート側のページヘッダやレポートヘッダには何も設定していません。

     

    2011年8月29日 2:57
  • あれ? 構造としては例えば以下のようになっているのではないんですね?

    1.メインレポートのデータ

    請求先ID   101
    請求先ID   102
    請求先ID   103

    2.サブレポートのデータ

    明細ID  1001   請求先ID   101
    明細ID  1002   請求先ID   101
    明細ID  1003   請求先ID   101
    明細ID  1004   請求先ID   102
    明細ID  1005   請求先ID   102
    明細ID  1006   請求先ID   102
    明細ID  1007   請求先ID   103
    明細ID  1008   請求先ID   103
    明細ID  1009   請求先ID   103
    明細ID  1010   請求先ID   103

    リンクフィールドは請求先ID。
    サブレポートは3つともデータは共通。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年8月29日 3:12
    モデレータ
  • > メインのレポートにグループヘッダを追加したり、

    これで良い気はしますけどね。

    グループ条件を改ページ条件にして、メインレポートのサブレポート オブジェクトをグループヘッダに配置。メインレポートの明細は空にするかんじでしょうか。

    2011年8月29日 3:26
  • ありがとうございます。

    上記のようになっていません。。

    メインのデータもサブのデータともにサブのデータを使っていました。

    現在、フィールドエクスプローラーのデータベースフィールドにはサブレポート表示用のデータセットのみ存在しているのですが、

    メイン用のデータセットを用意し、サブレポートのリンクでメインのデータセットのキーをフィールドのリンク先に設定すれば

    いいのでしょうか?

    質問ばかりですいません。

     

    2011年8月29日 3:56
  • メインのデータもサブのデータともにサブのデータを使っていました。

    現在、フィールドエクスプローラーのデータベースフィールドにはサブレポート表示用のデータセットのみ存在しているのですが、

    メイン用のデータセットを用意し、サブレポートのリンクでメインのデータセットのキーをフィールドのリンク先に設定すれば

    いいのでしょうか?

    それでうまく動くはずです。

    (追記)
    K.Takaokaさんが書かれているようにグループヘッダに配置すれば、データセットは1つで済むかもしれません。これは試したことが無いのでわかりませんが、うまくいきそうな気もします。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年8月29日 4:06
    モデレータ
  • メインレポートの方で、私が上げた例で言えば、同じ請求先IDであれば非表示にすれば、一つのデータセットで済むかもしれません。
    #未検証で申し訳ありません。すぐ上の私の追記も見て下さい。

    (参考)
    Crystal Reports 重複したデータを非表示
    http://d.hatena.ne.jp/haradago/20090220/p1

    データセット(またはデータテーブル)を複数用意しても良いのですが、複数のデータセット(またはデータテーブル)にFillする場合はトランザクションを切る必要があります。Fillするタイミングによって整合性の取れていないデータセット(またはデータテーブル)が発生する可能性があるからです。
    もしくは一つのデータセットからLINQを使ってGroupByし、その結果からCopyToDataTableメソッドを使ってデータテーブルを得て、それをメインレポートのデータソースにする方法なども思い付きます。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年8月29日 4:51
    モデレータ
  • Takaokaさん
    trapemiyaさん

    ありがとうございます。
    無事に問題が解決できました。

    今後のためにも、ここにサブレポートの作成の記述しておきたいと思います。

    ★前提:データの表示にxsdを使用し、クリスタルレポートビューワーを使用する場合
    【xsd】
     1.サブレポートのデータとメインレポートにて使用するデータを作成
     
     【サブのクリスタルレポート】
     1.改ページの処理をしないレポートを作成
     
     【メインのクリスタルレポート】
     1.詳細にサブレポートを挿入
     2.サブレポートのリンクを開き、フィールドのリンク先にメイン側のデータのキーとなる項目を設定
       指定のフィールドに基づいてサブレポートのデータを選択のチェックをオン
     3.グループヘッダに改ページの条件となるキーを設定
     
     【クリスタルレポートビューワーがあるフォームの処理】
     
     DataSet main ;
     DataSet sub ;
     
      rptMain Report = new rptMain();//レポートをインスタンス化
     
      ReportDocument crSubRptDoc;
      crSubRptDoc = Report.OpenSubreport("rptSub.rpt");
      crSubRptDoc.SetDataSource(sub);
     
      Report.SetDataSource(main);
     
      レポートビューワー.ReportSource = Report;

    • 回答としてマーク Ninichi 2011年8月30日 4:55
    2011年8月29日 4:55