Feb 1 2011

Reportviewer Relatório com Agrupamento

Category: C# | Report | ReportSuzuki @ 17:36

Desta vez com um espírito de ajudar a fazer relatórios de forma simples e prática, esta postagem vem de encontro com esta necessidade. Digo mais, demonstraremos em um exemplo simples, só não é o mais simples por um fator, ele será agrupado por um dado.

Falando mais sobre o que será utilizado, ou seja, as ferramentas: Microsoft Visual Studio 2010, ReportViewer e .Net Framework 4.0, o projeto será do tipo Windows Forms Application. Não há banco de dados neste exemplo, simularemos dados instanciando classes, entretanto é só extender a idéia.

O que iremos fazer é preparar uma classe pessoa com as propriedades primeiro nome, último nome e data de nascimento, então vamos criar um relatório listando todos os nomes (primeiro e último nome) e data de nascimento, e este relatório será agrupado por sobrenome, ou seja, haverá uma quebra por sobrenome. Então a lista tenta mostrar um relacionamento por sobrenome ex: todos os Suzuki, Silva, etc. Bom sabemos que muitas pessoas tem o mesmo sobrenome porém não são parentes, então parece não fazer muito sentido, mas este é apenas um exemplo didático.
Mãos à obra.
Primeiro vamos criar um projeto com o nome GroupingReport, veja a imagem:

GroupingReport

Agora na raiz do projeto vamos adicionar a classe PersonInfo, veja a imagem:

PersonInfo

O código da classe PersonInfo:

  1. using System;   
  2.   
  3. namespace GroupingReport   
  4. {   
  5.     public class PersonInfo   
  6.     {   
  7.         public string FirstName { get; set; }   
  8.   
  9.         public string LastName { get; set; }   
  10.   
  11.         public DateTime BirthDate { get; set; }   
  12.     }   
  13. }  

Vamos adicionar o relatório na raiz do projeto com o nome RptPersons.rdlc.

groupingReportCreation

No relatório adicione uma table da toolbox, quando soltar no relatório ele iniciará o wizard para configurar o dataset do relatório.
Primeiro escolhemos o Object:

DataSource

Na próxima tela marcamos PersonInfo que é de onde virão nossos dados.

DataSource1

Assim a tabela esta apontando para a fonte de dados, agora basta clicar com o botão direito sobre ela escolher a opção Add Group depois Parent Group, como na imagem:

AddGroup

Após isso, escolhemos qual a propriedade que será usada para agrupar.

Group

Agora basta ir adicionando as outras propriedades como desejar, por exemplo:

reportFinal

Agora vamos para o form, eu renomeei o Form1 para FrmGroupingReport.cs, inclui também 2 botões e o reportviewer o design ficou assim:

Form

Ok! Estamos quase lá, não desista, insista.
Vamos fazer uma espécie de bônus para o artigo agora. Linq to Objects. Smiley piscando
Então primeiramente vamos criar um método que retorna a nossa lista de pessoas. Assim:

  1. private List<PersonInfo> GetPersons()   
  2. {   
  3.     List<PersonInfo> list = new List<PersonInfo>()   
  4.     {   
  5.          new PersonInfo(){FirstName = "James", LastName = "Silva", BirthDate = new DateTime(1985,08,15)},   
  6.          new PersonInfo(){FirstName = "Antonio", LastName = "Nunes", BirthDate = new DateTime(1970,08,1)},   
  7.          new PersonInfo(){FirstName = "Maria", LastName = "Silva", BirthDate = new DateTime(1985,03,3)},   
  8.          new PersonInfo(){FirstName = "Aline", LastName = "Barros", BirthDate = new DateTime(1981,02,11)},   
  9.          new PersonInfo(){FirstName = "Carlos", LastName = "Barros", BirthDate = new DateTime(1972,02,11)},   
  10.          new PersonInfo(){FirstName = "Alda", LastName = "Celia", BirthDate = new DateTime(1982,01,20)}   
  11.     };   
  12.     return list;   
  13. }  

Ok, podemos então “brincar” um pouco com Linq, criando um método por exemplo que retorne a lista ordenada pelo FirstName. Repare na utilização do método "GetPersons", o operador "=>", note que p é apenas o nome de uma variável.

  1. private List<PersonInfo> GetOrderBy()   
  2. {   
  3.     List<PersonInfo> list = GetPersons();   
  4.     return list.OrderBy(p => p.FirstName).ToList();   
  5. }  

E se quisessemos uma ordenação descendente? Simples, veja este outro método:

  1. private List<PersonInfo> GetOrderByDesc()   
  2. {   
  3.     List<PersonInfo> list = GetPersons();   
  4.     return list.OrderByDescending(p => p.FirstName).ToList();   
  5. }  

