集計処理
TextBoxコントロールの集計処理について見てみましょう。
TextBoxコントロールの集計関連プロパティ(SummaryFunc、SummaryGroup、SummaryRunning、SummaryType)の設定によって、レポート上に集計値を表示することができます。具体的には、以下のような値を表示することができます。
- あるフィールドの値の全体の集計値(合計値、平均値など)
- あるフィールドの値のグループ内での集計値
- あるフィールドの値のそれまでのデータ行の累計値
- ページ数(現在のページ数、総ページ数)
これらを表示するために使用する各集計関連プロパティの役割は、以下のとおりです。
-
SummaryFuncプロパティ:どのような集計値を表示するかを設定します。デフォルトは「Sum」であり、加算合計値を表します。他にも「Avg」(平均)、「Count」(データの個数)、「Max」「Min」(最大値・最小値)などがあります。
-
SummaryGroupプロパティ:どのグループについて集計値を計算するかを設定します。そのレポートにあるグループヘッダ名を設定します。このプロパティは、SummaryTypeを「SubTotal」に設定した時のみ有効です。
-
SummaryRunningプロパティ:累積しながら集計値を出力するか、累積する場合にどのタイミングで集計をリセットするかを設定します。「None」「Group」「All」があり、「None」は累積せずに集計結果を得ます。「Group」ではグループごとの累計値が得られ、その集計はグループごとにリセットされます。「All」はリセットすることなく全体に対する累計値が得られます。
- SummaryTypeプロパティ:集計処理の動作を設定します。「None」では、集計を行いません(デフォルト)。「GrandTotal」では全体に対しての集計を行います。「PageTotal」はページごとの集計を行います。「SubTotal」はグループごとの集計を行います。「PageCount」はページ数の表示を行います。
なお、フィールドの値の集計を行うためには、そのTextBoxコントロールのDataFieldプロパティに、「集計したいフィールド」を設定しておく必要があります。今回のレポートでは「Price」フィールドを設定しています。
(1)ページ番号・総ページ数の表示
帳票にページ番号を表示するには、SummaryTypeプロパティに「PageCount」を設定します。ページ番号の表示の場合にはSummaryFuncプロパティは関係ありません。
プロパティ | 設定値 | |
---|---|---|
現在のページ番号 | SummaryRunning | All |
SummaryType | PageCount | |
総ページ数 | SummaryRunning | None |
SummaryType | PageCount |
なお、セクションレポートには「ReportInfo」というコントロールが用意されております。今回は集計機能の解説のためにTextBoxを使用しておりますが、ページ番号を表示するだけであればReportInfoコントロールを使用する方が簡単に実現できます。ご使用ください。
(2)総計の表示
明細の全データを集計する場合は、SummaryTypeプロパティに「GrandTotal」を設定します。
プロパティ | 設定値 | |
---|---|---|
前データの集計 |
SummaryFunc | Sum |
SummaryGroup | (なし) | |
SummaryRunning | None | |
SummaryType | GrandTotal |
(3)グループごとの小計値の表示
グループごとの小計項目は、以下のように設定します。
TextBox | プロパティ | 値 |
---|---|---|
注文番号ごとの小計 | SummaryFunc | Sum |
SummaryGroup | 「注文番号」のグループヘッダ | |
SummaryRunning | None | |
SummaryType | SubTotal | |
注文日付ごとの小計 | SummaryFunc | Sum |
SummaryGroup | 「注文日付」のグループヘッダ | |
SummaryRunning | None | |
SummaryType | SubTotal |
今回の例では小計を表示するTextBoxコントロールはグループフッタに配置しています。これは一般的な配置ですが、SummaryRunningプロパティが「None」の場合は、グループ内のセクションならばどこに置いても同じ値が得られます。グループヘッダやDetailセクションに配置しても構いません。
ページヘッダに項目タイトル用のLabelコントロールを配置するなどしてレポートの体裁を整えたら、デザイナの「プレビュータブ」などを使用して、レポートを表示させてください。一日に複数の注文がある日(例:1994/8/8)のグループフッタには、その日の合計値が表示されているのが確認できます。
データフィールドをTextBoxコントロールにバウンドする(DataFieldプロパティにフィールド名を設定する)と、そのフィールドの値がTextBoxコントロールに表示されます。デフォルトではToString()で得られる文字列が表示されます。
ただしそのままでは要件を満たせない場合があります。例えば日付/時刻型データの場合、デフォルトでは「1994/04/01 0:00:00」のように時刻まで文字列化されてしまいます。日付だけが欲しい場合にはこのままでは使えません。
このように出力する書式を設定したい時のために、TextBoxコントロールやLabelコントロールには「OutputFormat」プロパティが用意されています。このプロパティには、.NET FrameworkのString.Formatメソッドと同じ書式が使用できます。直接書式文字列を記述することもできますが、プロパティウィンドウから「出力書式の設定」ダイアログが出るので、それを利用すると便利です。
累計値の表示
レポートの要件によっては「それまでの累計値を表示したい」という場合があります。この場合もTextBoxコントロールの集計機能が有効です。
累計値を表示するレポートを作ってみましょう。先程と同じデータベースから、以下のSQLで「注文日付および注文番号ごとの金額」(フィールド名:Price)を取得します。
SELECT Orders.OrderDate, Orders.OrderID, Sum(Round(Round([Order Details].UnitPrice,0) * [Order Details].[Quantity] * (1 - [Order Details].[Discount]), 0)) AS Price FROM Orders INNER JOIN (Products INNER JOIN [Order Details] ON Products.ProductID = [Order Details].ProductID) ON Orders.OrderID = [Order Details].OrderID GROUP BY Orders.OrderDate, Orders.OrderID ORDER BY Orders.OrderDate, Orders.OrderID;
このデータから「それまでの金額の累計」を表示するレポートを作成します。
まず、グループヘッダ/フッタを1つ追加し、そのグループヘッダのDataFieldプロパティに「OrderDate(注文日付)」を、UnderlayNextプロパティにTrueを設定します。
次に、詳細(Detail)セクション上に「注文番号」を表示するためのTextBoxコントロール(DataFieldプロパティ=「OrderID」)と「金額」を表示するためのTextBoxコントロール(DataFieldプロパティ=「Price」)を配置します。さらに「グループ内累計」「全体累計」を表示するTextBoxコントロールを配置します。これらの2つのTextBoxコントロールのプロパティは、以下のように設定します。
TextBox | プロパティ | 設定値 |
---|---|---|
グループ内累計 | SummaryFunc | Sum |
SummaryGroup | グループヘッダ | |
SummaryRunning | Group | |
SummaryType | SubTotal | |
全体累計 | SummaryFunc | Sum |
SummaryGroup | (なし) | |
SummaryRunning | All | |
SummaryType | GrandTotal |
前述の「注文表」における「グループ内小計」「全体合計」との違いは、SummaryRunningプロパティがNoneではない点です。
最後に、ページヘッダに項目タイトル用のLabelコントロールを配置したり、グループヘッダ上にLineコントロールを配置するなどして、レポートの体裁を整えます。
このレポートをプレビュー表示すると、以下のような結果になります。
このレポートは「注文日付(OrderDate)」ごとにグループ化されており、罫線で区切られている部分が1つのグループになります。
1注文日付あたり1注文というデータがほとんどですが、「注文日付=1994/8/8」というグループには、2つ注文が存在することが確認できます。
このグループの「グループ内累計」をご覧ください。最初の注文の「金額」が1546なので、「グループ内累計」も同じ1546になります。2つ目の注文の「金額」が665なので、「グループ内累計」は2211(1546+665)となっているのが確認できます。
一方、「全体累計」は、レポート全体の累計になります。最初の注文の「金額」が40250なので、最初の「全体累計」もそれと同じ数値になります。次の注文の「金額」が443なので、その行の「全体累計」は40693(40250+443)です。それ以降の行についても「金額」の分だけ累積した値が「全体累計」に表示されているのが確認できます。