none
Crystal Reports でレポートの動的生成はできますか? RRS feed

  • 質問

  • 漠然とした質問で申し訳ありません。

    C#からCrystalReportsの.rptファイルにフィールドをコードで生成することはできるのでしょうか?

     

    2011年1月11日 13:14

回答

すべての返信

  • 微妙によくわからないのですが、表示の枠の位置は決まっていて、表示させたい内容を動的に変えたいのであれば、下記のサイトを一度ご覧下さい。

    プログラム的にrptファイルを作成したいということであれば、残念ながら存じ上げません。

    「Dynamic Crystal Report with C#」
    http://www.codeproject.com/KB/cs/Dynamic_Crystal_Report.aspx

    • 回答としてマーク oira3ryu 2011年1月11日 23:07
    2011年1月11日 16:42
  • Chukiさん、ありがとうございます。

    やはり、プログラム的にrptファイルを作成するということは、難しそうですね。

    掲載していただいたリンクを参考にして考えてみたいと思います。

    ありがとうございました。

    2011年1月11日 23:06
  • AddFieldObjectで可能です。しかし、いろいろ調べてみましたが.NETに付属のCrystal Reportsでは対応していないようです。この辺りのドキュメントを見つけられればよかったのですが、見つけることができませんでした。ちなみに手元のCrystal Reports for Visual Studio 2010を見てみましたが、AddFieldObjectを見つけることができませんでした。
    ちなみにどのようなことを実現されたいのでしょうか? 場合よっては代替案があるかもしれません。

     


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

    小規模のマラソン大会用のアプリケーションを作っています。

     

    (1)テーブルnumbersは開催回を管理するテーブル

    n_id | number 

    -----+----------

        1 |        10 

    -----+----------

        2 |        11  

     

    (2)テーブルsectorは区間マスタで

    s_id | id | sector | n_id | notes

    -----+---+--------+-----+-------

        1 |  1 |       4P |    1 |     第4 

    -----+---+--------+-----+-------

        2 |  2 |       9P |    1 |    第9 

    -----+---+--------+-----+-------

        3 |  3 |     12P |    1 |   第12

    -----+---+--------+-----+-------

        4 |  4 |       GP |    1 |  ゴール

    -----+---+--------+-----+-------

        5 |  1 |       4P |    2 |    第4 

    -----+---+--------+-----+-------

        6 |  2 |       9P |    2 |    第9 

    -----+---+--------+-----+-------

        7 |  3 |       GP |    2 |  ゴール

     

    (3)テーブルrecordsは記録管理テーブルで
    別にuserマスタテーブルがあり
    下記idフィールドは選手のゼッケン番号です。

    r_id |     id | s_id | n_id |    results

    -----+------+-----+--- --+-----------

        1 |  125 |     1 |     1 | 08:45:56     

    -----+------+-----+--- --+-----------

        2 |    43 |     1 |    1 | 08:45:57  

    -----+------+-----+--- --+-----------

        3 |      2 |     1 |    1 | 08:46:00  

    -----+------+-----+--- --+-----------

    snip

    -----+------+-----+--- --+-----------

     512 |  125 |     2 |    1 | 10:12:51 

    -----+------+-----+--- --+-----------

     513 |      3 |    2 |    1 | 10:12:52 

     

    このようなテーブル構成から

    (2)を元にn_idが1(開催回10)のレコードが

    (第4,第9,第12,ゴール)4レコードあれば

    カラムをt1, t2, t3, t4に、

    n_idが2(開催回11)のレコードが

    (第4,第9,ゴール)3レコードあれば

    カラムをt1, t2, t3というように

    動的に一時テーブルのフィールドを生成を作るところまでは出来たのですが

    それを元にCrystal Reportsのフィールドを動的に生成できないものかと

    質問させていただいた次第です。

    何か代替案等ありましたらお願いいたします。

    2011年1月12日 12:23
  • 返信が遅くなりました。すみません。

    さて、代替案としては既にChukiさんがリンク先に示されている通りの方法になると思います。汎用のデーターテーブルを用意しておき、そこに印刷するデータをセットして印刷を行います。(この汎用のデーターテーブルは、Chukiさんのリンク先ではCustomerという名前で作成されています。)

    汎用データーテーブルには十分な列を用意しておきます。例えば10列でも構いません。印刷しない列には空白をセットすれば良いのですから。具体的には開催回が10の時には、4レコードありますから、汎用データーテーブルの1列から4列までにそれぞれのタイムをセットし、5列から10列は空白をセットします。これにより、5列から10列までは印刷されないのと同等になります。
    1列から4列の列間隔が気になるようであれば、以下のコードで列の位置をコードで変更することができます。

    var report = new レポートの名前();
    report.ReportDefinition.ReportObjects[フィールドオブジェクトの名前].Left = 左端からの距離;

    列タイトルはパラメーターフィールドにしてしまい、列データと同様に1列から4列には列タイトルをセットし、5列から10列には空白をセットすれば良いでしょう。

     


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