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

Standard

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

 

Leave a Reply

Your email address will not be published. Required fields are marked *