Usuário com melhor resposta
Mostrar Dados ReportViewer C#

Pergunta
-
Bom dia!
Caros colegas eu criei um relatório para gerar pedido de compras.
Conforme observei em um webcast do próprio fórum eu consegui criar um DataSet com meu banco MySQL, selecionar os campos criar o design do relatório e tudo mais.
O problema é que meus dados não estão aparecendo no relatório porque eu não consegui evoluir no código própriamente dito. Preciso saber se alguém pode dar um exemplo ou link onde eu possa ver como trabalhar meu código fonte para que estes dados sejam mostrados.
Quando eu criei um form para visualizar meu relatório eu apontei para o Data Souce criado porém a parte do código para que o relatório seja mostrado eu não consegui...
Preciso de um força...
Valeuu grande abraço a todos.
Léo
Respostas
-
Então, ao criar o dataset pelo wizard você definiu a QUERY (consulta) para determinar os pedidos que seriam retornados do banco de dados, este wizard gera um arquivo (.xsd), com a definição do dataset, para você alterar esta consulta basta você abrir este arquivo, clicar com o botão direito sobre o tableadapter refetente a consulta e clicar em Configure, então supondo que sua consulta anterior estivesse assim:
SELECT NUMERO_PEDIDO,DATA_PEDIDO FROM PEDIDO (Aonde estaria retornando todos os pedidos)
você colocaria assim:
SELECT NUMERO_PEDIDO,DATA_PEDIDO FROM PEDIDO WHERE NUMERO_PEDIDO = @NUMERO_PEDIDO
(Neste caso você retornaria somente um pedido de acordo com o número passado como parâmetro)
Feito isto, o método Fill automaticamente receberá mais um parâmetro (além do dataSet) que é justamente o número do pedido:
private void Form2_Load(object sender, EventArgs e)
{
int numeroPedido = 2;
this.pedidoTableAdapter.Fill(this.DataSet1.pedido,numeroPedido);
this.reportViewer1.RefreshReport();
}
Existe também uma forma de tratar o recebimento ou não do parâmetro, por exemplo algumas vezes eu poderia retornar todos os pedidos e outras vezes somente um pedido especifico, aí neste caso ficaria assim:
SELECT NUMERO_PEDIDO,DATA_PEDIDO FROM PEDIDO WHERE (NUMERO_PEDIDO IS NULL OR
NUMERO_PEDIDO = @NUMERO_PEDIDO)
Ou seja se número do pedido passado como parâmetro for nulo retornará todos, caso contrário retornará somente um pedido especifico, aí no código poderia ficar assim no evento de click de um botao filtrar por exemplo:
private void Button1_Click(object sender, EventArgs e)
{
if(!string.isNullOrEmpty(txtNumeroPedido.Text))
{
this.pedidoTableAdapter.Fill(this.DataSet1.pedido,int.Parse(txtNumeroPedido.Text));}
else
{
this.pedidoTableAdapter.Fill(this.DataSet1.pedido,null);}
this.reportViewer1.RefreshReport();
}
Espero ter ajudado
Todas as Respostas
-
Bom Dia, olha como você está em um forum de desenvolvimento geral em .NET fica um pouco confuso para saber qual ReportViewer você está usando, pois até onde eu sei existem 3 ou 4, e o funcionamento deles pode ser um pouco diferente:
ReportViewer WinForms --> Microsoft.Reporting.WinForms.ReportViewer
ReportViewer WebForms --> Microsoft.Reporting.WebForms.ReportViewer
ReportViewer Crystal --> CrystalDecisions.Windows.Forms.CrystalReportViewer
No ultimo caso eu faço da seguinte forma
private void loadReport()
{
Administrativo.Rpt.RelatorioHorasTrabalhadas rptHorasTrabalhadas = new Administrativo.Rpt.RelatorioHorasTrabalhadas();
rptHorasTrabalhadas.SetParameterValue("@DATA_INICIAL", dtpDataInicial.Value);
rptHorasTrabalhadas.SetParameterValue("@DATA_FINAL", dtpDataFinal.Value);
rptHorasTrabalhadas.SetParameterValue("@ID_USUARIO", null);
rptHorasTrabalhadas.SetDatabaseLogon("login", "senha");
crystalReportViewer1.ReportSource = rptHorasTrabalhadas; //Veja se não é esta linha que está faltando
}
Se não for este o ReportViewer que você está falando peço que especifique qual -
Marcus, você tem razão... na verdade o que eu me refiro é o "ReportViewer WinForms".
Bom até o momento eu até consegui evoluir um pouco no sentido de conseguir mostrar meus dados no relatório pois no momento em que eu criei a parte de visualização eu apontei para meu DataSet criado.
Porém a dúvida ainda permanece pois eu quero trabalhar com filtros etc... para que o usuário consiga trabalhar de diversas formas com o relatório seja por exemplo informações de nível analíto ou sintético.
é possível ???
abraço -
Olá, se você estiver usando um DataSet Tipado com Table Adapter basta na montagem da query você pode incluir os filtros
por exemplo:
SELECT ID_USUARIO,NOME FROM USUARIO WHERE (@NOME IS NULL OR NOME LIKE '%'+ @NOME +'%')
Na query a cima se o nome tiver nulo ele retornará todos, ai na hora de executar o método Fill do TableAdapter você já pode passar o parâmetro
SeuTableAdapter.Fill(SeuDataSet, "marcus");
Agora se você quiser passar os parâmetros diretamente para o relatório seria algo deste tipo:
{
ReportParameter parametro1 = new ReportParameter("NOME", "Marcus");
ReportViewer1.LocalReport.ReportPath = "caminhodoarquivodorelatorio";
ReportViewer1.LocalReport.SetParameters(parametro1);
ReportViewer1.RefreshReport();
} -
-
Léo,
Você fez o download dos 3 vídeos e dos arquivos com código fonte? Todos os exemplos que eu apresentei nos vídeos (inclusive em MySQL) estão disponiveis para download no próprio Media Center.
Os exemplos estão em VB.NET mais é muito fácil converter para C# .
Uma outra dica:
Criei um tópico fixo no fórum MSDN com algumas dicas sobre a construção de relatórios com Crystal Reports e ReportView (incluindo 3 vídeos com vários exemplos de como construir relatórios com os componentes, licença, distribuição, service packs, etc.):
Inclusive com um exemplo passo a passo de como criar um relatório com Crystal Reports e ReportViewer utilizando grupos.
http://forums.microsoft.com/MSDN-BR/ShowPost.aspx?PostID=3761576&SiteID=21
[ ]'sLaércio.
Ajude a melhorar o nosso Fórum!
Não esqueça de marca a mensagem como "útil", caso tenha ajudado. -
Pra mim não ficou muito claro pois nunca usei o reportviewer, mais seguinte quando eu gerei o DataSet foi pelo wizard sabe, tipo ao criar um DataSet tem a opção de selecionar os campos etc...
Associei ao componente Reportviewer o ReportXXX.rdlc depois de devidamente configurado o relatório.
Quando eu abro o Form2.cs te o seguinte código:
private void Form2_Load(object sender, EventArgs e)
{
// TODO: This line of code loads data into the 'DataSet1.pedido' table. You can move, or remove it, as needed.
this.pedidoTableAdapter.Fill(this.DataSet1.pedido);
this.reportViewer1.RefreshReport();
}
Só que no meu caso eu preciso que seja impresso um pedido por vez e não um relatório com todos os pedidos.
A minha pergunta é, eu consigo alterar o select dentro deste código ? e de que forma poderia fazer isto?
Pq ao meu ver seria muito mais fácil eu alterar no próprio fonte Form2.cs se é que isto é possível.
Valeuu -
Então, ao criar o dataset pelo wizard você definiu a QUERY (consulta) para determinar os pedidos que seriam retornados do banco de dados, este wizard gera um arquivo (.xsd), com a definição do dataset, para você alterar esta consulta basta você abrir este arquivo, clicar com o botão direito sobre o tableadapter refetente a consulta e clicar em Configure, então supondo que sua consulta anterior estivesse assim:
SELECT NUMERO_PEDIDO,DATA_PEDIDO FROM PEDIDO (Aonde estaria retornando todos os pedidos)
você colocaria assim:
SELECT NUMERO_PEDIDO,DATA_PEDIDO FROM PEDIDO WHERE NUMERO_PEDIDO = @NUMERO_PEDIDO
(Neste caso você retornaria somente um pedido de acordo com o número passado como parâmetro)
Feito isto, o método Fill automaticamente receberá mais um parâmetro (além do dataSet) que é justamente o número do pedido:
private void Form2_Load(object sender, EventArgs e)
{
int numeroPedido = 2;
this.pedidoTableAdapter.Fill(this.DataSet1.pedido,numeroPedido);
this.reportViewer1.RefreshReport();
}
Existe também uma forma de tratar o recebimento ou não do parâmetro, por exemplo algumas vezes eu poderia retornar todos os pedidos e outras vezes somente um pedido especifico, aí neste caso ficaria assim:
SELECT NUMERO_PEDIDO,DATA_PEDIDO FROM PEDIDO WHERE (NUMERO_PEDIDO IS NULL OR
NUMERO_PEDIDO = @NUMERO_PEDIDO)
Ou seja se número do pedido passado como parâmetro for nulo retornará todos, caso contrário retornará somente um pedido especifico, aí no código poderia ficar assim no evento de click de um botao filtrar por exemplo:
private void Button1_Click(object sender, EventArgs e)
{
if(!string.isNullOrEmpty(txtNumeroPedido.Text))
{
this.pedidoTableAdapter.Fill(this.DataSet1.pedido,int.Parse(txtNumeroPedido.Text));}
else
{
this.pedidoTableAdapter.Fill(this.DataSet1.pedido,null);}
this.reportViewer1.RefreshReport();
}
Espero ter ajudado -
-
http://www.stjhimy.com/2009/10/25/reportviewer-and-linq-to-sql-a-better-way-to-report-your-applications/Esse link facilita pra fazer os relatórios das aplicações, escrevi faz pouco tempo.
Espero que ajude.- Sugerido como Resposta JC_KAKA sábado, 22 de maio de 2010 23:43
-
Olá Boa Noite, alguem poderia me enviar um exemplo com report vierwer com parametros.
Não estou conseguindo de jeito nenhum fazer o reportviewer com parametros;
Já vi em vários sites inclusive aqui, mas não consegui acertar na criação do parametro, devo estar pecando em algum detalhe. Por isso peço por gentileza algum exmplo com parametro enviar para mim ou postar pra mim.
Estou usuando o vs 2008 e programando em c#. Obrigado a todos e fico no aguardo!!!!!
-
Então, ao criar o dataset pelo wizard você definiu a QUERY (consulta) para determinar os pedidos que seriam retornados do banco de dados, este wizard gera um arquivo (.xsd), com a definição do dataset, para você alterar esta consulta basta você abrir este arquivo, clicar com o botão direito sobre o tableadapter refetente a consulta e clicar em Configure, então supondo que sua consulta anterior estivesse assim:
SELECT NUMERO_PEDIDO,DATA_PEDIDO FROM PEDIDO (Aonde estaria retornando todos os pedidos)
você colocaria assim:
SELECT NUMERO_PEDIDO,DATA_PEDIDO FROM PEDIDO WHERE NUMERO_PEDIDO = @NUMERO_PEDIDO
(Neste caso você retornaria somente um pedido de acordo com o número passado como parâmetro)
Feito isto, o método Fill automaticamente receberá mais um parâmetro (além do dataSet) que é justamente o número do pedido:
private void Form2_Load(object sender, EventArgs e)
{
int numeroPedido = 2;
this.pedidoTableAdapter.Fill(this.DataSet1.pedido,numeroPedido);
this.reportViewer1.RefreshReport();
}
Existe também uma forma de tratar o recebimento ou não do parâmetro, por exemplo algumas vezes eu poderia retornar todos os pedidos e outras vezes somente um pedido especifico, aí neste caso ficaria assim:
SELECT NUMERO_PEDIDO,DATA_PEDIDO FROM PEDIDO WHERE (NUMERO_PEDIDO IS NULL OR
NUMERO_PEDIDO = @NUMERO_PEDIDO)
Ou seja se número do pedido passado como parâmetro for nulo retornará todos, caso contrário retornará somente um pedido especifico, aí no código poderia ficar assim no evento de click de um botao filtrar por exemplo:
private void Button1_Click(object sender, EventArgs e)
{
if(!string.isNullOrEmpty(txtNumeroPedido.Text))
{
this.pedidoTableAdapter.Fill(this.DataSet1.pedido,int.Parse(txtNumeroPedido.Text));}
else
{
this.pedidoTableAdapter.Fill(this.DataSet1.pedido,null);}
this.reportViewer1.RefreshReport();
}
Espero ter ajudado
Sem querer dar uma de coveiro em um post de 2009, mas precisei fazer um comentário. Cara eu to a quase 1 semana tentando fazer isso que tu mostrou, precisava criar um reportviewer mas com uma cláusula WHERE na query e não sabia como fazer, tentei de tudo. Mas não fazia ideia q dentro do menu "Configure" eu podia usar o "@data", pois eu faço isso mas com o MySqlCommand... E bastava apenas passar o valor na chamada do método, muito simples cara, mais uma valiosa lição aprendida, só queria dizer.... MUITO OBRIGADO MARCUS PAULO GHELLI =) continue compartilhando seu conhecimento com nos mais desprovidos deste...
Valeu Cara ;D