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