quarta-feira, 13 de junho de 2007

Classe ObjetoDataSource para JasperReport

Com a classe ObjetoDataSource é possível acessar os atributos de qualquer objeto. Basta colocar os campos separados por ponto. Essa classe 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 digamos que a gente possui uma intância da classe Pessoa e desejamos imprimir todos seus campos em um relatório Jasper. Para fazer isso basta instanciar um novo ObjetoDataSource, como mostrado abaixo:
Pessoa eu = loadPessoa();
ObjetoDataSource dataSource = new ObjetoDataSource(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 seguinte forma:
<field name="nome" class="java.lang.String" />
<field name="nascimento" class="java.util.Date" /> 
<field name="telefones" class="java.lang.Object" />
<field name="endereco.rua" class="java.lang.String" />
<field name="endereco.numero" class="java.lang.Short" />

Repare que o campo telefones é declarado como Object, porque a resposta dele não é um List, e sim um ColecaoDataSource. Isso é feito para que se você possa iterar nele utilizando um SubReport.

Neste exemplo, o relatório possuiria apenas uma pessoa, no caso de termos que exibir várias pessoas utiliza-se o ColecaoDataSource. Ou poderiamos ter uma classe, por exemplo, Equipe que possui um atributo do tipo List. Com essas classes as possibilidades são infinitas.

3 comentários:

  1. muito bom essa lib!

    mas e se a classe Pessoa tivesse um atributo Collection"<"Empresa">" empresas.

    e Empresa tivesse atribuitos como codigo e nome

    tenho q mostrar os atributos de cada pessoa acompanhado dos atributos de cada empresa que esta pessoa está vinculada

    como acessaria os atributos de cada empresa da coleção para exibir no relatório?!

    ResponderExcluir
  2. Fabricio você precisa colocar a listagem das embresas em um subreport.

    ResponderExcluir
  3. Oi, como passaria a minha List para um subrelatorio Tiago.Obrigado e t+.
    Muito bacana o seu post!

    ResponderExcluir