- PR -

AvtiveRports for .NET で改ページ時の出力データがずれる

投稿者投稿内容
ジエゴ
常連さん
会議室デビュー日: 2003/12/08
投稿数: 26
お住まい・勤務地: ヨコハマ
投稿日時: 2005-09-15 10:25
引用:

--<ページ1>--------------------------------------
[A] [1000] [XXXXXXXX]
[B] [2000] [XXXXXXXX]
[C] [3000] [XXXXXXXX]
[ ] [3001] [XXXXXXXX]
[ ] [3002] [XXXXXXXX]
[ ] [3003] [XXXXXXXX]
--<ページ2>--------------------------------------
[C] [3004] [XXXXXXXX]
[ ] [3005] [XXXXXXXX]
[ ] [3006] [XXXXXXXX]
[D] [4000] [XXXXXXXX]
[E] [5000] [XXXXXXXX]

これを実際に出力すると下図のようにずれてしまいます。

--<ページ1>--------------------------------------
[A] [1000] [XXXXXXXX]
[B] [2000] [XXXXXXXX]
[C] [3000] [XXXXXXXX]
[ ] [3001] [XXXXXXXX]
[ ] [3002] [XXXXXXXX]
--<ページ2>--------------------------------------
[ ] [3003] [XXXXXXXX]
[C] [3004] [XXXXXXXX]
[ ] [3005] [XXXXXXXX]
[ ] [3006] [XXXXXXXX]
[D] [4000] [XXXXXXXX]
[E] [5000] [XXXXXXXX]

[3003] のレコードを処理する Formatイベント の中で
PageNumber を調べると 1 になっています。[3004] のときには 2 になっています。



正しい動きだと思うのですが。
3003のレコードを処理するときはまだ一ページ目で出力してみて
ページに収まらないことが分かり、二ページ目に行くのだと思います。
そもそもDetailセクションでPageNumberは正しく参照できるんでしたっけ?

ちなみにわたしならグループヘッダでUnderLayNext&RepeatStyleを
使用してコントロールします。
Bear
会議室デビュー日: 2005/09/14
投稿数: 10
投稿日時: 2005-09-15 10:53
ありがとうございます。
引用:

じゃんぬねっとさんの書き込み (2005-09-15 09:55) より:
ということは、非表示にしているのが原因と考えられますね。
どういうロジックで、前のデータとの比較をしているのでしょう?

私だったら、これらをグループ セクションで括り、
「まとめて表示」させるような仕様にしますね。
(まとめて表示できなければ、その時点で改ページする)



以下がサンプルで作ったソースコードです(部分的に省略あり)。
直前のデータを変数に保持して、現在のデータと比較するようにしています。

-----------------------------------------------------------
'直前のデータ保持用
Private bk As String

Private Sub Detail_Format(ByVal sender As Object, ...) Handles Detail.Format

'現在のデータと直前のデータが同じなら非表示にする
If txtCustomerID.Text = bk Then
txtCustomerID.Visible = False
Else
txtCustomerID.Visible = True
End If

'現在のデータを次のデータと比較させるために変数に保持
bk = txtCustomerID.Text

End Sub

Private Sub Report_PageEnd(ByVal sender As Object, ...) Handles MyBase.PageEnd
'次ページの先頭データが非表示にならないように変数を初期化
bk = ""
End Sub

-----------------------------------------------------------

根本的な解決は難しいのかもしれません。。
じゃんぬねっとさんのアドバイスを参考にして仕様も含めて再検討してみます。
とは言うものの既にたくさんの帳票があるので、仕様変更(作り変え)は最終手段にしたいのが本音(T_T)。新規開発ではなく移行開発なんです。。
Bear
会議室デビュー日: 2005/09/14
投稿数: 10
投稿日時: 2005-09-15 11:13
引用:

ジエゴさんの書き込み (2005-09-15 10:25) より:
正しい動きだと思うのですが。
3003のレコードを処理するときはまだ一ページ目で出力してみて
ページに収まらないことが分かり、二ページ目に行くのだと思います。
そもそもDetailセクションでPageNumberは正しく参照できるんでしたっけ?

ちなみにわたしならグループヘッダでUnderLayNext&RepeatStyleを
使用してコントロールします。



アドバイスありがとうございます。
ということは ActiveReports の仕様と考えた方がいいですね。
これから UnderLayNext & RepeatStyle を試してみます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-09-15 11:26
引用:

以下がサンプルで作ったソースコードです(部分的に省略あり)。
直前のデータを変数に保持して、現在のデータと比較するようにしています。

