.NET &TI &Tutorial André Dourado em 10 abr 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
{
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.";
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
{
List
switch (clienteId)
{
case 1:
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;
listaContato.Add(contato6);
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
- Utilizando o menu do VS: “Data > Add New Data Source…”;
- Escolha o tipo “Object” e clique em Next;
- Selecione na árvore de objetos do projeto o objeto “Cliente” e clique em “Finish”;
- Repita o passo 3, selecionando agora o objeto “Contato”;
4.Crie o relatório “master”:
- 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 “Report1.rdlc”;
- Na janela “Solution Explorer” dê duplo clique sobre o objeto “Report1.rdlc”;
- Na janela “ToolBox”, na divisão “Reporting Items” clique sobre o componente “List” e arraste até o “Report1”;
- Na janela “ToolBox”, na divisão “Reporting Items” clique sobre o componente “Textbox” e arraste para o interior do “List”;
- Na janela “Data Sources” selecione a propriedade “clienteId” do datasource “Cliente” e arraste para o interior do TextBox criado no passo 4;
- Repita os passos 4 e 5 para a propriedade “clienteNome”;
- 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”:
- 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”;
- Na janela “Solution Explorer” dê duplo clique sobre o objeto “Report2.rdlc”;
- Na janela “ToolBox”, na divisão “Reporting Items” clique sobre o componente “List” e arraste até o “Report2”;
- Na janela “ToolBox”, na divisão “Reporting Items” clique sobre o componente “Textbox” e arraste para o interior do “List”;
- Na janela “Data Sources” selecione a propriedade “contatoId” do datasource “Contato” e arraste para o interior do TextBox criado no passo 4;
- Repita os passos 4 e 5 para a propriedade “contatoNome”;
6.Utilize o formulário “Form1” para armazenar o componente ReportViewer:
- Na janela “Solution Explorer” dê duplo clique sobre o objeto “Form1”;
- Na janela “ToolBox”, na divisão “Reporting” clique sobre o componente “MicrosoftReportViewer” e arraste até o “Form1”
- Selecione qual o relatório será exibido pelo ReportViewer. Selecione “RelatorioTeste.Report1″, conforme a tela a seguir:

7.Crie o parâmetro do report.
- Na janela “Solution Explorer” dê duplo clique sobre o objeto “Report2.rdlc”;
- No menu do VS selecione a opção: “Report > Report Parameters…”;
- 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”;

8.Defina o subreport que será exibido.
- Na janela “Solution Explorer” dê duplo clique sobre o objeto “Report1.rdlc”;
- 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.
- Selecione a aba “Parameters”;
- 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:
- Na janela “Solution Explorer” dê duplo clique sobre o objeto “Form1.cs”;
- No formulário dê duplo clique sobre o título do Formulário, ou selecione nos eventos do form o evento “Load”;
- 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 = 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 = 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?
Olá! Desde que coloquei o site
em 11 abr 2009 às 15:35 1.Paulo Barros escreveu …
É sempre bom termos acesso a um tutorial como esse, feito por especialistas no assunto !!
em 06 mai 2009 às 12:08 2.Relatórios em .NET: ReportViewer e NHibernate « Reginaldo Jr. Weblog escreveu …
[...] http://blog.adsystems.com.br/2009/04/10/tutorial-c-relatorios-master-detail-com-reportviewer/ [...]
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?
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????
em 04 fev 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 ?
em 17 fev 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.
em 21 mai 2010 às 12:35 7.Abinalio escreveu …
Muito legal este artigo!
Alguém consegue fazer isso com o ReportViewer para Web.
Abinálio
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
em 08 jul 2010 às 20:23 9.André Dourado escreveu …
Usei o VS 2008. Qual problem vc está tendo?
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?
em 09 jul 2010 às 12:31 11.Bruno Britto escreveu …
Mandei até algumas mesagens para o twitter do senhor o meu é @BrunoBrittoPB
em 11 fev 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();
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));
}
em 12 abr 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.
em 13 abr 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