- PR -

CrystalReport 詳細セクションの非表示

投稿者投稿内容
花茶
会議室デビュー日: 2006/10/11
投稿数: 12
投稿日時: 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ページ目の下段の枠もろとも非表示にしたいのです。

ちょっとしたヒントでもかまいませんのでご教授願います。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-05-28 19:10
逆にデータが存在する時だけ表示とかできんのかいな?
花茶
会議室デビュー日: 2006/10/11
投稿数: 12
投稿日時: 2007-05-29 09:07
ぶさいくろう様、返答ありがとうございます。

>逆にデータが存在する時だけ表示

試してみましたが、やはり現象は変わらずでした。
以下のようなコードを詳細bセクションの「非表示−ドリルダウン不可」に
追加しました。
(CrystalReportの開発は初めてなので間違っているかも知れませんが)

WhilePrintingRecords;
//DataTableA.01が1件以上なら表示
If (COUNT({DataTableA.01}) > 0)
then
 False
Else
 True

一度セクションの表示がされてしまうと次ページ以降もその設定が
引き継がれてしまうのでしょうか?
例えば最終頁だけ部分的に非表示にすると言ったことは
CrystalReportでは不向きなのでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-05-29 09:59
引用:

花茶さんの書き込み (2007-05-29 09:07) より:

一度セクションの表示がされてしまうと次ページ以降もその設定が引き継がれてしまうのでしょうか?


引き継ぐも何も元の条件が満たされっぱなしなので、CrystalReports は正しい動作をしています。If (COUNT({DataTableA.01}) = 0) の条件はページの中に含まれるレコードの条件ではなく、DataSource 全体の条件ですよね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
花茶
会議室デビュー日: 2006/10/11
投稿数: 12
投稿日時: 2007-05-29 10:52
じゃんぬねっと様、返答ありがとうございます。

引用:

If (COUNT({DataTableA.01}) = 0) の条件はページの中に含まれるレコードの条件ではなく、DataSource 全体の条件ですよね。



確かにそうです。
一応VB内でレポート側にデータを渡す際にクリアしてみたりとかもやってみたのですが
そのときも詳細bすべてのデータがクリアされてしまったりとかで
うまく行きませんでした・・・。

ページを指定しての判断というのは出来るものなのでしょうか?
例えば If (COUNT({2ページ目のDataTableA.01}) = 0)
と言ったような感じで。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-05-29 11:32
引用:

花茶さんの書き込み (2007-05-29 10:52) より:

ページを指定しての判断というのは出来るものなのでしょうか?
例えば If (COUNT({2ページ目のDataTableA.01}) = 0)と言ったような感じで。


そのイメージで実現することはできません。式フィールド上に Global もしくは Shared なフラグ変数を用意して、その変数をセクションの非表示条件にするのが正攻法だと思います。

まず、ページ ヘッダに式フィールドを配置しそこでフラグ変数の初期化を行います。詳細セクションがレコード毎に走査されることを利用して、データがあるかどうかを判断します。データがあると判断した場合にフラグ変数の値を変え、それをセクションの非表示条件とします。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
花茶
会議室デビュー日: 2006/10/11
投稿数: 12
投稿日時: 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 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-05-29 13:42
詳細セクション A と詳細セクション B に表示されるデータまたは DataSource 上の関係がわからないので具体的にお答えすることができないでいます。どのような関係になっているのでしょうか? またデータ存在しない場合というのはどのように表現されますか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)