'現在のデータと直前のデータが同じなら非表示にする
If txtCustomerID.Text = bk Then
  txtCustomerID.Visible = False
Else
  txtCustomerID.Visible = True
End If

'現在のデータを次のデータと比較させるために変数に保持
bk = txtCustomerID.Text


当然、この部分にブレークポイントを置いたり、
コンソール出力などして、実際どのタイミングで false になってしまってるのか見てますよね?

ページの最後になるレコードだけが、
Format イベントと PageEnd イベントで期待通りに動作しないわけですから、
順番はまず追いますよね?

# PageEnd が先に来ているような気がします。
# ページ セクションの位置にかかってるのでしょうかね?


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2005-09-15 12:55
> 文章だけではなかなか現象が伝わりにくいのですが、
>  1ページ目で処理されたデータは
>  1ページ目に出力される。
> という、当たり前のことをしたいのですが
>  1ページ目で処理されたデータが
>  2ページ目の先頭に出力されてしまう。
> という状況になっています。

「処理」が何をさすかですが、Fetch あたりでしょうか。
ActiveReports では各イベントは非同期でおきるので、
Fetch 時点で、このデータで改ページされるかどうか、
また、すでに改ページされ、ページの先頭かどうかの保証はないですね。

Format あたりでセクションの高さが決定して、
改ページ判定が行われて、改ページが必要ならPageEnd が発生するのだと思います。

私も、同じような現象になりました。
そのときは、Fetch で欲しいデータを DataField に移してから、
それ以降の処理に使用しました。
PageEnd の時点ではすでに次の Fetch が行われていたりしたので。
無月 重造
ベテラン
会議室デビュー日: 2003/12/18
投稿数: 67
投稿日時: 2005-09-15 13:08
ふとおもったんですが、「1レコードの行数・1行のサイズ」が固定なのに
1ページに出力されるレコード数が一致しない、ということですか?

_________________
人の振り見て我が振りなおせ。
Bear
会議室デビュー日: 2005/09/14
投稿数: 10
投稿日時: 2005-09-15 13:36
引用:

じゃんぬねっとさんの書き込み (2005-09-15 11:26) より:
当然、この部分にブレークポイントを置いたり、
コンソール出力などして、実際どのタイミングで false になってしまってるのか見てますよね?

ページの最後になるレコードだけが、
Format イベントと PageEnd イベントで期待通りに動作しないわけですから、
順番はまず追いますよね?

# PageEnd が先に来ているような気がします。
# ページ セクションの位置にかかってるのでしょうかね?



以下は実際にデバッグ出力したものです(改ページ前後の抜粋)。
左から ページ番号, 項目1, 項目2, イベント名, 項目1のVisible状態 です。

1 [A] [10626] Report_FetchData : Visible=False
1 [A] [10654] Detail_Format : Visible=False ⇒ False
1 [A] [10654] Report_FetchData : Visible=False
1 [A] [10654] PageFooter_Format : Visible=False
1 [A] [10654] Report_PageEnd : Visible=False
2 [A] [10654] Report_PageStart : Visible=False
2 [A] [10654] PageHeader_Format : Visible=False
2 [A] [10672] Detail_Format : Visible=False ⇒ True
2 [A] [10672] Report_FetchData : Visible=True
2 [A] [10689] Detail_Format : Visible=True ⇒ False
2 [A] [10689] Report_FetchData : Visible=False
2 [A] [10733] Detail_Format : Visible=False ⇒ False
2 [A] [10733] Report_FetchData : Visible=False

下図は実際の出力を表したものです。

--- ページ1 ---
#省略#
[ ] [10626]
--- ページ2 ---
[ ] [10654]
[A] [10672]
[ ] [10689]
[ ] [10733]

項目2の[10654]のレコードは PageEnd より前にありますが、2ページ目に表示されます。
2ページ目の PageStart, PageHeader にもかかっていることが原因でしょうか。
このイベントの流れを見る限りは1ページ目に収まっても良さそうなんですが。
もう少し探ってみます。
Bear
会議室デビュー日: 2005/09/14
投稿数: 10
投稿日時: 2005-09-15 14:08
引用:

masaさんの書き込み (2005-09-15 12:55) より:
私も、同じような現象になりました。
そのときは、Fetch で欲しいデータを DataField に移してから、
それ以降の処理に使用しました。
PageEnd の時点ではすでに次の Fetch が行われていたりしたので。


今は Detailセクション の Formatイベント で処理しているのですが
Fetch やイベントのタイミングを見てみると、工夫が必要そうですね。
参考にさせていただきます。ありがとうございます。

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