Você está na página 1de 9

ADSystems – Agile Development Blog » Tutorial C# – Relatórios Mast

Home

Feed Artigos Comentários

file:///C:/Documents and Settings/WC/Desktop/Pendencias/Asp.Net/Tut

.NET &TI &Tutorial André Dourado em 10 Apr 2009

Tutorial C# – Relatórios Master Detail utilizando Reportviewer (com subreports)

Por: André Dourado

Existem duas formas de desenvolver relatórios master-detail utilizando o Reportviewer. A primeira opção é utilizar subreports. A segunda, que oferece melhor performance, é utilizar aninhamento de regiões.

Neste tutorial será mostrado como utilizar o Reportviewer para criação de relatórios master-detail através do uso de subreports.

Fontes: RelatorioTeste.zip (57K)

1.Crie um projeto chamado RelatorioTeste;

2.Crie para este exemplo, classes de manipulação dos dados. Por serem apenas classes para efeito didático, não se preocupe com acessos a banco. São classes apenas para prover dados para o relatório. Para este exemplo definiremos classes que representam Clientes e os Contatos desses Clientes.

Cliente.cs

using System; using System.Collections.Generic; using System.Linq; using System.Text;

namespace RelatorioTeste

{

 

public class Cliente

{

public Int32 clienteId { get; set; } public String clienteNome { get; set; }

public Cliente()

{

}

}

}

ClienteDAO.cs

using System; using System.Collections.Generic; using System.Linq; using System.Text;

namespace RelatorioTeste

{

class ClienteDAO

{

public List getAll()

{

List listaCliente = new List();

Cliente cliente1 = new Cliente(); cliente1.clienteId = 1; cliente1.clienteNome = "Empresa Xyz S.A.";

listaCliente.Add(cliente1);

Cliente cliente2 = new Cliente(); cliente2.clienteId = 2; cliente2.clienteNome = "Empresa Klz Ltda.";

ADSystems – Agile Development Blog » Tutorial C# – Relatórios Mast

listaCliente.Add(cliente2);

return listaCliente;

}

}

}

Contato.cs

using System; using System.Collections.Generic; using System.Linq; using System.Text;

namespace RelatorioTeste

{

 

class Contato

{

public Int32 contatoId { get; set; } public String contatoNome { get; set; } public Int32 clienteId { get; set; }

public Contato()

{

}

}

}

ContatoDAO.cs

using System; using System.Collections.Generic; using System.Linq; using System.Text;

namespace RelatorioTeste

{

class ContatoDAO

{

public List getByCodigo(Int32 clienteId)

{

List listaContato = new List();

switch (clienteId)

{

case 1:

file:///C:/Documents and Settings/WC/Desktop/Pendencias/Asp.Net/Tut

Contato contato1 = new Contato(); contato1.contatoId = 1; contato1.contatoNome = "Fulano de Tal da Empresa 1"; contato1.clienteId = 1;

listaContato.Add(contato1);

Contato contato2 = new Contato(); contato2.contatoId = 2; contato2.contatoNome = "Ciclano de Tal da Empresa 1"; contato2.clienteId = 1;

listaContato.Add(contato2);

Contato contato3 = new Contato(); contato3.contatoId = 3; contato3.contatoNome = "Antitese de Tal da Empresa 1"; contato3.clienteId = 1;

listaContato.Add(contato3);

break;

case 2:

Contato contato4 = new Contato(); contato4.contatoId = 4; contato4.contatoNome = "Fulano de Tal da Empresa 2"; contato4.clienteId = 2;

listaContato.Add(contato4);

Contato contato5 = new Contato(); contato5.contatoId = 5; contato5.contatoNome = "Ciclano de Tal da Empresa 2"; contato5.clienteId = 2;

listaContato.Add(contato5);

Contato contato6 = new Contato(); contato6.contatoId = 6; contato6.contatoNome = "Antitese de Tal da Empresa 2"; contato6.clienteId = 2;

ADSystems – Agile Development Blog » Tutorial C# – Relatórios Mast

listaContato.Add(contato6);

file:///C:/Documents and Settings/WC/Desktop/Pendencias/Asp.Net/Tut

Contato contato7 = new Contato(); contato7.contatoId = 7; contato7.contatoNome = "Prognostico de Tal da Empresa 2"; contato7.clienteId = 2;

listaContato.Add(contato7);

}

break;

return listaContato;

}

}

}

