レポートを定義する
サンプル帳票デザイン
今回のサンプルプロジェクト「CZ0905Bound」では、図2のような帳票デザインを採用しています。帳票定義体のDataSourceにDataSetのテーブルを指定し、テキストボックスのDataFieldプロパティにカラム名を指定することで、自動的に各レコードの値を印字します。
デザイン上の工夫としては、帳票デザイナ画面でActiveReportsテキストボックスコントロールが一目で分かるよう、Textプロパティには「[xxxxx]
」のように角括弧で囲んだ文字を設定している事です。このような決め事をしておくと、デザインの打ち合わせ時などに、帳票デザイナ画面のハードコピーを印刷しておくだけで、動的に値が変わる部分が明確に確認でき、便利です。
また、グループを追加して[Bill_GroupHeader]ヘッダと[Bill_GroupFooter]フッタを作成しています。このグループはBillNOが同一のときに同じグループになるように定義してあるので、[Detail]セクションに定義された「日付」「伝票NO」「区分」「製品名」「単価」「数量」「金額」は「BillNO」が同一のもの同士でグループ分けされ、印刷されます。
各ページの先頭には[PageHeader]セクションの内容が印刷され、各ページの最後には[PageFooter]セクションの内容が印刷されます。
(1)[Bill_GroupHeader]ヘッダと[Bill_GroupFooter]フッタ
グループヘッダのプロパティで重要なのは、どの項目でグループ化するかを表すDataFieldプロパティです。例えば、今回は請求書Noである「BillNo」でグループ化するので、表2のように設定しています。
プロパティ | 値 |
---|---|
DataField | BillCondition.BillNo |
NewPage | None |
グループフッタのプロパティで重要なのは、別のグループに代わる直前に改ページするためのNewPageプロパティです。表3のように「After」と設定すれば、用紙の途中であっても、BillNoの値が異なるデータが来ると改ページします。
プロパティ | 値 |
---|---|
NewPage | After |
(2)[txtTotal]テキストボックス
[PageHeader]セクションに置かれた[txtTotal]テキストボックスは、請求書ごとの金額合計を印字するためのテキストボックスです。ActiveReportsのグループ合計機能を使うためには、次のようにプロパティを設定しています。
プロパティ | 値 |
---|---|
DataField | Price |
DistinctField | |
SummaryGroup | Bill_GroupHeader |
SummaryRunning | None |
SummaryType | SubTotal |
このようにプロパティを設定することで、データソースに存在する[Price]列の値を[Bill_GroupHeader]ヘッダに割り当てられた項目値(この場合BillNo)グループごとに中計(SubTotal)して、表示します。なお、SummaryRunningプロパティの値を設定すると、ページヘッダで正しく合計が計算されないので、注意してください。
(3)[txtPage]テキストボックス
[PageFooter]セクションに置かれた[txtPage]テキストボックスは、請求書ごとの通しページ番号を印字するためのテキストボックスです。ActiveReportsのページカウント機能を使うためには、次のようにプロパティを設定します。
プロパティ | 値 |
---|---|
DataField | |
DistinctField | |
SummaryGroup | Bill_GroupHeader |
SummaryRunning | Group |
SummaryType | PageCount |
もし、グループごとの総ページ数が必要な場合は、次のようにプロパティを設定します。
プロパティ | 値 |
---|---|
DataField | |
DistinctField | |
SummaryGroup | Bill_GroupHeader |
SummaryRunning | None |
SummaryType | PageCount |
帳票定義体にコードを記述する
WindowsフォームがSystem.Windows.Forms.Formクラスを継承したクラスであるのと同様に、ActiveReports帳票定義体はDataDynamics.ActiveReports.ActiveReport3クラスを継承したクラスです。よって、Windowsフォームの場合と同様、実行時の各種イベントに対してコードを組み込むことができます。
「CZ0905Bound」サンプルプロジェクトに組み込んだコードはリスト1になります。
Public Class Seikyu_Report Private m_Row As Integer Private Sub PageHeader_BeforePrint(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles PageHeader.BeforePrint '集計値を参照して、別のField コントロールに値を設定します。 txtExcise.Value = CType(txtTotal.Value, Decimal) * 0.05 '消費税額 txtBillTotal.Value = CType(txtTotal.Value, Decimal) * 1.05 + _ CType(txtCarryOver.Value, Decimal) '請求額合計 End Sub Private Sub GroupHeader1_BeforePrint(ByVal sender As Object, _ ByVal e As System.EventArgs) _ Handles Bill_GroupHeader.BeforePrint m_Row = 0 End Sub Private Sub Detail_Format(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Detail.Format '行番号をインクリメントします。 m_Row = m_Row + 1 '1行ごとに背景色を切り替えます。 If (m_Row Mod 2) = 0 Then shpDetailBack1.BackColor = Color.White '白色 Else shpDetailBack1.BackColor = Color.LightYellow '黄色 End If End Sub End Class
(1)ページヘッダで計算結果を印字する
PageHeader.BeforePrintイベントで、[PageHeader]セクションにある「今回消費税額」と「今回ご請求額」を計算しています。BeforePrintイベントで処理する事で、印字内容に介入できます。
(2)一覧部分の背景色を交互に切り替える
[Detail]セクションの背景色を交互に切り替えるために、Detail.Formatイベントで背景色を設定しています。背景色の判断はグループごとの現在行の行位置が奇数か偶数かで行っているため、Bill_GroupHeader.BeforePrintイベントで行数を0にクリアしています。
もし、行数のカウントがページごとでよければ、PageHeader.BeforePrintイベントに0クリアのコードを移動すると良いでしょう。
以上が、帳票定義体クラスの準備です。続いて、プレビュー表示部分について解説していきます。