André Alves de Lima

Talking about Software Development and more…

Trabalhando com parâmetros no Report Viewer

Uma grande dificuldade que muitas pessoas acabam passando ao trabalhar com o Report Viewer é a questão de passagem de parâmetros. É através deles que nós conseguimos passar valores estáticos para os nossos relatórios. No vídeo de hoje eu quero acabar com esse problema de uma vez por todas. Você vai conferir todos os segredos para trabalhar com parâmetros no Report Viewer de forma efetiva. Confira:

Parâmetros para conteúdos estáticos

A principal razão para utilizarmos parâmetros em um relatório é para passarmos algum conteúdo estático que não faça parte do DataSet. Por exemplo, em uma aplicação “multi-empresa“, talvez faça sentido passar o nome da empresa para exibirmos em algum lugar do relatório, ou até mesmo o caminho do logotipo da empresa para exibirmos no cabeçalho do relatório.

Para criarmos parâmetros no nosso relatório do Report Viewer, basta clicarmos com o botão direito no item “Parameters” na janela “Report Data” e, em seguida, escolhemos a opção “Add Parameter“:

Na janela que se abre, escolhemos um nome e o tipo do parâmetro:

Com o parâmetro criado, para utilizarmos o seu valor dentro do relatório, basta arrastá-lo da janela “Report Data” para dentro do relatório:

Além de utilizarmos o valor do parâmetro em um TextBox, nós podemos também utilizá-lo em expressões (para configurar o caminho de uma imagem, por exemplo):

Para passarmos um valor para o nosso parâmetro, nós utilizamos o método “SetParameters“, que deve ser chamado antes de “RefreshReport“:

            // C#
            this.reportViewer1.LocalReport.SetParameters(new Microsoft.Reporting.WinForms.ReportParameter("Empresa", "Microsoft"));
            this.reportViewer1.RefreshReport();
        ' VB.NET
        Me.ReportViewer1.LocalReport.SetParameters(New Microsoft.Reporting.WinForms.ReportParameter("Empresa", "Microsoft"))
        Me.ReportViewer1.RefreshReport()

Parâmetros obrigatórios e opcionais

Se configurarmos um parâmetro como obrigatório sem valor padrão e não passarmos um valor para ele através do método “SetParameters“, nós receberemos um erro:

Para configurarmos um parâmetro como não obrigatório, nós temos que marcar as opções “Allow blank value” e/ou “Allow null value“:

Configurando um valor padrão para o parâmetro

Uma outra opção bem interessante que nós podemos configurar nos parâmetros do Report Viewer são os valores padrão. Dessa forma, se não passarmos nenhum valor para o parâmetro, ele assumirá o valor padrão que definimos no relatório.

Para configurarmos valores padrão para um parâmetro do Report Viewer, nós utilizamos a tab “Default Values“:

Cuidado com as letras maiúsculas e minúsculas!

Um cuidado muito importante que temos que ter na hora de passarmos os valores para os nossos parâmetros é que o Report Viewer diferencia maiúsculas e minúsculas. Ou seja, se definirmos o nome “Empresa” (com “E” maiúsculo) para o parâmetro no relatório e tentarmos passar o valor utilizando o nome “empresa” (com “e” minúsculo), o Report Viewer acusará um erro (sempre clique em “View Detail” para ter uma informação mais detalhada dos erros do Report Viewer):

Parâmetros como filtro do relatório

Um outro exemplo clássico da utilização de parâmetros em relatórios é a filtragem de dados. Imagine um relatório que traz uma lista de Produtos com as suas categorias. Não seria interessante possibilitar a filtragem desse relatório por categoria?

Para fazer isso, você só precisa criar o parâmetro (como vimos anteriormente) que receberá o ID da categoria a ser utilizada no filtro. Em seguida, nós abrimos a janela de propriedades do Tablix:

E definimos um novo filtro na aba “Filter“:

Em “Expression” nós definimos a seguinte sentença:

=IIf(Not IsNothing(Parameters!CategoriaID.Value), Fields!CategoriaID.Value = Parameters!CategoriaID.Value, True)

E em “Value“, nós definimos o valor “True“:

=True

Isso fará com que o Tablix seja filtrado quando algum valor for passado para o parâmetro “CategoriaID“. Caso contrário (se nenhum valor for passado para esse parâmetro), nenhum filtro será aplicado (ou seja, todos os registros serão exibidos).

