レッスン 8: データ フィルターを作成する
親レポートにドリルスルー アクションを追加した後は、子レポート用に定義したデータ テーブル用のデータ フィルターを作成します。
詳細レポートに対しては、テーブルベースのフィルターまたはクエリ フィルターを作成できます。 このレッスンでは、両方のオプションの手順を説明します。
テーブルベースのフィルター
テーブルベースのフィルターを実装するには、次の操作を実行する必要があります。
子レポートの Tablix にフィルター式を追加します。
PurchaseOrderDetail テーブルからフィルター選択されていないデータを選択する関数を作成します。
子レポートに PurchaseOrderDetail DataTable をバインドするイベント ハンドラーを追加します。
子レポートの Tablix にフィルター式を追加するには
子レポートを開きます。
Tablix の列見出しを選択します。列見出しの上の灰色のセルを右クリックし、[Tablix のプロパティ] をクリックします。
[フィルター] ページをクリックし、[追加] をクリックします。
[式] フィールドで、一覧から [ProductID] をクリックします。 これは、フィルターを適用する列です。
[演算子] ボックスの一覧で、等号演算子 ([=]) をクリックします。
[値] フィールドの横の式ボタンをクリックします。[カテゴリ] 領域の [パラメーター] をクリックし、[値] 領域の [productid] をダブルクリックします。 [式の設定: 値] フィールドに、=Parameters!productid.Value のような式が表示されます。
[OK] をクリックします。[Tablix のプロパティ] ダイアログ ボックスで再び [OK] をクリックします。
.rdlc ファイルを保存します。
PurchaseOrderDetail テーブルからフィルター選択されていないデータを選択する関数を作成するには
ソリューション エクスプローラーで、Default.aspx を展開し、Default.aspx.cs をダブルクリックします。
新しい関数を作成します。この関数は、Integer 型の productid パラメーターを受け取った後、datatable オブジェクトを返し、次の操作を行います。
「レッスン 4: 子レポートのデータ接続とデータ テーブルを定義する」の手順 2. で作成した DataSet2 データセットのインスタンスを作成します。
SqlServer データベースへの接続を作成し、「レッスン 4: 子レポートのデータ接続とデータ テーブルを定義する」で定義されたクエリを実行します。
クエリにより、フィルター選択されていないデータが返されます。
クエリを実行して、フィルター選択されていないデータを DataSet インスタンスに入力します。
PurchaseOrderDetail DataTable を返します。
関数は次のようになります (これは単なる参考です。 任意のパターンに従って、子レポートに必要なデータをフェッチできます)。
System.Data 名前空間および System.Data.SqlClient 名前空間への参照を必ず含めてください。
/// <summary> /// Function to query PurchaseOrderDetail table, fetch the /// unfiltered data and bind it with the Child report /// </summary> /// <returns>A dataTable of type PurchaseOrderDetail</returns> private DataTable GetPurchaseOrderDetail() { try { //Create the instance for the typed dataset, DataSet2 which will //hold the [PurchaseOrderDetail] table details. //The dataset was created as part of the tutorial in Step 4. DataSet2 ds = new DataSet2(); //Create a SQL Connection to the AdventureWorks2008 database using Windows Authentication. using (SqlConnection sqlconn = new SqlConnection("Data Source=.;Initial Catalog=Adventureworks;Integrated Security=SSPI")) { //Building the dynamic query with the parameter ProductID. SqlDataAdapter adap = new SqlDataAdapter("SELECT PurchaseOrderID, PurchaseOrderDetailID, OrderQty, ProductID, ReceivedQty, RejectedQty, StockedQty FROM Purchasing.PurchaseOrderDetail ", sqlconn); //Executing the QUERY and fill the dataset with the PurchaseOrderDetail table data. adap.Fill(ds, "PurchaseOrderDetail"); } //Return the PurchaseOrderDetail table for the Report Data Source. return ds.PurchaseOrderDetail; } catch { throw; } }
子レポートに PurchaseOrderDetail DataTable をバインドするイベント ハンドラーを追加するには
Default.aspx を開きます。
ReportViewer コントロールを右クリックし、[プロパティ] をクリックします。
[プロパティ] ページで、[イベント] アイコンをクリックします。
[ドリルスルー] イベントをダブルクリックします。
次に示すブロックに似たイベント ハンドラー セクションがコードに追加されます。
protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e) { }
イベント ハンドラーを完成させます。 このイベント ハンドラーには、次の機能を含めます。
DrillthroughEventArgs パラメーターから子レポート オブジェクト参照をフェッチする。
GetPurchaseOrderDetail 関数を呼び出す。
PurchaseOrderDetail DataTable をレポートの対応するデータ ソースにバインドする。
完成したイベント ハンドラーのコードは、次のようになります。
Microsoft.Reporting.WebForms 名前空間への参照を必ず含めてください。
protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e) { try { //Get the instance of the Target report, in our case the JumpReport.rdlc. LocalReport report = (LocalReport)e.Report; //Binding the DataTable to the Child report dataset. //The name DataSet1 which can be located from, //Go to Design view of Child.rdlc, Click View menu -> Report Data //You'll see this name under DataSet2. report.DataSources.Add(new ReportDataSource("DataSet1", GetPurchaseOrderDetail())); } catch (Exception ex) { Response.Write(ex.Message); } }
このファイルを保存します。
クエリ フィルター
クエリ フィルターを実装するには、次の操作を実行する必要があります。
PurchaseOrderDetail テーブルからフィルター選択されたデータを選択する関数を作成します。
パラメーター値を取得し、PurchaseOrderDetail DataTable を子レポートにバインドするイベント ハンドラーを追加します。
PurchaseOrderDetail テーブルからフィルター選択されたデータを選択する関数を作成するには
ソリューション エクスプローラーで、Default.aspx を展開し、Default.aspx.cs をダブルクリックします。
新しい関数を作成します。この関数は、Integer 型の productid パラメーターを受け取った後、datatable オブジェクトを返し、次の操作を行います。
「レッスン 4: 子レポートのデータ接続とデータ テーブルを定義する」の手順 2. で作成した DataSet2 データセットのインスタンスを作成します。
SqlServer データベースへの接続を作成し、「レッスン 4: 子レポートのデータ接続とデータ テーブルを定義する」で定義したクエリを実行します。
このクエリには、返されるデータを親レポートで選択された ProductID に基づいてフィルター選択するための productid パラメーターが含まれます。
クエリを実行して、フィルター選択されたデータを DataSet インスタンスに入力します。
PurchaseOrderDetail DataTable を返します。
関数は次のようになります (これは単なる参考です。 任意のパターンに従って、子レポートに必要なデータをフェッチできます)。
System.Data 名前空間および System.Data.SqlClient 名前空間への参照を必ず含めてください。
/// <summary> /// Function to query PurchaseOrderDetail table and filter the /// data for a specific ProductID selected in the Parent report. /// </summary> /// <param name="productid">Parameter passed from the Parent report to filter data.</param> /// <returns>A dataTable of type PurchaseOrderDetail</returns> private DataTable GetPurchaseOrderDetail(int productid) { try { //Create the instance for the typed dataset, DataSet2 which will //hold the [PurchaseOrderDetail] table details. //The dataset was created as part of the tutorial in Step 4. DataSet2 ds = new DataSet2(); //Create a SQL Connection to the AdventureWorks2008 database using Windows Authentication. using (SqlConnection sqlconn = new SqlConnection("Data Source=.;Initial Catalog=Adventureworks;Integrated Security=SSPI")) { //Building the dynamic query with the parameter ProductID. SqlDataAdapter adap = new SqlDataAdapter("SELECT PurchaseOrderID, PurchaseOrderDetailID, OrderQty, ProductID, ReceivedQty, RejectedQty, StockedQty FROM Purchasing.PurchaseOrderDetail where ProductID = " + productid, sqlconn); //Executing the QUERY and fill the dataset with the PurchaseOrderDetail table data. adap.Fill(ds, "PurchaseOrderDetail"); } //Return the PurchaseOrderDetail table for the Report Data Source. return ds.PurchaseOrderDetail; } catch { throw; } }
パラメーター値を取得し、PurchaseOrderDetail DataTable を子レポートにバインドするイベント ハンドラーを追加するには
Default.aspx を開きます。
ReportViewer コントロールを右クリックし、[プロパティ] をクリックします。
[プロパティ] ペインで、[イベント] アイコンをクリックします。
[ドリルスルー] イベントをダブルクリックします。
次のようなイベント ハンドラー セクションがコードに追加されます。
protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e) { }
イベント ハンドラーを完成させます。 このイベント ハンドラーには、次の機能を含めます。
DrillthroughEventArgs パラメーターから子レポート オブジェクト参照をフェッチする。
フェッチした子レポート オブジェクトから子レポート パラメーター リストを取得する。
パラメーターのコレクションに対して反復処理を行い、親レポートから渡された ProductID パラメーターの値を取得する。
GetPurchaseOrderDetail 関数を呼び出し、ProductID パラメーターの値を渡す。
PurchaseOrderDetail DataTable をレポートの対応するデータ ソースにバインドする。
完成したイベント ハンドラーのコードは、次のようになります。
Microsoft.Reporting.WebForms 名前空間への参照を必ず含めてください。
protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e) { try { //Variable to store the parameter value passed from the MainReport. int productid = 0; //Get the instance of the Target report, in our case the JumpReport.rdlc. LocalReport report = (LocalReport)e.Report; //Get all the parameters passed from the main report to the target report. //OriginalParametersToDrillthrough actually returns a Generic list of //type ReportParameter. IList<ReportParameter> list = report.OriginalParametersToDrillthrough; //Parse through each parameters to fetch the values passed along with them. foreach (ReportParameter param in list) { //Since we know the report has only one parameter and it is not a multivalued, //we can directly fetch the first value from the Values array. productid = Convert.ToInt32(param.Values[0].ToString()); } //Binding the DataTable to the Child report dataset. //The name DataSet1 which can be located from, //Go to Design view of Child.rdlc, Click View menu -> Report Data //You'll see this name under DataSet2. report.DataSources.Add(new ReportDataSource("DataSet1", GetPurchaseOrderDetail(productid))); } catch (Exception ex) { Response.Write(ex.Message); } }
このファイルを保存します。
次の作業
これで、子レポートに対して定義したデータ テーブルのデータ フィルターを作成できました。 次は、Web サイト アプリケーションをビルドして実行します。 「レッスン 9: アプリケーションをビルドして実行する」を参照してください。