Pesquisar neste blog

Mostrando postagens com marcador Javabeans set datasource. Mostrar todas as postagens
Mostrando postagens com marcador Javabeans set datasource. Mostrar todas as postagens

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.