O código para mandar um valor selecionado em um ComboBox de categorias seria este:

            // C#
            this.reportViewer1.LocalReport.SetParameters(new Microsoft.Reporting.WinForms.ReportParameter("CategoriaID", comboBoxCategoria.SelectedValue.ToString()));
            this.reportViewer1.RefreshReport();
        ' VB.NET
        Me.ReportViewer1.LocalReport.SetParameters(New Microsoft.Reporting.WinForms.ReportParameter("CategoriaID", ComboBoxCategoria.SelectedValue.ToString()))
        Me.ReportViewer1.RefreshReport()

Já o código para mandar um valor em branco para esse parâmetro (de forma que todos os Produtos sejam exibidos, sem filtro) seria este:

            // C#
            this.reportViewer1.LocalReport.SetParameters(new Microsoft.Reporting.WinForms.ReportParameter("CategoriaID", (string)null));
            this.reportViewer1.RefreshReport();
        ' VB.NET
        Me.ReportViewer1.LocalReport.SetParameters(New Microsoft.Reporting.WinForms.ReportParameter("CategoriaID", DirectCast(Nothing, String)))
        Me.ReportViewer1.RefreshReport()

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 parâmetros é essencial ao desenvolvermos os relatórios das nossas aplicações. Com ela, nós conseguimos enviar valores estáticos para os relatórios, que poderão ser utilizados para exibir alguma informação, ou até mesmo para filtrarmos os dados do relatório.

No vídeo de hoje você conferiu como utilizar parâmetros no Report Viewer, tanto como valor estático (que você pode utilizar em um TextBox ou para fazer o carregamento de uma imagem dinamicamente) quanto para filtragem do relatório.

E você, já precisou passar valores estáticos para relatórios do Report Viewer? Utilizou a funcionalidade de parâmetros? Encontrou alguma dificuldade ou tudo funcionou conforme o esperado? Conte-nos mais detalhes na caixa de comentários logo abaixo!

Até a próxima!

André Lima

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

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

54 thoughts on “Trabalhando com parâmetros no Report Viewer

  • ERON disse:

    Outra coisa que não consigo resolver é fazer um relatório de Aniversariantes com busca por mes. Aparece a data + horário….

    Tambem gostaria de quando abrisse o relatório, já fosse apresentado direto ao Layout de impressão. Tem algum comando para fazer isso? Agradeço

    • andrealveslima disse:

      Olá Eron!

      Quanto à sua dúvida sobre o relatório de aniversariantes, eu não consegui entender o problema.. Será que você poderia explicar de outra maneira?

      Já quanto à sua segunda pergunta, você só precisa configurar o DisplayMode para “PrintLayout” antes de chamar o RefreshReport:

      this.reportViewer1.SetDisplayMode(Microsoft.Reporting.WinForms.DisplayMode.PrintLayout);
      

      Abraço!
      André Lima

      • ERON disse:

        Obrigado pelo retorno. Funcionou a sua dica.
        Sobre a minha primeira pergunta é que não estou conseguindo fazer um relatório de aniversariantes do mes.

        Veja no meu print neste link: https://drive.google.com/file/d/0B6w5pK7jnl87anl5UnpabDU4alE/view?usp=sharing

        Agradeço

        • andrealveslima disse:

          Olá Eron, que bom que funcionou.. :)

          Quanto ao seu relatório de aniversariantes, o que você está querendo mostrar no ComboBox para filtrar o relatório?

          Abraço!
          André Lima

          • ERON disse:

            Oi André. Eu tenho um cadastro de clientes e dele eu queria fazer um relatório de Aniversariantes.
            Por exemplo:
            Uma pesquisa por mes, (01,02,03, etc…)ai eu selecionava o mês que eu quisesse (tipo: Junho) e mostrava um relatório dos clientes que fazem aniversários em junho. A partir da geração deste relatório eu iria enviar email de felicitações a esses clientes…

            Seria isso!

            Obrigado pela sua ajuda.
            Abraços

          • andrealveslima disse:

            Olá Eron!

            Entendi.. Para fazer isso, você pode configurar o seu ComboBox com os itens de 1 a 12 (ou os nomes dos meses, desde que você converta para número na hora de passar para o relatório).. Aí, no filtro do Tablix, você configura algo como:

            =Convert.ToDateTime(Fields!SuaColunaData.Value).Month = Parameters!NomeDoSeuParametro.Value
            

            Dessa forma o relatório só exibirá os registros que sejam do mês selecionado..

            Entendeu a ideia?

            Abraço!
            André Lima

  • Julio Sardenberg disse:

    Muito bom material!
    Eu penei muito e acabei conseguindo fazer exatamente o que descreveu nesse tutorial, pena que chegou um pouco depois da minha necessidade.
    Mas tenho certeza que será MUITO útil a MUITA gente!

  • eron pasa disse:

    Oi Andre, obrigado pelo retorno.

    Veja anexo um print do meu relatório…. ele está apresentando a HORA, junto com a data do aniversário.
    Não consegui fazer o filtro que vc me ensinou… onde tenho que colocar o ” =Convert.ToDateTime(Fields!SuaColunaData.Value).Month = Parameters!NomeDoSeuParametro.Value”

    Meu código do formulário é:

    Public Class FormAniversario
    Private Sub FormAniversario_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ‘TODO: esta linha de código carrega dados na tabela ‘DB_SeoNVDataSet.TabPagamentos’. Você pode movê-la ou removê-la conforme necessário.
    ‘Me.TabPagamentosTableAdapter.Fill(Me.DB_SeoNVDataSet.TabPagamentos)
    ‘TODO: esta linha de código carrega dados na tabela ‘DB_SeoNVDataSet.TabClientes’. Você pode movê-la ou removê-la conforme necessário.
    Me.TabClientesTableAdapter.Fill(Me.DB_SeoNVDataSet.TabClientes)

    Me.ReportViewer1.RefreshReport
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs)
    Me.Close()

    End Sub

    Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
    Me.Close()
    End Sub

    Private Sub ComboBoxMesNiver_SelectedIndexChanged(sender As Object, e As EventArgs)
    ‘Me.TabClientesTableAdapter.FiltroCodSeove(Me.DB_SeoNVDataSet.TabClientes, ComboBoxMesNiver.Text)

    End Sub

    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs)

    End Sub

    Private Sub TextBox1_TextChanged_1(sender As Object, e As EventArgs)

    End Sub

    Private Sub TextBox1_TextChanged_2(sender As Object, e As EventArgs)

    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
    Try
    Me.TabClientesTableAdapter.FillByNiver1(Me.DB_SeoNVDataSet.TabClientes)
    Catch ex As System.Exception
    System.Windows.Forms.MessageBox.Show(ex.Message)
    End Try
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Try
    Me.TabClientesTableAdapter.FillByNiver1(Me.DB_SeoNVDataSet.TabClientes)
    Catch ex As System.Exception
    System.Windows.Forms.MessageBox.Show(ex.Message)
    End Try
    End Sub

    Private Sub ReportViewer1_Load(sender As Object, e As EventArgs) Handles ReportViewer1.Load

    End Sub
    End Class

    Poderia me auxiliar?

    • andrealveslima disse:

      Olá Eron!

      O problema da hora deve estar na formatação do TextBox.. Você já abriu as opções de formatação do TextBox (botão direito em cima do TextBox, opção TextBox Properties, aba “Number”) e escolheu o formato de data sem hora?

      Quanto ao filtro, essa expressão você terá que colocar como filtro do Tablix.. No vídeo / artigo eu mostro como filtrar por categoria de produto.. No seu caso será a mesma ideia, só que filtrando pelo mês da data de aniversário.. Dá uma olhada novamente no jeito que eu fiz no vídeo e veja se você consegue adaptar.. Se não conseguir, me avisa..

      Abraço!
      André Lima

      • ERON disse:

        Oi Andre! Obrigado

        A primeira dica da sua resposta consegui fazer…deu certo.
        Já a segunda dica, não consegui fazer o filtro, olhei o seu video mesmo assim não consegui.
        Estou enviando o meu código abaixo para vc dar uma olhada no que estou errando.

        Public Class FormEtiquetas
        Private Sub FormEtiquetas_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ‘TODO: esta linha de código carrega dados na tabela ‘DB_SeoNVDataSet.TabClientes’. Você pode movê-la ou removê-la conforme necessário.
        Me.TabClientesTableAdapter.Fill(Me.DB_SeoNVDataSet.TabClientes)

        Me.ReportViewer1.RefreshReport()
        End Sub

        Private Sub EtiquetaCobrancaToolStripButton_Click(sender As Object, e As EventArgs) Handles EtiquetaCobrancaToolStripButton.Click
        Try
        Me.TabClientesTableAdapter.EtiquetaCobranca(Me.DB_SeoNVDataSet.TabClientes, CobrancaToolStripTextBox.Text)
        Me.ReportViewer1.RefreshReport()
        Catch ex As System.Exception
        System.Windows.Forms.MessageBox.Show(ex.Message)
        End Try

        End Sub

        Private Sub ToolStripButton1_Click(sender As Object, e As EventArgs) Handles ToolStripButton1.Click
        Close()
        End Sub

        Private Sub CobrancaToolStripTextBox_Click(sender As Object, e As EventArgs) Handles CobrancaToolStripTextBox.Click

        End Sub

        Private Sub ReportViewer1_Load(sender As Object, e As EventArgs) Handles ReportViewer1.Load
        ReportViewer1.SetDisplayMode(Microsoft.Reporting.WinForms.DisplayMode.PrintLayout)

        End Sub
        End Class

        Se puder me ajudar, agradeço muito sua atenção.
        Abraços
        Eron

        • andrealveslima disse:

          Olá Eron!

          Você criou o parâmetro no relatório? Configurou como filtro no Tablix? Eu não estou vendo a parte em que você passa o parâmetro para o relatório baseado no que foi selecionado no ComboBox..

          Está tudo explicadinho no vídeo (a partir de 4 minutos, assista novamente, por favor) e tem o projeto de exemplo também para você dar uma olhada (em C# e VB.NET)..

          Abraço!
          André Lima

          • ERON disse:

            Oi, Obrigado novamente.

            1 – O código no comboBox eu coloquei assim:

            Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
            ‘ VB.NET
            Me.ReportViewer1.LocalReport.SetParameters(New Microsoft.Reporting.WinForms.ReportParameter(“DtaAniversario”, DirectCast(Nothing, String)))
            Me.ReportViewer1.RefreshReport()
            End Sub

            2 – A Expressao e filtro:
            =Fields!DtaAniversario.Value=True
            =IIf(Not IsNothing(Parameters!DtaAniversario.Value), Fields!DtaAniversario.Value = Parameters!DtaAniversario.Value, True)

            3 – Só que não filtra nada e tambem fica carregando o relatório, dai tenho que força o reinicio do Visual Studio…

            Obrigado.,

          • andrealveslima disse:

            Olá Eron!

            Você está passando DirectCast(Nothing, String) como valor do parâmetro, quando na verdade você tem que passar a data que você selecionou no ComboBox (a propósito, você não estava trabalhando com o mês ao invés da data?).. Seria algo como:

            Me.ReportViewer1.LocalReport.SetParameters(New Microsoft.Reporting.WinForms.ReportParameter("DtaAniversario", SeuComboBox.SelectedValue.ToString()))
            

            E a expressão do filtro depende se você está trabalhando com a data ou com o mês.. A parte “=Fields!DtaAniversario.Value=True” não faz sentido nenhum.. Você precisa colocar a expressão que retornará “True” ou “False” dependendo se a data (ou mês) passado é igual ao registro.. E depois na parte “Value”, você coloca somente “=True”.. Exatamente como mostrei no vídeo..

            Abraço!
            André Lima

  • ERON disse:

    Sim, Andre. Fiz isso.
    Mais só que na hora eu quero chamar somente os meses ( 01,02,03, etc…que estão no combobox) e não aparece…. acho que não estou conseguindo configurar a chamada do MES….
    Agradeço novamente.

    • andrealveslima disse:

      Olá Eron!

      Cara, não sei mais como eu posso explicar.. Preparei um projeto de exemplo com esse tipo de filtro.. Faz o download aqui e veja como eu implementei:

      https://www.dropbox.com/s/6fgspa8nsr3v2j7/RVFiltroMes.zip?dl=0

      Abraço!
      André Lima

      • ERON disse:

        Oi Andre! Muito Obrigado… estou dando trabalho para vc…., me desculpas.
        Só mais uma informação:
        O Exemplo que vc tem um codígo no Form, que eu não uso.
        Eu uso uma tabela que está dentro do banco de dados (Acess), veja o meu código Atual:

        Public Class FormAniversario
        Private Sub FormAniversario_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ‘TODO: esta linha de código carrega dados na tabela ‘DB_SeoNVDataSet.TabPagamentos’. Você pode movê-la ou removê-la conforme necessário.
        ‘Me.TabPagamentosTableAdapter.Fill(Me.DB_SeoNVDataSet.TabPagamentos)
        ‘TODO: esta linha de código carrega dados na tabela ‘DB_SeoNVDataSet.TabClientes’. Você pode movê-la ou removê-la conforme necessário.
        Me.TabClientesTableAdapter.Fill(Me.DB_SeoNVDataSet.TabClientes)
        Me.ReportViewer1.RefreshReport()
        End Sub

        Private Sub Button1_Click(sender As Object, e As EventArgs)
        Me.Close()

        End Sub

        Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
        Me.ReportViewer1.LocalReport.SetParameters(New Microsoft.Reporting.WinForms.ReportParameter(“FiltroMes”, DirectCast(Nothing, String)))
        Me.ReportViewer1.RefreshReport()
        End Sub

        Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs)

        End Sub

        Private Sub TextBox1_TextChanged_1(sender As Object, e As EventArgs)

        End Sub

        Private Sub TextBox1_TextChanged_2(sender As Object, e As EventArgs)

        End Sub

        Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged

        End Sub

        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Me.ReportViewer1.LocalReport.SetParameters(New Microsoft.Reporting.WinForms.ReportParameter(“FiltroMes”, ComboBox1.SelectedValue.ToString))
        Me.ReportViewer1.RefreshReport()
        End Sub

        Private Sub ReportViewer1_Load(sender As Object, e As EventArgs) Handles ReportViewer1.Load

        End Sub
        End Class

        ——————————-
        As outras configurações que vc me enviou, estão certinhas… só tenho problema em configurar esse codigo do form.
        ——————————–
        Veja neste link o erro que está dando ao carregar o ReportView

        https://drive.google.com/file/d/0B6w5pK7jnl87dGZ1NE5tM1Y5QTg/view?usp=sharing

        Agradeço sua atenção.

        • andrealveslima disse:

          Olá Eron, sem problema.. Mas, não tenho ideia do que possa estar acontecendo.. Tem como compartilhar o seu projeto em algum lugar (no Google Drive, por exemplo) para eu dar uma olhada? Pode mandar o link por e-mail para não deixar público aqui (contato [arroba] andrealveslima [ponto] com [ponto] br)..

          Abraço!
          André Lima

  • ERON disse:

    Oi Bom Dia Andre! Conseguiu baixar o meu sistema??
    Agradeço.

    • andrealveslima disse:

      Olá Eron. Tentei baixar o seu projeto hoje, mas o Google Drive está falando que está com vírus:

      Abraço
      André Lima

      • ERON disse:

        Oi Bom Dia! Acho que era problema no WINRAR, mais compactei com WinZIP e passei anti-virus e não acusou nada. Enviei novamente um email para vc com os Links novos para vc baixar.

        Agradeço sua Atenção.

        Obrigado

        • andrealveslima disse:

          Olá Eron. Consegui baixar o seu projeto, mas estou tendo problema ao compilar (por causa da versão do Report Viewer em um dos relatórios). Para não ficar duplicando conteúdo, vamos continuar discutindo por e-mail e depois a gente coloca o resultado aqui.

          Abraço
          André Lima

  • Romenique Silva Dos Santos disse:

    Muito Bom ! Demorei mas encontrei tudo que eu queria, espero conseguir atualizar o sistema de geração de contra cheques dos funcionários da empresa e deixar de mão o Crystal Report :)

    ps:Sou Estagiário rs

    • andrealveslima disse:

      Olá Romenique, muito obrigado pelo comentário! Fico feliz por ter conseguido ajudar.. Qualquer dificuldade aí, é só entrar em contato..

      Abraço!
      André Lima

  • Matheus disse:

    Boa Noite,
    Andre muito bom seus tutoriais, meus parabéns.
    Estou com problema em passar um paramento para o Report View. dá o seguinte erro: Microsoft.Reporting.WebForms.MissingReportSourceException: ‘A origem da definição do relatório não foi especificada’

    Estou fazendo um projeto em Asp Net MVC 5.

    • andrealveslima disse:

      Olá Matheus!

      Esse erro normalmente acontece quando setamos um caminho incorreto (em disco) para o LocalReport, ou seja, acredito que não tenha nada a ver com a funcionalidade de parâmetros em si.. Como é que está o seu código na hora de carregar o relatório? Se você remove o parâmetro do relatório, ele funciona?

      Abraço!
      André Lima

  • Matheus disse:

    Boa Noite,
    Mesmo eu tirando a linha do código continua dando erro.

    DataSetImagem dataSetImagem = new DataSetImagem();
    DataSet2 dataSetDadosClientes = new DataSet2();
    var id = 11;

    var connectionString = ConfigurationManager.ConnectionStrings[“projetoConnectionString”].ConnectionString;

    SqlConnection conx = new SqlConnection(connectionString);

    SqlDataAdapter adp = new SqlDataAdapter(“SELECT * FROM clientes as c Join clientes_enderecos as ce on c.ClienteId = ce.EnderecoId where ClienteId =” + id+””, conx);
    // SqlDataAdapter adp = new SqlDataAdapter(“SELECT * FROM imagens “, conx);
    adp.Fill(dataSetDadosClientes, dataSetDadosClientes.clientes.TableName);

    adp.Dispose();
    //SqlDataAdapter adp3 = new SqlDataAdapter(“SELECT * FROM clientes as c Join clientes_enderecos as ce on c.ClienteId = ce.EnderecoId where ClienteId =” + id + “”, conx);
    SqlDataAdapter adp3 = new SqlDataAdapter(“SELECT * FROM imagens “, conx);
    adp3.Fill(dataSetImagem, dataSetImagem.imagens.TableName);
    adp3.Dispose();

    var viewer = new Microsoft.Reporting.WebForms.ReportViewer();
    viewer.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Local;
    viewer.LocalReport.EnableExternalImages = true;

    // viewer.LocalReport.SetParameters(new Microsoft.Reporting.WebForms.ReportParameter(“ReportParameter1”, “Matheus”));

    viewer.LocalReport.ReportPath = Request.MapPath(Request.ApplicationPath) + @”Reports\teste.rdlc”;
    //viewer.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource(“DataSet1”, ds.Tables[0])); ds.relatorio.Where(m => m.ClienteId == id).FirstOrDefault())
    viewer.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource(“DataSet1”, dataSetImagem.Tables[0]));
    viewer.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource(“DataSetDados”, dataSetDadosClientes.Tables[0]));
    //viewer.ReportRefresh();

    viewer.SizeToReportContent = true;
    viewer.Width = System.Web.UI.WebControls.Unit.Percentage(100);
    viewer.Height = System.Web.UI.WebControls.Unit.Percentage(100);

    ViewBag.ReportViewer = viewer;

    • andrealveslima disse:

      Olá Matheus!

      Aparentemente está tudo correto.. Você tem certeza que o relatório está no diretório correto? Já tentou colocar um breakpoint depois da linha onde você seta o ReportPath para conferir o caminho que está sendo gerado e se o relatório está presente nele?

      Abraço!
      André Lima

  • Matheus disse:

    Bom dia,
    Andre eu ate criei um relatório novo para fazer o teste, eu rodei ele deu certo.
    Quando eu adicionei essa linha:
    viewer.LocalReport.SetParameters(new Microsoft.Reporting.WebForms.ReportParameter(“ReportParameter1”, “Matheus”));

    deu o erro, mesmo eu tirando a linha o relatorio já não roda mais.

    • andrealveslima disse:

      Olá Matheus!

      Deixa eu entender.. O relatório novo que você criou funcionou até o momento em que você colocou a linha referente aos parâmetros, certo? Qual foi o erro que você recebeu nesse momento?

      Aí você removeu a linha dessa mesma chamada que estava funcionando anteriormente e, mesmo assim, continua dando erro? O erro ainda é o mesmo de anteriormente?

      Abraço!
      André Lima

      • Anderson Machado disse:

        Olá, bom dia.
        André, estou tendo o mesmo problema do Matheus para passagem de paramentros em mvc5.

        Quando retiro a linha abaixo ele funciona:

        relatorio.SetParameters(new Microsoft.Reporting.WebForms.ReportParameter(“DataIni”, “testando”));

        Obrigado.

        • andrealveslima disse:

          Olá Anderson!

          Qual é exatamente o erro que você está recebendo? Você poderia enviar a mensagem de erro? Você tem certeza que o relatório tem esse parâmetro chamado “DataIni” (confira inclusive maiúsculas e minúsculas – o Report Viewer é case sensitive com nomes de parâmetros e datasets)..

          Abraço!
          André Lima

  • Alexandre Ribon disse:

    como abaixar os exemplos sou assinante

  • Olá professor, estou precisando fazer o seguinte…. Gerar um carnê de pagamento que terá entre 1 e 14 parcelas, existe algum forma de eu criar um layout apenas e gerar o relatório com as respectivas parcelas independente se for 1, 2, 3… 14 parcelas????

    Sem a necessidade de criar 14 parâmetros… com o numero da parcela e 14 parâmetros com as datas de vencimento… rsrrs

    ou seja reaproveitar o layout e mudar os parâmetros porém sair tudo em uma unica página…

    • andrealveslima disse:

      Olá Edivan!

      Nesse caso você deveria alimentar o seu relatório com uma DataTable ou classe de dados, e não com parâmetros (que é, a propósito, uma má prática – a funcionalidade de parâmetros servem para passar configurações, opções extras, etc. para o relatório e não todas as informações que devem ser impressas!)..

      O mais fácil é criar um DataSet tipado no seu projeto, adicionar uma DataTable com as informações de uma parcela, aí você adiciona também nessa DataTable um campo chamado “NumeroParcela” e duplica os dados da DataTable N vezes (no seu caso, 14 vezes).. No relatório, você agrupa por esse campo “NumeroParcela” e pronto!

      É muito parecido com o que eu mostrei neste vídeo sobre impressão de múltiplas vias com o Report Viewer:

      Imprimindo múltiplas vias no Report Viewer

      Dá uma olhada nele e veja se você consegue entender a ideia..

      Abraço!
      André Lima

  • Francisco Benedetto disse:

    Bom dia André

    Sou assinante newsletter como faço para baixar os exemplos

    Obrigado

  • Davi Souza disse:

    Boa tarde André!
    Muito bom seus tutoriais. Parabéns.
    Estou com uma dúvida aqui… Estou montando um relatório de fluxo de caixa, no caso tenho 3 colunas [ENTRADA] [SAÍDA] [SALDO], no saldo, como pegar o valor da linha anterior para fazer o cálculo? Não sei se fui muito claro… ou qual melhor maneira que você nos sugere.
    Grande abraço,
    Sucesso!

    • andrealveslima disse:

      Olá Davi, obrigado pelo comentário!

      Normalmente esse tipo de necessidade é solucionada com a expressão RunningValue.. Você conhece ela? Veja mais informações na documentação:

      RunningValue Function

      No seu caso, seria um RunningValue de “Entrada – Saída” para ir acumulando os resultados linha a linha..

      Abraço!
      André Lima

  • DIEGO RODRIGUES FELISBINO disse:

    Olá parabéns pelo tutorial.
    Uma dúvida: quando eu arrasto um parameter para o design do report, ele vem com um tamanho fixo, onde arrastando na altura ou largura, é possível redimensionar.
    No caso onde o valor recebido nesse parameter for variável, como faço para configurar que o tamanho fique dinâmico de acordo com o tamanho recebido?
    Um abraço

  • DIEGO RODRIGUES FELISBINO disse:

    Olá André td bem?
    Estou alterando um relatório em minha empresa, porém estou com um pouco de dificuldade.
    O report é um recibo, semelhante a um extrato de banco, que é impresso diretamente sem utilização de preview
    O desenvolvedor fez o relatório inteiro, utilizando parâmetros (em um total de 34).
    O problema é que 1 desses parâmetros recebe um valor com tamanho dinâmico, ou seja, hora ele ocupará uma linha, hora 4 e etc…
    Quando utilizo o preview, percebo que esse parâmetro é expandido dentro da Page Header. No entanto quando eu mando imprimir, o recibo sai cortado.

    Eu li um outro tutorial seu, onde mostrava exemplo de imprimir utilizando como os valores do deviceInfo, os mesmos valores setados no relatório. Tentei fazer dessa forma, porém tive o mesmo problema (talvez pq o valor fixo da Page, não esteja correta).

    Como “quebra ganho” alterei a altura desse parameter de forma manual, no entanto além de ser perigoso (pode não caber toda informação) quando a informação é menor fica um espaço feio no relatório.

    Tens alguma sugestão?

    Desde já obrigado pela anteção

    • DIEGO RODRIGUES FELISBINO disse:

      Olá André! Por favor pode desconsiderar o meu questionamento…. Acabei descobrindo o problema. Todos os parameters estavam no Page Header e o report nao tinha informações no Body.

      De qualquer forma, obrigado.

  • António de Oliveira disse:

    Boa noite Caro,
    Gostaria de saber como aplicar em aspnet

  • Leonardo disse:

    Boa tarde, tenho acompanhado muito material seu, principalmente na criação de relatórios utilizando o report viewer e gostaria de parabeniza-lo. Material de muito boa qualidade.
    Preciso de sua ajuda…
    Preciso criar um relatório com vários parâmetros opcionais e faria a clausa where de forma dinâmica em tempo de execução. Então gostaria de criar um objeto table como exemplo abaixo:

    string sql = “SELECT Produtos.CodigoProdutoPK AS CodProduto, Produtos.CodigoBarra, Produtos.Nome AS Produto, Produtos.MarcaProduto AS Marca, Produtos.Quantidade, Categorias.CodigoCategoriaPK, Categorias.Nome AS Categoria, ItensdeEntrada.Quantidade AS QtdeItens, ItensdeEntrada.DataValidade, ItensdeEntrada.CodigoProdutoFK FROM Produtos INNER JOIN Categorias ON Produtos.CodigoCategoriaFK = Categorias.CodigoCategoriaPK INNER JOIN ItensdeEntrada ON Produtos.CodigoProdutoPK = ItensdeEntrada.CodigoProdutoFK”;

    SqlConnection con = new SqlConnection(connectionString);
    SqlCommand cmd = new SqlCommand(sql, con);
    cmd.CommandType = CommandType.Text;

    con.Open();

    try
    {
    DataTable table = new DataTable();
    table.Load(cmd.ExecuteReader());
    //grdBaiProd.DataSource = table; (Gostaria de fazer com o reportviewer o mesmo que estou fazendo com a grid)

    }

    finally
    {
    con.Close();

    }

    Gostaria de carregar o objeto “DataTable table” para preencher o tablix no reportviewer1. Tem ideia de como poderia fazer isso?
    Não sei se conseguir ser claro ao expor minha dúvida.
    Grato pela atenção

  • Rodrigo Camargo dos Santos disse:

    André, bom dia!

    Estou criando um recibo simples de pagamento e está apresentando o erro abaixo: É um erro de tratamento de exceção de valor extenso.Como devo corrigir?

    Obrigado
    Microsoft.Reporting.WinForms.LocalProcessingException
    HResult=0x80131500
    Message=Ocorreu um erro durante o processamento de relatórios local.
    Source=Microsoft.ReportViewer.WinForms
    StackTrace:
    em Microsoft.Reporting.WinForms.LocalReport.SetParameters(IEnumerable`1 parameters)
    em Recibo.Recibo..ctor(String Nome, String Valor, String Valor_Extenso, String Data, String Serviço, String Empresa) em C:\Users\rocam\source\repos\Recibo\Recibo\Recibo.cs:linha 33
    em Recibo.Form1.button1_Click(Object sender, EventArgs e) em C:\Users\rocam\source\repos\Recibo\Recibo\Form1.cs:linha 22
    em System.Windows.Forms.Control.OnClick(EventArgs e)
    em System.Windows.Forms.Button.OnClick(EventArgs e)
    em System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
    em System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
    em System.Windows.Forms.Control.WndProc(Message& m)
    em System.Windows.Forms.ButtonBase.WndProc(Message& m)
    em System.Windows.Forms.Button.WndProc(Message& m)
    em System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    em System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    em System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    em System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    em System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
    em System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    em System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    em System.Windows.Forms.Application.Run(Form mainForm)
    em Recibo.Program.Main() em C:\Users\rocam\source\repos\Recibo\Recibo\Program.cs:linha 19

    Exceção interna 1:
    UnknownReportParameterException: Tentativa de configurar um parâmetro de relatório ‘Valor_Extenso’ que não está definido neste relatório.

    • andrealveslima disse:

      Olá Rodrigo!

      Na verdade o erro que você está recebendo é que o parâmetro “Valor_Extenso” não está definido no relatório.. Você já conferiu se o nome do parâmetro é esse mesmo? Ele deve bater 100% com o que está definido no relatório (inclusive letras maiúsculas e minúsculas)..

      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 *