3.Adicione os DataSources ao projeto

1. Utilizando o menu do VS: “Data > Add New Data Source…”;

2. Escolha o tipo “Object” e clique em Next;

3. Selecione na árvore de objetos do projeto o objeto “Cliente” e clique em “Finish”;

4. Repita o passo 3, selecionando agora o objeto “Contato”;

4.Crie o relatório “master”:

1. Na janela “Solution Explorer” clique com o botão da direita do mouse sobre o projeto “RelatorioTeste”;

2. Selecione as opções “Add” e depois “New Item…”. Selecione o template “Report” e clique sobre o botão “Add”. O nome desse primeiro report deverá receber o nome “Report1.rdlc”;

3. Na janela “Solution Explorer” dê duplo clique sobre o objeto “Report1.rdlc”;

4. Na janela “ToolBox”, na divisão “Reporting Items” clique sobre o componente “List” e arraste até o “Report1 ;

5. Na janela “ToolBox”, na divisão “Reporting Items” clique sobre o componente “Textbox” e arraste para o interior do “List”;

6. Na janela “Data Sources” selecione a propriedade “clienteId” do datasource “Cliente” e arraste para o interior do TextBox criado no passo 4;

7. Repita os passos 4 e 5 para a propriedade “clienteNome”;

8. Na janela “ToolBox”, na divisão “Reporting Items” clique sobre o componente “Subreport” e arraste para o interior do “List”;

5.Crie o relatório “detail”:

1. Na janela “Solution Explorer” clique com o botão da direita do mouse sobre o projeto “RelatorioTeste”. Selecione as opções “Add” e depois “New Item…”. Selecione o template “Report” e clique sobre o botão “Add”. O nome desse primeiro report deverá receber o nome “Report2.rdlc”;

2. Na janela “Solution Explorer” dê duplo clique sobre o objeto “Report2.rdlc”;

3. Na janela “ToolBox”, na divisão “Reporting Items” clique sobre o componente “List” e arraste até o “Report2 ;

4. Na janela “ToolBox”, na divisão “Reporting Items” clique sobre o componente “Textbox” e arraste para o interior do “List”;

5. Na janela “Data Sources” selecione a propriedade “contatoId” do datasource “Contato” e arraste para o interior do TextBox criado no passo 4;

6. Repita os passos 4 e 5 para a propriedade “contatoNome”;

6.Utilize o formulário “Form1 para armazenar o componente ReportViewer:

1. Na janela “Solution Explorer” dê duplo clique sobre o objeto “Form1 ;

2. Na janela “ToolBox”, na divisão “Reporting” clique sobre o componente “MicrosoftReportViewer” e arraste até o “Form1

3. Selecione qual o relatório será exibido pelo ReportViewer. Selecione “RelatorioTeste.Report1 , conforme a tela a seguir:

7.Crie o parà¢metro do report.

1. Na janela “Solution Explorer” dê duplo clique sobre o objeto “Report2.rdlc”;

2. No menu do VS selecione a opção: “Report > Report Parameters…”;

3. Na tela de definição de Parà¢metros clique sobre o botão “Add” e defina o parà¢metro “parCodigoCliente”, conforme a tela a seguir. Ao final clique no botão “Ok”;

ADSystems – Agile Development Blog » Tutorial C# – Relatórios Mast

8.Defina o subreport que será exibido.

file:///C:/Documents and Settings/WC/Desktop/Pendencias/Asp.Net/Tut

1. Na janela “Solution Explorer” dê duplo clique sobre o objeto “Report1.rdlc”;

2. Clique com o botão da direita do mouse sobre o componente “Subreport”. Selecione a opção “Properties”. Na aba “General” selecione no campo “Subreport:” o report “Report2 ;

9.Crie o parà¢metro do subreport.

1. Selecione a aba “Parameters”;

2. Selecione nos campos as opções de forma que fiquem como a tela a seguir:

