- PR -

ActiveReports for .NET 1.0J SP4 Standard で サブレポートが表示されない

1
投稿者投稿内容
tani
会議室デビュー日: 2006/10/20
投稿数: 6
投稿日時: 2008-08-06 18:43
皆様日夜お疲れ様です。
taniと申します。

現在、ActivreReport .Net 2.0(※訂正 ActivreReport .Net 1.0J)でサブレポートを2つ使ったレポートを作成しているのですが、条件によって、片方のサブレポートが表示されません。
GrapeCityのFAQとバグレポートにも載っていないようなのですが、どこか間違っているでしょうか。アドバイスをお願いします。


現象
--GroupHeader1-------------
ヘッダ情報
--GroupHeader2-------------
--Detail-------------
■サブレポート1 ■サブレポート2
--GroupFooter2-------------
Detail後の区切り線=======
--GroupFooter1-------------
---------------

サブレポート1、2は、それぞれ0〜4明細。Detail.CanGrow=true Shrink=true。 SR1,SR2も同様です。

Detail_FormatでDatasetを作成。サブレポートを作成。サブレポートコントロール.Reportに割付。しています。

サブレポート1が思い通りに表示されません。

しかし、Detail_Format内で、サブレポート2をコメントアウトすると、サブレポート1が思い通りに表示されます。

切り分けができなくて、泣いています。
(1) ソースが悪い
(2) 仕様として、Detailにサブレポートが割り付けられない。
(3) ActiveReportのバグ


開発環境
* ActivreReport .Net 2.0J SP2 std(※訂正 ActivreReport .Net 1.0J Std)
* C# 2003

====ソースコード
//SR1、SR2がサブレポートコントロール

// サブレポート
private ActiveReportS1 subr1;
private ActiveReportS2 subr2;
private DataSet ds;

private void RPsyujiss_ReportStart(object sender, System.EventArgs eArgs)
{
ds = new DataSet();
}

private void Detail_Format(object sender, System.EventArgs eArgs)
{
ds.Clear();
if(subr1 != null)
{
subr1.Dispose();
subr1= null;
}
if(subr2 != null)
{
subr2.Dispose();
subr2= null;
}
SR1.Report = null;
SR2.Report = null;

if(int.Parse(DetailKBN.Text) == 0)
{
//DetailKBN==0 のときは、サブレポート1を出力
//SELECT * FROM TABLE1 WHERE NO = int.Parse(DetailNO.Text)
adp.Fill(ds, "table1");
subr1 = new ActiveReportS1();
subr1.DataSource = ds.Tables["table1"];
subr1.DataMember = "";
SR1.Report = subr1;
}

//↓のサブレポート2の部分をコメントアウトすれば、サブレポート1が表示される
//サブレポート2を出力
//SELECT * FROM TABLE2 WHERE NO = int.Parse(DetailNO.Text)
adp.Fill(ds, "table2");
subr2 = new ActiveReportS2();
subr2.DataSource = ds.Tables["table2"];
subr2.DataMember = "";
SR2.Report = subr2;
}



[ メッセージ編集済み 編集者: tani 編集日時 2008-08-11 11:25 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-08-06 18:54
とりあえず、サブ レポート 2 側の DataSet を別の変数に充ててください。 どうせ 1 テーブルにしか使わないのであれば、DataSet ではなく DataTable で良いでしょう。

それと関係ないと思いますが、Detail_Format イベントがどのタイミングでどれほどの頻度で行われているかご存知でしょうか? 私からは仕様が定かではありませんが、サブ レポートのインスタンスがプライベート メンバであるのに、Format イベントで毎度新しく作り直しているのは仕様がどうであれおかしいと思います。 破棄は最初にやるものではないです。 これはすなわちラスト 1 回分の考慮が漏れていることを意味します。 しかし .NET 的にはあまり問題ではなかったりします。 ただ行儀良くしようとしているのに逆に行儀が悪く見えてしまいますね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
tani
会議室デビュー日: 2006/10/20
投稿数: 6
投稿日時: 2008-08-11 11:02
ActiveReports のバージョンですが、1つ目の投稿で、
> ActivreReport .Net 2.0J SP2 std
と書きましたが、誤認識していました。投稿のタイトルも間違えていました。

正しくは、
ActiveReports for .NET 1.0J SP4 Standard
ActiveReport バージョン:3.4.0.2032
タイムスタンプ :2006/01/27 0:00:00
でした。
訂正させてください。申し訳ありません。




返信遅くなりました。taniです。
じゃんぬさん、いつもWebページ見てます。いつも一方的にお世話になっています。<(_ _)>


> DataSet を別の変数に充ててください。
やってみました。気持ちが良くなりました。


> Detail_Format イベントがどのタイミングでどれほどの頻度で行われているかご存知でしょうか?...中略...プライベート メンバ...中略...ラスト 1 回分の考慮が漏れている...中略...
80%位は把握しています。
ActiveReport仕様の把握、テストも兼ねてやっていますが、テストコードがそのまま残ることがしばしば。。。(汗。気をつけます。

> Detail_Format イベントがどのタイミング
これが良くわかりません。GroopKeepTogether=Trueにすると、発生順が変わってしまう気がします。
が、よくわかりません。
#FetchDataイベントは変わりますよね。


閑話休題。なんだかドツボにはまってしまいましたが、最終的には回避しました。

うまくいかないときは、
* サブレポート1_コンストラクタは呼ばれる(想定どおり、if(int.Parse(DetailKBN.Text) == 0)の条件に入る)
* サブレポート1_ReportStart呼ばれない
* サブレポート1_NoData呼ばれない
という現象です。サポートセンターに聞くべきのような気がしてきました。。。


■想定どおりの動きをするパターン1
if(int.Parse(DetailKBN.Text) == 0) の条件をコメントアウトする。
-> サブレポート1が表示されるようになります。この条件が悪さしているかもしれませんが、
Visible = Trueとして表示してみる限りは、0、1想定どおり表示されていますし、if文の中に入るのも想定どおりです。
SR1.Report = nullにならないためうまくいく?


DetailKBNは、Detail上のTextBoxです(Visible = False、DataFieldを設定)。

■想定どおりの動きをするパターン2
サブレポート2の部分をコメントアウトする。
-> サブレポート1が表示されます。

推測でしかないのですが、
* サブレポートが2つある場合に限り(SR2をコメントアウトすると、うまくいく)
* SR1.Report = null; が悪影響する(SR1.Report = new SubReport1();とすると、うまくいく)
ということのような気がします。

つまり

Detail_Format(){
SR1.Report = null;
SR2.Report = new SubReport2();
}
とした次のデータで、
Detail_Format(){
SR1.Report = new SubReport1();
SR2.Report = new SubReport2();
}
としても、SubReport1_Run()が走らない。
ということだと思います。


サブレポート分の空白が気になるという問題はありますが、
SR1.Report = null;
の部分を、
SR1.Report = new SubReport1();
SR1.Visible = False;
とすることで回避しました。

時間があれば、誰か検証してください(何
#時間があれば、検証したいですが。


ActiveReport バージョン:3.4.0.2032
タイムスタンプ :2006/01/27 0:00:00


[ メッセージ編集済み 編集者: tani 編集日時 2008-08-11 12:29 ]
1

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