André Alves de Lima

Talking about Software Development and more…

Trabalhando com drillthrough no Report Viewer

Ao construirmos uma aplicação que possua relatórios, muito provavelmente essa aplicação terá múltiplos relatórios (e não somente um). Uma funcionalidade que podemos adicionar nos nossos relatórios para melhorar a experiência do usuário é a navegação entre eles, diretamente no controle visualizador (sem ter que ficar fechando e abrindo formulários). No Report Viewer, isso é possível através do conceito de drillthrough.

O drillthrough é normalmente utilizado para explorarmos detalhes das linhas de um relatório (daí o nome drillthrough = “perfurar“). Por exemplo, se tivermos um relatório com uma listagem, nós podemos configurar um evento de clique nas linhas do relatório, que abrirá um outro relatório com dados mais detalhados daquela linha. Porém, nós não precisamos necessariamente utilizar essa funcionalidade para detalharmos uma linha, nós podemos simplesmente configurar uma navegação entre relatórios que não tenham nenhuma relação entre si.

No vídeo de hoje eu mostro para você como implementar o drillthrough no Report Viewer para fazermos a navegação entre relatórios:

Navegação entre relatórios independentes

Configurar uma navegação entre relatórios que não tenham relação entre si é algo muito simples de ser feito no Report Viewer. Basta abrirmos a janela de propriedades do TextBox que será o link para o outro relatório (pode ser qualquer outro tipo de controle também) e, na aba “Action“, nós configuramos o nome do relatório que deverá ser aberto (note que nós não devemos indicar a extensão “rdlc” no nome do relatório!):

Além disso, nós temos que passar de alguma forma os dados do segundo relatório que deverá ser aberto. Afinal de contas, como é que o Report Viewer poderia saber de onde pegar os dados, não é mesmo? O evento que temos que implementar para enviarmos os dados do segundo relatório é o evento chamado “Drillthrough“:

Nesse evento, nós passamos os dados do relatório através do método DataSources.Add:

        // C#
        private void reportViewer1_Drillthrough(object sender, Microsoft.Reporting.WinForms.DrillthroughEventArgs e)
        {
            var localReport = (Microsoft.Reporting.WinForms.LocalReport)e.Report;
            localReport.DataSources.Clear();

            if (e.ReportPath.Contains("RelatorioFornecedor"))
            {
                localReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSetRelatorio", (DataTable)ds.Fornecedor));
            }
        }
    ' VB.NET
    Private Sub ReportViewer1_Drillthrough(sender As Object, e As Microsoft.Reporting.WinForms.DrillthroughEventArgs) Handles ReportViewer1.Drillthrough
        Dim LocalReport = DirectCast(e.Report, Microsoft.Reporting.WinForms.LocalReport)
        LocalReport.DataSources.Clear()

        If e.ReportPath.Contains("RelatorioFornecedor") Then
            LocalReport.DataSources.Add(New Microsoft.Reporting.WinForms.ReportDataSource("DataSetRelatorio", DirectCast(Ds.Fornecedor, DataTable)))
        End If
    End Sub

Note que nós conseguimos avaliar o conteúdo da propriedade “ReportPath” para detectarmos qual relatório está sendo carregado. Isso é muito útil caso nós tenhamos mais de um drillthrough no mesmo relatório, apontando para destinos diferentes.

Navegação entre relatórios dependentes

A única diferença na navegação entre relatórios dependentes é que nós temos que, de alguma maneira, ligar o relatório pai com o relatório filho. Por exemplo, se nós tivermos uma listagem de clientes e quisermos que um outro relatório com as suas transações seja aberto ao clicarmos no ID do cliente, nós temos que criar um parâmetro no relatório de transações:

Em seguida, nas propriedades do Tablix, vamos configurar um filtro pelo ID do cliente, utilizando o valor do parâmetro:

Por fim, na hora de configurarmos a navegação para o relatório de transações, nós passamos o ID do cliente selecionado como valor do parâmetro “ClienteID” no relatório destino:

Pronto! E com isso nós configuramos a navegação entre o relatório de clientes e o relatório de transações do cliente, que será devidamente filtrado dependendo do cliente que for clicado pelo usuário. Só não esqueça de ajustar o código do evento “Drillthrough” de forma que os dados sejam passados para o relatório de transações também:

        // C#
        private void reportViewer1_Drillthrough(object sender, Microsoft.Reporting.WinForms.DrillthroughEventArgs e)
        {
            var localReport = (Microsoft.Reporting.WinForms.LocalReport)e.Report;
            localReport.DataSources.Clear();

            if (e.ReportPath.Contains("RelatorioFornecedor"))
            {
                localReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSetRelatorio", (DataTable)ds.Fornecedor));
            }
            else if (e.ReportPath.Contains("RelatorioTransacao"))
            {
                localReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSetRelatorio", (DataTable)ds.Transacao));
            }
        }
    ' VB.NET
    Private Sub ReportViewer1_Drillthrough(sender As Object, e As Microsoft.Reporting.WinForms.DrillthroughEventArgs) Handles ReportViewer1.Drillthrough
        Dim LocalReport = DirectCast(e.Report, Microsoft.Reporting.WinForms.LocalReport)
        LocalReport.DataSources.Clear()

        If e.ReportPath.Contains("RelatorioFornecedor") Then
            LocalReport.DataSources.Add(New Microsoft.Reporting.WinForms.ReportDataSource("DataSetRelatorio", DirectCast(Ds.Fornecedor, DataTable)))
        ElseIf e.ReportPath.Contains("RelatorioTransacao") Then
            LocalReport.DataSources.Add(New Microsoft.Reporting.WinForms.ReportDataSource("DataSetRelatorio", DirectCast(Ds.Transacao, DataTable)))
        End If
    End Sub

