Pesquisar neste blog

terça-feira, 14 de junho de 2011

Usando iReport 4.0.2 para gerar um relatório jasper com fonte de dados JavaBeans set datasource

O iReport é uma ferramenta muito conhecida no mundo Java para desenvolvimento de relatórios no formato jasper. Dessa forma, não serão abordados neste pequeno artigo minúcias do mesmo. Você pode encontrar o iReport em http://jasperforge.org/projects/ireport. Um dos fatores que cabe ressaltar aqui é a diferença na interface e mecanismos do programa entre uma versão e outra. Então fique atento, para testar os procedimentos descritos aqui recomenda-se a versão 4.0.2 do iReport. Neste artigo será usado a opção de acesso aos dados por meio de  JabaBeans set datasource, que permite popular o relatório com informações, por exemplo, de um list.






CONFIGURANDO ACESSO AOS DADOS

Como foi dito, será usado como fonte de dados a opção de  JabaBeans set datasource. Para que seja possível a criação do relatório é necessário gerar um jar da aplicação onde será inserido os relatórios jasper. Caso esteja usando o Eclipse, basta clicar sobre o projeto com o botão direito e escolher a opção export e seguir os procedimentos indicados.
Após gerado o jar da aplicação, é necessário agora adicionar o mesmo ao classpath do iReport. Para isso acesse o menu "Ferramentas\Opções". Veja um exemplo na imagem abaixo onde foi adicionado o arquivo "E:\iReports\Agenda.jar".




Agora que foi adicionado o jar com os arquivos beans, nesse caso entities, já é possível usar os mesmos para criar o relatório. Na etapa seguinte vai ser criado um relatório master que se refere a entity Pessoa que está dentro do pacote br.claupers.agenda.entities. Em seguida será criado o sub-relatório para a entity Fone. Segue abaixo o código fonte de ambas as entities:


Pessoa:

package br.claupers.agenda.entities;

@Entity
public class Pessoa extends AbstractModelObject implements Serializable {
    private static final long serialVersionUID = 1L;    

    @Id
    @GeneratedValue(strategy=SEQUENCE, generator = "COD_PESSOA")
    @Column(name="COD_PESSOA")
    
    private int codPessoa;

    @Column(name="BAIRRO_PESSOA")
    private String bairroPessoa;

    @Column(name="COMPLEMENTO_PESSOA")
    private String complementoPessoa;

    @Column(name="ENDERECO_PESSOA")
    private String enderecoPessoa;

    @Column(name="NOME_PESSOA")
    private String nomePessoa;

    @Column(name="OBS_PESSOA")
    private String obsPessoa;

    //bi-directional many-to-one association to Fone
    @OneToMany(mappedBy="pessoa")
    private List<Fone> fones;

    //bi-directional many-to-one association to Cidade
    @ManyToOne
    @JoinColumn(name="COD_CIDADE")
    private Cidade cidade;
 
    public Pessoa() {
    }
    //getters e setters omitidos
           
}
Fone:

package br.claupers.agenda.entities;

@Entity
public class Fone implements Serializable {
 private static final long serialVersionUID = 1L;

 @Id
 @GeneratedValue(strategy=SEQUENCE, generator = "COD_FONE")
 @Column(name="COD_FONE")
 private int codFone;

 @Column(name="NUM_FONE")
 private String numFone;

 @Column(name="TIPO_FONE")
 private String tipoFone;

 //bi-directional many-to-one association to Pessoa
    @ManyToOne
 @JoinColumn(name="COD_PESSOA")
 private Pessoa pessoa;

    public Fone() {
    }
   //getters e setters omitidos 
}







CRIANDO RELATÓRIOS E CARREGANDO OS DADOS DOS JAVABEANS

Agora que os beans já foram adicionados ao classpath do iReport, é hora de criar os relatórios. Para isso acesse o menu "Arquivo\new...". Na tela que irá abrir selecione o template Blank A4 e clique em "Open this template". Na tela seguinte, em Report name digite Pessoas, escolha um local para salvar e clique Próximo. Na tela seguinte clique em Finalizar. Com esse procedimento foi criado um relatório em branco. Agora é hora de adicionar a fonte de dados. Para isso clique no botão Report Query, ao lado de Preview. Com isso será aberto a tela para editar a query. Clique na aba JavaBean Datasource, em Class name digite o nome da classe juntamente com o caminho dos pacotes. Neste exemplo o valor é br.claupers.agenda.entities.Pessoa. Em seguida, clique no botão Read attributes. Se tudo foi feito corretamente até aqui será carregado todos os atributos da entidade informada. Agora deve ser selecionado todos os atributos e em seguida clicado em Add selected field(s) e depois Ok. Feito isso os campos estarão disponíveis para criação do relatório. Veja exemplo abaixo do procedimento que foi descrito:



Feito isso, o relatório já pode ser desenhado. Veja abaixo uma sugestão de Layout para o relatório:



Na imagem acima pode ser visto a esquerda todos os campos disponíveis. No relatório foi usado apenas o field nomePessoa que irá trazer apenas o nome do contato e logo abaixo todos os telefones do mesmo. Para isso será usado o componente Subreport que será tratado na seção seguinte. Também foi usado um componente que já vem no iReport para informar o número da página e o total de páginas. Sobre isso não será detalhado pois o uso deste componente não é complexo.

ADICIONANDO UM SUBREPORT NO iREPORT

