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 um filtro de consulta para o relatório de detalhamento. 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.
Criar uma função que seleciona dados não filtrados na tabela PurchaseOrderDetail .
Adicionar um manipulador de eventos que associa a DataTable PurchaseOrderDetail ao relatório filho.
Adicione 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 exibida acima do título de coluna e escolha Propriedades do Tablix.
Selecione a página filtros e escolha Adicionar.
No campo Expressão , clique em ProductID na lista suspensa. É nessa coluna que você aplica o filtro.
Clique no operador igual ( = ) na lista suspensa Operador .
Clique no botão de expressão ao lado do campo Valor, escolha Parâmetros na área Categoria e clique duas vezes em productid na área Valores . O campo Definir expressão para: Valor agora deve conter uma expressão semelhante a =Parameters!productid.Value.
Selecione OK e OK novamente na caixa de diálogo Propriedades do Tablix .
Salve o arquivo .rdlc.
Criar uma função que seleciona dados não filtrados na tabela PurchaseOrdeDetail.
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 chamado productid do tipo Integer. Ele deve retornar um objeto datatable e fazer o seguinte:
Crie uma instância do conjunto de dados, DataSet2, criado na Etapa 2 da 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 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 retorna dados não filtrados.
Preencha a instância do DataSet com os dados não filtrados executando a consulta.
Retorna a DataTable PurchaseOrderDetail .
A função deve ser semelhante ao exemplo a seguir (este exemplo é apenas para referência. Você pode seguir qualquer padrão que desejar para obter os dados necessários para o relatório filho).
/// <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=AdventureWorks2022;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; } }
Adicionar um manipulador de eventos que associa a DataTable PurchaseOrderDetail ao relatório filho
Abra Default.aspx no modo designer.
Clique com o botão direito do mouse no controle ReportViewer e selecione Propriedades.
Na página Propriedades , selecione o ícone Eventos .
Clique duas vezes no evento Detalhamento .
Essa ação adiciona uma seção de manipulador de eventos no código, que deve ser semelhante ao bloco a seguir.
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 do manipulador de eventos concluído deve ser semelhante ao exemplo a seguir.
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); } }
Salve o arquivo.
Filtro de consulta
É necessário concluir as seguintes tarefas para implementar um filtro de consulta.
Crie uma função que seleciona dados filtrados da tabela PurchaseOrderDetail .
Adicione um manipulador de eventos que recupera valores de parâmetro e associa a DataTable PurchaseOrdeDetail ao relatório filho.
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 aceita um parâmetro, productid, do tipo Inteiro, retorna um objeto datatable e faz o seguinte.
Cria uma instância do conjunto de dados, DataSet2, criado na Etapa 2 da 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 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, para garantir 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.
Retorna a DataTable PurchaseOrderDetail .
A função deve ser semelhante ao exemplo a seguir (este exemplo é apenas para referência. Você pode seguir qualquer padrão que desejar para obter os dados necessários para o relatório filho).
/// <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=AdventureWorks2022;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; } }
Adicione um manipulador de eventos que recupera valores de parâmetro e associa a DataTable PurchaseOrdeDetail ao relatório filho
Abra Default.aspx no modo designer.
Clique com o botão direito do mouse no controle ReportViewer e selecione Propriedades.
No painel Propriedades , selecione o ícone Eventos .
Clique duas vezes no evento Detalhamento .
Essa ação adiciona uma seção de manipulador de eventos no código que deve ser semelhante ao exemplo a seguir.
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 GetPurchaseOrderDetaile passe o valor para o parâmetro ProductID.
Associe a DataTable PurchaseOrderDetail à fonte de dados correspondente do Relatório.
O código do manipulador de eventos concluído deve ser semelhante ao exemplo a seguir.
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); } }
Salve o arquivo.
Próxima etapa
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. Confira a Lição 9: Criar e executar o aplicativo.
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de