Download - Criando Relatórios Report Viewer em Aplicações ASP.NET MVC ...api.ning.com/files/n8tVJNydip6fukPp7suOmzJgP1A1t*z2Blu9AuOPXa8... · Viewer e ASP.NET MVC. Como esta é a segunda

Transcript

Criando Relatórios Report Viewer em Aplicações

ASP.NET MVC – Parte 1 (Renderização pelo

Controller)

05abr

Semanalmente recebo diversas dúvidas sobre como criar, manipular e trabalhar com relatórios em uma

aplicação ASP.NET MVC. Realmente não existe muito material referente a este assunto, sendo a maioria

voltados para a geração de relatórios com WebForms.

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

simples e produtiva como criar e renderizar relatórios e sub-relatórios 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 dúvidas que recebo serem referêntes a tais ferramentas e tecnologias, e também ao fato

de não existir muito material disponível sobre tal assunto.

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

Mãos 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 persistência e manipulação dos dados, vamos então cria-lo no diretório Model e selecionar

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

Imagem 2

Criando uma Classe DTO para o relatório Vamos criar agora uma classe DTO chamada DTO_RelatorioPedido.cs, esta classe servirá para

transferência dos dados e representação das informações que nosso relatório 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 seleção 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<DTO_RelatorioPedido> SelecionaPedido(int codPedido)

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 instância do nosso Contexto de Dados dentro do próprio método, porém em

uma solução corporativa o melhor e mais correto seria a implementação de um Repositório Genérico.

Atente-se ao fato que nossa classe deve ser parcial e o método estático!!!

Criando o Relatório Criaremos agora um relatório 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

Imagem 4

Em seguida vamos inserir em nosso relatório uma lista e definir seu DataSetName como

DTO_RelatorioPedido, veja abaixo:

Imagem 7

Renderizando o Relatório pelo Controller Para renderizarmos nosso relatório 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 método que recebe como parâmetro o código do pedido a ser impresso e de fato

renderiza nosso relatório:

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

método 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 "<DeviceInfo>" +

18 " <OutputFormat>PDF</OutputFormat>" +

19 " <PageWidth>9in</PageWidth>" +

20 " <PageHeight>11in</PageHeight>" +

21 " <MarginTop>0.7in</MarginTop>" +

22 " <MarginLeft>2in</MarginLeft>" +

23 " <MarginRight>2in</MarginRight>" +

24 " <MarginBottom>0.7in</MarginBottom>" +

25 "</DeviceInfo>";

26

27 Warning[] warnings;

28 string[] streams;

29 byte[] bytes;

30

31 //Renderiza o relatório em bytes

32 bytes = relatorio.Render(

33 reportType,

34 deviceInfo,

35 out mimeType,

36 out encoding,

37 out fileNameExtension,

38 out streams,

39 out warnings);

40

41 return File(bytes, mimeType);

42 }

NOTA: No código acima o relatório é renderizado e exibido conforme o tipo definido, no caso PDF. Caso

deseje realizar o download do arquivo renderizado basta adicionar o seguinte código 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 método criado acima, podemos fazer isto na Master Page

mesmo, apenas para teste:

view source

print?

1 <%= Html.ActionLink("Imprimir Pedido", "RenderizaRelatorio", "Suporte", new { codPedido = 1 }, null)%>

Testando Agora podemos rodar nossa aplicação e veja o resultado:

Imagem 8

Imagem 9

Criando Relatórios Report Viewer em Aplicações

ASP.NET MVC – Parte 2 (Criando um Sub-

Relatório)

19mai

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:

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

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:

view source

print?

01 public partial class RepositorioPedido

02 {

03

04 public static List<DTO_RelatorioPedido> 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<DTO_RelatorioPedidoItem> 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 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 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:

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-

relatório:

Imagem 11

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