Lezione 8: Creare un filtro di dati
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.
È possibile creare un filtro basato su tabella o un filtro query per il report drill-through. In questa lezione vengono fornite le istruzioni per entrambe le opzioni.
Filtro basato su tabella
È necessario completare le attività seguenti per implementare un filtro basato su tabella.
Aggiungere un'espressione di filtro alla Tablix nel report figlio.
Creare una funzione mediante la quale vengono selezionati i dati non filtrati dalla tabella PurchaseOrderDetail.
Aggiungere un gestore eventi mediante il quale viene associato l'oggetto DataTable di PurchaseOrderDetail al report figlio.
Per aggiungere un'espressione di filtro alla Tablix nel report figlio
Aprire il report figlio.
Selezionare un'intestazione di colonna nella Tablix, fare clic con il pulsante destro del mouse sulla cella grigia visualizzata sopra l'intestazione di colonna, quindi scegliere Proprietà Tablix.
Fare clic sulla pagina Filtri, quindi su Aggiungi.
Nel campo Espressione fare clic su ProductID nell'elenco a discesa. Si tratta della colonna a cui applicare il filtro.
Fare clic sull'operatore di uguaglianza (=) nell'elenco a discesa Operatore.
Fare clic sul pulsante dell'espressione accanto al campo Valore, fare clic su Parametri nell'area Categoria, quindi fare doppio clic su productid nell'area Valori. Il campo Imposta espressione per: Valore dovrebbe contenere un'espressione simile a =Parameters!productid.Value.
Fare clic su OK, quindi di nuovo su OK nella finestra di dialogo Proprietà Tablix.
Salvare il file con estensione rdlc.
Per creare una funzione mediante la quale vengono selezionati i dati non filtrati dalla tabella PurchaseOrderDetail
In Esplora soluzioni espandere Default.aspx, quindi fare doppio clic su Default.aspx.cs.
Creare una nuova funzione che accetta un parametro, productid, di tipo Integer, restituisce un oggetto datatable e consente di eseguire le operazioni riportate di seguito.
Creare un'istanza del set di dati, DataSet2, creato nel Passaggio 2 di Lezione 4: Definire una connessione dati e una tabella di dati per il report figlio.
Creare una connessione al database di SQL Server per eseguire la query definita in Lezione 4: Definire una connessione dati e una tabella dati per il report figlio.
Tramite la query verranno restituiti i dati non filtrati.
Inserire i dati non filtrati nell'istanza di DataSet eseguendo la query.
Restituire l'oggetto DataTable di PurchaseOrderDetail.
La funzione sarà simile alla seguente e dovrà essere utilizzata solo come riferimento. È infatti possibile utilizzare qualsiasi modello desiderato per recuperare i dati necessari per il report figlio.
Assicurarsi di includere i riferimenti agli spazi dei nomi System.Data e 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; } }
Per aggiungere un gestore eventi mediante il quale viene associato l'oggetto DataTable di PurchaseOrderDetail al report figlio
Aprire Default.aspx.
Fare clic con il pulsante destro del mouse sul controllo ReportViewer, quindi scegliere Proprietà.
Nella pagina delle proprietà fare clic sull'icona Eventi.
Fare doppio clic sull'evento Drill-through.
Verrà aggiunta una sezione del gestore eventi nel codice, che sarà simile al blocco riportato di seguito.
protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e) { }
Completare il gestore eventi nel quale dovrebbe essere inclusa la funzionalità riportata di seguito.
Recuperare il riferimento all'oggetto del report figlio dal parametro DrillthroughEventArgs.
Chiamare la funzione, GetPurchaseOrderDetail.
Associare l'oggetto DataTable di PurchaseOrderDetail all'origine dati corrispondente del report.
Il codice del gestore eventi completato sarà simile al seguente.
Assicurarsi di includere i riferimenti allo spazio dei nomi 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); } }
Salvare il file.
Filtro query
È necessario completare le attività seguenti per implementare un filtro query.
Creare una funzione mediante la quale sono stati selezionati i dati filtrati dalla tabella PurchaseOrderDetail.
Aggiungere un gestore eventi mediante il quale vengono recuperati i valori dei parametri e viene associato l'oggetto DataTable di PurchaseOrdeDetail al report figlio.
Per creare una funzione mediante la quale vengono selezionati i dati filtrati dalla tabella PurchaseOrderDetail
In Esplora soluzioni espandere Default.aspx, quindi fare doppio clic su Default.aspx.cs.
Creare una nuova funzione che accetta un parametro, productid, di tipo Integer, restituisce un oggetto datatable e consente di eseguire le operazioni riportate di seguito.
Creare un'istanza del set di dati, DataSet2, creato nel Passaggio 2 di Lezione 4: Definire una connessione dati e una tabella di dati per il report figlio.
Creare una connessione al database di SQL Server per eseguire la query definita in Lezione 4: Definire una connessione dati e una tabella dati per il report figlio.
Nella query sarà incluso un parametro, productid, per garantire che i dati restituiti vengano filtrati in base a ProductID selezionato nel report padre.
Inserire i dati filtrati nell'istanza di DataSet eseguendo la query.
Restituire l'oggetto DataTable di PurchaseOrderDetail.
La funzione sarà simile alla seguente e dovrà essere utilizzata solo come riferimento. È infatti possibile utilizzare qualsiasi modello desiderato per recuperare i dati necessari per il report figlio.
Assicurarsi di includere i riferimenti agli spazi dei nomi System.Data e 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; } }
Per aggiungere un gestore eventi mediante il quale vengono recuperati i valori dei parametri e viene associato l'oggetto DataTable di PurchaseOrderDetail al report figlio
Aprire Default.aspx.
Fare clic con il pulsante destro del mouse sul controllo ReportViewer, quindi scegliere Proprietà.
Nel riquadro Proprietà fare clic sull'icona Eventi.
Fare doppio clic sull'evento Drill-through.
Verrà aggiunta una sezione del gestore eventi nel codice, che sarà simile a quanto riportato di seguito.
protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e) { }
Completare il gestore eventi nel quale dovrebbe essere inclusa la funzionalità riportata di seguito.
Recuperare il riferimento all'oggetto del report figlio dal parametro DrillthroughEventArgs.
Ottenere l'elenco dei parametri del report figlio dall'oggetto del report figlio recuperato.
Scorrere la raccolta dei parametri e recuperare il valore per il parametro, ProductID, passato dal report padre.
Chiamare la funzione, GetPurchaseOrderDetail, e passare il valore per il parametro ProductID.
Associare l'oggetto DataTable di PurchaseOrderDetail all'origine dati corrispondente del report.
Il codice del gestore eventi completato sarà simile al seguente.
Assicurarsi di includere i riferimenti allo spazio dei nomi 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); } }
Salvare il file.
Attività successiva
È stato creato correttamente un filtro di dati per la tabella di dati definita per il report figlio. Successivamente, verrà compilata ed eseguita l'applicazione del sito Web. Vedere Lezione 9: Compilare ed eseguire l'applicazione.