10.Crie os métodos de alimentação dos dados para os reports:

1. Na janela “Solution Explorer” dê duplo clique sobre o objeto “Form1.cs”;

2. No formulário dê duplo clique sobre o título do Formulário, ou selecione nos eventos do form o evento “Load”;

3. Insira no evento “Form1_Load” o seguinte código:

private void Form1_Load(object sender, EventArgs e)

{

reportViewer1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(LocalReport_SubreportProcessing);

ClienteDAO clienteDAO = new ClienteDAO(); List listaCliente = new List(); listaCliente = clienteDAO.getAll();

ClienteBindingSource.DataSource = listaCliente;

reportViewer1.RefreshReport();

}

void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e)

{

 

int codigoCliente = Int32.Parse(e.Parameters["parCodigoCliente"].Values[0]);

ContatoDAO contatoDAO = new ContatoDAO(); List listaContato = new List(); listaContato = contatoDAO.getByCodigo(codigoCliente);

e.DataSources.Add(new ReportDataSource("RelatorioTeste_Contato", listaContato));

}

Na linha: e.DataSources.Add(new ReportDataSource(“RelatorioTeste_Contato”, listaContato)), “RelatorioTeste_Contato” corresponde ao namespace (RelatorioTeste) onde o objeto (Contato) está armazenado. Sendo que o objeto (Contato), que pode ser um POCO/VO/TO/DTO (não defendendo nenhuma pattern em especial, apenas para efeito didático), contém as definições das propriedades utilizadas no subreport.

11.Execute o projeto. O resultado obtido deve ser semelhante a esse:

Referência: got reportviewer?

12,909 views

Comments (15)

15 Comentários para “Tutorial C# – Relatórios Master Detail utilizando Reportviewer (com subreports)”

1. em 11 Apr 2009 às 15:35 1.Paulo Barros escreveu …

É sempre bom termos acesso a um tutorial como esse, feito por especialistas no assunto !!

ADSystems – Agile Development Blog » Tutorial C# – Relatórios Mast

file:///C:/Documents and Settings/WC/Desktop/Pendencias/Asp.Net/Tut

2. em 06 May 2009 às 12:08 2.Relatórios em .NET: ReportViewer e NHibernate « Reginaldo Jr. Weblog escreveu …

[

]

http://adsystemsblog.audits.com.br/2009/04/10/tutorial-c-relatorios-master-detail-com-reportviewer/ [

3. em 26 Jun 2009 às 15:06 3.Rodrigo escreveu …

]

Muito bom o artigo! Gostaria de saber se tem como fazer o relatório com composição de objetos.

Ex:

public class Cliente

{

public string Nome

{

get;

set;

}

}

public class Pedido

{

private int id = 0; private Cliente cliente;

public int Id

{

get { return this.id; } set { this.id = value; }

}

public Cliente Cliente

{

get { return cliente; }

set { cliente = value; }

}

}

IList pedido = new List();

Como exibir o nome do cliente no relatório?

4. em 16 Nov 2009 às 13:29 4.Jonas escreveu …

Muito legal o Artigo. Mais queria saber se tem como informar no reportviewer o envio do relatório com a propriedade duplex, para que seja impressa frente e verso da folha????

5. em 04 Feb 2010 às 14:05 5.Rafael escreveu …

Aew galera, não estou achando a solução para o seguinte problema:

Ao exportar um relatório feito no Report Viewer para pdf algumas fontes não aparecem, mas quando exporto para excel fica perfeito!

Alguma idéia do que pode ser ?

6. em 17 Feb 2010 às 16:05 6.Alexandre escreveu …

Olá,

Este artigo me ajudou muito no meu aprendizado. O que saber acho que é simples: Montei um report, porém os títulos dos campos eu gostaria de passar por parà¢metro, pois meu report pode ser emitido em outras linguagens. Como faço para substituir um texto fixo do rdlc por um texto passado por código? Obrigado.

7. em 21 May 2010 às 12:35 7.Abinalio escreveu …

Muito legal este artigo!

ADSystems – Agile Development Blog » Tutorial C# – Relatórios Mast

