(.Net)AcriveReportsで行ごと、列ごと、全体の集計をしたい
今回出したいレポートは下記のよう感じです。
青枠で囲っているところが、バインドする DataTable に入っている値です。
赤枠の部分を ActiveReports 側で集計させます。
デザイナでの配置は下記のような感じです。
データは下記のように作成しています。(レポート作成部分です)
Dim frm As New frmReport() 'レポート結果表示するフォームDim dtbl_age As New DataTable() 'レポートにバインドするデータ
Dim cl_age1 As New DataColumn("RowTitle")
Dim cl_age2 As New DataColumn("MaleNum", Type.GetType("System.Int32"))
Dim cl_age3 As New DataColumn("WomanNum", Type.GetType("System.Int32"))
Dim cl_age4 As New DataColumn("OtherNum", Type.GetType("System.Int32"))
dtbl_age.Columns.Add(cl_age1)
dtbl_age.Columns.Add(cl_age2)
dtbl_age.Columns.Add(cl_age3)
dtbl_age.Columns.Add(cl_age4)
'テストデータ作成
For i As Integer = 0 To 4
Dim row_age As DataRow = dtbl_age.NewRow()
row_age("RowTitle") = i.ToString() + "行目"
row_age("MaleNum") = i
row_age("WomanNum") = i + 1
row_age("OtherNum") = 1
dtbl_age.Rows.Add(row_age)
Next
レポート作成
Dim rpt_age As New AgeDistributionReport()
rpt_age.DataSource = dtbl_age
rpt_age.Run()
frm.Viewer.Document = rpt_age.Document
frm.Show()
最初は各行の合計を DataField で "= 列1のDataField + 列2のDataField + 列3DataField " という感じでやっていたのですが、これだと合計の合計(一番右下)が出せません。
ということで、下記のように新しい total というフィールドを作成し、1行フェッチするたびに、行の合計を total フィールドに格納するようにしました。
'''
''' 初期化
'''
Private Sub rptSummary_DataInitialize(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.DataInitialize
'total フィールド追加
Me.Fields.Add("total")
End Sub
'''
''' データをフェッチしたとき
'''
Private Sub rptSummary_FetchData(ByVal sender As Object, ByVal eArgs As DataDynamics.ActiveReports.ActiveReport3.FetchEventArgs) Handles MyBase.FetchData
'合計フィールドに1行の各列の合計値を格納
Me.Fields("total").Value = Me.Fields("MaleNum").Value + Me.Fields("WomanNum").Value + Me.Fields("OtherNum").Value
End Sub
また、最下行の合計行(これはグループセクションを使用)はそれぞれの DataField プロパティに下記のように設定し集計を指定します。
男の合計表示 → MaleNum
女の合計表示 → WomanNum
その他合計表示 → OtherNum
合計の合計表示 → total
なお、上記の4つともサマリーに関するプロパティは下記の通りです。
SummaryGroupu: GroupHeader1
SummaryRunning: Group
SummaryType: SubTotal