A opção de subreport do iReport permite exibir no relatório os relacionamentos master/detail existente no sistema. Os procedimentos para isso são:
1) Criar um relatório com os campos de entity Fone e salvar na mesma pasta do relatório mestre. Nesse exemplo o relatório detalhe terá o nome pessoas_fones.
2)Adicionar um componente Subreport no relatório principal. Nesse exemplo o relatório principal é o Pessoas criado anteriormente.
3) Informar no componente Subreport a fonte de dados.

A etapa 1, já foi explicada para a entity Pessoa, basta fazer o mesmo com a entity Fone. O que deve ser observado é a necessidade de salvar o relatório detalhe na mesma pasta do mestre.
A etapa 2 consiste em arrastar o componente da palheta para o relatório mestre. Ao fazer isso ele irá solicitar que se crie um relatório ou informe o que será usado. Nesse exemplo o relatório é o "E:\iReports\pessoas_fones.jrxml". Selecione o relatório e clique em Próximo. Na tela seguinte marque a opção Use the same connection used to fill the master report e clique em Próximo duas vezes e na tela final marque a opção Store the directory name in a parameter. Essa é uma configuração importante pois caso seja mantido o caminho estático, quando o relatório for adicionado ao projeto não irá funcionar pois irá buscar o arquivo no local onde o relatório foi criado. Marque a opção indicada e clique em Finalizar.
Feito isso, agora é hora de informar de onde o subreport irá carregar os dados. Como pode ser observado no código da entity Pessoa loca acima, existe um atributo do tipo List que carrega objetos do tipo fone. Essa será a fonte da dados do subreport, veja:

//bi-directional many-to-one association to Fone
    @OneToMany(mappedBy="pessoa")
    private List<Fone> fones;

A questão é, como fazer isso? Não se assuste, o procedimento é bem simples, para isso basta clicar sobre o componente subreport que está no relatório Pessoas e nas propriedades do componente localizar Data Source Expression. Clique no botão ao lado e insira os seguintes parametros:

new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{fones})

Clique em Ok para salvar. Com isso o relatório será capaz de carregar as informações no subreport.
Agora falta apenas configurar o caminho do arquivo jasper do subreport no relatório principal, pois quando o relatório for carregado pelo programa java ele deve saber onde se encontra o arquivo do relatório detalhe. Para isso basta editar o Parameter  SUBREPORT_DIR e colocar o caminho do pacote onde serão armazenados os relatórios, neste exemplo "br/claupers/agenda/report/". Muita atenção para o tipo da barra, pois caso contrário não irá funcionar. Veja imagem abaixo para maiores detalhes sobre a configuração desse parâmetro:


Se todas as etapas acima foram feitas corretamente, o relatório pode ser compilado e movido para o projeto java. Não copie, mova os arquivos jasper pois se a referência ao relatório estiver buscando onde foi compilado vai gerar um erro e permitir a correção, caso contrário o erro só ocorrerá para o usuário final. Na seção seguinte será demonstrado como usar o relatório no projeto.


USANDO O RELATÓRIO JASPER GERADO NO iREPORT EM UM PROJETO JAVA SWING

Uma vez que os relatórios foram gerados e os arquivos jasper movidos para o pacote "br.claupers.agenda.report", para usa-los basta fazer o seguinte:


btnImprimir.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                List <Pessoa> listaDePessoas = new ArrayList<Pessoa>();
                listaDePessoas.addAll(controlaListaPessoas.getListaDePessoas());
                JRDataSource jrds = new JRBeanCollectionDataSource(listaDePessoas);
                URL jasper = this.getClass().getResource("/br/claupers/agenda/report/Pessoas.jasper");  
                try {
                    InputStream fs;  
                      fs = (InputStream) jasper.getContent();
                      JasperPrint impressao = JasperFillManager.fillReport(fs,null,jrds);
                      JasperViewer viewer = new JasperViewer(impressao, false);                    
                      viewer.setVisible(true);
                   }
                   catch(Exception ex) {
                       ex.printStackTrace();
                   }
            }
        });

Seria isso. Sugestões e dúvidas, favor postar um comentário.


Cordialmente;


Claudir Pereira dos Santos

Matelândia, 14 de junho de 2011.

4 comentários:

  1. Muto bom o Post.
    Várias foram as tentativas de se usar uma entity, mas acabava corrento pra conexão e SQL direto no relatório. E dica d einclusão do jar foi fatal. Valeu!
    Fernando Melo
    Floripa

    ResponderExcluir
  2. Legal Claudir.

    Muito bom seu tutorial.

    Como fazer utilizando HashSet?

    ResponderExcluir
  3. Prezado muito bom, eu tenho um projeto com JSF 2 JPA, estou tentando colocar o relatorio mais bem como achar a pasta onde o rel esta? nao posso colocar minha pasta C:\.... e ai esta meu problema
    parece simples né? mais... vc teria alguma dica?

    Robson

    ResponderExcluir
  4. Prezado,

    Parabéns pelo tutorial. Ficou excelente.
    Só uma dúvida, quais as bibliotecas referente ao ireport 4.0.2 devo adicionar ao meu projeto, para que o jar funcione corretamente?

    Ps. Na versão mais antiga do Ireport consegui gerar normalmente. Estou pensando em migrar para o 4.0.2.

    Att,

    Bruno W. Amorim

    ResponderExcluir