Escondendo botões de ação no modo impressão

Uma última melhoria que podemos fazer nesse exemplo é escondermos o TextBox que faz a abertura do relatório de fornecedores caso estivermos em modo impressão (ou exportação). Afinal, não faz sentido exibir esse TextBox na impressão ou exportação, uma vez que ele só serve como um link entre o relatório de clientes e o relatório de fornecedores.

Para fazermos isso, nós temos que adicionar uma expressão na propriedade “Hidden” desse TextBox, de maneira que ele seja escondido quando não estivermos no modo interativo:

Baixe o projeto de exemplo

Para baixar o projeto de exemplo desse artigo, assine a minha newsletter. Ao fazer isso, além de ter acesso ao projeto, você receberá um e-mail toda semana sobre o artigo publicado e ficará sabendo também em primeira mão sobre o artigo da próxima semana, além de receber dicas “bônus” que eu só compartilho por e-mail. Inscreva-se utilizando o formulário no final do artigo.

Concluindo

A funcionalidade de drillthrough do Report Viewer pode ser utilizada para adicionarmos navegação entre os relatórios da nossa aplicação. Ao utilizá-la, o usuário poderá navegar entre relatórios sem ter que ficar abrindo janelas diferentes. Essa é uma funcionalidade muito interessante que nós podemos adicionar nas nossas aplicações para melhorarmos a experiência do usuário.

Você já conhecia essa funcionalidade do Report Viewer? Já implementou nas suas aplicações? Deu tudo certo? Quais foram os problemas (ou melhor, desafios) que você encontrou ao utilizar drillthrough no Report Viewer? Conte-nos mais detalhes na caixa de comentários!

Até a próxima!

André Lima

Photo by Peter Shanks used under Creative Commons
https://pixabay.com/en/startup-start-up-notebooks-creative-593327/

Image by Pixabay used under Creative Commons
https://pixabay.com/en/tax-forms-income-business-468440/

Song Rocket Power Kevin MacLeod (incompetech.com)
Licensed under Creative Commons: By Attribution 3.0 License
http://creativecommons.org/licenses/by/3.0/

Newsletter do André Lima

* indicates required



Powered by MailChimp

8 thoughts on “Trabalhando com drillthrough no Report Viewer

  • deuzivaldo disse:

    Ótimo, muito bom professor. Eu estou pensando em criar um programa para gerar ordem de serviço. Muito obrigado.

    • andrealveslima disse:

      Legal, Deuzivaldo! Precisando de ajuda é só entrar em contato. Segunda que vem volto das férias e vou começar a responder os emails pendentes. Abraço!

  • Lucas Silverio disse:

    Oi André, tudo bem? To curtindo de mais mexer no report viewer, estava com um pouco de preconceito antes, haha. É possível criar uma espécie de tabela dinâmica como a do Excel, com o report viewer? Abraço

    • andrealveslima disse:

      Olá Lucas!

      O que você quer dizer exatamente com tabela dinâmica como a do Excel? Com o controle “Tablix” do Report Viewer você consegue criar agrupamentos por linhas e colunas, dando o efeito da tabela dinâmica.. É isso que você está querendo fazer? Se não for, dê mais detalhes para eu conseguir entender melhor..

      Abraço!
      André Lima

  • Piter Galdiano disse:

    Oi André, bom dia! Não conhecia essa funcionalidade do Report Viewer e achei muito interessante. Consegue utiliza-la em um dos meus relatórios. O único problema que tenho é o seguinte: Quando eu clico na ação para chamar o outro relatório, ele mostra certinho, porém quando clico para voltar ao relatório principal, aparece a seguinte mensagem: “Alguns parâmetros ou credenciais não foram especificados”. Porém se eu clicar no botão para atualizar, ele exibe o relatório principal. Porque será que ocorre isso? Obrigado

    • andrealveslima disse:

      Olá Piter!

      Que estranho hein.. Você está utilizando parâmetros no seu relatório principal? Eu fiz uns testes aqui e funcionou corretamente clicando no botão voltar.. Você já experimentou criar dois relatórios novos (simples, só para testar) para ver se não é um problema específico com o seu relatório mestre?

      Ah, e manda também exatamente a mensagem de erro que você está recebendo.. É exatamente essa que você mandou no seu comentário ou a mensagem tem mais algum detalhe?

      Abraço!
      André Lima

      • Piter Galdiano disse:

        Oi André, Obrigado pela resposta! A mensagem é exatamente essa! O meu relatório mestre tem parâmetros diferentes do relatório que eu chamo através do drillthrough. Pode ser por isso? E caso seja, como faço para retornar os parâmetros do relatório mestre quando eu clicar no botão voltar?

        Atenciosamente,

        • andrealveslima disse:

          Olá Piter!

          Que estranho.. Eu fiz um teste de drillthrough com parâmetros também e não tive problema nenhum ao utilizar o botão “voltar”.. A sua aplicação é desktop ou web? Eu testei em um projeto desktop.. Se você puder enviar os arquivos rdlc para eu dar uma olhada, talvez eu consiga entender onde é que está o problema..

          Abraço!
          André Lima

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *