Feed Artigos Comentários


.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 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.";
            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:
                    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

  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”;


 
8.Defina o subreport que será exibido.

  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?
 

Post visualizado 2.739 vezes.

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

  1. 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 !!

  2. 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/ [...]

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

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

Deixe um comentário