Lezione 8: Creare un filtro di datiLesson 8: Create a Data Filter

Dopo aver aggiunto un'azione drill-through nel report padre, il passaggio successivo consiste nel creare un filtro di dati per la tabella di dati definita per il report figlio.After you add a drillthrough action on the parent report, your next step is to create a data filter for the data table that you defined for the child report.

È possibile creare un filtro basato su tabella o un filtro query per il report drill-through.You can create a table-based filter or a query filter for the drillthrough report. In questa lezione vengono fornite le istruzioni per entrambe le opzioni.This lesson provides instructions for both options.

Filtro basato su tabellaTable-Based Filter

È necessario completare le attività seguenti per implementare un filtro basato su tabella.You need to complete the following tasks to implement a table-based filter.

  • Aggiungere un'espressione di filtro alla Tablix nel report figlio.Add a filter expression to the tablix in the child report.

  • Creare una funzione con la quale vengono selezionati i dati non filtrati dalla tabella PurchaseOrderDetail .Create a function that selects unfiltered data from the PurchaseOrderDetail table.

  • Aggiungere un gestore eventi con il quale viene associato l'oggetto DataTable di PurchaseOrderDetail al report figlio.Add an event handler that binds the PurchaseOrderDetail DataTable to the child report.

Per aggiungere un'espressione di filtro alla Tablix nel report figlioTo add a filter expression to the tablix in the child report

  1. Aprire il report figlio.Open the child report.

  2. Selezionare un'intestazione di colonna nella Tablix, fare clic con il pulsante destro del mouse sulla cella grigia visualizzata sopra l'intestazione di colonna e scegliere Proprietà Tablix.Select a column heading in the tablix, right-click the gray cell that appears above the column heading, and then select Tablix Properties.

  3. Fare clic sulla pagina Filtri su Aggiungi.Select on the Filters page, and then select Add.

  4. Nel campo Espressione fare clic su ProductID nell'elenco a discesa.In the Expression filed, select ProductID from the drop-down list. Si tratta della colonna a cui applicare il filtro.This is the column to which you apply the filter.

  5. Fare clic sull'operatore di uguaglianza (=) nell'elenco a discesa Operatore .Select the equal (=) operator in the Operator drop-down list.

  6. Fare clic sul pulsante dell'espressione accanto al campo Valore , selezionare Parametri nell'area Categoria e fare doppio clic su productid nell'area Valori .Select the expression button next to the Value field, select Parameters in the Category area, and then double-click productid in the Values area. Il campo Imposta espressione per: Valore dovrebbe contenere ora un'espressione simile a =Parameters!productid.Value.The Set expression for: Value field should now contain expression similar to =Parameters!productid.Value.

  7. Fare clic su OK e di nuovo su OK nella finestra di dialogo Proprietà Tablix .Select OK, and OK again in the Tablix Properties dialog box.

  8. Salvare il file con estensione rdlc.Save the .rdlc file.

Per creare una funzione mediante la quale vengono selezionati i dati non filtrati dalla tabella PurchaseOrderDetailTo create a function that selects unfiltered data from the PurchaseOrdeDetail table

  1. In Esplora soluzioni espandere Default.aspx, quindi fare doppio clic su Default.aspx.cs.In Solution Explorer, expand Default.aspx, and then double click Default.aspx.cs.

  2. Creare una funzione nuova che accetta un productiddi tipo Integer, che restituisce un oggetto datatable e che consente di eseguire le operazioni riportate di seguito.Create a new function that accepts a parameter, productid, of type Integer and returns a datatable object, and does the following.

    1. Crea un'istanza del set di dati DataSet2, che è stato creato nel passaggio 2 della Lezione 4: Definire una connessione dati e una tabella di dati per il report figlio.Creates an instance of the dataset, DataSet2, which was created in Step 2 of Lesson 4: Define a Data Connection and Data Table for Child Report.

    2. Creare una connessione al database di SQL Server per eseguire la query definita nella Lezione 4: Definire una connessione dati e una tabella di dati per il report figlio.Create a connection to the SqlServer database to execute the query defined in Lesson 4: Define a Data Connection and DataTable for Child Report.

    3. Tramite la query verranno restituiti i dati non filtrati.The query will return unfiltered data.

    4. Inserire i dati non filtrati nell'istanza di DataSet eseguendo la query.Fill the DataSet instance with the unfiltered data by executing the query.

    5. Restituire l'oggetto DataTable di PurchaseOrderDetail .Return the PurchaseOrderDetail DataTable.

      La funzione sarà simile alla seguente e dovrà essere utilizzata solo come riferimento.The function will look similar to the one below, (This is just for your reference. È infatti possibile utilizzare qualsiasi modello desiderato per recuperare i dati necessari per il report figlio.You can follow any pattern that you want, to fetch the necessary data for child report).

      /// <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=Adventureworks2014;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;  
              }  
          }  
      

