- - PR -
AvtiveRports for .NET で改ページ時の出力データがずれる
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-09-15 10:25
正しい動きだと思うのですが。 3003のレコードを処理するときはまだ一ページ目で出力してみて ページに収まらないことが分かり、二ページ目に行くのだと思います。 そもそもDetailセクションでPageNumberは正しく参照できるんでしたっけ? ちなみにわたしならグループヘッダでUnderLayNext&RepeatStyleを 使用してコントロールします。 | ||||
|
投稿日時: 2005-09-15 10:53
ありがとうございます。
以下がサンプルで作ったソースコードです(部分的に省略あり)。 直前のデータを変数に保持して、現在のデータと比較するようにしています。 ----------------------------------------------------------- '直前のデータ保持用 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)。新規開発ではなく移行開発なんです。。 | ||||
|
投稿日時: 2005-09-15 11:13
アドバイスありがとうございます。 ということは ActiveReports の仕様と考えた方がいいですね。 これから UnderLayNext & RepeatStyle を試してみます。 | ||||
|
投稿日時: 2005-09-15 11:26
当然、この部分にブレークポイントを置いたり、 コンソール出力などして、実際どのタイミングで false になってしまってるのか見てますよね? ページの最後になるレコードだけが、 Format イベントと PageEnd イベントで期待通りに動作しないわけですから、 順番はまず追いますよね? # PageEnd が先に来ているような気がします。 # ページ セクションの位置にかかってるのでしょうかね? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2005-09-15 12:55
> 文章だけではなかなか現象が伝わりにくいのですが、
> 1ページ目で処理されたデータは > 1ページ目に出力される。 > という、当たり前のことをしたいのですが > 1ページ目で処理されたデータが > 2ページ目の先頭に出力されてしまう。 > という状況になっています。 「処理」が何をさすかですが、Fetch あたりでしょうか。 ActiveReports では各イベントは非同期でおきるので、 Fetch 時点で、このデータで改ページされるかどうか、 また、すでに改ページされ、ページの先頭かどうかの保証はないですね。 Format あたりでセクションの高さが決定して、 改ページ判定が行われて、改ページが必要ならPageEnd が発生するのだと思います。 私も、同じような現象になりました。 そのときは、Fetch で欲しいデータを DataField に移してから、 それ以降の処理に使用しました。 PageEnd の時点ではすでに次の Fetch が行われていたりしたので。 | ||||
|
投稿日時: 2005-09-15 13:08
ふとおもったんですが、「1レコードの行数・1行のサイズ」が固定なのに
1ページに出力されるレコード数が一致しない、ということですか? _________________ 人の振り見て我が振りなおせ。 | ||||
|
投稿日時: 2005-09-15 13:36
以下は実際にデバッグ出力したものです(改ページ前後の抜粋)。 左から ページ番号, 項目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ページ目に収まっても良さそうなんですが。 もう少し探ってみます。 | ||||
|
投稿日時: 2005-09-15 14:08
今は Detailセクション の Formatイベント で処理しているのですが Fetch やイベントのタイミングを見てみると、工夫が必要そうですね。 参考にさせていただきます。ありがとうございます。 |