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:
Agora com um clique direito no painél de visualização do relatório, clique em Report Parameters…:
Em seguida vamos criar o parâmetro do codPedido, informando que este relatório irá receber este parâmetro:
Agora vamos arrastar uma Table para nosso relatório e definir seu DataSetName para DTO_RelatorioPedidoItem:
Por fim podemos formata-lo para que fique da seguinte forma e com as seguintes colunas:
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:
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:
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:
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:
Testando
Agora quando invocamos nosso método de renderização observe os itens do Pedido no sub-relatório:
Para baixar o projeto do artigo clique aqui.
Abraços e até a próxima !!!














Login