SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(ActiveReports)

帳票Windowsアプリ実践構築ガイド
ActiveReports for .NETを使いこなす!

  • X ポスト
  • このエントリーをはてなブックマークに追加

レポートを定義する

サンプル帳票デザイン

 今回のサンプルプロジェクト「CZ0905Bound」では、図2のような帳票デザインを採用しています。帳票定義体のDataSourceにDataSetのテーブルを指定し、テキストボックスのDataFieldプロパティにカラム名を指定することで、自動的に各レコードの値を印字します。

 デザイン上の工夫としては、帳票デザイナ画面でActiveReportsテキストボックスコントロールが一目で分かるよう、Textプロパティには「[xxxxx]」のように角括弧で囲んだ文字を設定している事です。このような決め事をしておくと、デザインの打ち合わせ時などに、帳票デザイナ画面のハードコピーを印刷しておくだけで、動的に値が変わる部分が明確に確認でき、便利です。

図2:「CZ0905Bound」の帳票デザイン
図2:「CZ0905Bound」の帳票デザイン

 また、グループを追加して[Bill_GroupHeader]ヘッダと[Bill_GroupFooter]フッタを作成しています。このグループはBillNOが同一のときに同じグループになるように定義してあるので、[Detail]セクションに定義された「日付」「伝票NO」「区分」「製品名」「単価」「数量」「金額」は「BillNO」が同一のもの同士でグループ分けされ、印刷されます。

 各ページの先頭には[PageHeader]セクションの内容が印刷され、各ページの最後には[PageFooter]セクションの内容が印刷されます。

(1)[Bill_GroupHeader]ヘッダと[Bill_GroupFooter]フッタ

 グループヘッダのプロパティで重要なのは、どの項目でグループ化するかを表すDataFieldプロパティです。例えば、今回は請求書Noである「BillNo」でグループ化するので、表2のように設定しています。

表2:グループヘッダのプロパティ設定
プロパティ
DataField BillCondition.BillNo
NewPage None

 グループフッタのプロパティで重要なのは、別のグループに代わる直前に改ページするためのNewPageプロパティです。表3のように「After」と設定すれば、用紙の途中であっても、BillNoの値が異なるデータが来ると改ページします。

表3:グループフッタのプロパティ設定
プロパティ
NewPage After

(2)[txtTotal]テキストボックス

 [PageHeader]セクションに置かれた[txtTotal]テキストボックスは、請求書ごとの金額合計を印字するためのテキストボックスです。ActiveReportsのグループ合計機能を使うためには、次のようにプロパティを設定しています。

表4:グループ合計機能のためのプロパティ設定
プロパティ
DataField Price
DistinctField  
SummaryGroup Bill_GroupHeader
SummaryRunning None
SummaryType SubTotal

 このようにプロパティを設定することで、データソースに存在する[Price]列の値を[Bill_GroupHeader]ヘッダに割り当てられた項目値(この場合BillNo)グループごとに中計(SubTotal)して、表示します。なお、SummaryRunningプロパティの値を設定すると、ページヘッダで正しく合計が計算されないので、注意してください。

(3)[txtPage]テキストボックス

 [PageFooter]セクションに置かれた[txtPage]テキストボックスは、請求書ごとの通しページ番号を印字するためのテキストボックスです。ActiveReportsのページカウント機能を使うためには、次のようにプロパティを設定します。

表5:グループ通しページのためのプロパティ設定
プロパティ
DataField  
DistinctField  
SummaryGroup Bill_GroupHeader
SummaryRunning Group
SummaryType PageCount

 もし、グループごとの総ページ数が必要な場合は、次のようにプロパティを設定します。

表6:グループ総ページのためのプロパティ設定
プロパティ
DataField  
DistinctField  
SummaryGroup Bill_GroupHeader
SummaryRunning None
SummaryType PageCount

帳票定義体にコードを記述する

 WindowsフォームがSystem.Windows.Forms.Formクラスを継承したクラスであるのと同様に、ActiveReports帳票定義体はDataDynamics.ActiveReports.ActiveReport3クラスを継承したクラスです。よって、Windowsフォームの場合と同様、実行時の各種イベントに対してコードを組み込むことができます。

 「CZ0905Bound」サンプルプロジェクトに組み込んだコードはリスト1になります。

リスト1:Seikyu_Report.vb
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クリアのコードを移動すると良いでしょう。

 以上が、帳票定義体クラスの準備です。続いて、プレビュー表示部分について解説していきます。

次のページ
レポートをプレビュー表示する

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(ActiveReports)連載記事一覧

もっと読む

この記事の著者

初音玲(ハツネアキラ)

 国内SIerのSEでパッケージ製品開発を主に行っており、最近は、空間認識や音声認識などを応用した製品を手掛けています。 個人的には、仕事の内容をさらに拡張したHoloLensなどのMRを中心に活動しています。 Microsoft MVP for Windows Development ブログ:http://hatsune.hatenablog.jp/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3911 2009/05/14 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング