GrapeCity ActiveReports for .NET 16.0J
集計コントロールによるイベント発生順の変化
ActiveReportsユーザーガイド > 概念 > セクションレポートの概念 > イベント > 集計コントロールによるイベント発生順の変化

セクションのイベント発生順は、集計オブジェクトの有無によって大きく変化します。このトピックでは、1つのレポートを取り上げ、集計コントロールにより、イベント発生順がどのように変化するのかを解説します。

レポートの構成

観察に用いたレポートは以下の3つです。

レポート実行結果

それぞれのレポートを実行し、セクションイベントの発生順を観察すると、以下のような結果となります。

レポート1 レポート2 レポート3
1 ReportStart ReportStart ReportStart
2 PageStart PageStart PageStart
3 PageHeader_Format PageHeader_Format PageHeader_Format
4 Detail_Format:1 Detail_Format:1 Detail_Format:1
5 Detail_BeforePrint:1 Detail_BeforePrint:1 Detail_BeforePrint:1
6 Detail_AfterPrint:1 Detail_AfterPrint:1 Detail_AfterPrint:1
7 Detail_Format:2 Detail_Format:2 Detail_Format:2
8 Detail_BeforePrint:2 Detail_BeforePrint:2 Detail_BeforePrint:2
9 Detail_AfterPrint:2 Detail_AfterPrint:2 Detail_AfterPrint:2
10 Detail_Format:3 Detail_Format:3 Detail_Format:3
11 Detail_BeforePrint:3 Detail_BeforePrint:3 Detail_BeforePrint:3
12 Detail_AfterPrint:3 Detail_AfterPrint:3 Detail_AfterPrint:3
13 Detail_Format:4 Detail_Format:4 Detail_Format:4
14 Detail_BeforePrint:4 Detail_BeforePrint:4 Detail_BeforePrint:4
15 Detail_AfterPrint:4 Detail_AfterPrint:4 Detail_AfterPrint:4
16 Detail_Format:5 Detail_Format:5 Detail_Format:5
17 PageFooter_Format PageFooter_Format PageFooter_Format
18 PageHeader_BeforePrint PageHeader_BeforePrint PageFooter_BeforePrint
19 PageHeader_AfterPrint PageHeader_AfterPrint PageFooter_AfterPrint
20 PageFooter_BeforePrint PageFooter_BeforePrint PageEnd
21 PageFooter_AfterPrint PageFooter_AfterPrint PageStart
22 PageEnd PageEnd PageHeader_Format
23 PageStart PageStart Detail_Format:6
24 PageHeader_Format PageHeader_Format Detail_BeforePrint:5
25 Detail_Format:6 Detail_Format:6 Detail_AfterPrint:5
26 Detail_BeforePrint:5 Detail_BeforePrint:5 Detail_BeforePrint:6
27 Detail_AfterPrint:5 Detail_AfterPrint:5 Detail_AfterPrint:6
28 Detail_BeforePrint:6 Detail_BeforePrint:6 PageFooter_Format
29 Detail_AfterPrint:6 Detail_AfterPrint:6 PageFooter_BeforePrint
30 PageFooter_Format PageFooter_Format PageFooter_AfterPrint
31 PageHeader_BeforePrint PageHeader_BeforePrint PageEnd
32 PageHeader_AfterPrint PageHeader_AfterPrint PageHeader_BeforePrint
33 PageFooter_BeforePrint PageFooter_BeforePrint PageHeader_AfterPrint
34 PageFooter_AfterPrint PageFooter_AfterPrint PageHeader_BeforePrint
35 PageEnd PageEnd PageHeader_AfterPrint
36 ReportEnd ReportEnd ReportEnd

考察

  1. レポート1では、(3)PageHeader_Formatが(18)PageHeader_BeforePrint、および(19)PageHeader_AfterPrintと離れていることがわかります。PageFooterについても同様です。これは特殊なことではありません。ActiveReportsが保証しているのは、1つのセクションの出力に関して、FormatBeforePrintAfterPrintの各イベントがこの順序で発生するということであり、これらの3つのイベントが連続して発生するということではないからです。さまざまな理由により、3つのイベントが離れてしまうことがよくあります。
  2. レポート1では、5レコード目の詳細セクションは2ページ目に出力されますが、(16)Detail_Formatは、1ページ目の処理中に発生していること、この詳細セクションの (26)Detail_BeforePrintと (27)Detail_AfterPrintが2ページ目の処理中に発生していることがわかります。これは特殊なことではなく、ページの末尾に出力されようとしているセクション(ページフッタは除く)によく見られます。ActiveReportsでは、Formatイベントにおいてセクションの高さをプログラマが変更することが認められているので、このイベントが終了してからでないとセクションが現在処理中のページに収まるかどうかが判断できません。Formatイベントの終了後にセクションが現在のページに収まらないと判断した場合、ActiveReportsは改ページ処理に入ります。そして、次のページの先頭にそのセクションを出力します。
  3. レポート2は、ページヘッダにページ計を出力するコントロールを配置していますが、イベントの順序は、レポート1と変化が無いことがわかります。
  4. レポート3は、ページヘッダにレポート計を出力するコントロールを配置しています。このレポートでは、(32)PageHeader_BeforePrintイベントと (33)PageHeader_AfterPrintイベントの発生タイミングが変化していることに気づきます。これらのイベントがレポート処理の最後に発生しています。これは、データの集計がレポートの生成前にまとめて行われるのではなく、レポートの生成中に1件1件のレコードが読み込まれるたびに、言い換えれば、ひとつひとつの詳細セクションのFormatイベントが発生するたびに行われることに関係しています。つまり、この例では、正しい集計結果はすべての詳細セクションのFormatイベントが発生した後にはじめて得られます。ActiveReportsはデータが揃ったセクションから次々に出力していくため、各詳細セクションやページフッタが、ページヘッダよりも先に処理されています。このような状況を指して、「ページヘッダの出力が遅延された」と表現します。