クリスタルレポート 動的にグループ化のキーを変更する方法
動的にグループ化の制御をする方法を示します。今回はデータベースにSQL ServerのサンプルとしてついてくるAdventureWorksを使用します。
SQL文は自作のものを使います。自作のSQL文を使うときのやり方は次のページに書いてあります。
最初レポートは、年月を表したYandMというフィールドでグループ化されています。そして、下記のサンプルプログラムで動的にグループ化を顧客番号でのものに変更します。
レポート自体は作成時にフォーマットが決まっているので、この機能の使い道としては、グループ化を変更することによって切り口を変えてみたい時に使うとよいのではないでしょうか。同じデータを見るために2つ別々にレポートを作るのも面倒ですので。 - SELECT [SalesOrderID]
- ,[OrderDate]
- ,[CustomerID]
- ,CONVERT(VARCHAR,YEAR([OrderDate])) + '/' + CONVERT(VARCHAR,MONTH([OrderDate])) AS [YandM]
- FROM [AdventureWorks].[Sales].[SalesOrderHeader] AS [SalesOrderHeader]
复制代码- using CrystalDecisions.CrystalReports.Engine;
- //レポート用変数の作成
- ReportDocument myDocument = new ReportDocument();
- this.openFileDialog1.InitialDirectory = Application.ExecutablePath;
- if (openFileDialog1.ShowDialog() == DialogResult.OK)
- {
- //レポートをメモリにロード
- myDocument.Load(this.openFileDialog1.FileName);
- if (MessageBox.Show("顧客番号でグループ化しますか?", "確認", MessageBoxButtons.YesNo) == DialogResult.Yes)
- {
- //新たにグループ化する為のキーとなるフィールドを取得する。
- //今回は自身で作成したSQL文を使用したため、テーブル名が全角の「コマンド」となっている。
- //自作の時は必ずこうしないといけないようだ。
- DatabaseFieldDefinition myField = myDocument.Database.Tables["コマンド"].Fields["CustomerID"];
- //グループ化のコレクションでループする
- foreach (Group myGroup in myDocument.DataDefinition.Groups)
- {
- //グループ化のフィールド名が「YandM」であるかどうか。
- if (myGroup.ConditionField.Name == "YandM")
- {
- //グループ化を「CustomerID」で行うように設定
- myGroup.ConditionField = myField;
- }
- }
- }
- this.crystalReportViewer1.ReportSource = myDocument;
- }
- }
复制代码 |