RSS

Criando Relatórios Report Viewer em Aplicações ASP.NET MVC – Parte 2 (Criando um Sub-Relatório)

19 maio

Dando continuidade ao tema, neste post irei demonstrar como podemos criar um Sub-Relatório com Report Viewer e ASP.NET MVC.

Como esta é a segunda parte do artigo, é muito interessante que a leitura do artigo anterior sobre “Criando Relatórios Report Viewer em Aplicações ASP.NET MVC – Parte 1 (Renderização pelo Controller)” seja feita antes. Você pode clicar aqui para ler o artigo anterior.


Criando uma Classe DTO para o sub-relatório
Vamos iniciar criando uma classe DTO chamada DTO_RelatorioPedidoItem.cs, esta classe servirá para transferência dos dados e representação das informações que nosso sub-relatório irá conter, para tanto vamos cria-la da seguinte forma:

public class DTO_RelatorioPedidoItem
 {
     public int codPedido { get; set; }
     public int codProduto { get; set; }
     public string nomeProduto { get; set; }
     public int quantidade { get; set; }
     public decimal valorUnitario { get; set; }
     public decimal valorTotal { get; set; }
}

 

Selecionando os Itens do Pedidos

Agora na classe RepositorioPedido já criada, vamos criar um outro método estático, que permita realizar a seleção dos Itens do Pedido, nossa classe deve ficar como abaixo:


public partial class RepositorioPedido
{

     public static List<DTO_RelatorioPedido> SelecionaPedido(int codPedido)
     {
        DB db = new DB();

        return (from p in db.tbPedidos
        where p.codPedido == codPedido
        select new DTO_RelatorioPedido
        {
          codPedido = p.codPedido,
          dataEntrega = (DateTime)p.dataEntrega,
          nomeCliente = p.tbClientes.nome,
          quantidadeItens = p.tbPedidosItens.Count,
          valorTotalPedido = (decimal)p.valorTotal
        }).ToList();
     }

     public static List<DTO_RelatorioPedidoItem> SelecionaPedidoItem(int codPedido)
     {
        DB db = new DB();

        return (from p in db.tbPedidosItens
        where p.codPedido == codPedido
        select new DTO_RelatorioPedidoItem
        {
           codPedido = p.codPedido,
           codProduto = p.codProduto,
           nomeProduto = p.tbProdutos.nome,
           quantidade = (int)p.quantidade,
           valorUnitario = (decimal)p.tbProdutos.valorUnitario,
           valorTotal = (int)p.quantidade * (decimal)p.tbProdutos.valorUnitario
        }).ToList();
      }

}

NOTA: Observe que o método criado SelecionaPedidoItem recebe como parâmetro o código do pedido e retorna um List<DTO_RelatorioPedidoItem> com apenas os itens deste pedido.

Criando o Sub-Relatório
Criaremos agora um novo relatório com Report Viewer chamado PedidoItem.rdlc, em seguida vamos definir seu DataSource com o tipo da classe DTO_RelatorioPedidoItem conforme as imagens abaixo:

Imagem 1

Imagem 2

Agora com um clique direito no painél de visualização do relatório, clique em Report Parameters…:

Imagem 3

Em seguida vamos criar o parâmetro do codPedido, informando que este relatório irá receber este parâmetro:

Imagem 4

Agora vamos arrastar uma Table para nosso relatório e definir seu DataSetName  para DTO_RelatorioPedidoItem:

Imagem 5

Imagem 6

Por fim podemos formata-lo para que fique da seguinte forma e com as seguintes colunas:

Imagem 7

Configurando o Relatório Pai de Pedido
Para que nosso sub-relatório funcione devemos defini-lo em nosso relatório Pai, que no caso é o Pedido.drlc. Vamos então adicionar um sub-relatório ao mesmo, basta arrastar e soltar:

Imagem 8

Agora vamos definir que esse sub-relatório que arrastamos será representado pelo relatório PedidoItem.rdlc, para isso basta selecionarmos o mesmo na propriedade ReportName do sub-relatório:

Imagem 9

E por fim vamos definir que o relatório pai irá passar como parâmetro o codPedido para o sub-relatório, basta clicarmos com o botão direito no sub-relatório e selecionarmos Properties, em seguida clique na guia Parameters e defina as seguintes propriedades:

Imagem 10

Renderizando nosso Sub-Relatório
Para renderizarmos nosso sub-relatório vamos primeiramente criar um novo método privado em nosso SuporteController chamado RenderizaSubRelatorioPedido, o mesmo será um delegate:


private void RenderizaSubRelatorioPedido(object sender, SubreportProcessingEventArgs e)
{
    int _codPedido = Convert.ToInt32(e.Parameters["codPedido"].Values[0]);

    e.DataSources.Add(new ReportDataSource("DTO_RelatorioPedidoItem",
                  RepositorioPedido.SelecionaPedidoItem(_codPedido)));
}

 

Vamos utilizar a propriedade SubreportProcessing do nosso LocalReport para processarmos o sub-relatório:

Imagem 11

 

 

Testando
Agora quando invocamos nosso método de renderização observe os itens do Pedido no sub-relatório:

Imagem 12

 

Para baixar o projeto do artigo clique aqui.

 

Abraços e até a próxima !!!

 

Anúncios
 

Tags: , , , ,

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

 
%d blogueiros gostam disto: