Criando Relatórios Report Viewer em Aplicações ASP.NET MVC...

Click here to load reader

  • date post

    30-Nov-2018
  • Category

    Documents

  • view

    215
  • download

    1

Embed Size (px)

Transcript of Criando Relatórios Report Viewer em Aplicações ASP.NET MVC...

  • Criando Relatrios Report Viewer em Aplicaes

    ASP.NET MVC Parte 1 (Renderizao pelo

    Controller)

    05abr

    Semanalmente recebo diversas dvidas sobre como criar, manipular e trabalhar com relatrios em uma

    aplicao ASP.NET MVC. Realmente no existe muito material referente a este assunto, sendo a maioria

    voltados para a gerao de relatrios com WebForms.

    Vendo isto, irei destinar este post para sanar diversas dvidas que recebo, e demonstrar de uma forma

    simples e produtiva como criar e renderizar relatrios e sub-relatrios com Report Viewer utilizando

    ASP.NET MVC.

    Tecnologias envolvidas Para o artigo estarei utilizando o Visual Studio 2008 com SP1 e ASP.NET MVC2. Isto devido ao fato de

    que a maior parte das dvidas que recebo serem referntes a tais ferramentas e tecnologias, e tambm ao fato

    de no existir muito material disponvel sobre tal assunto.

    Contexto Irei criar primeiramente um relatrio de Pedidos, e em seguida um sub-relatrio com os itens do Pedido.

    Mos a Massa Iremos considerar as seguintes tabelas no banco:

    Imagem 1

    Primeiramente vamos criar um novo projeto em MVC2, para este artigo estarei utilizando Entity

    Framework para persistncia e manipulao dos dados, vamos ento cria-lo no diretrio Model e selecionar

    as tabelas que iremos trabalhar, nossa estrutura deve ficar como na imagem abaixo:

    http://rafaelzaccanini.files.wordpress.com/2011/12/imagem-11.jpg

  • Imagem 2

    Criando uma Classe DTO para o relatrio Vamos criar agora uma classe DTO chamada DTO_RelatorioPedido.cs, esta classe servir para

    transferncia dos dados e representao das informaes que nosso relatrio ir conter, para tanto vamos

    cria-la da seguinte forma:

    view source

    print?

    1 public class DTO_RelatorioPedido

    2 {

    3 public int codPedido { get; set; }

    4 public string nomeCliente { get; set; }

    5 public DateTime dataEntrega { get; set; }

    6 public decimal valorTotalPedido { get; set; }

    7 public int quantidadeItens { get; set; }

    8 }

    Selecionando os Pedidos Agora vamos criar uma classe que permita realizar a seleo dos Pedidos, nossa classe tera o nome

    RepositorioPedido.cs com a seguinte estrutura:

    view source

    print?

    01 public partial class RepositorioPedido

    02 {

    03 public static List SelecionaPedido(int codPedido)

    http://msdn.microsoft.com/en-us/library/ff649585.aspxhttp://rafaelzaccanini.wordpress.com/2011/04/05/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-1-renderizacao-pelo-controller/#viewSourcehttp://rafaelzaccanini.wordpress.com/2011/04/05/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-1-renderizacao-pelo-controller/#printSourcehttp://rafaelzaccanini.wordpress.com/2011/04/05/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-1-renderizacao-pelo-controller/#printSourcehttp://rafaelzaccanini.wordpress.com/2011/04/05/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-1-renderizacao-pelo-controller/#viewSourcehttp://rafaelzaccanini.wordpress.com/2011/04/05/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-1-renderizacao-pelo-controller/#printSourcehttp://rafaelzaccanini.wordpress.com/2011/04/05/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-1-renderizacao-pelo-controller/#printSourcehttp://rafaelzaccanini.files.wordpress.com/2011/12/imagem-2.jpg

  • 04 {

    05 DB db = new DB();

    06

    07 return (from p in db.tbPedidos

    08 where p.codPedido == codPedido

    09 select new DTO_RelatorioPedido

    10 {

    11 codPedido = p.codPedido,

    12 dataEntrega = (DateTime)p.dataEntrega,

    13 nomeCliente = p.tbClientes.nome,

    14 quantidadeItens = p.tbPedidosItens.Count,

    15 valorTotalPedido = (decimal)p.valorTotal

    16 }).ToList();

    17 }

    18

    19 }

    NOTA: Para o artigo criei uma instncia do nosso Contexto de Dados dentro do prprio mtodo, porm em

    uma soluo corporativa o melhor e mais correto seria a implementao de um Repositrio Genrico.

    Atente-se ao fato que nossa classe deve ser parcial e o mtodo esttico!!!

    Criando o Relatrio Criaremos agora um relatrio com Report Viewer chamado Pedido.rdlc, em seguida vamos definir seu

    DataSource com o tipo da classe DTO_RelatorioPedido conforme as imagens abaixo:

    Imagem 3

    http://rafaelzaccanini.files.wordpress.com/2011/12/imagem-3.jpg

  • Imagem 4

    Em seguida vamos inserir em nosso relatrio uma lista e definir seu DataSetName como

    DTO_RelatorioPedido, veja abaixo:

    http://rafaelzaccanini.files.wordpress.com/2011/12/imagem-4.jpg

  • Imagem 5

    Imagem 6

    Depois possivel formatar seu relatrio como achar melhor, no momento vou deixa-lo como abaixo:

    http://rafaelzaccanini.files.wordpress.com/2011/12/imagem-5.jpghttp://rafaelzaccanini.files.wordpress.com/2011/12/imagem-6.jpghttp://rafaelzaccanini.files.wordpress.com/2011/12/imagem-7.jpg

  • Imagem 7

    Renderizando o Relatrio pelo Controller Para renderizarmos nosso relatrio a primeira coisa precisamos fazer utilizar a dll

    Microsoft.ReportViewer.WebForms, famos adiciona-la ao nosso projeto e em seguida vamos criar um

    novo Controller chamado SuporteController.cs.

    Em seguida vamos criar um mtodo que recebe como parmetro o cdigo do pedido a ser impresso e de fato

    renderiza nosso relatrio:

    view source

    print?

    01 public ActionResult RenderizaRelatorio(int codPedido)

    02 {

    03 LocalReport relatorio = new LocalReport();

    04

    05 //Caminho onde o arquivo do Report Viewer est localizado

    06 relatorio.ReportPath = Server.MapPath("~/Relatorio/Pedido.rdlc");

    07

    08 //Define o nome do nosso DataSource e qual rotina ir preenche-lo, no caso, nosso

    mtodo criado anteriormente

    09 relatorio.DataSources.Add(new ReportDataSource("DTO_RelatorioPedido", RepositorioPedido.SelecionaPedido(codPedido)));

    10

    11 string reportType = "PDF";

    12 string mimeType;

    13 string encoding;

    14 string fileNameExtension;

    15

    16 string deviceInfo =

    17 "" +

    18 " PDF" +

    19 " 9in" +

    20 " 11in" +

    21 " 0.7in" +

    22 " 2in" +

    23 " 2in" +

    24 " 0.7in" +

    25 "";

    26

    27 Warning[] warnings;

    28 string[] streams;

    29 byte[] bytes;

    30

    31 //Renderiza o relatrio em bytes

    32 bytes = relatorio.Render(

    33 reportType,

    34 deviceInfo,

    35 out mimeType,

    36 out encoding,

    http://rafaelzaccanini.wordpress.com/2011/04/05/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-1-renderizacao-pelo-controller/#viewSourcehttp://rafaelzaccanini.wordpress.com/2011/04/05/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-1-renderizacao-pelo-controller/#printSourcehttp://rafaelzaccanini.wordpress.com/2011/04/05/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-1-renderizacao-pelo-controller/#printSource

  • 37 out fileNameExtension,

    38 out streams,

    39 out warnings);

    40

    41 return File(bytes, mimeType);

    42 }

    NOTA: No cdigo acima o relatrio renderizado e exibido conforme o tipo definido, no caso PDF. Caso

    deseje realizar o download do arquivo renderizado basta adicionar o seguinte cdigo antes de seu return:

    view source

    print?

    1 Response.AddHeader("content-disposition", "attachment; filename=PEDIDO." + fileNameExtension);

    Agora falta apenas criarmos um link para chamar o mtodo criado acima, podemos fazer isto na Master Page

    mesmo, apenas para teste:

    view source

    print?

    1

    Testando Agora podemos rodar nossa aplicao e veja o resultado:

    Imagem 8

    http://rafaelzaccanini.wordpress.com/2011/04/05/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-1-renderizacao-pelo-controller/#viewSourcehttp://rafaelzaccanini.wordpress.com/2011/04/05/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-1-renderizacao-pelo-controller/#printSourcehttp://rafaelzaccanini.wordpress.com/2011/04/05/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-1-renderizacao-pelo-controller/#printSourcehttp://rafaelzaccanini.wordpress.com/2011/04/05/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-1-renderizacao-pelo-controller/#viewSourcehttp://rafaelzaccanini.wordpress.com/2011/04/05/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-1-renderizacao-pelo-controller/#printSourcehttp://rafaelzaccanini.wordpress.com/2011/04/05/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-1-renderizacao-pelo-controller/#printSourcehttp://rafaelzaccanini.files.wordpress.com/2011/12/imagem-8.jpg

  • Imagem 9

    Criando Relatrios Report Viewer em Aplicaes

    ASP.NET MVC Parte 2 (Criando um Sub-

    Relatrio)

    19mai

    Dando continuidade ao tema, neste post irei demonstrar como podemos criar um Sub-Relatrio com Report

    Viewer e ASP.NET MVC.

    Como esta a segunda parte do artigo, muito interessante que a leitura do artigo anterior sobre Criando

    Relatrios Report Viewer em Aplicaes ASP.NET MVC Parte 1 (Renderizao pelo Controller) seja feita antes. Voc pode clicar aqui para ler o artigo anterior.

    Criando uma Classe DTO para o sub-relatrio Vamos iniciar criando uma classe DTO chamada DTO_RelatorioPedidoItem.cs, esta classe servir para

    transferncia dos dados e representao das informaes que nosso sub-relatrio ir conter, para tanto vamos

    cria-la da seguinte forma:

    view source

    print?

    1 public class DTO_RelatorioPedidoItem

    2 {

    3 public int codPedido { get; set; }

    4 public int codProduto { get; set; }

    5 public string nomeProduto { get; set; }

    6 public int quantidade { get; set; }

    7 public decimal valorUnitario { get; set; }

    8 public decimal valorTotal { get; set; }

    9 }

    Selecionando os Itens do Pedidos

    http://rafaelzaccanini.net.com/2011/04/05/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-1-renderizacao-pelo-controller/http://msdn.microsoft.com/en-us/library/ff649585.aspxhttp://rafaelzaccanini.wordpress.com/2011/05/19/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-2-criando-um-sub-relatorio/#viewSourcehttp://rafaelzaccanini.wordpress.com/2011/05/19/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-2-criando-um-sub-relatorio/#printSourcehttp://rafaelzaccanini.wordpress.com/2011/05/19/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-2-criando-um-sub-relatorio/#printSourcehttp://rafaelzaccanini.files.wordpress.com/2011/12/imagem-9.jpg

  • Agora na classe RepositorioPedido j criada, vamos criar um outro mtodo esttico, que permita realizar a

    seleo dos Itens do Pedido, nossa classe deve ficar como abaixo:

    view source

    print?

    01 public partial class RepositorioPedido

    02 {

    03

    04 public static List SelecionaPedido(int codPedido)

    05 {

    06 DB db = new DB();

    07

    08 return (from p in db.tbPedidos

    09 where p.codPedido == codPedido

    10 select new DTO_RelatorioPedido

    11 {

    12 codPedido = p.codPedido,

    13 dataEntrega = (DateTime)p.dataEntrega,

    14 nomeCliente = p.tbClientes.nome,

    15 quantidadeItens = p.tbPedidosItens.Count,

    16 valorTotalPedido = (decimal)p.valorTotal

    17 }).ToList();

    18 }

    19

    20 public static List SelecionaPedidoItem(int codPedido)

    21 {

    22 DB db = new DB();

    23

    24 return (from p in db.tbPedidosItens

    25 where p.codPedido == codPedido

    26 select new DTO_RelatorioPedidoItem

    27 {

    28 codPedido = p.codPedido,

    29 codProduto = p.codProduto,

    30 nomeProduto = p.tbProdutos.nome,

    31 quantidade = (int)p.quantidade,

    32 valorUnitario = (decimal)p.tbProdutos.valorUnitario,

    33 valorTotal = (int)p.quantidade * (decimal)p.tbProdutos.valorUnitario

    34 }).ToList();

    35 }

    36

    37 }

    NOTA: Observe que o mtodo criado SelecionaPedidoItem recebe como parmetro o cdigo do pedido e

    retorna um List com apenas os itens deste pedido.

    Criando o Sub-Relatrio Criaremos agora um novo relatrio com Report Viewer chamado PedidoItem.rdlc, em seguida vamos

    definir seu DataSource com o tipo da classe DTO_RelatorioPedidoItem conforme as imagens abaixo:

    http://rafaelzaccanini.wordpress.com/2011/05/19/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-2-criando-um-sub-relatorio/#viewSourcehttp://rafaelzaccanini.wordpress.com/2011/05/19/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-2-criando-um-sub-relatorio/#printSourcehttp://rafaelzaccanini.wordpress.com/2011/05/19/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-2-criando-um-sub-relatorio/#printSource

  • Imagem 1

    Imagem 2

    Agora com um clique direito no painl de visualizao do relatrio, clique em Report Parameters:

    http://rafaelzaccanini.files.wordpress.com/2011/12/imagem-12.jpghttp://rafaelzaccanini.files.wordpress.com/2011/12/imagem-21.jpg

  • Imagem 3

    Em seguida vamos criar o parmetro do codPedido, informando que este relatrio ir receber este parmetro:

    Imagem 4

    Agora vamos arrastar uma Table para nosso relatrio e definir seu DataSetName para

    DTO_RelatorioPedidoItem:

    http://rafaelzaccanini.files.wordpress.com/2011/12/imagem-31.jpghttp://rafaelzaccanini.files.wordpress.com/2011/12/imagem-41.jpg

  • Imagem 5

    Imagem 6

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

    http://rafaelzaccanini.files.wordpress.com/2011/12/imagem-51.jpghttp://rafaelzaccanini.files.wordpress.com/2011/12/imagem-61.jpghttp://rafaelzaccanini.files.wordpress.com/2011/12/imagem-71.jpg

  • Imagem 7

    Configurando o Relatrio Pai de Pedido Para que nosso sub-relatrio funcione devemos defini-lo em nosso relatrio Pai, que no caso o

    Pedido.drlc. Vamos ento adicionar um sub-relatrio ao mesmo, basta arrastar e soltar:

    Imagem 8

    Agora vamos definir que esse sub-relatrio que arrastamos ser representado pelo relatrio

    PedidoItem.rdlc, para isso basta selecionarmos o mesmo na propriedade ReportName do sub-relatrio:

    http://rafaelzaccanini.files.wordpress.com/2011/12/imagem-81.jpg

  • Imagem 9

    E por fim vamos definir que o relatrio pai ir passar como parmetro o codPedido para o sub-relatrio,

    basta clicarmos com o boto direito no sub-relatrio e selecionarmos Properties, em seguida clique na guia

    Parameters e defina as seguintes propriedades:

    http://rafaelzaccanini.files.wordpress.com/2011/12/imagem-91.jpg

  • Imagem 10

    Renderizando nosso Sub-Relatrio Para renderizarmos nosso sub-relatrio vamos primeiramente criar um novo mtodo privado em nosso

    SuporteController chamado RenderizaSubRelatorioPedido, o mesmo ser um delegate:

    view source

    print?

    1 private void RenderizaSubRelatorioPedido(object sender, SubreportProcessingEventArgs e)

    2 {

    3 int _codPedido = Convert.ToInt32(e.Parameters["codPedido"].Values[0]);

    4

    5 e.DataSources.Add(new ReportDataSource("DTO_RelatorioPedidoItem",

    6 RepositorioPedido.SelecionaPedidoItem(_codPedido)));

    7 }

    Vamos utilizar a propriedade SubreportProcessing do nosso LocalReport para processarmos o sub-

    relatrio:

    Imagem 11

    http://rafaelzaccanini.wordpress.com/2011/05/19/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-2-criando-um-sub-relatorio/#viewSourcehttp://rafaelzaccanini.wordpress.com/2011/05/19/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-2-criando-um-sub-relatorio/#printSourcehttp://rafaelzaccanini.wordpress.com/2011/05/19/criando-relatorios-report-viewer-em-aplicacoes-asp-net-mvc-parte-2-criando-um-sub-relatorio/#printSourcehttp://rafaelzaccanini.files.wordpress.com/2011/12/imagem-10.jpghttp://rafaelzaccanini.files.wordpress.com/2011/12/imagem-111.jpg

  • Testando Agora quando invocamos nosso mtodo de renderizao observe os itens do Pedido no sub-relatrio:

    http://rafaelzaccanini.files.wordpress.com/2011/12/imagem-121.jpg