- - PR -
CrystalReport 詳細セクションの非表示
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-05-28 18:32
VS2005(VB.NET)付属のCrystalReportで開発を行っています。
よろしくお願いします。 詳細セクションを詳細aと詳細bに分けて表示をしているのですが 詳細bに表示すべきデータが無かった場合は 詳細bセクション丸々非表示としたいのです。 ここでの記事なども調べて以下のように WhilePrintingRecords; //DataTableA.01が0件なら非表示 If (COUNT({DataTableA.01}) = 0) then True Else False としてみたのですが、詳細bにまったくデータが無い場合は非表示になるのですが 2頁目以降になるとデータ自体は表示されないのですが、空の枠が表示されてしまいます。 (枠というのは自分で作成した線オブジェクト等の描画オブジェクトです) こんな感じになってしまいます。 1ページ目 ┌───────┐ │┌─────┐│ ││ 詳細A ││ ││ 詳細A ││ │└─────┘│ │┌─────┐│ ││ 詳細B ││ ││ 詳細B ││ │└─────┘│ └───────┘ 2ページ目 ┌───────┐ │┌─────┐│ ││ 詳細A ││ ││ 詳細A ││ │└─────┘│ │┌─────┐│ ││ ││ ││ ││ │└─────┘│ └───────┘ この2ページ目の下段の枠もろとも非表示にしたいのです。 ちょっとしたヒントでもかまいませんのでご教授願います。 | ||||
|
投稿日時: 2007-05-28 19:10
逆にデータが存在する時だけ表示とかできんのかいな?
| ||||
|
投稿日時: 2007-05-29 09:07
ぶさいくろう様、返答ありがとうございます。
>逆にデータが存在する時だけ表示 試してみましたが、やはり現象は変わらずでした。 以下のようなコードを詳細bセクションの「非表示−ドリルダウン不可」に 追加しました。 (CrystalReportの開発は初めてなので間違っているかも知れませんが) WhilePrintingRecords; //DataTableA.01が1件以上なら表示 If (COUNT({DataTableA.01}) > 0) then False Else True 一度セクションの表示がされてしまうと次ページ以降もその設定が 引き継がれてしまうのでしょうか? 例えば最終頁だけ部分的に非表示にすると言ったことは CrystalReportでは不向きなのでしょうか? | ||||
|
投稿日時: 2007-05-29 09:59
引き継ぐも何も元の条件が満たされっぱなしなので、CrystalReports は正しい動作をしています。If (COUNT({DataTableA.01}) = 0) の条件はページの中に含まれるレコードの条件ではなく、DataSource 全体の条件ですよね。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2007-05-29 10:52
じゃんぬねっと様、返答ありがとうございます。
確かにそうです。 一応VB内でレポート側にデータを渡す際にクリアしてみたりとかもやってみたのですが そのときも詳細bすべてのデータがクリアされてしまったりとかで うまく行きませんでした・・・。 ページを指定しての判断というのは出来るものなのでしょうか? 例えば If (COUNT({2ページ目のDataTableA.01}) = 0) と言ったような感じで。 | ||||
|
投稿日時: 2007-05-29 11:32
そのイメージで実現することはできません。式フィールド上に Global もしくは Shared なフラグ変数を用意して、その変数をセクションの非表示条件にするのが正攻法だと思います。 まず、ページ ヘッダに式フィールドを配置しそこでフラグ変数の初期化を行います。詳細セクションがレコード毎に走査されることを利用して、データがあるかどうかを判断します。データがあると判断した場合にフラグ変数の値を変え、それをセクションの非表示条件とします。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2007-05-29 13:24
じゃんぬねっと様返答ありがとうございます。
このレコード毎に、という判断方法が分かりません。 ページヘッダに Global numberVar dFlg := 0; WhilePrintingRecords; If (COUNT({DataTableA.01}) = 0) then dFlg := 1; というような処理を追加してみたのですが やはり2頁目以降は1が設定されていません。 If (COUNT({DataTableA.01}) = 0) ここを ページ毎の判断に変えなければならないとは思うのですが。。。 細かいところまで聞いてしまって大変恐縮なのですが よろしくお願いします。 [ メッセージ編集済み 編集者: 花茶 編集日時 2007-05-29 13:26 ] | ||||
|
投稿日時: 2007-05-29 13:42
詳細セクション A と詳細セクション B に表示されるデータまたは DataSource 上の関係がわからないので具体的にお答えすることができないでいます。どのような関係になっているのでしょうか? またデータ存在しない場合というのはどのように表現されますか?
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |