14 06 2017
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/
Aplicações Android com Xamarin – Parte 2 de N – Ambiente Xamarin Android e Hello World Como atualizar aplicações .NET automaticamente?
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
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:
Abraço!
André Lima
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
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
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
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:
Dessa forma o relatório só exibirá os registros que sejam do mês selecionado..
Entendeu a ideia?
Abraço!
André Lima
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!
Olá Julio, muito obrigado pelo comentário!
Que pena que o vídeo acabou chegando muito tarde para você.. Mas, como você disse, espero que ele ajude outras pessoas que passem pela mesma dificuldade no futuro.. :)
Abraço!
André Lima
Achei massa, porém não entendi!
Olá Adan, obrigado pelo comentário!
Qual parte você nao entendeu, exatamente?
Abraço!
André Lima
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?
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
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
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
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.,
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:
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
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.
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
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.
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
Ok, enviei para o seu email.
Muito obrigado pela atenção.
Abraços.
Oi Bom Dia Andre! Conseguiu baixar o meu sistema??
Agradeço.
Olá Eron. Tentei baixar o seu projeto hoje, mas o Google Drive está falando que está com vírus:
Abraço
André Lima
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
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
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
Olá Romenique, muito obrigado pelo comentário! Fico feliz por ter conseguido ajudar.. Qualquer dificuldade aí, é só entrar em contato..
Abraço!
André Lima
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.
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
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;
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
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.
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
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.
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
como abaixar os exemplos sou assinante
Olá Alexandre! Mandei as instruções no seu e-mail..
Abraço!
André Lima
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…
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
Bom dia André
Sou assinante newsletter como faço para baixar os exemplos
Obrigado
Olá Francisco!
Acabei de mandar um e-mail para você com o link.. Qualquer coisa é só falar..
Abraço!
André Lima
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!
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
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
Olá Diego!
Você já deu uma olhada nas propriedades “CanGrow” e “CanShrink”? Acredito que seja isso que você está procurando.. Veja este artigo também, pode ser útil:
CanShrink and CanGrow Behaviors
Abraço!
André Lima
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
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.
Beleza, Diego.. Que bom que você acabou conseguindo resolver.. Qualquer coisa estamos aí..
Abraço!
André Lima
Boa noite Caro,
Gostaria de saber como aplicar em aspnet
Olá António!
No ASP NET é exatamente do mesmo jeito.. Qual é a dificuldade que você está tendo exatamente?
Abraço!
André Lima
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
Olá Leonardo!
Para carregar essa DataTable no seu relatório, você só precisa setar ela como DataSource do relatório.. Eu acredito que este meu outro artigo vai te ajudar (principalmente a seção “Criando e passando um DataSet não tipado”, só que no seu caso você já tem a DataTable pronta):
Passando um DataSet não tipado para o Report Viewer
Abraço!
André Lima
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.
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