.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 ?