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:
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.



