quarta-feira, 13 de junho de 2007

Classe ColecaoDataSource para JasperReport

Com a classe ColecaoDataSource é possível iterar e acessar os atributos dos objetos presentes em uma coleção. Funciona da mesma forma que a ObjetoDataSource, com a diferença de que por ser uma coleção, permite iterar entre uma coleção de objetos. Essa classe também faz parte do pacote de auxílio no uso de JasperReport e IReport. Mostro abaixo um exemplo simples. Primeiro vejamos as classes de dominio:
public class Pessoa
{
 String nome;
 Date nascimento;
 Endereco endereco;
 List<String> telefones;
 // ... Gets e Sets omitidos ...
}
public class Endereco
{
 String rua;
 short numero;
 // ... Gets e Sets omitidos ...
}

Agora vou preencher o relatorio com uma lista de pessoas:
List pessoas = loadPessoas();
ColecaoDataSource dataSource = new ColecaoDataSource(eu);
JasperReport compilado = JasperCompileManager.compileReport("/tmp/Relatorio.xml");
JasperPrint preenchido = JasperFillManager.fillReport(compilado, new HashMap(), dataSource);
JasperViewer.viewReport(preenchido);

No seu relatorio, para acessar os campos da Pessoa, basta declarar os campos da mesma forma como foi feita com a classe ObjetoDataSource. Viu como é fácil?

Agora digamos que ao invés de List, queremos utilizar um Map. É a mesma coisa, só a declaração dos campos no relatório fica um pouco diferente. Isso porque passamos a iterar não por objetos Pessoa, mas por objetos Entry. Veja abaixo:
Map<Integer,Pessoa> pessoas = loadPessoas();
ColecaoDataSource dataSource = new ColecaoDataSource(eu);
JasperReport compilado = JasperCompileManager.compileReport("/tmp/Relatorio.xml");
JasperPrint preenchido = JasperFillManager.fillReport(compilado, new HashMap(), dataSource);
JasperViewer.viewReport(preenchido);

No relatório então, os campos ficariam assim:
No seu relatorio, para acessar os campos da Pessoa, basta declarar os campos da seguinte forma:
<field name="key" class="java.lang.Integer" />
<field name="value.nome" class="java.lang.String" />
<field name="value.nascimento" class="java.util.Date" /> 
<field name="value.telefones" class="java.lang.Object" />
<field name="value.endereco.rua" class="java.lang.String" />
<field name="value.endereco.numero" class="java.lang.Short" />


Simples não é?

3 comentários:

  1. Ola. ficou mto bem explicado mesmo,agora estou com uma duvida:
    Como se chama um Relatorio Mestre+ 1 subrelatorio ?

    ResponderExcluir
  2. Elimarcos Arouca14 de maio de 2009 10:54

    Saudações, irmão. Estava dando uma lida no teu tutoria e esbarrei com uma dúvida. O que seria este "ColecaoDataSource"??? É o mesmo que o JRBeanCollectionDataSource???

    ResponderExcluir
  3. Elimarcos, pra falar a verdade, bem que pode ser. Já faz um bom tempo que não trabalho com o jasperreport e não tenho informações suficientes pra te dizer se esta classe é semelhante a JRBeanCollectionDataSource.

    ResponderExcluir