セクションレポートでは、イベントを使用してレポートの動作を制御することができます。
以下のイベントは、レポートの処理時に1回だけ発生するイベントです。これらのイベントは、レポート生成処理の始まり、もしくは終わりに発生します。
1回だけ発生するイベント
DataInitializeイベントの前に発生します。このイベントは、レポートの実行時に必要な任意のオブジェクト、または変数を初期化するために使用します。また、サブレポートの場合、親レポートのこのイベントで内で、SubreportコントロールのReportプロパティに任意の子レポートを割り当てることができます。
ReportStartイベントの後に発生します。このイベントは、アンバウンドフィールドをレポートのFieldsコレクションに追加する場合に使用します。アンバウンドフィールドは、バウンドレポート(レコードを取得するために組み込みデータソースを利用するレポートのこと)や、アンバウンドレポート(レコードを取得するためにデータソースを必要としないレポートのこと)に追加できます。バウンドレポートでは、データセットがオープンされ、データセットのフィールドがフィールドコレクションに追加されます。次に、新しいアンバウンドフィールドを追加できるように、DataInitializeイベントが発生します。DataInitializeイベントを使用し、DataSourceを調整したりデータベースの接続を設定したりすることもできます。
レポートの処理が終わった後に発生します。このイベントは、アンバウンドモードの実行中に使用していた任意のオブジェクトを閉じたり解放したりする場合や、情報やメッセージをエンドユーザーに表示したりする場合に使用します。また、このイベント内で、レポートをエクスポートすることもできます。
以下のイベントは、セクションレポート処理中に何回も発生します。
複数回発生するイベント
新しいレコードを処理するたびに発生します。FetchDataイベントは、このイベントを続けて発生させるかどうかを示すEOFパラメータを持ちます。このパラメータは、レコードセットのEOFプロパティと同じではなく、デフォルトで「True」に設定されます。バウンドレポート(DataControlを使用するレポート)で作業している場合、EOFパラメータはレポートによって自動的に設定されます。しかし、アンバウンドレポートの場合は、このパラメータは手動で制御する必要があります。
このイベントは、アンバウンドレポートにおいて、DataInitializeイベントで定義したアンバウンドフィールドの値を設定する場合か、バウンドレポートにおいて、計算やフィールドの連結など、レコードから取得したデータに対し特別なデータ操作を行う場合に使用します。FetchDataイベント内で、レポート上のコントロールを直接操作してはいけません。
Detailセクション内のコントロールにデータセットの値を使用する必要がある場合は、FetchDataイベント内でアンバウンドフィールドなどの変数にデータセットの値を設定し、セクションのFormatイベント内で、この変数を使用してコントロールに値を設定します。FetchDataイベントで変数に値を設定し、これを使用してコントロールに値を設定するこの方法は、Detail_Formatイベント内でのみサポートされていることに注意してください。
また、配列、またはコレクションを操作する場合、カウンタのインクリメントはFetchDataイベントを使用してください。
ページが描画される前に発生します。このイベントを使用し、アンバウンドレポートを実行するときに各ページに必要な変数を初期化します。
レポート内の各ページが描画された後に発生します。このイベントを使用し、アンバウンドレポートを実行するときに各ページに必要な変数を更新します。
セクションの種類や内容にかかわらず、レポートの各セクションにはFormat、BeforePrint、AfterPrintの3つのイベントがあります。
セクションイベント
これらのイベントの発生順序は、集計オブジェクトとそのセクション従属関係に依存します。さまざまなレポートデザインが可能であるため、イベントが発生する順序は、個々のレポートの要求に合わせて動的に変化します。唯一の保証された発生順序は、セクションのFormatイベントがそのセクションのBeforePrintイベントの前に発生し、さらにBeforePrintイベントはそのセクションのAfterPrintイベントの前に発生することです。これらのイベントの発生順に頼るようなレポートの設計は行うべきではありません。
注意: これらのセクションイベント内で、FieldCollectionを参照することはできません。FieldCollectionは、DataInitializeイベント、もしくはFetchDataイベントで参照してください。
データがロードされてフィールドにバインドされた後、セクションが印刷用にレイアウトされる前に発生します。
Formatイベントは、セクションの高さを変更できる唯一のイベントです。このイベントを使用し、セクション、またはセクション内の任意のコントロールのプロパティを変更します。
また、Formatイベントを使用し、SQL文字列などの情報をサブレポートに渡します。
セクション、またはセクション上のコントロールに対して、CanGrowプロパティ、またはCanShrinkプロパティを「True」に設定した場合の処理がFormatイベント内で発生します。このため、Formatイベント内にコントロールまたはセクションの高さに関する情報を取得することはできません。
Formatイベントが完了するまでセクションの高さが不明なため、セクションのFormatイベントはセクションが描画されていないページ上にレポートがあるときに発生させることができます。たとえば、Detail_Formatイベントが発生しますが、セクションが大きすぎてページに入らない場合があります。これによって、現在のページ上にPageFooterイベントとPageEndイベントが発生し、次ページのキャンバスにセクションを描画される前にPageStart、任意の他のHeaderイベント、およびFetchDataイベント(可能な場合)が発生します。
セクションがページに描画される前に発生します。
セクションとコントロールの高さの変更(CanGrow、またはCanShrink)がすでに適用されています。したがって、このイベントを使用し、セクションとコントロールの正確な高さを取得することができます。BeforePrintイベントで、コントロールのサイズまたは値を変更できますが、セクション自体の高さは変更できません。
このイベントが発生したときレポートはセクションが描画されるページを認識しているため、このイベントを使用してページ固有の書式を設定します。セクションはこのイベントが発生した直後にキャンバスに描画されるため、このイベントが完了すると変更できません。
メモ: SubReportコントロールが1つ以上のページにわたっている場合、描画時により小さい部分に分割されます。この場合、BeforePrintイベントが、描画されたSubReportの各部分の高さを習得するために複数回発生します。
セクションがキャンバスオブジェクトに描画された後に発生します。
このイベントを使用し、キャンバスに直接描画できます。このイベントが発生する時点では、セクションはすでにキャンバスに描画されていますので、既に描画されているセクションに対して変更を加えることはできません。このイベントは、ページにテキストが描画された後でページにさらに描画を追加する場合に便利です。
ActiveReportsの高速な処理、および出力生成は、知性的なマルチスレッド、かつシングルパスの処理によって実現されています。ActiveReportsは、準備ができたページからただちに処理、および描画を行います。データ要素の一部が認識できない、レイアウトが完成していないなどの理由でActiveReportsがページの描画を完了できない場合は、必要なデータが揃うまで、このページはActiveReportsの内部のキャッシュに格納されます。
イベントの発生順
ページが完全に描画されない場合は、集計用テキストボックスとKeepTogetherプロパティの値による制約が原因です。集計用テキストボックスは、集計に必要な全データがデータソースから読み込まれるまで描画が完了しません。総計などの集計用テキストボックスが、レポートヘッダ内など、その完了レベルより前に置かれている場合は、全データが読み込まれるまで、レポートヘッダセクション、およびそれ以降の全セクションの描画は遅延されます。
セクションレポートのコードでは10個のイベント、スクリプトでは7個のイベントが提供されています。
セクションレポートでは、多様な方法でレポートをカスタマイズすることができます。レポートを実行すると、一般的には次のような処理が行われます。
以下のようなイベントは、レポートに対してデータがない時、またはユーザーの操作に応答する時に発生します。
その他のイベント
レポートのデータソースが変更されるときに発生します。 エンドユーザーデザイナを使用する際に便利です。
レポートのデータソースが何もデータを返さず、処理するデータがない場合に発生します。
ユーザーがクエリーパラメータダイアログを閉じた後に発生します。
ユーザーが印刷ジョブをキャンセルしたときに発生します。
レポートドキュメントの各ページがプリンタへ送信されるごとに発生します。