file:///C:/Documents and Settings/WC/Desktop/Pendencias/Asp.Net/Tut

Alguém consegue fazer isso com o ReportViewer para Web.

Abinálio

8.

em 08 Jul 2010 às 20:11 8.Bruno Britto escreveu …

Gostaria de saber em qual versão do VS que esta sendo utilizado no exemplo, pois já tentei realizar o tutorial tanto no VS 2008 express como do 2010 profissional

9.

em 08 Jul 2010 às 20:23 9.André Dourado escreveu …

Usei o VS 2008. Qual problem vc está tendo?

10.

em 09 Jul 2010 às 11:30 10.Bruno Britto escreveu …

Esta indo tudo certo até que chega no item 7, quando temos que acessar o menu REPORT > REPORT PARAMETERS, não aparece o item report parameters estou usando o VS 2008 express, será que é isso?, qual a versão que Senhor usou?

11.

em 09 Jul 2010 às 12:31 11.Bruno Britto escreveu …

Mandei até algumas mesagens para o twitter do senhor o meu é @BrunoBrittoPB

12.

em 11 Feb 2011 às 17:02 12.Danilo escreveu …

Poderia me auxiliar com o erro abaixo:

Data retrieval failed for the subreport, ‘SubreportReferencia’, located at:

Representacao.Reports.ReportReferencia.rdlc. Please check the log files for more

Não estou conseguindo fazer o subreport funcionar conforme o exemplo postado.

Obrigado

Fonte:

public partial class FmrVisualizarPedido : Form