Ok. Aposto que a partir daqui você já sacou como as coisas funcionam, e notou que se quisesse ordenar por outra propriedade basta alterar o FirstName pelo LastName por exemplo. Maravilha!
Só que tem mais uma forma de fazer isso, muito semelhante a sintaxe SQL, então pensando nisso, adicionei este mais exemplos, na verdade tem a mesma função (ordenar) só que escritos de outra forma, portanto aqui vão os exemplos versão 2. Repare que p é uma variável que foi criada e poderia se chamar outra coisa qualquer.

  1. private List<PersonInfo> GetOrderByVersion2()   
  2. {   
  3.     List<PersonInfo> list = GetPersons();   
  4.     var personQuery = from p in list   
  5.                       orderby p.FirstName   
  6.                       select p;   
  7.   
  8.     return personQuery.ToList();   
  9. }  

Muito bem, pra fechar esta história do bônus, segue o outro exemplo da ordenação descendente:

  1. private List<PersonInfo> GetOrderByDescVersion2()   
  2. {   
  3.     List<PersonInfo> list = GetPersons();   
  4.     var personQuery = from p in list   
  5.                       orderby p.FirstName descending   
  6.                       select p;   
  7.   
  8.     return personQuery.ToList();   
  9. }  

Agora que temos estes métodos, podemos utilizá-los. Utilizei nos 2 botões que inclui no formulário.
Repare que ambos os métodos funcionam version 1 ou 2, então pode comentar e descomentar aquele que desejar para testar.

  1. private void btnAsc_Click(object sender, EventArgs e)   
  2. {   
  3.     PersonInfoBindingSource.DataSource = GetOrderBy();   
  4.     //PersonInfoBindingSource.DataSource = GetOrderByVersion2();   
  5.   
  6.     this.reportViewer.RefreshReport();   
  7. }   
  8.   
  9. private void btnDesc_Click(object sender, EventArgs e)   
  10. {   
  11.     PersonInfoBindingSource.DataSource = GetOrderByDesc();   
  12.     //PersonInfoBindingSource.DataSource = GetOrderByDescVersion2();   
  13.   
  14.     this.reportViewer.RefreshReport();   
  15. }  

E após compilar o projeto você deve chegar ao seguinte resultado:

final

Se você quiser pode fazer o download do projeto GroupingReport.rar (56,30 kb) .
Por enquanto é isso, espero que tenha sido útil.
Qualquer problema ou dúvida, deixa o seu comentário ou me escreva que tentarei ajudar.

Até a próxima. Sayonaraa

 

Senhor meu Deus, clamei a ti, e tu me saraste. (Salmos 30:2)


Share or Bookmark this post…

Tags: , , , , , , , , , , , , , , , , , , , , , ,

Kommentare

1.
pingback topsy.com says:

Pingback from topsy.com

Twitter Trackbacks for
        
        Ninja Code - Reportviewer Relatório com Agrupamento
        [ninjacode.com.br]
        on Topsy.com

2.
pingback thiagosatoshisuzuki.wordpress.com says:

Pingback from thiagosatoshisuzuki.wordpress.com

Reportviewer Relatório com Agrupamento « Thiago Satoshi Suzuki

3.
trackback Ninja Code says:

ASP.net Como Manter Valores de CheckBox na GridView

ASP.net Como Manter Valores de CheckBox na GridView

4.
Filipe Filipe Brazil says:

Olá! É meu primeiro contato com Report Viewer, e não consegui deixar o design do RDLC como o seu no exemplo. O Agrupamento fica acima, e não ao lado.

5.
Suzuki Suzuki Brazil says:

Filipe,
Não entendi muito bem o problema que você esta passando com seu report, poderia por favor explicar melhor?
O projeto que coloquei no final da página não ajudou?

Aguardando retorno.

6.
Filipe Filipe Brazil says:

Opa! desculpe, erro meu.. eu estava utilizando "Add Group / Column Group", o certo é "Add Group / Row Group" .. hehe, mal ae! o/

7.
Welinton Welinton Brazil says:

Olá, primeiramente gostaria de agradecer pelo tutorial, me ajudou bastante em um assunto que na prática ninguém ensina.

Só que tive um problema na hora de fazer, acho que é simples, porém como sou leigo, não estou conseguindo arrumar.
Quando gero o relatório, ele fica só com uma página, mas na hora de visualizar a impressão, ele fica correto.

Como faço para mostrar o mesmo número de paginas que são exibidas na hora de visualizar impressão?

Estou usando Linq em um bd SQLServer

Voeg kommentaar By


(Sal you Gravatar ikone vertoon)

  Country flag

biuquote
  • Opmerkings
  • Voorskou
Loading