作成日: 2022/04/20 最終更新日: 2022/04/20
文書種別
使用方法
詳細
セクションレポートで以下のような集計処理を行っている場合、不正な結果になる可能性があります。
◆サンプルコード (C#)
// 集計用の変数を定義する private int intSum; private void SectionReport1_FetchData(object sender, FetchEventArgs eArgs) { if (eArgs.EOF) return; // 条件に該当する値を加算する if ((Boolean)this.Fields["sumFlg"].Value) { intSum += (int)this.Fields["amount"].Value; } } private void GroupFooter1_Format(object sender, EventArgs e) { // グループフッタのTextBoxに表示する this.textSum.Value = intSum; } private void GroupFooter1_AfterPrint(object sender, EventArgs e) { // 初期化 intSum = 0; }
◆サンプルコード (VB.NET)
' 集計用の変数を定義する Private intSum As Integer Private Sub SectionReport1_FetchData(sender As Object, eArgs As FetchEventArgs) Handles MyBase.FetchData If eArgs.EOF Then Exit Sub ' 条件に該当する値を加算する If DirectCast(Me.Fields("sumFlg").Value, Boolean) Then intSum += DirectCast(Me.Fields("amount").Value, Integer) End If End Sub Private Sub GroupFooter1_Format(sender As Object, e As EventArgs) Handles groupFooter1.Format ' グループフッタのTextBoxに表示する Me.textSum.Value = intSum End Sub Private Sub GroupFooter1_AfterPrint(sender As Object, e As EventArgs) Handles groupFooter1.AfterPrint ' 初期化 intSum = 0 End Sub
上記の処理は、グループに属するデータのFetchDataイベントがすべて完了した直後にグループフッタのFormatイベントが発生することを前提とした処理になっています。
しかしながら、FetchDataイベントの発生はセクションの出力と同期していません。
グループフッタのFormatイベントが発生する前に、次のグループに属するデータのFetchDataイベントが発生する可能性もあります。
このため、上記の処理で正しい集計結果が得られることは保証されません。
イベントの発生順序については、製品ヘルプの「よくある質問 > セクションレポート > イベント」をご参照ください。
コードで集計したい場合は、アンバウンドフィールドを使用し、DataInitializeイベントとFetchDataイベントのみで処理を行ってください。
具体的には以下のような方法が考えられます。
◆サンプルコード (C#)
using GrapeCity.ActiveReports.SectionReportModel; private void SectionReport1_DataInitialize(object sender, EventArgs e) { // アンバウンドフィールドを追加する this.Fields.Add("sum"); // 集計用のTextBoxに設定する this.textSum.DataField = "sum"; this.textSum.SummaryFunc = SummaryFunc.Sum; this.textSum.SummaryGroup = "groupHeader1"; this.textSum.SummaryRunning = SummaryRunning.Group; this.textSum.SummaryType = SummaryType.SubTotal; } private void SectionReport1_FetchData(object sender, FetchEventArgs eArgs) { if (eArgs.EOF) return; // 加算する値をアンバウンドフィールドにセットする if ((Boolean)this.Fields["sumFlg"].Value) { this.Fields["sum"].Value = (int)this.Fields["amount"].Value; } else { this.Fields["sum"].Value = 0; } }
◆サンプルコード (VB.NET)
Imports GrapeCity.ActiveReports.SectionReportModel Private Sub SectionReport1_DataInitialize(sender As Object, e As EventArgs) Handles MyBase.DataInitialize ' アンバウンドフィールドを追加する Me.Fields.Add("sum") ' 集計用のTextBoxに設定する Me.textSum.DataField = "sum" Me.textSum.SummaryFunc = SummaryFunc.Sum Me.textSum.SummaryGroup = "groupHeader1" Me.textSum.SummaryRunning = SummaryRunning.Group Me.textSum.SummaryType = SummaryType.SubTotal End Sub Private Sub SectionReport1_FetchData(sender As Object, eArgs As FetchEventArgs) Handles MyBase.FetchData If eArgs.EOF Then Exit Sub ' 加算する値をアンバウンドフィールドにセットする If DirectCast(Me.Fields("sumFlg").Value, Boolean) Then Me.Fields("sum").Value = DirectCast(Me.Fields("amount").Value, Integer) Else Me.Fields("sum").Value = 0 End If End Sub