{

private DataTable dataTable; private clReferenciaBLL clReferencia = new clReferenciaBLL(); private VisualizarPedidoObject visualizarPedidoObject = new VisualizarPedidoObject();

public FmrVisualizarPedido(DataTable dataTable)

{

this.dataTable = dataTable; InitializeComponent();

}

private void FmrVisualizarPedido_Load(object sender, EventArgs e)

{

reportViewer1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(LocalReport_SubreportProcessing);

visualizarPedidoObject.totalPedido = dataTable.Rows[0]["total_pedido"].ToString();

VisualizarPedidoObjectBindingSource.DataSource = visualizarPedidoObject;

this.reportViewer1.RefreshReport();

}

void LocalReport_SubreportProcessing(object sender, SubreportProcessingEventArgs e)

{

DataTable dtReferencia = clReferencia.GetReferenciaByCodCliente(1);

//List listaItemPedido = new List(); List listaReferencias = new List();

ReferenciasObject referenciasObject = new ReferenciasObject();

ADSystems – Agile Development Blog » Tutorial C# – Relatórios Mast

file:///C:/Documents and Settings/WC/Desktop/Pendencias/Asp.Net/Tut

foreach (DataRow dr in dtReferencia.Rows)

{

referenciasObject.nomeReferencia = dr["nome"].ToString(); referenciasObject.telefone = dr["telefone"].ToString(); referenciasObject.tipoReferencia = dr["tipo_referencia"].ToString();

listaReferencias.Add(referenciasObject);

}

//e.DataSources.Add(new ReportDataSource(“ReportItemPedido.rdlc”, listaItemPedido)); e.DataSources.Add(new ReportDataSource(“Representacao_ReferenciasObject”, listaReferencias));

}

13. em 12 Apr 2012 às 16:46 13.junior escreveu …

André tenho um relatorio em landscape com 11 colunas e preciso trazer o campo observação, sendo que esse campo é um texto então queria traze-lo abaixo de cada linha, pensei assim inserir uma linha unica abaixo de cada linha do registro onde estão as 11 colunas será que deu pra vc entender ? Será que subreport resolveria meu caso, a tabela é a mesma.Meu relatorio está agrupado por data e uso o vs2010.

14. em 13 Apr 2012 às 08:27 14.André Dourado escreveu …

Junior,

não tenho mais trabalhado com VS. Nem ao menos tenho como testar para lhe ajudar no momento.

Já tentou usar listas?

http://www.gotreportviewer.com/lists/index.html

http://www.gotreportviewer.com/objectdatasources/index.html

Espero ter ajudado de alguma forma.

Abraços,

André Dourado

15. em 29 Aug 2012 às 14:24 15.Junior escreveu …

André se eu quisesse fazer esse mesmo relatório que vc fez sendo que usando TableAdapter pois uso consultas no banco direto, pois meu sistema é pequeno e não estou usando classes.Na minha consulta já estou fazendo os joins é assim tenho uma tabela de pedido e outra de itens do pedido.Nesse TableAdapter já trago a consulta pronta.

Trackback esse post | Subscreva os comentários pelo RSS Feed

Deixe um comentário

Subscreva os comentários pelo RSS Feed Deixe um comentário Nome (required) E-Mail (não será publicado) (required)
Subscreva os comentários pelo RSS Feed Deixe um comentário Nome (required) E-Mail (não será publicado) (required)
Subscreva os comentários pelo RSS Feed Deixe um comentário Nome (required) E-Mail (não será publicado) (required)

Nome (required)

E-Mail (não será publicado) (required)

Website

(required) E-Mail (não será publicado) (required) Website Notify me of follow-up comments by email. 7 de
(required) E-Mail (não será publicado) (required) Website Notify me of follow-up comments by email. 7 de
(required) E-Mail (não será publicado) (required) Website Notify me of follow-up comments by email. 7 de

Notify me of follow-up comments by email.

ADSystems – Agile Development Blog » Tutorial C# – Relatórios Mast

file:///C:/Documents and Settings/WC/Desktop/Pendencias/Asp.Net/Tut

and Settings/WC/Desktop/Pendencias/Asp.Net/Tut Notify me of new posts by email. André Dourado Olá! Desde

Notify me of new posts by email.

André Dourado

Olá! Desde que coloquei o site ADSystems no ar, senti falta de uma forma simples de publicar artigos, vídeos, comentários, enfim tudo de interessante que vou encontrando pela web, relacionado ou não à área de TI ou mesmo à agilidade. Que forma poderia ser mais interessante que um blog? Espero que gostem, retornem e mantenham contato. Sejam bem vindos.

que gostem, retornem e mantenham contato. Sejam bem vindos. View Andre ' Search Categories .NET (19)
View Andre '

View Andre

'

Search

contato. Sejam bem vindos. View Andre ' Search Categories .NET (19) Agile (157) best (2) BI

Categories

.NET (19) Agile (157) best (2) BI (1) Blog (4) BYOD (1) Carreira (106) CEP (3) CIO (25) Cloud (1) Cobit (1) Costumes (8) Curriculo (16) Desenvolvimento (185) ERP (13) Estatística (11) Frases (1) Gartner (7) Gestão (34) Governo (7) Humor (54) iPhone (4) Itil (5) Java (10) linux (1) Negócios (10) Notícias (12) OEBS (3) Open Source (6) Opinião (4) PHP (2) Projetos (42) Propaganda (11) R-Project (11) Rails (11) Redmine (4) SAP (2) Scrum (8) Segurança (3) Six Sigma (11) SOA (3) Tech (34)

ADSystems – Agile Development Blog » Tutorial C# – Relatórios Mast

file:///C:/Documents and Settings/WC/Desktop/Pendencias/Asp.Net/Tut

TI (628)

Tutorial (7)

Video (6)

web (22)

Yii (1)

Archives

August 2013 (1) December 2012 (5) November 2012 (7) July 2012 (1) June 2012 (3) May 2012 (2) March 2012 (1) December 2011 (1) October 2011 (1) August 2011 (2) July 2011 (1) January 2011 (1) October 2010 (5) September 2010 (4) August 2010 (2) July 2010 (2) June 2010 (3) May 2010 (4) April 2010 (1) March 2010 (3) February 2010 (10) January 2010 (9) December 2009 (18) November 2009 (25) October 2009 (14) September 2009 (25) August 2009 (22) July 2009 (30) June 2009 (27) May 2009 (40) April 2009 (32) March 2009 (33) February 2009 (43) January 2009 (52) December 2008 (84) November 2008 (78) October 2008 (64) September 2008 (51) August 2008 (9)

ADSystems – Agile Development Blog © 2013 - descobrindo maneiras melhores de desenvolver software