Per aggiungere un gestore eventi mediante il quale viene associato l'oggetto DataTable di PurchaseOrderDetail al report figlioTo add an event handler that binds the PurchaseOrderDetail DataTable to the child report

  1. Aprire Default. aspx nella visualizzazione della finestra di progettazione.Open Default.aspx in designer view.

  2. Fare clic con il pulsante destro del mouse sul controllo ReportViewer e scegliere Proprietà.Right-click the ReportViewer control, and then select Properties.

  3. Nella pagina Proprietà fare clic sull'icona Eventi .On the Properties page, select the Events icon.

  4. Fare doppio clic sull'evento Drill-through .Double-click the Drillthrough event.

    Verrà aggiunta una sezione del gestore eventi nel codice, che sarà simile al blocco riportato di seguito.This will add an event handler section in the code, which will look similar to the below block.

    protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e)  
    {  
    }  
    
  5. Completare il gestore eventiComplete the event handler. nel quale dovrebbe essere inclusa la funzionalità riportata di seguito.It should include the following functionalty.

    1. Recuperare il riferimento all'oggetto del report figlio dal parametro DrillthroughEventArgs .Fetch the child report object reference from the DrillthroughEventArgs parameter.

    2. Chiamare la funzione GetPurchaseOrderDetailCall the function, GetPurchaseOrderDetail

    3. Associare l'oggetto DataTable di PurchaseOrderDetail all'origine dati corrispondente del report.Bind the PurchaseOrderDetail DataTable with the report's corresponding data source.

      Il codice del gestore eventi completato sarà simile al seguente.The completed event handler code will look similar to the following.

      protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e)  
          {  
              try  
              {  
                   //Get the instance of the Target report.  
                  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. Salvare il file.Save the file.

Filtro queryQuery Filter

È necessario completare le attività seguenti per implementare un filtro query.You need to complete the following tasks to implement a query filter.

  • Creare una funzione con la quale sono stati selezionati i dati filtrati dalla tabella PurchaseOrderDetail .Create a function that selected filtered data from the PurchaseOrderDetail table.

  • Aggiungere un gestore eventi con il quale vengono recuperati i valori dei parametri e viene associato l'oggetto DataTable di PurchaseOrderDetail al report figlio.Add an event handler that retrieves parameter values and binds the PurchaseOrdeDetail DataTable to the child report.

Per creare una funzione mediante la quale vengono selezionati i dati filtrati dalla tabella PurchaseOrderDetailTo create a function that selects filtered data from the PurchaseOrderDetail table

  1. In Esplora soluzioni espandere Default.aspx, quindi fare doppio clic su Default.aspx.cs.In Solution Explorer, expand Default.aspx, and then double click Default.aspx.cs.

  2. Creare una funzione nuova che accetta un productiddi tipo Integer, che restituisce un oggetto datatable e che consente di eseguire le operazioni riportate di seguito.Create a new function that accepts a parameter, productid, of type Integer and returns a datatable object and does the following.

    1. Crea un'istanza del set di dati DataSet2, che è stato creato nel passaggio 2 della Lezione 4: Definire una connessione dati e una tabella di dati per il report figlio.Creates an instance of the dataset, DataSet2, which was created in Step 2 of Lesson 4: Define a Data Connection and Data Table for Child Report.

    2. Creare una connessione al database di SQL Server per eseguire la query definita in Lezione 4: Definire una connessione dati e una tabella di dati per il report figlio.Create a connection to the SqlServer database to execute the query defined Lesson 4: Define a Data Connection and DataTable for Child Report.

    3. Nella query sarà incluso un parametro productidper garantire che i dati restituiti vengano filtrati in base al valore di ProductID selezionato nel report padre.The query will include a parameter, productid, to make sure the data returned is filtered based on the ProductID selected in the parent report.

    4. Inserire i dati filtrati nell'istanza di DataSet eseguendo la query.Fill the DataSet instance with the filtered data by executing the query.

    5. Restituire l'oggetto DataTable di PurchaseOrderDetail .Return the PurchaseOrderDetail DataTable.

      La funzione sarà simile alla seguente e dovrà essere utilizzata solo come riferimento.The function will look similar to the one below, (This is just for your reference. È infatti possibile utilizzare qualsiasi modello desiderato per recuperare i dati necessari per il report figlio.You can follow any pattern that you want, to fetch the necessary data for child report).

      /// <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=Adventureworks2014;Integrated Security=SSPI"))  
                  {  
                      //Building the dynamic query with the parameter ProductID.  
                      SqlCommand cmd = new SqlCommand("SELECT PurchaseOrderID, PurchaseOrderDetailID, OrderQty, ProductID, ReceivedQty, RejectedQty, StockedQty FROM Purchasing.PurchaseOrderDetail where ProductID = @ProductID", sqlconn);  
      
                      // Sets the productid parameter.  
                      cmd.Parameters.Add((new SqlParameter("@ProductID", SqlDbType.Int)).Value = productid);  
      
                      SqlDataAdapter adap = new SqlDataAdapter(cmd);  
                      //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;  
              }  
          }  
      

Per aggiungere un gestore eventi mediante il quale vengono recuperati i valori dei parametri e viene associato l'oggetto DataTable di PurchaseOrderDetail al report figlioTo add an event handler that retrieves parameter values and binds the PurchaseOrdeDetail DataTable to the child report

  1. Aprire Default. aspx nella visualizzazione della finestra di progettazione.Open Default.aspx in designer view.

  2. Fare clic con il pulsante destro del mouse sul controllo ReportViewer e scegliere Proprietà.Right-click the ReportViewer control, and then select Properties.

  3. Nel riquadro Proprietà fare clic sull'icona Eventi .On the Properties pane, select the Events icon.

  4. Fare doppio clic sull'evento Drill-through .Double-click the Drillthrough event.

    Verrà aggiunta una sezione del gestore eventi nel codice, che sarà simile a quanto riportato di seguito.This will add an event handler section in the code that will look similar to the following.

    protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e)  
    {  
    }  
    
  5. Completare il gestore eventiComplete the event handler. nel quale dovrebbe essere inclusa la funzionalità riportata di seguito.It should include the following functionality.

    1. Recuperare il riferimento all'oggetto del report figlio dal parametro DrillthroughEventArgs .Fetch the Child report object reference from the DrillthroughEventArgs parameter.

    2. Ottenere l'elenco dei parametri del report figlio dall'oggetto del report figlio recuperato.Get the child report parameter list from the child report object fetched.

    3. Scorrere la raccolta dei parametri e recuperare il valore per il parametro ProductID, passato dal report padre.Iterate through the parameter's collection and retrieve the value for the parameter, ProductID, passed from the parent report.

    4. Chiamare la funzione GetPurchaseOrderDetaile passare il valore per il parametro ProductID.Call the function, GetPurchaseOrderDetail, and pass the value for parameter ProductID.

    5. Associare l'oggetto DataTable di PurchaseOrderDetail all'origine dati corrispondente del report.Bind the PurchaseOrderDetail DataTable with the Report's corresponding data source.

      Il codice del gestore eventi completato sarà simile al seguente.The completed event handler code will look similar to the following.

      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.  
                  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. Salvare il file.Save the file.

Attività successivaNext Task

È stato creato correttamente un filtro di dati per la tabella di dati definita per il report figlio.You have successfully created a data filter for the data table that you defined for the child report. Successivamente, verrà compilata ed eseguita l'applicazione del sito Web.Next, you will build and run the website application. Vedere Lezione 9: Compilare ed eseguire l'applicazione.See Lesson 9: Build and Run the Application.