作成日: 2019/06/04 最終更新日: 2019/06/04
文書種別
使用方法
詳細
セクションレポートで以下のような集計処理を行っている場合、不正な結果になる可能性があります。
◆サンプルコード(VB.NET)
◆サンプルコード(C#)
上記の処理は、グループに属するデータのFetchDataイベントがすべて完了した直後にグループフッタのFormatイベントが発生することを前提とした処理になっています。
しかしながら、FetchDataイベントの発生はセクションの出力と同期していません。
グループフッタのFormatイベントが発生する前に、次のグループに属するデータのFetchDataイベントが発生する可能性もあります。
このため、上記の処理で正しい集計結果が得られることは保証されません。
イベントの発生順序については、製品ヘルプの「よくある質問 > セクションレポート > イベント」をご参照ください。
コードで集計したい場合は、アンバウンドフィールドを使用し、DataInitializeイベントとFetchDataイベントのみで処理を行ってください。
具体的には以下のような方法が考えられます。
◆サンプルコード(VB.NET)
◆サンプルコード(C#)
◆サンプルコード(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
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
◆サンプルコード(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;
}
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;
}
上記の処理は、グループに属するデータのFetchDataイベントがすべて完了した直後にグループフッタのFormatイベントが発生することを前提とした処理になっています。
しかしながら、FetchDataイベントの発生はセクションの出力と同期していません。
グループフッタのFormatイベントが発生する前に、次のグループに属するデータのFetchDataイベントが発生する可能性もあります。
このため、上記の処理で正しい集計結果が得られることは保証されません。
イベントの発生順序については、製品ヘルプの「よくある質問 > セクションレポート > イベント」をご参照ください。
コードで集計したい場合は、アンバウンドフィールドを使用し、DataInitializeイベントとFetchDataイベントのみで処理を行ってください。
具体的には以下のような方法が考えられます。
◆サンプルコード(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
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
◆サンプルコード(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;
}
}
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;
}
}
関連情報
旧文書番号
84030