isuais em seus ambientes de desenvolvimento RAD, desde que o Visual Basic 3 incorporou uma versão reduzida do Crystal Reports. O Java 2 SDK e alguns IDEs populares como o Eclipse e o NetBeans ainda não incluem ferramentas do gênero, de modo que muitos desenvolvedores acreditam – erroneamente – que este tipo de facilidade não está disponível em Java.
Parte do problema vem do fato da maioria dos geradores de relatórios populares serem aplicações independentes escritas em C, em muitos dos casos suportando apenas a plataforma Windows. São portanto incompatíveis com o objetivo de portabilidade do Java. Outra parte vem do fato da maioria desses geradores estarem disponíveis para aquisição em separado e, por meio de chamadas a JNI ou requisições HTTP, poderem ser utilizados como parte de qualquer sistema, independentemente da linguagem de programação na qual foram escritos – eliminando assim a necessidade de se criar versões dos produtos específicas para o desenvolvimento Java.
Mas isto não quer dizer que não existam geradores de relatórios escritos em Java. Na verdade, existem muitos, inclusive vários premiados por publicações especializadas. Utilizar um gerador escrito em Java tem muitas vantagens além da portabilidade, por exemplo, usar como fonte de dados coleções de objetos Java recuperadas via EJBs, Hibernate, JAXB ou web services. Geradores escritos em outras linguagens necessitarão acesso direto ao banco de dados, e não poderá interagir de forma fácil com objetos Java.
Existem várias opções de geradores de relatórios livres em Java, capazes de atender à maioria dos desenvolvedores (veja o quadro “Mais alternativo livres”).
Neste artigo serão vistas duas ferramentas que se complementam mutuamente: o JasperReports e o iReport.
Não se assuste com a numeração de versão destes dois programas (ambos 0.x), pois um software livre atinge a versão 1.0 apenas quando implementa, de forma confiável, todo o conjunto de features “sonhadas” pelo autor ao iniciar o projeto. Muitas versões 0.x de software livre estão tão ricas e maduras quanto versões 5.x de softwares proprietários, onde a numeração de versões segue mais critérios comerciais do que tecnológicos.
Desenhando ou gerando relatórios
O JasperReports é um engine para a geração de relatórios, escrito inteiramente em Java, que recebe como entrada uma descrição estruturada do relatório na forma de um documento XML, e gera a saída diretamente na impressora (incluindo uma pré-visualização baseada em Swing), ou como um documento PDF, HTML, XLS ou CSV. Já o iReport é um “desenhador” visual de relatórios, também escrito em Java, que gera descrições XML no formato esperado pelo JasperReports. O quadro “Desenhadores alternativos” cita outros softwares que poderiam ser utilizados em substituição ao iReport.
Seria possível gerar relatórios utilizando apenas o JasperReports – bastaria editar a descrição manualmente, de preferência com um editor especializado em XML. É fornecido inclusive o DTD que define o dialeto XML reconhecido pela ferramenta.
Além disso, algumas empresas apreciarão a possibilidade de gerar relatórios para o JasperReports diretamente a partir de documentos XML, mediante transformações XSL (não inclusas no JasperReports). Uma quantidade crescente de sistemas adota esta estratégia, em vez do design visual tradicional nas ferramentas RAD.
Por outro lado, se você prefere o modelo RAD tradicional, o iReport cumpre esta função, executando o JasperReports “por baixo dos panos”, e permitindo gerar relatórios sem necessidade de escrever código Java.
Instalação do iReport
Seguindo o caminho mais fácil, vamos iniciar pelo iReport (veja no quadro “Abandonando o lado negro” um pouco da sua história). Esta será uma exploração sem compromisso por alguns dos menus e diálogos do programa, dando uma idéia de suas capacidades e idiossincrasias, para que depois possamos apresentar com mais detalhes a estrutura de um relatório do JasperReports e seu uso programático.
Baixe a versão mais recente do pacote iReport0.2.x.zip no site do programa (0.2.3 quando da escrita deste artigo) – mas não baixe o pacote iReport0.2.x_nolib.zip – e descompacte o pacote em um diretório à sua escolha. Cuidado, pois o pacote não fornece uma raiz comum para todos os arquivos inclusos (recomendo criar um diretório para agrupar os arquivos descompactados).
A distribuição do iReport inclui fontes, no diretório src, além dos bytecodes correspondentes no diretório classes, mas utiliza o Ant (na recente versão 1.6 ou posterior) para gerar o classpath necessário à execução. Também deve estar disponível um JSDK e não apenas um JRE – o motivo será visto mais à frente.
O subdiretório noAnt fornece arquivos .sh e .bat apropriados para a execução do iReport em ambientes Linux e Windows,
sem que seja necessário instalar o Ant. Entretanto, usuários de Linux e outros sistemas Unix devem tomar cuidado, pois os scripts estão no formato Windows, com finais de linha CR+LF, e não serão aceitos pelo shell, a menos que sejam
convertidos para o formato Unix (com finais de linha LF).
Assim sendo, entre no diretório criado para a descompactação do iReport, e execute ant iReport, ou, alternativamente, execute sh startup.sh (startup.bat no Windows) a partir do subdiretório noAnt para iniciar o iReport. Tanto os scripts na raiz de instalação do iReport quanto os no subdiretório noAnt podem ter que ser modificados para o ambiente do usuário.
Cuidado! Há uma série de pacotes JAR no subdiretório lib, como iText, POI, Xerces, o próprio JasperReports e várias bibliotecas do Jakarta Commons. Eles são necessários para a execução do iReport, mas tome cuidado pois, caso algum deles esteja também presente no classpath do seu sistema operacional, poderá haver conflitos de versão. Se isso acontecer, modifique os scripts de inicialização (iReport.bat/sh e startup.bat/sh) para configurar inicialmente um classpath vazio, contendo apenas o pacote tools.jar do Java 2 SDK.
No pacote ZIP baixado, todas as bibliotecas necessárias já estão disponíveis, inclusive o JasperReports 0.5.2 e drivers JDBC para alguns bancos de dados livres. Caso deseje disponibilizar outros drivers, basta copiar os pacotes JAR correspondentes para o subdiretório db_drivers.
Nota: Em algumas plataformas (por exemplo, no Windows 98), os pacotes no subdiretório db_drivers podem não ser incorporados corretamente ao classpath. Neste caso, copie os drivers JDBC desejados para o subdiretório lib.
Instalação do iReport
Seguindo o caminho mais fácil, vamos iniciar pelo iReport (veja no quadro “Abandonando o lado negro” um pouco da sua história). Esta será uma exploração sem compromisso por alguns dos menus e diálogos do programa, dando uma idéia de suas capacidades e idiossincrasias, para que depois possamos apresentar com mais detalhes a estrutura de um relatório do JasperReports e seu uso programático.
Baixe a versão mais recente do pacote iReport0.2.x.zip no site do programa (0.2.3 quando da escrita deste artigo) – mas não baixe o pacote iReport0.2.x_nolib.zip – e descompacte o pacote em um diretório à sua escolha. Cuidado, pois o pacote não fornece uma raiz comum para todos os arquivos inclusos (recomendo criar um diretório para agrupar os arquivos descompactados).
A distribuição do iReport inclui fontes, no diretório src, além dos bytecodes correspondentes no diretório classes, mas utiliza o Ant (na recente versão 1.6 ou posterior) para gerar o classpath necessário à execução. Também deve estar disponível um JSDK e não apenas um JRE – o motivo será visto mais à frente.
O subdiretório noAnt fornece arquivos .sh e .bat apropriados para a execução do iReport em ambientes Linux e Windows, sem que seja necessário instalar o Ant. Entretanto, usuários de Linux e outros sistemas Unix devem tomar cuidado, pois os scripts estão no formato Windows, com finais de linha CR+LF, e não serão aceitos pelo shell, a menos que sejam convertidos para o formato Unix (com finais de linha LF).
Assim sendo, entre no diretório criado para a descompactação do iReport, e execute ant iReport, ou, alternativamente, execute sh startup.sh (startup.bat no Windows) a partir do subdiretório noAnt para iniciar o iReport. Tanto os scripts na raiz de instalação do iReport quanto os no subdiretório noAnt podem ter que ser modificados para o ambiente do usuário.
Cuidado! Há uma série de pacotes JAR no subdiretório lib, como iText, POI, Xerces, o próprio JasperReports e várias bibliotecas do Jakarta Commons. Eles são necessários para a execução do iReport, mas tome cuidado pois, caso algum deles esteja também presente no classpath do seu sistema operacional, poderá haver conflitos de versão. Se isso acontecer, modifique os scripts de inicialização (iReport.bat/sh e startup.bat/sh) para configurar inicialmente um classpath vazio, contendo apenas o pacote tools.jar do Java 2 SDK.
No pacote ZIP baixado, todas as bibliotecas necessárias já estão disponíveis, inclusive o JasperReports 0.5.2 e drivers JDBC para alguns bancos de dados livres. Caso deseje disponibilizar outros drivers, basta copiar os pacotes JAR correspondentes para o subdiretório db_drivers.
Nota: Em algumas plataformas (por exemplo, no Windows 98), os pacotes no subdiretório db_drivers podem não ser incorporados corretamente ao classpath. Neste caso, copie os drivers JDBC desejados para o subdiretório lib.
Mais alternativas livres
Conheça algumas ferramentas que podem ser usadas em substituição ou como complemento ao JasperReports/iReport:
JFreeReport (www.jfree.org/jfreereport) – segue a mesma filosofia do JasperReports; gera relatórios em vários formatos diferentes a partir de uma descrição em XML, sem incluir um editor visual para estas descrições. Sua descrição é mais “verbosa” do que o JasperReports, mas o JFreeReport também é um projeto maduro e reconhecido pela comunidade. Nele, os dados para os relatórios são obtidos de um TableModel do Swing, o que facilita sua incorporação a aplicações gráficas (mas a dificulta em aplicações web). A mesma organização mantém o JFreeChart (veja o quadro “Gráficos e imagens em relatórios”).
eSuite (jeez.sf.net) – um conjunto de plug-ins para o Eclipse que fornece suporte ao JFreeReport; inclui um editor visual para as descrições de relatórios.
JReporter (jreporter.sf.net) – outra opção de biblioteca de classes Java para a geração de relatórios. Fornece classes utilitárias, como diálogos para a configuração da impressora, mas não existe ainda um desenhador visual dos seus relatórios.
DataVision (datavision.sf.net) – gerador de relatórios mais tradicional, que incorpora tanto o desenhador visual dos layouts quanto os componentes para a execução dos relatórios pelas aplicações.
O banco de dados de exemplo
Antes de tudo, é necessário ter um banco de dados pronto para alimentar o relatório. Nossos exemplos serão construídos sobre um banco simples, contendo sumários de vendas por região e por produto. A Listagem 1 inclui um script SQL que cria as tabelas e insere alguns dados (com registros omitidos para poupar espaço). O código completo do script pode ser baixado no site da Java Magazine.
Será utilizado o banco de dados
HSQLDB (apresentado na Edição 7), pois assim o exemplo poderá ser executado facilmente em qualquer plataforma. O iReport já inclui o driver JDBC e o próprio
servidor do HSQLDB. Este será utilizado no modo StandAlone (de acesso direto aos arquivos) apenas por comodidade – um ambiente de produção utilizaria o modo Server para permitir o acesso multiusuário.
Inclua o pacote <ireport>/db_drivers/
hsqldb*.jar no seu classpath e execute o comando a seguir (em uma única linha) para rodar o script de criação das tabelas:
java org.hsqldb.util.ScriptTool
-url jdbc:hsqldb:
-database /home/lozano/vendas
-script vendas.sql
Nota: O iReport inclui o HSQLDB 1.7.2RC2, que utiliza formatos de arquivos incompatíveis com versões anteriores, como a 1.7.1. Portanto, tenha certeza de utilizar o pacote JAR fornecido e não outra versão dos JARs do HSQLDB que você tenha instalada.
Não se esqueça de substituir “/home/lozano” pelo diretório onde você deseja armazenar seus arquivos de bancos de dados. Qualquer mensagem diferente de “update count 0” ou “update count 1” indica que houve algum erro na criação do banco – provavelmente as classes do HSQLDB não foram adicionadas corretamente ao classpath, ou você não tem acesso ao diretório escolhido para a criação dos arquivos, ou ainda o banco de dados está em uso por outro processo.