イベントが発生する順序について
ActiveReportsは、1つのレポートをいくつかのセクションに分けて処理します。各セクションには、Format、BeforePrint、AfterPrintの3つのイベントがあり、必ずこの順番に発生します。しかしながら、これらの3つのイベントが連続して発生するわけではなく、例えば、PageHeaderのFormatイベントの後にDetailのFormatイベントが発生するなどのように、3つのイベントが離れて発生することがよくあります。このため、これらのイベントの発生順に頼ったレポートを作成することは、お勧めできません。詳細については、セクションのイベントが連続して発生しない理由を参照してください。
データ処理のイベントデータベースのデータを出力する場合は、1件のレコードが読み込まれるたびに、FetchDataイベントが発生します。このイベントは、DetailセクションのFormatイベントの直前に発生します。FetchDataイベント内では、必ずデータに関する処理のみを行うようにしてください。なお、データベースのデータをバウンド形式で出力しレコードが1件も存在しない場合は、NoDataイベントが発生しますが、アンバウンド形式で出力した場合には発生しません。この場合は、手動で行っているデータ読み込み後に、レコードが存在するかどうかを判定してください。アンバウンドで使用するフィールドは、DataInitializeイベントで定義してください。
レポートの生成処理に関するその他のイベント上記イベントの他にもレポートの生成過程では多くのイベントが発生します。以下にそれらのイベントの一部を記述します。その他のイベントについては、製品ヘルプのリファレンスを参照してください。
セクションのイベントが連続して発生しない理由
セクションのイベント発生順は、集計オブジェクトと、それらのセクションの依存関係などによって、さまざまに変化します。
例えばPageHeader上に、Detailに配置した項目の集計結果を出力するためのTextBoxコントロールを配置したとします。この場合、TextBoxコントロールに表示する正しい値は、すべてのレコードを読み込んだ後、言い換えるとすべてのレコードについてDetailのFormatイベントが発生した後(データはDetailのFormatイベントの直前に読み込まれます)でなければ分かりません。このため、PageHeaderのイベントよりも、Detailのイベントが先に発生するようになります。イベントの発生順に関して唯一確実なのは、各セクション(複数レコードが存在しDetailが複数出力される場合は、各Detail)に対し、Format、BeforePrint、AfterPrintの順でイベントが発生することです。
ActiveReportsは、準備ができたページからただちに処理および描画を行います。データ要素の一部が認識できない、レイアウトが完成していないなどの理由でActiveReportsがページの描画を完了できない場合は、必要なデータが揃うまで、このページはActiveReports内部のキャッシュに格納されます。
イベントを利用する上での重要なポイントについて
セクションにはFormat、BeforePrint、AfterPrintの3つのイベントがありますが、これらのイベントでは、基本的にアクティブなセクションやアクティブなセクション上にあるコントロール以外操作してはいけません。アクティブなセクションとはそのイベントの対象となっているセクションのことです。たとえばDetailセクションのFormatイベントの場合、アクティブなセクションはDetailセクションということになります。 DetailセクションのBeforePrintイベントで、データに合わせてGroupHeaderセクションの背景色を変更するような処理を行ってはいけません。
データに関する操作はFetchDataイベントとDataInitializeイベントのみで行うFetchDataイベントでは、FieldCollectionクラス、Fieldクラス、データソースコントロールを使用した、データに関する処理のみを行ってください。たとえば、このイベントで、データに合わせてDetailセクションの背景色を変更するような処理を行ってはいけません。このような場合は、FetchDataイベント内でデータを格納し、DetailセクションのFormatイベントでその値を判定して背景色を変更するようにしてください。このように、このイベント内ではセクションやセクション上のコントロールを直接操作してはいけません。
DataInitializeイベントでは、アンバウンドフィールドの定義を行います。
集計用に使用したTextBoxコントロールの値の参照はBeforePrintイベントで行うセクションに集計用のTextBoxコントロール(Summaryプロパティを設定したコントロール)を貼り付けている場合、データの読み込み処理と集計対象のデータ範囲との関係から、Formatイベントの発生時点では集計が完了していないことがあります。しかし、どのような場合においてもそのセクションのBeforePrintイベントの発生時点では集計が完了していることが保証されています。そのため、集計用のTextBoxコントロールの値はBeforePrintイベントで参照する方が確実です。