次の方法で共有


レッスン 8: データ フィルターを作成する

親レポートにドリルスルー アクションを追加した後は、子レポート用に定義したデータ テーブル用のデータ フィルターを作成します。

詳細レポートに対しては、テーブルベースのフィルターまたはクエリ フィルターを作成できます。 このレッスンでは、両方のオプションの手順を説明します。

テーブルベースのフィルター

テーブルベースのフィルターを実装するには、次の操作を実行する必要があります。

  • 子レポートの Tablix にフィルター式を追加します。

  • PurchaseOrderDetail テーブルからフィルター選択されていないデータを選択する関数を作成します。

  • 子レポートに PurchaseOrderDetail DataTable をバインドするイベント ハンドラーを追加します。

子レポートの Tablix にフィルター式を追加するには

  1. 子レポートを開きます。

  2. Tablix の列見出しを選択します。列見出しの上の灰色のセルを右クリックし、[Tablix のプロパティ] をクリックします。

  3. [フィルター] ページをクリックし、[追加] をクリックします。

  4. [式] フィールドで、一覧から [ProductID] をクリックします。 これは、フィルターを適用する列です。

  5. [演算子] ボックスの一覧で、等号演算子 ([=]) をクリックします。

  6. [値] フィールドの横の式ボタンをクリックします。[カテゴリ] 領域の [パラメーター] をクリックし、[値] 領域の [productid] をダブルクリックします。 [式の設定: 値] フィールドに、=Parameters!productid.Value のような式が表示されます。

  7. [OK] をクリックします。[Tablix のプロパティ] ダイアログ ボックスで再び [OK] をクリックします。

  8. .rdlc ファイルを保存します。

PurchaseOrderDetail テーブルからフィルター選択されていないデータを選択する関数を作成するには

  1. ソリューション エクスプローラーで、Default.aspx を展開し、Default.aspx.cs をダブルクリックします。

  2. 新しい関数を作成します。この関数は、Integer 型の productid パラメーターを受け取った後、datatable オブジェクトを返し、次の操作を行います。

    1. レッスン 4: 子レポートのデータ接続とデータ テーブルを定義する」の手順 2. で作成した DataSet2 データセットのインスタンスを作成します。

    2. SqlServer データベースへの接続を作成し、「レッスン 4: 子レポートのデータ接続とデータ テーブルを定義する」で定義されたクエリを実行します。

    3. クエリにより、フィルター選択されていないデータが返されます。

    4. クエリを実行して、フィルター選択されていないデータを DataSet インスタンスに入力します。

    5. 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 をバインドするイベント ハンドラーを追加するには

  1. Default.aspx を開きます。

  2. ReportViewer コントロールを右クリックし、[プロパティ] をクリックします。

  3. [プロパティ] ページで、[イベント] アイコンをクリックします。

  4. [ドリルスルー] イベントをダブルクリックします。

    次に示すブロックに似たイベント ハンドラー セクションがコードに追加されます。

        protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e)
        {
        }
    
  5. イベント ハンドラーを完成させます。 このイベント ハンドラーには、次の機能を含めます。

    1. DrillthroughEventArgs パラメーターから子レポート オブジェクト参照をフェッチする。

    2. GetPurchaseOrderDetail 関数を呼び出す。

    3. 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);
              }
          }
      
  6. このファイルを保存します。

クエリ フィルター

クエリ フィルターを実装するには、次の操作を実行する必要があります。

  • PurchaseOrderDetail テーブルからフィルター選択されたデータを選択する関数を作成します。

  • パラメーター値を取得し、PurchaseOrderDetail DataTable を子レポートにバインドするイベント ハンドラーを追加します。

PurchaseOrderDetail テーブルからフィルター選択されたデータを選択する関数を作成するには

  1. ソリューション エクスプローラーで、Default.aspx を展開し、Default.aspx.cs をダブルクリックします。

  2. 新しい関数を作成します。この関数は、Integer 型の productid パラメーターを受け取った後、datatable オブジェクトを返し、次の操作を行います。

    1. レッスン 4: 子レポートのデータ接続とデータ テーブルを定義する」の手順 2. で作成した DataSet2 データセットのインスタンスを作成します。

    2. SqlServer データベースへの接続を作成し、「レッスン 4: 子レポートのデータ接続とデータ テーブルを定義する」で定義したクエリを実行します。

    3. このクエリには、返されるデータを親レポートで選択された ProductID に基づいてフィルター選択するための productid パラメーターが含まれます。

    4. クエリを実行して、フィルター選択されたデータを DataSet インスタンスに入力します。

    5. 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 を子レポートにバインドするイベント ハンドラーを追加するには

  1. Default.aspx を開きます。

  2. ReportViewer コントロールを右クリックし、[プロパティ] をクリックします。

  3. [プロパティ] ペインで、[イベント] アイコンをクリックします。

  4. [ドリルスルー] イベントをダブルクリックします。

    次のようなイベント ハンドラー セクションがコードに追加されます。

        protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e)
        {
        }
    
  5. イベント ハンドラーを完成させます。 このイベント ハンドラーには、次の機能を含めます。

    1. DrillthroughEventArgs パラメーターから子レポート オブジェクト参照をフェッチする。

    2. フェッチした子レポート オブジェクトから子レポート パラメーター リストを取得する。

    3. パラメーターのコレクションに対して反復処理を行い、親レポートから渡された ProductID パラメーターの値を取得する。

    4. GetPurchaseOrderDetail 関数を呼び出し、ProductID パラメーターの値を渡す。

    5. 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);
              }
          }
      
  6. このファイルを保存します。

次の作業

これで、子レポートに対して定義したデータ テーブルのデータ フィルターを作成できました。 次は、Web サイト アプリケーションをビルドして実行します。 「レッスン 9: アプリケーションをビルドして実行する」を参照してください。