- 題名: ActiveReports 項目数が可変のテーブルを表示させたい
- 日時: 2011/02/17 22:51:50
- ID: 28203
- この記事の返信元:
- (なし)
- この記事への返信:
- [28206] Re[1]: ActiveReports 項目数が可変のテーブルを表示させたい2011/02/18 8:39:19
- ツリーを表示
回答ありがとうございます。 > グループという概念 グループヘッダのDataFieldを使って…ということでしょうか。 それともGROUP BY を含むSQL文を書いて、という意味ですか。 すごく初歩的な質問ですみません。 こんな感じのテーブルに対して、どうアプローチすれば良いのか まったくわからない状態です。 品名 | 金額 | 備考1 | 備考2 | 備考3 |……| 備考99 | −−−−+−−−−+−−−−−+−−−−−+−−−−−+−−+−−−−−−+ 製品A | 2,000 | 値下げ | 見切品 | 誤仕入 | | | −−−−+−−−−+−−−−−+−−−−−+−−−−−+−−+−−−−−−+ 製品B | 1,000 | セール | | | | | −−−−+−−−−+−−−−−+−−−−−+−−−−−+−−+−−−−−−+ 製品C | 5,000 | 特売品 | ワゴン | | | | −−−−+−−−−+−−−−−+−−−−−+−−−−−+−−+−−−−−−+ 製品D | 3,000 | 見切品 | セール | 福袋用 |……| 過剰在庫 | −−−−+−−−−+−−−−−+−−−−−+−−−−−+−−+−−−−−−+ ヒントだけでも教えていただけたらうれしいです。 よろしくお願いします。 ■No28206に返信(じゃんぬねっとさんの記事) > ■No28203に返信(チャタさんの記事) >>よろしくお願いします。 >> >>VB.net Activereports 3.0で帳票を作成したいと思います。 >>データソースは下記のようなテーブルです。 >> >>品名,金額,数量,備考1,備考2,備考3, ...... 備考n >> >> >>これを、↓このようなフォーマットで表示したいです。 >> >> 品名 | 備考 | 金額 >>−−−−+−−−−−+−−−− >>製品A | |20,000 >> | 備考1 | >> | 備考2 | >> | 備考3 | >> | 備考4 | >> | 備考5 | >>−−−−+−−−−−+−−−− >>製品B | | 1,000 >> | 備考1 | >>−−−−+−−−−−+−−−− >>製品C | | 5,000 >> | 備考1 | >> | 備考2 | >>−−−−+−−−−−+−−−− >> | | >> >>備考は、NULL以外なら表示します。 >> >>この実現方法がわかりません。 >> >>一応、考えてみたのは、備考欄に >>textBoxBikou1 >>textBoxBikou2 >>textBoxBikou3 >>. >>. >>. >>textBoxBikou999 >>みたいにテキストボックスをたくさん配置して、 >>設定値なしなら非表示にする、という方法です。 >>どうも、あまり良いやり方ではないように思います。 >>もっとスマートな方法がありましたら、教えてください。 >>下手な説明ですみません。 > > グループという概念がありますので、それを使えば特に労せず図示されたレイアウトになります。 > > ActiveReports というか、ほとんどの帳票コンポーネントでは可変長での印字は基本ですし、グループも基本的なことです。 > おまけに ActiveReports を販売している Grapecity さんはリファレンスと多くのサンプルを同梱していますので、基本的なことはそこに全部書かれています。 > そちらをご参照ください。
この場合、 レポートの使い方云々ではなく数可変で横並びのデータをどう後の都合が良いように取り出すかですよね。 行毎に背景色を切り替える場合はデータが行になっているのが手っ取り早い(他にも方法はありますが。)でしょうから、 テーブル上の備考のカラム数Nをデータ構造から求めた上で、ループでその個数分、 各備考を取得するSELECT文をUNIONで縦にくっつけたSQL文を作成してデータ取得するのが良いと思います。 また、「備考欄がすべて空の状況」と「備考の一つ目が商品の一行目ではなく次の行に配置されること」両方を考えると、 レポートのグループ機能は基本的に使えません。 (備考が必ず1から順に隙間なく使用される場合、少しやり方を変えてレポートのグループ機能を使用することもできます。) 細かいとこがいちいち面倒なのでコードは書きませんが、 SELECT 商品ID,0 as sub,商品名,価格等,'' as 備考 from 表 union →ここからが、Nループで作り上げる部分 SELECT 商品ID,1 as sub,'' as 商品名,0 as 価格等,備考1 as 備考 from 表 where not(備考1 is null) union SELECT 商品ID,2 as sub,'' as 商品名,0 as 価格等,備考2 as 備考 from 表 where not(備考2 is null) union …でNまで ←ここまで order by 商品ID,sub という感じのSQL文を作ります。(表に商品IDがないなら、商品名に読み替えてください。) ※なお、数字部分の全角・半角の変換等はReplace等適当に処理を考えてください。 ループ回数と備考項目名の後ろ側を得るためのNを求めるのは、 テーブル構造を取得するストアドにアクセスしてもよいですし、 知らなければ表にselect * from 表 where 0=1してもよいですし、 FillSchemaを利用してもよいですし、何でもよいです。 とりあえず列情報リストを得た後にそれをループしつつ名称を調べ、 「備考+数字の繰り返し」の項目で数字部分を数値化してもっとも大きかったところがNです。 先にNを求めれば、コレクション系クラスではなく単なる配列で処理可能ですし、 Nを先に求めず調べながらSQL組み立てをするなら、配列でReDim Preserveを使うかコレクション系クラスを使うかしてください。 で、レポート側では、subが0の際以外には名称や価格を表示しないように制御すればよいと思います。
■No28213に返信(チャタさんの記事) サーバー側から取得したデータを直接渡すことしかできないのなら こど。さんの言うようにUnionでやればいいと思いますが、 もしDatasetとかDataTableで渡せるのなら、取得したデータを 以下の用に新しいDataTableにセットしなおしてActiveReportへ渡し 品名、金額でグループ化してあげればよいのではないでしょうか。 品名 | 金額 | 備考 −−−−+−−−−+−−−−−+ 製品A | 2,000 | 値下げ | −−−−+−−−−+−−−−−+ 製品A | 2,000 | 見切品 | −−−−+−−−−+−−−−−+ 製品A | 2,000 | 誤仕入 | −−−−+−−−−+−−−−−+ 製品B | 1,000 | セール | −−−−+−−−−+−−−−−+ 製品C | 5,000 | 特売品 | −−−−+−−−−+−−−−−+ 製品C | 5,000 | ワゴン | −−−−+−−−−+−−−−−+ 製品D | 3,000 | 見切品 | −−−−+−−−−+−−−−−+ 製品D | 3,000 | セール | −−−−+−−−−+−−−−−+ 製品D | 3,000 | 福袋用 | −−−−+−−−−+−−−−−+ 製品D | 3,000 | 過剰在庫| −−−−+−−−−+−−−−−+
こんばんは。 もちろんunionでやる必要はなく一旦受け取ったデータを後で加工する方法も確かに採れるのですが、 後からコードで加工するとSQL一回で必要な形で取得するよりほとんどの場合無駄に極端に遅いことと、 この場合加工というより結局別途新造データになるため仮で受け取るデータ領域と最終の加工データの領域とが必要で無駄だと考え、 unionを提案しました。 また、備考欄がすべて空の商品でも商品データは出力する必要があると思ったのと、 No.28203にて商品ヘッダの行と備考の先頭行が別位置であることを考慮し、 ActiveReports側でグループ機能を使用することができないと判断しました。
分類:[.NET]