帳票レイアウトの作成
1.セクションの設定
Visual Studioのプロジェクトに「ActiveReports 3.0ファイル」を追加し、レポートデザイナで帳票のレイアウトを作成します。
前回と同様、detailセクションのアイコンをダブルクリックして、レポートデータソースにクエリを設定します。レポートデータソース設定の詳細については前回の記事を参照ください。
また、今回は取得したデータをグループ単位で集計・表示するために[グループヘッダ/フッタ]を設定します。右クリックメニューの[挿入]から「グループヘッダ/フッタ」を追加します。
今回の集計単位は、「注文月」と「注文日」「注文番号」の3つになるので、上位グループ(外側)から順に「注文月(OrderYear, OrderMonth)」「注文日(OrderDate)」「注文番号(OrderID)」単位のグループヘッダ/フッタを設定します。グループヘッダ/フッタを追加したら、それぞれキーになるデータソースの列名を、グループヘッダのDataFieldプロパティに設定します。このうち、注文月だけは「注文年+月」の単位で集計する必要があるため、DataFieldプロパティには計算式の=OrderYear*100 + OrderMonth
を入力します。
2.コントロールの追加
次に、ツールボックスからコントロールをドロップして、帳票レイアウトに貼り付けていきます。帳票タイトルなどの固定値表示や集計のないデータ項目表示はLabelコントロールとTextBoxコントロールのどちらを使用しても構いませんが、Labelは集計設定のためのSummaryプロパティを持たないため、集計値の表示欄にはTextBoxを使う必要があります。
3.集計項目のプロパティ設定
集計データを設定するためのSummaryプロパティには、以下の4つがあります(表1)。このうち、SummaryGroupはグループ単位で合計するときのみ使用する項目で、SubTotal/PageCountの場合に作用します。また、SummaryRunningはNoneに設定すると、値の初期化が行われません。
プロパティ名 | 内容 |
SummaryFunc | 集計関数の種類 |
SummaryGroup | どのグループを対象とするかの設定 |
SummaryRunning | 値の初期化のタイミング。None/Group/Allのいずれかを設定する |
SummaryType | 合計する単位。None/GrandTotal/PageTotal/SubTotal/PageCountのいずれかを設定する |
例えば、グループ単位で、合計値を表示したい場合は次のように設定します(合計単位とグループを設定してあるので、値の初期化はGROUPに設定する必要はありません)。
プロパティ名 | 設定値 |
SummaryFunc | Sum(合計関数) |
SummaryGroup | [集計したいグループ] |
SummaryRunning | None |
SummaryType | SubTotal(グループ単位の小計) |
DataField | [集計したい値] |
Summaryプロパティを使うと、アプリケーション側で集計値を加算していく処理や複雑なSQLの記述が不要になるだけでなく、グループヘッダに明細の合計値欄を配置させることもできます。
今回作成する帳票のコントロール設定
続いて、具体的に今回作成する帳票の集計値の設定について説明します。
A.ページ番号を表示する
帳票にページ番号を表示するには、SummaryTypeプロパティにSummaryType.PageCountを設定します。
ページ | プロパティ | 設定値 |
現在ページ | SummaryRunning | All |
SummaryType | PageCount | |
総ページ | SummaryRunning | None |
SummaryType | PageCount |
現在ページ番号と総ページ数の切り替えは、SummaryRunningプロパティの設定で行います。SummaryFuncは何を設定しても同じ値が表示されます。なお、グループごとにページ数を設定する場合や、2ページ目からページを数えたいなどの場合については、後ほど説明します。
B.総合計値を表示する
明細の全データを集計する場合は、SummaryType.GrandTotalを設定します。
C.グループごとの小計値を表示する。
前項で説明した集計項目のプロパティ設定例と同様に設定します。商品小計項目は次のように設定します。
プロパティ | 設定例 |
SummaryFunc | Sum |
SummaryGroup | [注文番号グループヘッダ] |
SummaryRunning | None |
SummaryType | SubTotal(グループ単位の小計) |
DataField | [Price] |
どのセクションでも小計の取得は可能ですが、位置によってはうまく合計されないこともあります。
特に、グループヘッダ/フッタを複数もつ帳票の場合、グループの順序に気をつけないと集計の単位が大きく変わってしまい、正しい集計結果を表示させることができません。今回はグループの順序が「注文日→注文番号→商品」の順序で入れ子構造になるようにグループを作成する必要があります。
グループの順序を確認・変更するには、右クリックメニューの[グループ順]を選択すると表示されるグループ順ダイアログで変更することができます。
D.重複を排除した小計値を表示する
宅配料金は注文ごとに発生するデータなので、明細単位ですべて合計するとデータが重複し、正しい値を得られなくなってしまいます。このような場合はSum関数の代わりに、Dsum関数を使用します。Dsum関数は、指定されたキー値をもとに重複を除いた値の合計を計算します。Dsum関数がキーとして使用する値は、DistinctDataFieldプロパティに設定します。
今回は宅配料金を注文番号(OrderID)ごとに集計したいので、Summaryプロパティを次のように設定します。
プロパティ | 設定値 |
SummaryFunc | DSum |
SummaryGroup | [注文月グループヘッダ] |
SummaryRunning | None |
SummaryType | SubTotal(グループ単位の小計) |
DistinctDataField | OrderID(注文番号) |
DataField | Freight(宅配料金) |