Lição 8: Criar um filtro de dados
Após adicionar uma ação de detalhamento no relatório pai, a próxima etapa é criar um filtro de dados para a tabela de dados definida para o relatório filho.
Você pode criar um filtro baseado em tabela ou em um filtro de consulta para o relatório detalhado. Esta lição fornece instruções para ambas as opções.
Filtro baseado em tabela
É necessário concluir as seguintes tarefas para implementar um filtro baseado em tabela.
Adicione uma expressão de filtro ao tablix no relatório filho.
Crie uma função que seleciona dados não filtrados na tabela PurchaseOrderDetail.
Adicione um manipulador de eventos que associe a DataTable PurchaseOrderDetail ao relatório filho.
Para adicionar uma expressão de filtro ao tablix no relatório filho
Abra o relatório filho.
Selecione um título de coluna no tablix, clique com o botão direito do mouse na célula cinza que aparece acima do título da coluna e clique em Propriedades do Tablix.
Clique na página Filtros e clique em Adicionar.
No campo Expressão, clique em ProductID na lista suspensa. Esta é a coluna à qual você aplicará o filtro.
Clique no operador igual (=) na lista suspensa Operador.
Clique no botão de expressão ao lado do campo Valor, clique em Parâmetros na área Categoria e clique duas vezes em productid na área Valores. O campo de Definir expressão para: Valor agora deve conter uma expressão semelhante a =Parameters!productid.Value.
Clique em OK e clique em OK novamente na caixa de diálogo Propriedades do Tablix.
Salve o arquivo .rdlc.
Para criar uma função que seleciona dados não filtrados na tabela PurchaseOrderDetail
No Gerenciador de Soluções, expanda Default.aspx e clique duas vezes em Default.aspx.cs.
Crie uma nova função que aceite um parâmetro, productid, do tipo inteiro e retorne um objeto datatable, e faça o seguinte.
Crie uma instância do conjunto de dados, DataSet2, que foi criado na Etapa 2 Lição 4: Definir uma conexão de dados e uma tabela de dados para o relatório filho.
Crie uma conexão com o banco de dados do SQL Server para executar a consulta definida na Lição 4: Definir uma conexão de dados e uma DataTable para o relatório filho.
A consulta deve retornará dados não filtrados.
Preencha a instância do DataSet com os dados não filtrados executando a consulta.
Retorne a DataTable PurchaseOrderDetail.
A função terá aparência similar à mostrada abaixo (Isso é apenas para fins de referência. Você pode seguir o padrão desejado para buscar os dados necessários ao relatório filho).
Inclua referências aos namespaces 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; } }
Para adicionar um manipulador de eventos que associe a DataTable PurchaseOrderDetail ao relatório filho.
Abra o Default.aspx
Clique com o botão direito do mouse no controle ReportViewer e clique em Propriedades.
Na página Propriedades, clique no ícone Eventos.
Clique duas vezes no evento Detalhamento.
Isso adicionará uma seção do manipulador de eventos ao código, que será semelhante ao bloco abaixo.
protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e) { }
Conclua o manipulador de eventos. Ele deve incluir a seguinte funcionalidade.
Busque a referência de objeto do relatório filho no parâmetro DrillthroughEventArgs.
Chame a função GetPurchaseOrderDetail
Associe a DataTable PurchaseOrderDetail à fonte de dados correspondente do relatório.
O código completo do manipulador de eventos será semelhante ao conteúdo seguinte.
Inclua referências ao namespace 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); } }
Salve o arquivo.
Filtro de consulta
É necessário concluir as seguintes tarefas para implementar um filtro de consulta.
Crie uma função que tenha selecionado dados filtrados na tabela PurchaseOrderDetail.
Adicione um manipulador de eventos que recupere valores de parâmetro e associe a DataTable PurchaseOrdeDetail ao relatório filho.
Para criar uma função que selecione dados filtrados na tabela PurchaseOrderDetail
No Gerenciador de Soluções, expanda Default.aspx e clique duas vezes em Default.aspx.cs.
Crie uma nova função que aceite um parâmetro, productid, do tipo inteiro e retorne um objeto datatable, e faça o seguinte.
Crie uma instância do conjunto de dados, DataSet2, que foi criado na Etapa 2 Lição 4: Definir uma conexão de dados e uma tabela de dados para o relatório filho.
Crie uma conexão com o banco de dados do SQL Server para executar a consulta definida na Lição 4: Definir uma conexão de dados e uma DataTable para o relatório filho.
A consulta incluirá um parâmetro, productid, assegurar que os dados retornados serão filtrados com base na ProductID selecionada no relatório pai.
Preencha a instância do DataSet com os dados filtrados executando a consulta.
Retorne a DataTable PurchaseOrderDetail.
A função terá aparência similar à mostrada abaixo (Isso é apenas para fins de referência. Você pode seguir o padrão desejado para buscar os dados necessários ao relatório filho).
Inclua referências aos namespaces 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; } }
Para adicionar um manipulador de eventos que recupere valores de parâmetro e associe a DataTable PurchaseOrdeDetail ao relatório filho
Abra o Default.aspx
Clique com o botão direito do mouse no controle ReportViewer e clique em Propriedades.
No painel Propriedades, clique no ícone Eventos.
Clique duas vezes no evento Detalhamento.
Isso adicionará uma seção do manipulador de eventos ao código, que será semelhante ao conteúdo abaixo.
protected void ReportViewer1_Drillthrough(object sender, Microsoft.Reporting.WebForms.DrillthroughEventArgs e) { }
Conclua o manipulador de eventos. Ele deve incluir a seguinte funcionalidade.
Busque a referência de objeto do relatório filho no parâmetro DrillthroughEventArgs.
Obtenha a lista de parâmetros do relatório filho no objeto do relatório filho buscado.
Itere pela coleção do parâmetro e recupere o valor do parâmetro ProductID passado pelo relatório pai.
Chame a função GetPurchaseOrderDetail e passe o valor para o parâmetro ProductID.
Associe a DataTable PurchaseOrderDetail à fonte de dados correspondente do relatório.
O código completo do manipulador de eventos será semelhante ao conteúdo seguinte.
Inclua referências ao namespace 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); } }
Salve o arquivo.
Próxima tarefa
Você criou, com êxito, um filtro de dados para a tabela de dados definida para o relatório filho. Em seguida, você compilará e executará o aplicativo de site. Consulte Lição 9: Criar e executar o aplicativo.