ESTRATÉGIAS PARA O DESENVOLVIMENTO DE RELATÓRIOS

Propaganda
Revista Eletrônica da Faculdade Metodista Granbery
http://re.granbery.edu.br - ISSN 1981 0377
Curso de Sistemas de Informação - N. 10, JAN/JUN 2011
ESTRATÉGIAS PARA O DESENVOLVIMENTO DE RELATÓRIOS UTILIZANDO O
JASPERREPORTS COM IREPORT
Elio Lovisi Filho1
RESUMO
Este artigo apresenta o desenvolvimento de um relatório para um sistema, implementado em
Java, empregando-se duas diferentes estratégias. Apresentam-se aqui as técnicas e as
ferramentas empregadas neste desenvolvimento, em especial o framework JasperReports e o
programa iReport, bem como os resultados obtidos durante a realização do processo.
PALAVRAS-CHAVE: JASPERREPORTS, IREPORT, RELATÓRIOS, JAVA
ABSTRACT
This article presents the development of a report for a system, implemented in Java, using
two differents strategies. The techniques and the tools used in this development are presented
here, specially the JasperReports framework and the iReport program, as well as the results
gotten during his accomplishment.
KEY-WORDS: JASPERREPORTS, IREPORT, REPORTS, JAVA
1 - Mestre em Informática pelo Instituto Tecnológico de Aeronáutica, Professor do curso de
Sistemas de Informação da Faculdade Metodista Granbery e do curso de Redes de
Computadores da Faculdade Estácio de Sá, e ainda, Analista de Sistemas da Prefeitura de
Juiz de Fora. Email: [email protected]
1. INTRODUÇÃO
No desenvolvimento de sistemas de informação uma das tarefas de mais comuns
é a elaboração de relatórios. Esta forma de apresentação de dados é muito relevante, sendo
bastante solicitada pelos usuários [Gonçalves 2008].
Em geral, o desenvolvimento de relatórios envolve a definição do design e
mapeamento de dados para campos dentro de um layout. Para tanto, existem diversas
ferramentas para auxiliar neste processo.
Atualmente, diversas ferramentas open-source com o esse objetivo estão
disponíveis, e tão ou mais robustas que as comerciais, com a grande conveniência de serem
gratuitas. É o caso de algumas ferramentas empregadas neste trabalho como o JasperReports
e o iReport [Shahi 2007] .
Neste artigo será apresentado um tutorial do desenvolvimento de relatórios para
uma aplicação Java empregando essas ferramentas. Para permitir o melhor entendimento,
será utilizado o software apresentado no artigo de Lovisi e Castro (2009).
As ferramentas empregadas no desenvolvimento deste tutorial foram:
• a IDE NetBeans 6.9, disponível em http://www.netbeans.org/;
• o framework JasperReports versão 4.0, que pode ser obtido em
http://jasperforge.org/projects/jasperreports; e
• o
aplicativo
iReport
versão
4.0,
que
pode
ser
obtido
em
http://www.jasperforge.org/projects/ireport .
Nos próximos itens será apresentada uma visão geral do framework
JasperReports e do iReport. Após isso, são mostradas duas formas distintas para a criação de
um relatório em um aplicativo Java empregando essas ferramentas.
2. JASPERREPORTS
O JasperReports é um framework open-source para geração de relatórios
desenvolvido em Java, podendo ser empregado em aplicativos de diferentes plataformas,
como desktop e Web. [Gonçalves 2008]
Esse framework apresenta vários recursos para facilitar a organização de dados e
formatação de conteúdo. Possibilita também a geração de relatórios em diversos formatos,
como PDF, HTML, XLS, CSV e XML.
2
Segundo Shahi (2007), a geração de relatórios neste framework envolve os
seguintes componentes e atividades:
• A parte gráfica (design) do relatório é definida em um arquivo específico no
formato XML. Para tanto, existem tags XML que obedecem a uma rígida estrutura,
vocabulário e restrições declarados em um arquivo DTD (jasperreports.dtd). Usando XML, o
designer pode definir textos estáticos, imagens, linhas, formas geométricas, entre outros e
suas localizações dentro do relatório. Pode-se também definir os campos que serão
preenchidos dinamicamente a partir de dados de um aplicativo.
• Após isso, o arquivo XML é compilado, gerando um arquivo .jasper. Isto
implica na compilação de todas as expressões Java definidas no arquivo XML, sendo então
realizadas várias verificações estáticas (em tempo de compilação).
• Esse arquivo .jasper, é utilizado por diferentes objetos JasperReports para
geração de relatório: JasperReport, JasperPrint e JasperViewer; e
• Os dados necessários para o relatório podem ser obtidos de diferentes fontes,
como um SGBD ou um arquivo XML. Sendo assim, o framework suporta vários tipos de
datasources (fonte de dados) por meio de uma interface específica chamada JRDataSource.
A figura a seguir representa as atividades necessárias ao processo de geração
de relatórios empregado o framework.
Figura 1: Geração de relatórios utilizando o framework JasperReport [JasperForge 2007].
3
3. IREPORT
A elaboração do formato (design) do relatório empregando código XML é, em
geral, uma tarefa bastante trabalhosa. Para automatizar este processo existem diferentes
ferramentas como, por exemplo, o iReport [Toffoli 2008].
Esta ferramenta permite definir o design do relatório dentro de um ambiente
gráfico, permitindo a fácil utilização dos recursos do framework JasperReports. A aplicação
do iReport permite desenvolver relatórios elaborados sem utilizar diretamente o código XML,
o qual é todo gerado automaticamente. O ambiente ainda oferece atalhos para tarefas de
compilação e visualização do relatório, facilitando assim a elaboração do relatório.
A figura a seguir apresenta a tela principal da ferramenta. Neste trabalho será
empregada a versão 4.0 da ferramenta.
Figura 2: Tela principal do iReport
4
Na parte esquerda da tela, é apresentado o Report Inspector, no qual são exibidos
os componentes do relatório, como as seções (bands), campos (fields), variáveis (variables),
entre outros.
Na direta, é exibida a paleta de componentes (Palette), a qual permite a inclusão
dos mesmos ao relatório apenas arrastando o componente desejado para o relatório que está
sendo desenvolvido na parte central da tela.
Acima do relatório é exibida a barra de ferramentas, que permite a configuração
dos básica de alguns componentes do relatório, a compilação e a exibição de diferentes
formatos do mesmo (Design, XML e Preview).
4. PRIMEIRO EXEMPLO DE CRIAÇÃO DE RELATÓRIOS EMPREGANDO
IREPORT E JASPERREPORTS
Agora, será apresentado um exemplo da aplicação das ferramentas apresentadas
anteriormente na geração de um relatório. Para tanto, será acrescentado um relatório a uma
aplicação desenvolvida anteriormente, a qual permite a manutenção de dados de
departamentos [Lovisi e Castro 2009]. Este relatório apresenta os dados (id, nome, área) os
dados de todos departamentos cadastrados no sistema.
Conforme citado anteriormente, o desenvolvimento de um relatório envolve a
criação da sua interface no iReport, e a inclusão de código Java à aplicação existente para
preencher e exibir o relatório. Neste código serão necessários comandos do framework
JasperReports.
Essas atividades serão detalhadas nas próximas seções.
4.1. CRIAÇÃO DA CONEXÃO COM O BANCO DE DADOS
Na tela principal do iReport (neste exemplo será utilizada a versão 4.0), deve-se
criar uma nova conexão selecionando a opção "Report Datasources", da barra de
ferramentas, conforme a próxima figura.
Figura 3: Opção Report DataSources
5
Será exibida, então, a tela a seguir que permite a criação a gerência das conexões.
Nela, deve-se selecionar a opção "New".
Figura 4: Conexões com banco de dados
Na tela seguinte, deve-se selecionar "Database JDBC Conection", e após isso,
"Next". Será exibida então uma tela similar a próxima figura.
Figura 5: Criação das Conexões JDBC
6
Deve-se informar o nome (Name) para a conexão, escolher o driver MySQL em
JDBC Driver e substituir "MYDATABASE" pelo nome do banco de dados, na opção JDBC
URL. Neste exemplo utilizou o nome "exemplohibernate" para a conexão.
Em username e password, informa-se o usuário e a senha do banco de dados.
Marcar também a opção "Save password".
Se quiser, pode-se verificar se a conexão está correta na opção "Test".
Finalmente, guarde os dados da conexão na opção "Save".
4.2. CRIAÇÃO DO DESIGN DO RELATÓRIO
Após criada a conexão, deve-se desenvolver o layout do relatório. Para isso, crie
um novo documento JasperReports usando o item de menu "File/New...". Será apresentada
então a seguinte tela.
Figura 6: Criação do Relatório
Selecionar a opção "Blank A4", conforme a figura anterior, e após isso, a opção
"Open this Template". Na tela seguinte, dê o nome "rptDepartamentos" para o arquivo,
7
selecione a opção "Next" para que, finalmente, seja criado o arquivo. O programa irá criar o
arquivo rptDepartamentos. jrxml no diretório que foi indicado.
Após isso, é apresentado então um modelo de relatório com diferentes bandas ou
seções (bands). Um relatório JasperReport pode ser dividido nas seguintes seções:
[Gonçalves 2008]
1. Title: nesta banda define-se o título do relatório;
2. Page Header: apresentada no começo de cada página impressa;
3. Column Header: banda apresentada no começo de cada coluna;
4. Detail 1: local de exibição dos dados de cada item de registro;
5. Column Footer: apresentada após cada coluna;
6. Page Footer: rodapé de cada página;
7. Last Page Footer: banda apresentada ao final da última página;
8. Summary: seção de sumário, apresentada somente no término do relatório; e
9. Backgound: permite a inserção de marcas d'água, por exemplo.
A próxima figura apresenta um modelo de relatório criado pelo iReport. Observe
que o relatório possui diferentes seções já definidas pela ferramenta. Se o usuário desejar,
pode remover alguma seção que não seja necessária, ou ainda alterar suas propriedades.
Figura 7: Seções do Relatório
8
Na barra de ferramentas, selecionar a conexão que deseja-se utilizar, conforme
mostra a próxima figura. Neste tutorial empregou-se a conexão exemplohibernate, criada no
item anterior.
Figura 8: Escolha da Conexão
Para criar-se os campos, selecione a opção “Report Query” conforme a figura
abaixo.
Figura 9: Opção Report Query
Será exibida, então, uma tela que recupera automaticamente os atributos do banco
de dados, facilitando a criação dos campos do relatório. Na parte superior da tela, digite uma
consulta SQL para recuperar todos os dados da tabela Departamento. Serão exibidos então
todos os atributos da tabela, conforme a próxima figura. Selecione, então a opção “Ok”.
Figura 10: Criação dos Campos
9
Observe que em Report Inspector, na parte esquerda da tela, são exibidos os
campos (Fields), as seções, os parâmetros (Parameters), as variáveis (Variables) do relatório,
como pode ser observado na próxima figura.
Figura 11: Campos do relatório
Arraste os campos para a seção Detail 1 do formulário. Com isso, define-se quais
os campos serão dinâmicamente exibidos no relatório.
O iReport possui várias facilidades para auxiliar na melhoria do visual do
relatório. Para tanto, pode-se acrescentar diferentes componentes como textos, imagens e
linhas, alterar fontes, mudar alinhamento, remover seções, entre outros para aprimorar o
projeto do relatório.
Para criar os textos estáticos do relatório utiliza-se o componente Static Text da
paleta (Palette). Na parte inferior direita do relatório foi incluída a numeração automática das
páginas, utilizando o componente Page number da paleta.
O relatório desenvolvido no exemplo possui somente as seções: Title, Column
Header, Detail 1 e Page Footer. As demais seções foram retiradas do relatório para melhorar
a aparência do mesmo.
A figura a seguir apresenta o layout desenvolvido para o relatório.
10
Figura 12: Layout do relatório
Finalmente, deve-se compilar o relatório (extensão .jrxml) para gerar o arquivo
que será utilizado no aplicativo, que possui a extensão ".jasper". Para tanto, seleciona-se a
opção “Compile Report” da barra de ferramentas.
Figura 13: Opção Compile Report
O programa irá gerar o arquivo rptDepartamentos.jasper no mesmo diretório de
trabalho. Se quiser testar o relatório, selecione a opção “Preview”.
5. ALTERAÇÃO DA APLICAÇÃO
Conforme citado, será utilizada uma aplicação desenvolvida anteriormente para
exemplificar o desenvolvimento do relatório. Esta aplicação permite a gerência de
departamentos e foi desenvolvida aplicando-se o framework Hibernate para persistência de
dados, além do SGBD MySQL [Lovisi e Castro 2009].
Abra o projeto no NetBeans, versão 6.9 ou superior, e crie um novo pacote
(Package) chamado "Report" dentro de "Source Package".
Após isso, inclua o framework JasperReports no seu projeto. Para tanto, selecione
a opção Tools/Library. A seguinte tela será exibida.
11
Figura 14: Gerência de bibliotecas no NetBeans
Crie uma nova biblioteca, acessando a opção new Library da tela anterior.
Atribua para ela o nome Jasper e adicione os arquivos necessários. Além da biblioteca do
JasperReports (jasperreports-3.7.0.jar) são necessárias também outras bibliotecas:
• Commons BeanUtils Component (versão 1.7 ou posterior);
• Commons Collections Component ( versão 2.1 ou posterior);
• Commons Javaflow (versão Sandbox );
• Commons Logging Component ( versão 1.0 ou posterior);
• Commons Digester Component ( versão 1.7 ou posterior);
• Groovy ( versão 1.5.5 ou posterior); e
• iText ( versão 1.3.1 ou posterior). [JasperForge 2007]
De acordo com a funcionalidade necessária, poderão ser requeridas ainda outras
bibliotecas. Após isso, adicione a biblioteca criada ao projeto.
Agora, dentro do pacote Report, crie uma classe para preencher os dados e exibir
o relatório, chamada GerarRelatorioDepartamentos, com um construtor público e inclua nela
o seguinte método.
12
1. public void gerar( ) throws ClassNotFoundException, SQLException{
2.
Map parameters = new HashMap();
3.
InputStream reportStream = this.getClass().getResourceAsStream
("\\rptDepartamentos.jasper");
4.
try {
5.
Class.forName("com.mysql.jdbc.Driver");
6.
Connection conn =
DriverManager.getConnection("jdbc:mysql://localhost:3306/exemplohibernate
", "root", "root");
7.
8.
JasperReport jrpt = (JasperReport)
JRLoader.loadObject(reportStream);
9.
JasperPrint jasperPrint = JasperFillManager.fillReport(jrpt, parameters,
conn);
10.
JasperViewer.viewReport(jasperPrint, false);
11.
} catch (JRException e) {
12.
e.printStackTrace();
13.
}
14. }
No código acima, podemos observar que na linha 3, é informado o arquivo .jasper
do relatório, o qual deverá estar no mesmo pacote. Na linha 8, é criado um relatório
utilizando esse arquivo. Na linha seguinte, os dados são inseridos e na linha 10, o relatório é
exibido.
Na tela principal da aplicação, inclua uma nova opção (botão ou item do menu) e
no evento mouseClicked inclua o código abaixo.
1. private void jBtnRelatorioMouseClicked(java.awt.event.MouseEvent evt) {
2.
GerarRelatorioDepartamentos gerarRelatorioTodosClientes = new
GerarRelatorioDepartamentos();
3.
try {
4.
gerarRelatorioTodosClientes.gerar();
5.
} catch (Exception ex) {
6.
ex.printStackTrace();
7.
}
8. }
Finalmente, copie o arquivo compilado do relatório (rptDepartamentos. jasper)
para o pacote Report e execute a aplicação. O sistema deverá, então, exibir uma tela similar a
mostrada na próxima figura.
Observe que o sistema permite, além de imprimir o relatório, exportar o mesmo
em diferentes formatos, como pdf ou xls.
13
Figura 15: Exibição do relatório no JasperViewer
6. UTILIZANDO UM DATA SOURCE DA PRÓPRIA APLICAÇÃO
Observe que no exemplo desenvolvido até então os dados dos departamentos são
recuperados a partir de uma consulta do próprio relatório. Pode-se desenvolver uma solução
na qual os dados dos objetos sejam recuperados a partir de métodos existem na própria
aplicação.
Para tanto é necessário desenvolver uma nova fonte de dados (Data Source),
criando-se, no pacote Report, a classe DepartamentoDataSource. Esta classe deve
implementar a interface JRDataSource (“implements JRDataSource”). O NetBeans irá sugerir
que sejam implementados todos os métodos abstratos, criando automaticamente os métodos a
seguir.
14
1. public boolean next() throws JRException {
2.
throw new UnsupportedOperationException("Not supported yet.");
3. }
4.
5. public Object getFieldValue(JRField jrf) throws JRException {
6.
throw new UnsupportedOperationException("Not supported yet.");
7. }
Após isso, crie atributos e altere o construtor da classe conforme apresentado
abaixo.
1.
2.
3.
4.
5.
6.
7.
8.
private Object valorAtual;
private Iterator todosDepartamentos;
private boolean irParaProximoDepartamento = true;
public DepartamentoDataSource(List lista) {
super();
this.todosDepartamentos = lista.iterator();
}
Ainda na classe DepartamentoDataSource, altere o código dos métodos next() e
getFieldValue conforme mostrado abaixo.
1. public boolean next() throws JRException {
2.
valorAtual = todosDepartamentos.hasNext() ? (Departamento)
todosDepartamentos.next() : null;
3.
irParaProximoDepartamento = (valorAtual != null);
4.
return irParaProximoDepartamento;
5. }
6.
7. public Object getFieldValue(JRField jrf) throws JRException {
8.
Object valor = null;
9.
Departamento departamento = (Departamento) valorAtual;
10.
11.
if ("id".equals(jrf.getName())) {
12.
valor = departamento.getId();
13.
}
14.
if ("nome".equals(jrf.getName())) {
15.
valor = departamento.getNome();
16.
}
17.
18.
if ("area".equals(jrf.getName())) {
19.
valor = departamento.getArea();
20.
}
21.
return valor;
22. }
Na segunda linha, o valor corrente do registro que está sendo processado é
atribuído ao atributo valorAtual. Este objeto é utilizado no método seguinte para obter o valor
dos campos a partir do nome que foi atrivuído a cada um deles no iReport.
15
Retorne para a classe GerarRelatorioDepartamentos, e inclua o método abaixo.
1. public void gerar(ArrayList<Departamento> todosDepartamentos){
2.
Map parameters = new HashMap();
3.
4.
InputStream reportStream =
this.getClass().getResourceAsStream("\\rptDepartamentos.jasper");
5.
try {
6.
JasperReport jrpt = (JasperReport) JRLoader.loadObject(reportStream);
7. DepartamentoDataSource clienteContratoDataSource = new
DepartamentoDataSource (todosDepartamentos);
8.
JasperPrint jasperPrint = JasperFillManager.fillReport(jrpt, parameters,
clienteContratoDataSource);
9.
JasperViewer.viewReport(jasperPrint, false);
10.
} catch (JRException e) {
11.
e.printStackTrace();
12.
}
13. }
Na
linha
7
do
código
acima
é
criado
um
objeto
da
classe
DepartamentoDataSource. Este objeto é utilizado na linha 8 para informar os dados do
relatório que é exibido pelo comando seguinte.
Finalmente, na tela principal da aplicação, altere o código da opção criada para
impressão conforme o código abaixo.
1.
private void jBtnRelatorioMouseClicked(java.awt.event.MouseEvent evt)
{
2.
3.
4.
5.
6.
7.
8.
GerarRelatorioDepartamentos gerarRelatorioTodosClientes = new
GerarRelatorioDepartamentos();
try {
gerarRelatorioTodosClientes.gerar((ArrayList<Departamento>) new
CtrManterDepartamento().carregarDepartamentos());
} catch (Exception ex) {
ex.printStackTrace();
}
}
7. CONSIDERAÇÕES FINAIS
Neste artigo apresentou-se o desenvolvimento de um exemplo de relatório para
um sistema implementado na linguagem de programação Java. Para tanto, empregou-se a
ferramenta iReport e o framework JasperReports.
16
A utilização da ferramenta iReport apresentou bons resultados, agilizando o
desenvolvimento do projeto do relatório. Além disso, o emprego do framework simplificou os
processos de geração e exibição do relatório.
A segunda forma utilizada para geração do relatório, empregando-se um data
source, foi considerada mais adequada, pois utiliza a conexão do próprio sistema com o
banco de dados, facilitando a manutenção do software.
Propõe-se a aplicação, em trabalhos futuros, das ferramentas apresentadas para o
desenvolvimento de aplicações de outras plataformas, em especial, para softwares Web.
8. REFERÊNCIAS BIBLIOGRÁFICAS
GONÇALVES Edson. Dominando Relatórios JasperReports com iReport. Primeira
edição. São Paulo: Ciência Moderna, 2008. 368 p.
LOVISI FILHO, Elio; CASTRO, Gustavo Mendes. Tutorial sobre a Construção de
Aplicações empregando Java, Hibernate e MySql. Revista Eletrônica da Faculdade
Metodista Granbery - N. 6, JAN/JUN 2009. Disponível em: < http://re.granbery.edu.br>
Acesso em: 21 jan. 2011.
JASPERFORGE.
JasperReports:
Tutorial.
2007.
Disponível
em:
<http://jasperforge.org/projects/jasperreports>.Acesso em: 25 jan. 2011.
SHAHI,
Kumar
Abhishek
JasperReports
by
Example.
2007.
Disponível
em:
<http://groups.google.com/group/abhi_and_friends/web/jasperbyexample>.Acesso em: 12
fev. 2011.
TOFFOLI,
Giulio.
Report
Getting
Started.
2008.
Disponível
em:
<http://jasperforge.org/projects/ireport> .Acesso em: 01 fev. 2011.
TOFFOLI,
Giulio.
iReport
Designing
a
report.
2010.
Disponível
em:
<http://jasperforge.org/projects/ireport> .Acesso em: 04 fev. 2011.
17
Download