SILVIO COSTA MOREIRA UTILIZAÇÃO DAS FERRAMENTAS JASPERREPORTS E IREPORT PARA A GERAÇÃO DE RELATÓRIO EM APLICAÇÕES JAVA Palmas 2005 i SILVIO COSTA MOREIRA UTILIZAÇÃO DAS FERRAMENTAS JASPERREPORTS E IREPORT PARA A GERAÇÃO DE RELATÓRIO EM APLICAÇÕES JAVA “Monografia apresentada como requisito parcial para a obtenção de nota na disciplina de Estágio Supervisionado em Sistema de Informação do curso de Sistemas de Informação, orientado pelo Profº. Fernando Luiz de Oliveira.” Palmas 2005 ii SILVIO COSTA MOREIRA UTILIZAÇÃO DAS FERRAMENTAS JASPERREPORTS E IREPORT PARA A GERAÇÃO DE RELATÓRIO EM APLICAÇÕES JAVA “Monografia apresentada como requisito parcial para a obtenção de nota na disciplina de Estágio Supervisionado em Sistema de Informação do curso de Sistemas de Informação, orientado pelo Profº. Fernando Luiz de Oliveira.” Aprovada em Dezembro de 2005 BANCA EXAMINADORA _____________________________________________ Profº. M.Sc. Fernando Luiz de Oliveira Centro Universitário Luterano de Palmas _____________________________________________ Profº. M.Sc. Fabiano Fagundes Centro Universitário Luterano de Palmas _____________________________________________ Profº. Ricardo Marx Costa de Jesus Centro Universitário Luterano de Palmas Palmas 2005 iii AGRADECIMENTOS À Deus por te me dado a vida a minha familia; Aos meus pais: Salomão Barbosa Moreira e Raimunda Ires costa Moreira por terem me dado oportunidade de chegar até aqui; Aos meus irmãos: Viviane Costa Moreira, Fabiane Costa Moreira, Saulo Costa Moreira, Alinne Costa Moreira e Lidianne Costa Moreira; Aos meus sobrinhos: Isabella, Samuel, Emanuel por terem me dado espiração para buscar novos horizontes; Aos meus tios, primos, cunhado. Aos professores que no decorrer deste curso me transmitem conhecimento, ao professor Fernando Luiz de Oliveira que me orientou na conclusão desse trabalho. Enfim, colegas de sala que se tornaram parte da minha vida, aos funcionarios e professores que trabalham na sala de produção de texto, aos funcionarios da biblioteca do CEULP/ULBRA-TO que me ajudaram a encotrar bibliografias necessarias para o desenvolvimento deste trabalho. iv SUMÁRIO LISTA DE FIGURAS .....................................................................................................................................V LISTA DE TABELAS................................................................................................................................... VI 1 INTRODUÇÃO ...........................................................................................................................................11 2 REVISÃO DE LITERATURA...................................................................................................................13 2.1 GERAÇÃO DE RELATÓRIO .......................................................................................................................13 2.1.1 Organização de um Relatório ........................................................................................................14 2.2 GERAÇÃO DE RELATÓRIOS UTILIZANDO A LINGUAGEM DE PROGRAMAÇÃO JAVA .................................15 2.3 JASPERREPORTS .....................................................................................................................................16 2.3.1 Projeto do Relatório ......................................................................................................................18 2.3.2 Origem dos Dados .........................................................................................................................19 2.3.3 Campos ..........................................................................................................................................19 2.3.4 Expressões .....................................................................................................................................20 2.3.5 Variáveis ........................................................................................................................................21 2.3.6 Seções do Relatório........................................................................................................................22 2.3.7 Parâmetros.....................................................................................................................................23 2.3.8 Principais Classes da Biblioteca JasperReports ...........................................................................24 2.4 IREPORT .................................................................................................................................................25 2.4.1 Criação de Projetos de Relatórios com iReport ............................................................................26 2.4.2 Origem dos Dados com iReport.....................................................................................................27 2.4.3 Criação de Parâmetros com iReport .............................................................................................28 2.4.4 Criação de Campos com iReport ...................................................................................................30 2.4.5 Criação de Variáveis com iReport.................................................................................................31 2.4.6 Criando Expressões com iReport...................................................................................................32 2.4.7 Seções com iReport ........................................................................................................................33 2.4.8 Testando e Visualizando o Projeto do Relatório no iReport..........................................................34 2.4.9 Código Gerado no IREPORT ........................................................................................................36 3 MATERIAIS E MÉTODOS .......................................................................................................................37 3.1 LOCAL E PERÍODO ..................................................................................................................................37 3.2 MATERIAIS .............................................................................................................................................37 3.2.1 Fontes Bibliográficas.....................................................................................................................37 3.2.2 Hardware .......................................................................................................................................38 3.2.3 Software .........................................................................................................................................38 3.2.4 Instalação e Configuração das Ferramentas.................................................................................38 3.2.4.1 Instalação e Configuração do J2SE 1.5.0 ............................................................................................... 38 3.2.4.2 Instalação e Configuração do IReport .................................................................................................... 43 3.2.4.3 Instalação e Configuração do JasperReports .......................................................................................... 44 3.3 METODOLOGIA .......................................................................................................................................45 4 RESULTADOS E DISCUSSÃO.................................................................................................................47 4.1 VISÃO GERAL DA APLICAÇÃO ................................................................................................................47 4.2 GERANDO RELATÓRIO ............................................................................................................................47 5 CONSIDERAÇÕES FINAIS......................................................................................................................61 6 REFERÊNCIAS BIBLIOGRÁFICAS.......................................................................................................62 ANEXOS .........................................................................................................................................................63 v LISTA DE FIGURAS Figura 1: Funcionamento da biblioteca JasperReports. (JASPERREPORTS, 2005). .....................................................17 Figura 2: Exemplo de um projeto do relatório. (JASPERREPORTS, 2005). ....................................................................18 Figura 3: Passagem de um objeto resultset para o relatório, através de uma classe Java..............................................19 Figura 4: Código de criação de um campo. (JASPERREPORTS, 2005)...........................................................................20 Figura 5: Código de criação de uma expressão. (JASPERREPORTS, 2005)...................................................................20 Figura 6: Código de criação de uma variável. (JASPERREPORTS, 2005) ......................................................................21 Figura 7: Código de criação de uma seção. (JASPERREPORTS, 2005) ..........................................................................23 Figura 8: Código de criação de um parâmetro. (JASPERREPORTS, 2005)....................................................................24 Figura 9: Tela principal do iReport - Menu Arquivo............................................................................................................26 Figura 10: Tela de configuração inicial do projeto do relatório.........................................................................................27 Figura 11: Tela principal, menu fonte de dados....................................................................................................................27 Figura 12: Telas de criação e configuração e teste de uma fonte de dados.......................................................................28 Figura 13: Tela principal do iReport, menu visualizar.........................................................................................................29 Figura 14: Telas de criação e configuração de parâmetros ................................................................................................29 Figura 15: Tela principal, menu ‘Visualizar’, ‘Campos do Relatório’...............................................................................30 Figura 16: Telas de criação e configuração de campo do projeto......................................................................................31 Figura 17: Tela principal, menu ‘Visualizar’, ‘Variáveis do Relatório’ ............................................................................31 Figura 18: Telas de criação e configuração de variável......................................................................................................32 Figura 19: Tela de criação e configuração de uma variável. ..............................................................................................33 Figura 20: Tela principal, página do projeto dividas em seções.........................................................................................34 Figura 21: Tela principal, menu ‘Criar (build)’, ‘Executa relatório (usando uma conexão ativa)’...............................35 Figura 22: Visualização do relatório na interface JasperViewer........................................................................................35 Figura 23: Tele de propriedades do sistema Windows 2000. ..............................................................................................39 Figura 24: Tele de criação e configuração das variáveis de ambiente. .............................................................................40 Figura 25: Tela de criação de uma variável de ambiente do usuário.................................................................................41 Figura 26: Tela de criação da variável de ambiente do usuário.........................................................................................42 Figura 27: Tela de criação da variável de ambiente do usuário.........................................................................................43 Figura 28: Tela de configuração.............................................................................................................................................44 Figura 29: Tela de adição de bibliotecas ao CLASSPATH .................................................................................................45 Figura 30: Tela de criação e configuração iniciais do projeto............................................................................................48 Figura 31 : Tela de criação e configuração da fonte de dados ...........................................................................................49 Figura 32: Tela de ativação da fonte de dados do projeto...................................................................................................50 Figura 33: Tela de criação e configuração de parâmetro para o projeto do relatório....................................................51 Figura 34: Barra de ferramentas do iReport .........................................................................................................................51 Figura 35: Inserção de um parâmetro dentro da seção title................................................................................................52 Figura 36: Inserção dos campos dentro da seção deitel da pagina do relatório ..............................................................53 Figura 37: Tela de configuração de um campo dentro da seção deitel da página do relatório......................................54 Figura 38: Tela de criação de variável...................................................................................................................................55 Figura 39: Inserção de uma variável na seção totalFooter .................................................................................................56 Figura 40: Visualização do relatório através da interface gráfica JasperVierwer...........................................................57 Figura 41: Executando o relatório na aplicação...................................................................................................................59 vi LISTA DE TABELAS Tabela 1: Cronograma das atividades....................................................................................................................................46 vii RESUMO A geração de relatórios corresponde a uma das tarefas mais comuns e necessárias em sistemas de informação. Assim, por menor que seja o sistema, a geração de relatórios será um de seus requisitos. Por ser um requisito necessário, as ferramentas tendem a agregar funcionalidades que facilitem o trabalho dos desenvolvedores. Por exemplo, para a linguagem de programação Java existem ferramentas que auxiliam este trabalho, tal como a biblioteca de classe Java chamada JasperReports, que com o auxílio da ferramenta iReport proporciona o desenvolvimento de relatórios para aplicações Java. O presente trabalho tem a finalidade de expor conceitos envolvendo a geração de relatório em aplicações Java, utilizando o JasperReports e iReport, bem como apresentar, na prática, sua utilização através da geração de relatório para uma determinada aplicação desenvolvida em Java. Palavras-chaves: Desenvolvimento de Sistemas, JasperReports e iReport viii ABSTRACT The generation of reports corresponds to one of the most common and necessary tasks in information systems. Thus, despite the size of the system, the generation of reports will be one of its requirements. As for being a necessary requirement, the tools tend to add functionalities that facilitate the work of the developers. For example, for the Java programming language there are tools that help this work, such as the library of class called Java JasperReports, with the help of the proportional tool iReport the report development for Java applications. The present work has the purpose to display concepts involving the generation of report in Java applications, using the JasperReports and iReport, as well presenting, in practical, its use through the generation of report for one determined application developed in Java. Keywords: Development of Systems, JasperReports e iReport 11 1 INTRODUÇÃO A geração de relatórios corresponde a uma das tarefas mais comuns e necessárias em sistemas de informação. Assim, por menor que seja o sistema, a geração de relatórios será um de seus requisitos, sendo que, basicamente, relatórios são compostos pelo design e pelo mapeamento dos dados para os campos existentes em seu layout. Geralmente as linguagens de programação dão suporte a essa tarefa, através do desenvolvimento de ferramentas que auxiliam na construção de relatório para a apresentação de dados. Isto é necessário porque criar relatórios sem estas ferramentas não é uma tarefa simples e requer um grande esforço durante a fase de implementação da aplicação. Para a linguagem de programação Java existem várias ferramentas que facilitam a construção de relatórios para a apresentação de dados. Durante anos a ferramenta Cristal Reports dominou o mercado. Porém, nos últimos anos, novas ferramentas foram desenvolvidas, oferecendo o mesmo pacote de recursos, mas com a vantagem de serem gratuitas, pois a ferramenta citada acima não é. Dentre essas ferramentas, merecem destaque o JasperReports e iReport, pois, além de serem gratuitas, oferecem uma grande quantidade de recursos para o desenvolvimento de relatórios, bem como são facilmente utilizadas dentro do contexto da linguagem de programação Java. O JasperReports é uma biblioteca de classe Java que tem como finalidade a geração de relatórios em aplicações Java. As classes pertencentes a essa biblioteca vêm com um conjunto de métodos que dão suporte ao desenvolvimento do relatório, ficando a cargo do programador desenvolver o projeto do relatório e buscar os dados para o seu preenchimento. Já o iReport é uma ferramenta que tem como finalidade auxiliar a criação do projeto de relatório que será utilizado pela biblioteca JasperReports. O projeto de relatório consiste em um arquivo XML, no qual é definido o design do relatório, assim como a definição do mapeamento dos dados para os campos dentro do layout definido. Esta ferramenta tem uma interface gráfica que torna o desenvolvimento do projeto de 12 relatório uma tarefa simples e rápida. Com a utilização da biblioteca JasperReports e da ferramenta iReport é possível, em pouco tempo, desenvolver relatório com qualidade para aplicações Java. O presente trabalho tem a finalidade de expor os conceitos envolvendo a geração de relatório em aplicações Java, utilizando as ferramentas JasperReports e iReport, assim como apresentar os recursos oferecidos por essas duas ferramentas, demonstrando sua utilização através do desenvolvimento de um relatório para uma determinada aplicação desenvolvida na linguagem de programação Java. Para tanto, este trabalho está estruturado da seguinte forma: no capítulo 2 são apresentados os conceitos referentes às ferramentas JasperReports e iReport. No capítulo 3 são apresentados os materiais e métodos utilizados nos estudos das ferramentas e os recursos de hardware e software utilizados para desenvolver esse trabalho. O capítulo 4 apresenta os resultados obtidos com o estudo, assim como a utilização dessas ferramentas. E, por fim, no capítulo 5 são apresentadas as considerações finais acerca deste trabalho. 13 2 REVISÃO DE LITERATURA Para que os propósitos desse trabalho fossem atingidos, foram realizados pesquisas e estudos envolvendo conceitos e ferramentas referentes á geração de relatório em aplicações Java. Parte destes estudos foi retirada dos tutoriais disponíveis em (JASPERREPORTS, 2005) e (IREPORT, 2005) e serão apresentados no decorrer dessa seção. Estes estudos são necessários para fornecer uma fundamentação teórica para uma melhor compreensão do objetivo desse trabalho, no que se refere à geração de relatório em aplicações Java, com JasperReports e iReport. 2.1 Geração de Relatório A geração de relatórios em um sistema de informação consiste basicamente na visualização e impressão dos dados manipulados pelo sistema. Esta é a forma que o usuário tem para visualizar os dados armazenados, sejam eles na tela do computador ou em papel impresso. “Os relatórios em geral são impressos pelo sistema em formulários contínuos. Este formulário é formado por folhas de papel que estão ligadas entre si”. (VILLAS, 1988). No entanto, nem todo relatório será impresso, pois, em muitas situações, somente são utilizados para consulta no próprio sistema de computador. Os dados que são apresentados nos relatórios podem vir de várias origens, sendo mais comum que os dados sejam proveniente de um Sistema de Gerenciamento de Banco de Dados (SGBD). Como exemplos de relatórios podem ser citados: relatório de contas a pagar, relatório de vendas, folha de pagamento de funcionários e vários outros de acordo com o sistema desenvolvido. 14 2.1.1 Organização de um Relatório Um relatório “é organizado em três níveis de controle” (VILLAS, 1988): nível de relatório, nível de página e nível de campo, sendo que cada nível de controle está dividido em três partes denominadas por: “cabeçalho, corpo e rodapé” (VILLAS, 1988). Estes níveis serão detalhados abaixo: Nível de Relatório: neste nível são tratadas as informações gerais sobre o relatório gerado.”É dividido em três partes: cabeçalho, corpo e rodapé” (VILLAS, 1988). cabeçalho: o cabeçalho do nível de relatório corresponde à identificação do sistema, ou seja, o nome do sistema que gerou o relatório: o titulo do relatório. corpo: o corpo deste nível corresponde às páginas do relatório. rodapé: o rodapé deste nível indica a área onde são inseridos os totais gerais de todos os dados apresentados no relatório, e também as informações gerais. Nível de Página: neste nível são tratadas as informações que compõem uma página do relatório.”São divididos em três partes: cabeçalho, corpo e rodapé” (VILLAS, 1988). cabeçalho: o cabeçalho deste nível é a primeira informação que compõe uma página. Como exemplo de cabeçalho pode-ser citado o título da página. corpo: o corpo deste nível refere-se à área reservada para a apresentação das informações que estão dentro dos campos. Esta área e conhecida como detail (detalhe). rodapé: o rodapé deste nível corresponde à área reservada onde deverão ser inseridos os totais gerais de todos os dados apresentados na página do relatório, e também informações gerais sobre a página. Nível de Campo: cada informação exibida em uma página do relatório é chamada de campo. Um campo pode conter informação de vários tipos de dados, e também são divididos em três partes: “cabeçalho, corpo e rodapé” (VILLAS, 1988). cabeçalho: o cabeçalho do nível de campo corresponde ao nome do campo. corpo: o corpo do nível de campo corresponde às informações que compõem o campo e que devem ser impressas na página. 15 rodapé: o rodapé do nível de campo é a área reservada para apresentação dos totais gerais das informações apresentadas nos campos. 2.2 Geração de Relatórios Utilizando a Linguagem de Programação Java A geração de relatórios está presente na maioria dos sistemas de informação que processam dados. Geralmente as linguagens de programação dão suporte a esta funcionalidade, desenvolvendo ferramentas que auxiliam os programadores na realização desta tarefa. Para a linguagem de programação Java existem ferramentas comerciais como Cristal Reports , “que, com o passar do tempo, tornou-se cada vez mais robusto no que diz respeito a novas funcionalidades, com o suporte a diferentes tipos de fontes de dados” (PAIXÃO, 2005). Existem também ferramentas e bibliotecas de classes gratuitas, como, por exemplo, JasperReports, que com o auxílio da ferramenta iReport facilitam a criação de relatórios para aplicações Java. As classes da biblioteca JasperReports oferecem um conjunto de métodos que já estão implementadas para criar os relatórios, exigindo do programador apenas a definição do design do relatório, que pode ser criado através do iReport, e a definição dos dados que serão exibidos. A linguagem de programação Java oferece aos programadores a reutilização de classes que já tenham sido implementadas e testadas, ou seja, pode-se construir uma nova classe Java a partir de outras classes. Além das bibliotecas disponibilizadas no J2SDK1 (kit de desenvolvimento Java), existe uma variedade de classes Java desenvolvidas em vários paises, as quais são disponibilizadas em bibliotecas de classes, organizadas em pacotes. Essas bibliotecas são criadas e utilizadas em aplicações específicas e têm como objetivo ajudar os programadores Java nas tarefas de programação, como, por exemplo: gerar relatório, manipulação de datas e várias outras finalidades. “As bibliotecas de classes são fornecidas principalmente por fornecedores de compiladores, mas muitas bibliotecas de classes são fornecidas por fornecedores independes de software (ISV-independent software vendor). Da mesma Forma, muitas bibliotecas de classes estão disponíveis a partir da Internet e da World Wide Web como freeware ou shareware.” (DEITEL, 1 2003). Possui as ferramentas necessárias para o desenvolvimento de aplicações Java. Disponível para download em: http://java.sun.com/j2se/1.5.0/download.jsp. 16 A reutilização dessas classes é uma prática nova em programação, chamada de desenvolvimento baseado em componentes, que agiliza o processo de desenvolvimento e “desta forma, a complexidade no desenvolvimento é reduzida, assim como os custos, através de reutilização de componentes exaustivamente testados” (GABRIEL, 2005). Atualmente, JasperReports e iReport vêm se destacando no mercado como ferramentas que geram relatórios para aplicações Java por dois motivos: primeiro, elas dão suporte à geração de relatório de uma forma simples e rápida; segundo, por serem gratuitas. Estas ferramentas serão descritas nas seções seguintes. 2.3 JasperReports O JasperReports2 é uma biblioteca Java, ou seja, é um conjunto de pacotes compostos por classes Java, desenvolvido por um fornecedor independente chamado JasperSoft3. Esta biblioteca tem como finalidade à geração de relatório em aplicações Java. A geração de relatório consiste na apresentação de dados armazenados e manipulados por um sistema de informação. JasperReports permite a apresentação desses dados, sejam eles provenientes de um SGBD, collections ou de um arrays de objeto. Para criar um relatório utilizando esta biblioteca é necessária a existência de um projeto de relatório, onde são inseridos e configurados todos os elementos que comporão o relatório: seções, campos, variáveis, parâmetros, expressões, base de dados, imagens e figuras geométricas, gráficos, entre outros. O projeto é definido através de um arquivo desenvolvido segundo os conceitos da eXtensible Markup Language (XML), através da especificação de tags XML e expressões Java. Para gerar um relatório utilizando essa biblioteca é necessário passar pelos seguintes processos: processo de compilação, preenchimento e visualização em um formato definido. Todos estes processos são realizados por classes pertencentes à própria biblioteca JasperReports. O processo de compilação consiste na verificação das tags XML e das expressões Java contidas no projeto do relatório. É realizado pela classe net.sf.JasperReports.engine.JasperManag, disponível na biblioteca JasperReports, 2 3 Disponível para download em: http://sourceforge.net/projects/jasperreports Mais informação sobre o jaspeSorft é encontrado em: http://www.jaspersoft.com/ 17 através do método compileRepor, que retorna um objeto “.jasper” que pode ser salvo em disco com a extensão “.jasper”. O objeto “jasper” é o relatório propriamente dito, pronto para receber os dados e parâmetros. O processo de preenchimento consiste na alimentação do relatório com os dados recuperados de uma origem. A função de preenchimento é realizada pela classe sf.JasperReportss.engine.JasperManager, através do método JasperFillManager.fillReport, que recebe: o objeto gerado no processo de compilação “jasper”, parâmetros, conexão com banco de dados ou resultset. Este último corresponde a um objeto gerado a partir da execução de métodos de conexão e recuperação de dados próprios da linguagem utilizada que, no caso da linguagem de programação Java, utiliza o à biblioteca de classe java.sql.*, para fazer conexões com banco de dados. Após passar por todos esses processos, o relatório estará pronto para ser visualizado na tela do computador, salvo em disco, impresso ou ser exportado para vários formatos: pdf, html, xsl, csv, xml. O relatório é apresentado em uma interface gráfica, o JasperViewer, que é uma classe da biblioteca JasperReports, ou em outros formatos suportado pela biblioteca. A Figura 1 ilustra o funcionamento da biblioteca JasperReports, os processos necessários para a criação, preenchimento e apresentação do relatório. Figura 1: Funcionamento da biblioteca JasperReports. (JASPERREPORTS, 2005). 18 2.3.1 Projeto do Relatório O projeto do relatório é definido por um arquivo XML, onde será especificado o design do relatório, assim como será definido o mapeamento dos dados para os campos dentro do layout do relatório. Neste arquivo são inseridas as seções, a localização dos campos, variáveis, a base de dados, linhas, imagens, figuras geométricas, dentro de uma seção. “O projeto de relatórios é definido em um arquivo XML através de tags XML que obedecem a uma estrutura, vocabulário e restrições declarados em um Document Type Definition (DTD), denominado “JasperReports.dtd” (JASPERREPORTS, 2005). Esse arquivo passa por um processo de compilação dando origem a um objeto “jasper” que pode ser salvo em disco com a extensão “.jasper”. A Figura 2 apresenta o código para um exemplo de projeto de relatório. 1. <?xml version="1.0"?> 2. <!DOCTYPE jasperReport PUBLIC "-//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> 3. <jasperReport name="Relatorio" ... > ... 4. </jasperReport> Figura 2: Exemplo de um projeto do relatório. (JASPERREPORTS, 2005). Na linha 1 (da Figura 2) é definido o cabeçalho XML, especificando a versão utilizada no arquivo. A linha 2 é indicado o DTD que estrutura o arquivo XML (JasperReports.dtd) da biblioteca JasperReports e na linha 3 apresenta a tag de abertura do relatório e na linha 4 a tag de fechamento correspondente. 19 2.3.2 Origem dos Dados Para a construção de um relatório é necessária a existência de uma origem de dados para que o relatório possa ser preenchido com os dados provenientes desta origem. A biblioteca JasperReports dá sustentação a vários tipos de origem de dados e usa uma relação chamada JRDataSource, que é uma “representação abstrata de uma origem dos dados de JasperReports” (JASPERREPORTS, 2005). Os dados podem ser provenientes de um SGBD, collections ou de um arrays de objetos. O mais comum é que os dados do relatório sejam provenientes de um SGBD, podendo ser passados para o relatório através de uma conexão ou um Resultset, que é um objeto gerado pela execução de uma instrução SQL, e contém dados extraídos de uma fonte de dados. A Figura 3 apresenta o código para um exemplo de passagem de um objeto resultset para operação de preenchimento do relatório através de uma classe Java. 1.JRResultSetDataSource jrRS = new JRResultSetDataSource(result); 2.JasperPrint impressao = JasperFillManager.fillReport(layoutJarper,parametros,jrRS ); Figura 3: Passagem de um objeto resultset para o relatório, através de uma classe Java. Na linha 1 (da Figura 3), é realizada a conversão de um objeto resultset, gerado por uma instrução SQL, para um formato entendido pela biblioteca através da classe JRResultSetDataSorce. Já na linha 2 é realizada a operação de preenchimento, que deve conter o projeto compilado, parâmetros e o resultset convertido. 2.3.3 Campos Somente por meio dos campos definidos dentro do layout do relatório é que se pode apresentar os dados provenientes de uma determinada origem. Se a origem dos dados for 20 um resultset, os campos do relatório devem relacionar as colunas correspondentes ao objeto resultset, ou seja, devem ter o mesmo nome e o mesmo tipo que as colunas do objeto. A Figura 4 apresenta o código para um exemplo de campo dentro do projeto do relatório. 1. <field name="codigo" class="java.lang.Integer"/> 2. <field name="nome_cidade" class="java.lang.String"/> 3. <field name="data" class="java.util.Date"/> Figura 4: Código de criação de um campo. (JASPERREPORTS, 2005). Na linha 1 (da Figura 4) é definida a tag de criação de um campo dentro do projeto do relatório, contendo as seguintes configurações: name = “código” e o tipo de dados que este campo suporta, ou seja, do tipo Integer. Da mesma forma, a linha 2 e 3 definem outros campos a serem apresentados neste relatório de exemplo. 2.3.4 Expressões As expressões permitem a utilização de elemento da linguagem Java dentro do projeto de relatório.“São utilizadas para especificar o conteúdo de campos de texto, na realização de cálculos freqüentes, por exemplo. Todas elas são expressões Java que podem conter em sua sintaxe: campos, parâmetros e variáveis de relatório” (PAIXÃO, 2005). A Figura 5 apresenta o código para um exemplo de criação de uma expressão dentro do projeto. 1. <textFieldExpression> 2. “Sr.(a) ”+ $F{Cliente} + " realizou um total de compras no valor de " + $V{ValorTotalCompraSum} + " no dia " + (new SimpleDateFormat("dd/MM/yyyy")).format($F{DataCompra}) + "." 3. </textFieldExpression> Figura 5: Código de criação de uma expressão. (JASPERREPORTS, 2005). 21 Na linha 1 (da Figura 5) é definida a tag de abertura de uma expressão dentro de um campo do projeto do relatório. Já na linha 2 é criada a expressão com os campos: ‘Cliente’, ‘DataCompra’ e uma variável ‘ValorTotalCompraSum’. A linha 3 é apresenta a tag de fechamento da expressão. 2.3.5 Variáveis As variáveis podem ser usadas para simplificar o projeto do relatório. Através de uma variável é possível declarar somente uma expressão, que pode ser usada durante todo o projeto do relatório para armazenar o resultado de cálculos, tais como: contagem, soma, menor, maior e vários outros. Uma variável deve conter uma expressão para executar cálculos, assim como um campo ou um conjunto de campos do relatório sobre os quais os cálculos serão realizados. A Figura 6 apresenta o código para um exemplo de criação de uma variável dentro do projeto. 1. <variable name="QuantitySum" class="java.lang.Double" resetType="Page" calculation="Sum"> 2. <variableExpression>$F{Quantity}</variableExpression> 3. <initialValueExpression>new Double(0) 4. </initialValueExpression> 5. </variable> Figura 6: Código de criação de uma variável. (JASPERREPORTS, 2005) Na linha 1 (da Figura 6) é definida a tag de abertura para a definição de uma variável dentro do projeto do relatório contendo as seguintes configurações: name = “QuantitySum” nome da variável, class = “Java.lang.Double” indica que a variável conterá dados do tipo Double, reseType = “Page” nível que é executada a operação de cálculo, ou seja, calcula os valores contidos em cada página separadamente, e o tipo de cálculo definido por calculation = “Sum”, significa que será executada uma soma com os valores do campo “QuantitySum”. A linha 2 é mostrada a tag de abertura da expressão dae 22 uma variável, que contém o campo que será calculado. Já na linha 3 é especificada a tag de abertura do valor de inicialização da expressão. Na linha 4 é apresentada a tag de fechamento da inicialização da expressão e, na linha 5, por sua vez, a tag de fechamento da variável. 2.3.6 Seções do Relatório Um relatório é composto por páginas que recebem os dados a serem apresentados. As páginas são divididas em seções, tais como: background: esta seção é usada para definir uma cor de fundo para as páginas do relatório. title: esta seção corresponde ao cabeçalho do relatório. É impresso somente uma vez e na primeira página do relatório. pageHeader: esta seção corresponde ao cabeçalho de uma página. É impresso em cada página. columnHeader: esta seção corresponde ao cabeçalho da coluna de uma página. É impresso em cada página que contém uma seção detail. Se uma página for dividida em uma ou mais colunas, esta seção será impressa em cada coluna da página. detail: esta seção corresponde ao corpo de uma página; nela são impressos os dados recuperados de uma fonte de dados através dos campos. columnFooter: esta seção corresponde ao rodapé da coluna de uma página. É impresso em cada página que contém uma seção detail. Se uma página for dividida em uma ou mais colunas, esta seção é impressa em cada coluna da página. pageFooter: esta seção corresponde ao rodapé de uma página E é impressa em cada página do relatório. summary: esta seção corresponde ao rodapé do relatório. É impressa somente uma vez, no fim do relatório, podendo ser impressa em uma página separada. As seções são parte de uma página do relatório que tem uma altura e uma largura especificadas, e pode conter objetos do relatório como linhas, retângulos, imagens, campos 23 de texto, variáveis entre outros. A Figura 7 apresenta o código exemplo para a criação de uma seção dentro do projeto, assim como suas configurações e objetos inseridos. 1. <pageHeader> 2. <band height="30"> 3. <staticText> 4. <reportElement x="0" y="0" width="555" height="25"/> 5. <textElement textAlignment="Center"> 6. <font fontName="Helvetica" size="18"/> 7. </textElement> 8. <text>Texto do elemento de texto</text> 9. </staticText> 10. </band> 11. </pageHeader> Figura 7: Código de criação de uma seção. (JASPERREPORTS, 2005) Na linha 1 (da Figura 7) é definida a tag de criação de uma seção pageHeader. A linha 2 é apresenta a tag que configura o tamanho de uma seção dentro da página. Já na linha 3 é especificada a tag para a criação de um elemento de texto dentro de uma seção. Na linha 4 é definida a tag que especifica a posição e o tamanho do elemento de texto dentro da seção. A linha 5 apresenta a tag de configuração do elemento de texto dentro da seção. Já na linha 6 é definida a tag de configuração da fonte do elemento de texto da seção e na linha 7 e fechada a tag de configurações do elemento de texto. A linha 8 apresenta a tag de abertura e inserção do texto, assim como a tag de fechamento do texto do elemento de texto. Na linha 9 o elemento de texto tem sua tag fechada. Nas linhas 10 e 11 é apresentada a tags de fechamento da configuração do tamanho que a seção ocupará na página e do fechamento da seção dentro do projeto do relatório. 2.3.7 Parâmetros Os paramentos são referências passadas ao relatório nas operações de preenchimento. Com isso o relatório torna-se dinâmico, pois é possível passar dados que não estão presentes na origem de dados para o relatório. “Uma forma de utilização dos parâmetros é usá-los para mudar dinamicamente uma instrução SQL, em tempo de execução do relatório, como, por exemplo: select * from funcionário where nome = ‘$P!{nome}’” (PAIXÃO, 2005). 24 Também podem ser usadas para a passagem de títulos, imagens e outras. A Figura 8 apresenta o código exemplo para a criação de um parâmetro dentro do projeto do relatório. 1. <parameter name="Titulo" class="java.lang.String"/> 2. <parameter name="Codigo" class="java.lang.Integer"/> 3. <parameter name="Imagem" class="java.awt.Image"/> Figura 8: Código de criação de um parâmetro. (JASPERREPORTS, 2005) Na linha 1 (da Figura 8) é definida a tag de criação de um parâmetro dentro do projeto, contendo as seguintes configurações: name = “Titulo”, define o nome do parâmetro, classe = “Java.lang.String”, define o tipo de dados que este campo suporta no caso String. Da mesma forma, as linhas 2 e 3 definem outros campos a serem apresentados neste relatório. 2.3.8 Principais Classes da Biblioteca JasperReports Um relatório é gerado através de classes pertencentes a bibliotecas JasperReports, tendo como base o projeto do relatório e cada classe tem uma função específica. As principais classes da biblioteca JasperReports, assim como suas funções, serão descritas a seguir: net.sf.JasperReports.engine.JasperManager: responsável por fazer a compilação do projeto, que consiste na verificação das tags XML e expressões Java nele contidas que obedecem as regras e restrições do “jasperreports.dtd” da biblioteca. net.sf.JasperReports.engine.design.JasperDesign: responsável pela construção do design do relatório, com base no que foi definido no projeto. net.sf.JasperReports.engine.JasperReports: representa o design do relatório com seus objetos: campos, variáveis, parâmetros, imagens, figuras geométricas e outras, deixando assim o relatório pronto para preenchimento das informações a partir da base de dados. 25 net.sf.JasperReports.engine.JasperPrint: esta classe permite ver o preenchimento completo do relatório nos mais diferentes formatos: pdf, html, xsl, csv, xml, conforme for definido. net.sf.JasperReports.view.JasperViewer: responsável pela exibição do relatório preenchido em uma interface gráfica chamada JasperViewer. Contém uma interface para a exibição dos dados do relatório na tela do computador com a opção de importar o relatório preenchido para os formatos suportados pelo JasperReports. 2.4 iReport Desenvolver projetos de relatório para a biblioteca JasperReports é uma tarefa que exige conhecimento em XML, assim como das regras e tags definidas no DTD (JasperReports.dtd) da biblioteca JasperReports que estrutura o documento XML e que representa o projeto do relatório.“Esse foi um dos problemas que, no início, tornava inviável a utilização da biblioteca JasperReports, pois para um programador desenvolver um projeto de relatório utilizando a biblioteca, era necessário o conhecimento da linguagem XML e das regras contida no DTD da biblioteca JasperReports (JasperReports.dtd)” (PAIXÃO, 2005). Para resolver esse problema foram criadas ferramentas GUI (Interface Gráfica com Usuário) para o desenvolvimento do projeto do relatório e suas configurações. Existem várias ferramentas que oferecem uma interface gráfica para o desenvolvimento do projeto de relatório para a biblioteca JasperReports, sendo que o iReport é uma dessas. O iReport4 é um programa desenvolvido totalmente em Java, e tem como finalidade desenvolver projetos de relatórios de uma forma simples e rápida, através de uma interface gráfica. Assim, sem ter nenhum conhecimento em XML e das regras definidas em seu DTD, o usuário pode criar projetos de relatório utilizando a interface gráfica do iReport, além de criar os projetos de relatórios. Também é permitida a visualização do relatório e realização de testes antes de utilizá-lo em uma aplicação. O que diferencia o iReport de outras ferramentas, que têm como finalidade oferecer uma interface gráfica para a construção do projeto de relatório para a biblioteca JasperReports, é que o iReport é de fácil utilização e, além de tudo, é gratuito. 26 2.4.1 Criação de Projetos de Relatórios com iReport Para criar um projeto de relatório com o iReport é necessário executá-lo através do ireport.bat, acionar o menu ‘Arquivo’, ‘novo documento’, que um novo projeto será criado, pronto para ser configurado e inseridos os elementos que compõem um relatório. A Figura 9 apresenta a tela principal do iReport, (menu ‘Arquivo’, ‘Novo Documento’). Figura 9: Tela principal do iReport - Menu Arquivo Ao acionar o menu ‘Arquivo’, ‘novo documento’, será exibida uma tela de criação e configurações iniciais do projeto de relatório, com: nome do relatório, tamanho das páginas do relatório e outras. A Figura 10 apresenta a tela de criação de um projeto do relatório com as configurações iniciais. 4 Disponível para download em: http://sourceforge.net/project/showfiles.php?group_id=64348 27 Figura 10: Tela de configuração inicial do projeto do relatório 2.4.2 Origem dos Dados com iReport Para criar um relatório é necessária a definição de uma origem de dados para o seu preenchimento. A Figura 11 apresenta a tela onde se pode configurar a origem dos dados no iReport (menu ‘Fonte de Dados’, ‘Conexão / Fonte de Dados’). Figura 11: Tela principal, menu fonte de dados 28 Ao acionar o menu ‘Fontes de Dados’, ‘Conexão / Fonte de Dados’, serão abertas as telas de criação e configuração da origem de dados do projeto de relatório, onde é possível escolher o tipo de origem e a fonte de dado do relatório. Nesta mesma área é possibilitado realizar o teste da conexão criada. A Figura 12 apresenta as telas de criação e configuração de uma fonte de dados no iReport. Figura 12: Telas de criação e configuração e teste de uma fonte de dados. 2.4.3 Criação de Parâmetros com iReport Os parâmetros são usados para passagem de valores ao relatório que não estão presentes na origem dos dados, isso atribui ao relatório uma maior dinamicidade. A Figura 13 apresenta a tela principal do iReport, (menu ‘Visualizar’, ‘Parâmetros do Relatório’). 29 Figura 13: Tela principal do iReport, menu visualizar Ao acionar o menu ‘Visualizar’, ‘Parâmetros do Relatório’, serão exibidas as telas de criação de parâmetros. Cada parâmetro possui um nome e um tipo de dados que ele suporta, assim como um valor opcional de inicialização. A Figura 14 apresenta as telas de criação de parâmetros com iReport. Figura 14: Telas de criação e configuração de parâmetros 30 2.4.4 Criação de Campos com iReport Somente através da definição dos campos é que se pode relacionar os dados de uma fonte para o layout do relatório. Para um campo receber os valores de uma coluna de uma tabela, ele deve ter o mesmo nome e o mesmo tipo de dados da coluna. A Figura 15 apresenta a tela principal do iReport, (menu ‘Visualizar’, ‘Campos do Relatório’). Figura 15: Tela principal, menu ‘Visualizar’, ‘Campos do Relatório’ Ao acionar o menu ‘Visualizar’, ‘Campos do Relatório’, serão apresentadas as telas de criação e configuração de campo dentro do projeto, onde cada campo terá um nome e um tipo de dados que ele suporta e a seção em que ele está localizado. A Figura 16 apresenta as telas de criação e configuração dos campos com iReport. 31 Figura 16: Telas de criação e configuração de campo do projeto. 2.4.5 Criação de Variáveis com iReport As variáveis são usadas para simplificar o projeto de relatório, possibilitando a efetuação de cálculos em um campo, onde o resultado desse cálculo é armazenado na mesma variável, com o auxilio de uma expressão. A Figura 17 tela principal do iReport, (menu ‘Visualizar’, ‘Variáveis do Relatório’). Figura 17: Tela principal, menu ‘Visualizar’, ‘Variáveis do Relatório’ 32 Ao acionar o menu ‘Visualizar’, ‘Variáveis do Relatório’, serão apresentadas as telas de criação e configuração das variáveis no iReport, onde será definido um nome, um tipo de dados e, uma expressão para a variável criada. A Figura 18 apresenta as telas de criação e configuração de uma variável com iReport. Figura 18: Telas de criação e configuração de variável 2.4.6 Criando Expressões com iReport As expressões podem ser criadas em um campo, em um parâmetro, em uma variável ou em campos estáticos do relatório. A Figura 19 apresenta a criação de uma expressão dentro de uma variável no iReport. 33 Figura 19: Tela de criação e configuração de uma variável. Uma expressão é criada dentro de uma variável através do campo = ‘variable expression’ do formulário de criação da variável. 2.4.7 Seções com iReport Um relatório é composto por páginas, uma página é dividida em seções, ou seja, uma seção é parte de uma página e possui altura e largura especificada e pode conter elementos do relatório como: linhas, retângulos, imagens ou campos do texto, variáveis, parâmetros e outros. Uma página de relatório pode conter as seguintes seções: backgroun, title, pageHeader, columnHeader, detail, groupFooter, columnFoter, pageFooter, summary. A Figura 20 apresenta uma página do relatório dividida em seções no iReport. 34 Figura 20: Tela principal, página do projeto dividas em seções. 2.4.8 Testando e Visualizando o Projeto de Relatório com iReport Após ter criado o projeto do relatório com iReport, é possível testar e visualizar o relatório antes de usá-lo em uma aplicação. Para testar e visualizar o relatório gerado, é preciso compilar e executar o projeto do relatório, onde é possível visualizar o relatório preenchido com os dados e também obter o arquivo com extensão ‘.jasper’ que será salvo em disco. A Figura 21 apresenta a tela principal do iReport, (menu ‘Criar (build))’, ‘(Executar relatório (usar uma conexão ativa)’). 35 Figura 21: Tela principal Ao acionar o menu ‘Criar (build)’, ‘Executa relatório (usando uma conexão ativa)’, o projeto será compilado, executado e visualizado no formato definido. A Figura 22 apresenta a visualização do relatório na interface gráfica JasperViewer da biblioteca JasperReports, com iReport. Figura 22: Visualização do relatório na interface JasperViewer 36 2.4.9 Código Gerado com IREPORT Quando o projeto do relatório é salvo no disco é gerado um arquivo com extensão ‘.jrxml’, que corresponde ao projeto do relatório, ou seja, o arquivo XML que obedece as regras e às restrições do (JasperReports.dtd). O projeto pode ser também compilado, a fim de gerar o arquivo com extensão ‘.jasper’, que será salvo no disco e estará proto para receber parâmetros e dados na operação de preenchimento do relatório. 37 3 MATERIAIS E MÉTODOS Para o desenvolvimento desse trabalho foram utilizados diversos recursos bibliográficos, além de hardware e software, que aliados às orientações permitiram a finalização do mesmo. 3.1 Local e Período Este trabalho foi desenvolvido durante o segundo semestre de 2005, como parte da disciplina: “Estágio Supervisionado em Sistema de Informação”. Os locais utilizados para sua elaboração foram os laboratórios de informática do curso de Sistemas de Informação, sendo que os mais utilizados foram os Laboratórios de Informática (Labin I) e (Labin III) do Centro Universitário Luterano de Palmas. 3.2 Materiais Os recursos utilizados para o desenvolvimento do trabalho foram disponibilizados pelo próprio curso, Sistemas de Informação do CEULP/ULBRA em seus laboratórios, tais como hardware e software licenciados. As demais ferramentas free foram adquiridas via Internet. 3.2.1 Fontes Bibliográficas Publicações Científicas; Artigos; Site do JASPERREPORTS (JASPERREPORTS, 2005); Site do IREPORT (IREPORT, 2005); Sites diversos. 38 3.2.2 Hardware Pentium III, 750 Mhz e 128 Mb de RAM (Disponível no laboratório); Pentium IV, 2.4 Ghz e 256 Mb de RAM (Disponível no laboratório); 3.2.3 Software Microsoft Windows 2000 Professional; Microsoft Office 2000 Professional; Internet Explorer 6.0; Acrobat Reader 7.0; IREPORT 0.5.0; JASPERREPORTS 0.6.0; JCreatorV3 LE 3.2.4 Instalação e Configuração das Ferramentas Esta seção visa auxiliar os desenvolvedores Java que queiram utilizar a biblioteca JasperReports e a ferramenta iReport para a geração de relatório em suas aplicações. Para tanto, as instruções de instalação e configurações das ferramentas: J2SE 1.5.0, iReport 0.5.0 e JasperReports 0.6.7 são descritas, passa a passo, com ilustrações. 3.2.4.1 Instalação e Configuração do J2SE 1.5.0 Para programar em Java é preciso fazer o download do J2SE 1.5.0 (Java 2 Platform Standard Edition 1.5.0)5, ou outras versões. O J2SE corresponde à plataforma de desenvolvimento Java e vem com dois ambientes: 5 Disponível para download em: http://java.sun.com/j2se/1.5.0/download.jsp. 39 J2SDK 1.5.0: é o kit de desenvolvimento Java que contém as ferramentas necessárias para programar na linguagem Java, contendo: compilador (javac), interpretador (java), documentação (javadoc), bibliotecas de classes Java e outras ferramentas. J2RE 1.5.0: possui ferramentas para tornar possível a execução de programas Java em um computador. Para configurar o J2SE 1.5.0 em um sistema operacional é necessário criar variáveis de ambiente: JAVA_HOME, CLASSPATH, PATH. Essas variáveis são necessárias para a utilização de todos os recursos do J2SE 1.5.0, como: javac (compilador Java), javadoc (gerador de documentação das classes Java), java (interpretador dos batycody Java) e vários outros. Para criar variável de ambiente no sistema operacional Windows 2000 é necessário seguir os seguintes passos: Meu computador, Propriedades, Avançado, Variáveis de ambiente. A Figura 23 apresenta a tela Propriedades do Sistema Operacional Windows 2000. Figura 23: Tele de propriedades do sistema Windows 2000. 40 Ao ser acionando o botão ‘variáveis de ambiente’ serão apresentadas as telas de criação e configuração das variáveis de ambiente no Windows 2000. A Figura 24 apresenta a tela de criação e configuração destas variáveis. Figura 24: Tele de criação e configuração das variáveis de ambiente. Para criar variável de ambiente do usuário, é preciso acionar o botão ‘Nova’, que será apresentada a tela de criação das variáveis do usuário, onde são atribuídos um nome e um valor para a variável. A variável JAVA_HOME deve conter os seguintes valores: nome = “JAVA_HOME” e valor = “C:\j2sdk 1.5.0”. A Figura 25 ilustra a criação da variável de ambiente do usuário JAVA_HOME no Windows 2000. 41 Figura 25: Tela de criação de uma variável de ambiente do usuário. A variável de ambiente do usuário CLASSPATH deve conter os seguintes valores: nome = “CLASSPATH” e valor = “.:JAVA_HOME”. A Figura 26 ilustra a criação da variável de ambiente do usuário CLASSPATH e seus respectivos valores. 42 Figura 26: Tela de criação da variável de ambiente do usuário O próximo passo é definir a variável de ambiente do usuário PATH, que deve conter os seguintes valores: nome = “PATH” e valor = “C:\j2sdk1.5.0\bin”. A Figura 27 ilustra a criação da variável de ambiente PATH e seus respectivos valores. 43 Figura 27: Tela de criação da variável de ambiente do usuário 3.2.4.2 Instalação e Configuração do IReport O iReport é uma ferramenta que possibilita a criação do projeto de relatório para a biblioteca JasperReports, através de uma interface gráfica. Sua instalação consiste na descompactação dos arquivos adquiridos na página web do iReport em uma determinada pasta. Necessita que o J2SE 1.5.0 esteja instalado no computador onde ele será executado. Para configurar o iReport é necessário executá-lo através do ‘iReport.bat’ no Windows e ‘iReport.sh’ no LINUX, acionar o menu ‘tool’, ‘opções’, onde será exibida a tela de configuração. Na aba External Programs deve-se configurar da mesma forma que está configurado na figura abaixo. A Figura 28 ilustra a configuração do iReport. 44 Figura 28: Tela de configuração. 3.2.4.3 Instalação e Configuração do JasperReports O JasperReports é uma biblioteca de classe Java que possibilita a criação de relatório em aplicações Java. Está presente no diretório lib do iReport e também está disponível na página web do JasperReports. Para fazer sua configuração é necessário adicioná-la ao CLASSPATH do editor de classes Java utilizado, e também as seguintes bibliotecas que estão presentes no diretório lib do iReport: ‘JasperReportss-1.0.1.jar’, ‘commonsbeanutils-1.5.jar’, ‘commons-collections-2.1.jar’, ‘commons-digester-1.7.jar’, ‘commonslogging-1.0.2.jar’, ‘commons-logging-api-1.0.2.jar’, ‘iReport.jar’. Esta configuração é necessária para que o editor possa importa as classes da biblioteca e utilizá-la em outras aplicações. A Figura 29 ilustra a adição das bibliotecas ao CLASSPATH do editor de classe Java (JCreator LE V3.50). 45 Figura 29: Tela de adição de bibliotecas ao CLASSPATH 3.3 Metodologia Para o desenvolvimento deste trabalho foi necessário, inicialmente, a realização de um estudo sobre os conceitos de relatório, biblioteca JasperReports e a ferramenta iReport no sentido de recolher informações referentes ao domínio do trabalho desenvolvido, de maneira que permitisse oferecer uma sustentação teórica necessária para a sua conclusão. Assim, foram abordados conceitos e técnicas alusivas ao escopo do trabalho, para que fosse possível o desenvolvimento de um relatório para a aplicação Java, como forma de concretização de parte do que foi explanado na Revisão de Literatura. 46 Após o levantamento teórico, aplicou-se na prática o desenvolvimento do relatório para a aplicação Java, com o objetivo de demonstrar as facilidades de uso das ferramentas estudadas. A Tabela 1 apresenta o cronograma das atividades desenvolvidas no trabalho. Tabela 1: Cronograma das atividades Data inicial Tarefa 23/08 02/09 16/09 17/10 07/11 08/11 17/11 19/11 23/11 26/11 Revisão de Literatura: JasperReports. Revisão de Literatura: iReport. Revisão de Literatura: Geração de Relatório. Revisão de Literatura: Geração de Relatório em Aplicações Java. Materiais e Métodos: Local Período. Materiais e Métodos: Materiais. Resultados e Discussão: Visão Geral da Ferramenta. Resultados e Discussão: Gerando Relatório. Considerações Finais. Revisão final do trabalho. 47 4 RESULTADOS E DISCUSSÃO Esta seção tem o objetivo de apresentar o desenvolvimento de relatório para a uma aplicação Java que necessite de relatórios e que mostre, na prática, a utilização das ferramentas JasperReports e iReport. 4.1 Visão Geral da Aplicação O SENAR – TO é uma empresa privada sem fins lucrativos que ministra treinamentos, palestras e outros eventos, exclusivamente, para o homem do campo, visando sua qualificação. Assim, identificou-se a necessidade do armazenamento das informações relativas a estes treinamentos, palestras e eventos, através de um sistema que auxiliasse tanto no armazenamento, como no gerenciamento destas atividades. Este trabalho utiliza este estudo de caso, ou seja, o desenvolvimento de um Sistema de Gerenciamento de Eventos – SGE, para demonstrar a utilização do JasperReports e do iReport na geração de um relatórios envolvido. 4.2 Gerando Relatório Esta seção visa demonstrar o desenvolvimento do relatório para o sistema descrito na seção anterior e sua utilização na aplicação, utilizando a biblioteca JasperReports e a ferramenta iReport. Para tanto, as demonstrações são descritas passo a passo com ilustrações. Para gerar um relatório utilizando a biblioteca JasperReports é necessário criar um projeto de relatório. Esse projeto é criado através do iReport. Para uma melhor compreensão de como é desenvolvido o projeto do relatório é necessária a demonstração da criação, assim como de sua execução, tanto no iReport, como na aplicação. O relatório a 48 ser desenvolvido deverá atender ao seguinte requisito: listar todas as despesas de um determinado evento, calculando o valor total das despesas geradas por este evento. Assim, o primeiro passo para se construir este relatório é executar o iReport através do ‘ireport.bat’, acione o menu ‘Arquivo’, ‘Novo documento’, onde será exibida a tela de criação de um projeto de relatório contendo suas configurações iniciais. A Figura 30 apresenta a tela de criação de um projeto de relatório com as suas configurações iniciais. Figura 30: Tela de criação e configuração iniciais do projeto O próximo passo é definir a base de dados que será usada para obtenção dos dados para o preenchimento do relatório. No caso, foi criado um driver ODBC chamado “eventos”. Feito isso, o próximo passo é configurar a fonte de dados no projeto do relatório através do iReport. A Figura 31 apresenta a tela de configuração da fonte de dados para o projeto do relatório. 49 Figura 31 : Tela de criação e configuração da fonte de dados Esta tela permite a criação e a configuração de uma fonte de dados para o projeto, a qual foi preenchida com os seguintes valores: Type of connection/datasource = “database JDBC connection”, name = “despesas”, JDBC Drive = “sun.jdbc.odbc.JdbcOdbcDriver”, JDBC URL = “jdbc:odbc:eventos”. Após esta configuração, acione o botão “Save” e, em seguida, o botão “Teste” para verificar se a conexão está funcionando corretamente. Após ter criado a fonte de dados deve-se ativá-la, para que essa fonte possa ser usada no projeto em desenvolvimento. Para ativar uma fonte de dados é necessário acionar o menu ‘criar (build)’, ‘Definir conexão ativa’ na tela principal do iReport. A Figura 32 apresenta a tela que proporciona a ativação de uma fonte de dados para o projeto. 50 Figura 32: Tela de ativação da fonte de dados do projeto Para a ativar a fonte de dados é necessário selecioná-la e acionar o botão “ok“. Assim, a fonte de dados estará ativada. O próximo passo refere-se à criação do parâmetro necessário para o projeto. Esse parâmetro será usado para a passagem do título do relatório através da aplicação, que é responsável por gerar o relatório. Para criar um parâmetro deve-se acionar o menu ‘Visualizar’, ‘Parâmetro do Relatório’ na tela principal do iReport. A Figura 33 apresenta a tela de criação e configuração de parâmetro para o projeto do relatório. 51 Figura 33: Tela de criação e configuração de parâmetro para o projeto do relatório Na primeira tela estão os parâmetros internos. Para criar um novo parâmetro é necessário acionar o botão ‘Novo’. Para o exemplo analisado, os valores do formulário devem estar preenchidos da seguinte forma: Parameter name = “Titulo”, Parameter class type = “Java.lang.String” e Default value expression = “Relatório de Despesa de Evento”, tal como é apresentado na Figura 34. Esse parâmetro é colocado na seção title da página, através do botão “F” da barra de ferramenta do iReport. A Figura 34 apresenta a barra de ferramentas do iReport, botão “F”. Figura 34: Barra de ferramentas do iReport Para inserir um parâmetro dentro de uma seção da página, deve-se acionar o botão “F” da barra de ferramenta do iReport, clicar com o mouse e arrastar para dentro da seção title da página. Ao colocá-lo dentro da seção é necessário fazer a seguinte modificação: 52 $F{Titulo} para $P{Titulo}. A Figura 35 demonstra a inserção de um parâmetro dentro da seção title da página. Figura 35: Inserção de um parâmetro dentro da seção title Os dados recuperados de uma fonte de dados através de uma instrução SQL são agrupados em um resultset. A única forma de imprimir esses dados no relatório é através de campos dentro da seção detail da página do relatório, devendo obedecer a seguinte restrição: os campos devem ter o mesmo nome e o mesmo tipo de dados das colunas do objeto resultset. Para criar um campo e inseri-lo dentro da seção detail é necessário acionar o botão “F” da barra de ferramenta do iReport, clicar sobre a seção detail e arrastar. Neste caso são criados 5 campos: “Evento”, “Fornecedor”, “Data”, “Valor” e “Descrição”, cada um deles referência uma coluna do objeto resultSet. A Figura 36 apresenta inserção de campos dentro da seção detail da página do relatório. 53 Figura 36: Inserção dos campos dentro da seção detail da pagina do relatório Para configurar um campo é necessário dar um duplo click sobre ele que será apresentada à tela de configuração, onde é possível configurar sua fonte e a coluna do objeto resultset que ele irá corresponder. A Figura 37 apresenta a tela de configuração de um campo. 54 Figura 37: Tela de configuração de um campo dentro da seção detail da página do relatório Após a criação dos campos que receberão os dados contidos no resultset, é necessário criar uma variável para armazenar o cálculo efetuado sobre o campo “Valor”. Para criar uma variável aciona-se o menu ‘Visualizar’, ‘Variável do relatório’, onde serão apresentadas as telas de criação e configuração da variável. A Figura 38 apresenta a tela de criação e configuração de uma variável. 55 Figura 38: Tela de criação de variável O formulário apresentado acima (Figura 38) deve estar preenchido da seguinte forma: variable name = “valor_total”, variable class type = “Java.lang.Double”, Calculation type = “sun” (que indica o tipo de cálculo que a variável realiza, ou seja, uma soma), reset type = “Report” (indica o nível que será realizado o cálculo, no caso, o cálculo será realizado em nível de relatório), Variable expression = “$F{Valor}” (indica o campo que será calculado). Depois de criada a variável, é necessário fazer a sua inserção dentro da seção totalFooter da página. Para inserir uma variável em uma seção, aciona-se o botão “F” da barra de ferramentas do iReport, clicar em cima da seção e arrastar. Após passar por estes processos deve-se fazer a seguinte modificação: “$F{valor_total}” para “$V{valor_total}”. A Figura 39 ilustra a inserção de uma variável na seção totalFooter da página. 56 Figura 39: Inserção de uma variável na seção totalFooter O iReport proporciona testar o relatório antes de utilizá-lo na aplicação. Para testar o projeto de um relatório é necessário acionar o menu ‘Criar (build)’, ’Executar relatório (usar conexão ativa)’, que o projeto será executado e compilado dando origem a um arquivo com a extensão “.jasper” que estará apto a receber os dados. A Figura 40 apresenta a execução do relatório. 57 Figura 40: Visualização do relatório através da interface gráfica JasperVierwer Depois de construído, testado, compilado e gerado o arquivo com extensão ‘.jasper’, o projeto do relatório está pronto para ser utilizado na aplicação. A Figura 41 apresenta o código para um exemplo de execução do relatório dentro de uma classe Java. 58 1. 2. 3. 4. 5. 6. 7. 8. 9. import import import import import import import import import net.sf.jasperreports.engine.*; net.sf.jasperreports.view.*; java.sql.*; java.util.*; java.awt.*; javax.swing.*; SGE.Conexao.*; SGE.Despesa.*; SGE.Evento.*; public class relatorio { 10. private Connection objBD; 11. private Statement objSQL; 12. conexao obj = new conexao(); 13. adicionar add = new adicionar(); 14. private static final String projeto= "eventos.jasper"; 15. public relatorio(){} 16. public void fechar() { 17. try { 18. objSQL.close(); 19. obj.fecharConexao(); }catch(SQLException e) { System.out.println("Erro ao fechar a conexão: " + e); } 20. } //consutar despesa de um determinado evento 21. public ResultSet consultarDespesaEvento(String evento) { 22. obj.abrirConexao("eventos", "", ""); 23. String sql = "SELECT * FROM despesa WHERE evento = '"+evento+"'"; 24. return add.pesquisarDados(sql, obj); 25. }// fim do metodo buscar fornecedor 59 26. public void geraRelatorio(String evento, String Titulo) throws Exception { 27. String titulo = "Evento " + Titulo; 28. Map parametros = new HashMap(); 29. parametros.put("Titulo", titulo); // 30. JRResultSetDataSource jrRS = new JRResultSetDataSource(consultarDespesaEvento(evento)); 31. JasperPrint impressao = JasperFillManager.fillReport(projeto,parametros,jrRS ); 32. JasperViewer viewer = new JasperViewer(impressao, false); 33. viewer.setTitle("Sistema de Gerenciamento de Eventos"); 34. viewer.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 35. viewer.show(); 36. fechar(); }//fim do método gerar relatório }//fim da classe relatório Figura 41: Executando o relatório na aplicação Nas linhas de 1 a 9 (da Figura 41) acontece a importação dos pacotes necessários para a geração de relatório na aplicação, inclusive alguns pacotes da biblioteca JasperReports (linha 1 e 2) e nas linhas 10 e 11 é declarada a variável utilizada para fazer a conexão com o banco de dados. Já na linha 12 é instanciada a classe responsável por fazer a conexão com o banco de dados e na linha 13 é instanciada a classe responsável por executar a operação de consulta no banco de dados. A linha 14 declara-se a variável que faz referência ao projeto do relatório compilado, que está salvo em disco. Na linha 15 é definido o método construtor da classe relatório. Já nas linhas 16 a 20 são definidos os métodos responsáveis por fechar a conexão com o banco de dados e nas linhas 21 a 25 o método responsável por fazer a consulta ao banco de dados, retornando um resultset. Na linha 26 é apresentado o método responsável por gerar o relatório, recebendo como 60 parâmetro o nome do evento e o título do relatório. A linha 27 é declara-se a variável ‘titulo’, que será passada ao relatório na operação de preenchimento. Já na linha 28 é instanciada a classe da biblioteca JasperReports que possibilita a criação do parâmetro. A linha 29 onde é criado o parâmetro que recebe o conteúdo da variável ‘titulo’. Na linha 30 é realizado a instanciação da classe da biblioteca JasperReports que cria o resultset para o preenchimento do relatório. Essa classe recebe como parâmetro um objeto resultset que, no caso, é o retorno da função ‘consultarDespesaEvento(evento)’. Já na linha 31 é definida a operação de preenchimento do relatório com os dados do objeto resultset convertido, com os parâmetros e o projeto compilado. Nas linhas 32 a 35 é realizada a visualização do relatório na interface gráfica da biblioteca JasperReports, o ‘JasperViewer’. Por fim, na linha 36 é realizado o encerramento da conexão com o banco de dado, através do método ‘fechar()’ da classe relatório. 61 5 CONSIDERAÇÕES FINAIS As ferramentas JasperReports e iReport mostram ser uma boa solução para o desenvolvimento de relatórios em aplicações Java, porque oferecem um pacote de recurso variado de fácil utilização dentro do contexto da linguagem Java, proporciona a geração de relatórios tanto para aplicações desktop como para aplicações web, e ainda com a vantagem de serem gratuitas. É recomendada a utilização dessas ferramentas em relatórios pequenos e médios, pois existem algumas limitações de recursos que só as ferramentas comerciais como Cristal Reports oferece. Uma limitação encontrada foi a falta de documentação disponível para o estudo dos recursos oferecidos pelas ferramentas JasperReports e iReport. Existem tutoriais em suas páginas web, mas são todos em inglês e só podem ser adquiridas mediante pagamento, são ferramentas recentes no mercado e pouco estudadas. Este trabalho descreveu o desenvolvimento de relatórios para aplicações desenvolvidas em Java, utilizando a biblioteca de classe Java JasperReports com o auxílio da ferramenta iReport. É importe ressaltar que existem outras ferramentas que têm a mesma finalidade. Porém, as ferramentas JasperReports e iReport foram escolhidas por serem fáceis de utilizar dentro do ambiente de programação Java, além de serem gratuitas. Como sugestão para trabalhos futuros recomenda-se uma comparação entre estas ferramentas com outras existentes, gratuitas ou pagas, abordando as potencialidades de cada uma. 62 6 REFERÊNCIAS BIBLIOGRÁFICAS (IREPORT, 2005) IREPORT. Setembro de 2005. Disponível em: < http://ireport.sourceforge.net/index.php?p_module=page&pageid=11 >. Acesso em: 08/09/2005. (JASPERREPORTS, 2005) JASPERREPORTS. Setembro de 2005. Disponível em: < http://jasperreports.sourceforge.net/tutorial/index.html >. Acesso em: 05/09/2005. (PAIXÃO, 2005) PAIXÃO, Carlos Feliz. Geração de Relatório com JasperReports e iReport. Belém PA: GUJ (Grupo de Usuários Java), 2005. Disponível em: <http://www.guj.com.br/content/articles/reports/JasperReportsIR eport.pdf>. Acesso em 02/10/2005. (GLÁUCIA, 2005) (VILLAS, 1988) GABRIEL, Gláucia. O Processo de Desenvolvimento Baseado em Componentes: O impulso das novas tecnologias. Portal Java, 2005. Disponível em:< http://www.portaljava.com/home/modules.php?name=Content&p a=showpage&pid=97>. Acessado em 17/11/2005. VILLAS, Marcos Viana.; VILLASBOAS Luiz Felipe P. Programação Técnicas e Linguagens. Rio de Janeiro-RJ. Campos. 1988. 63 ANEXOS 64 ● Código do Projeto do Relatório <?xml version="1.0" encoding="UTF-8" ?> <!-- Created with iReport - A designer for JasperReports --> <!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> <jasperReport name="eventos" columnCount="1" printOrder="Vertical" orientation="Portrait" pageWidth="595" pageHeight="842" columnWidth="535" columnSpacing="0" leftMargin="30" rightMargin="30" topMargin="20" bottomMargin="20" whenNoDataType="NoPages" isTitleNewPage="false" isSummaryNewPage="false"> <property name="ireport.scriptlethandling" value="0" /> <import value="java.util.*" /> <import value="net.sf.jasperreports.engine.*" /> <import value="net.sf.jasperreports.engine.data.*" /> <parameter name="Titulo" isForPrompting="false" class="java.lang.String"> <defaultValueExpression ><![CDATA["Relatorio de Despesa de Eventos"]]></defaultValueExpression> </parameter> <parameter name="Categoria" isForPrompting="false" class="java.lang.String"> <defaultValueExpression ><![CDATA["Bebidas"]]></defaultValueExpression> </parameter> <queryString><![CDATA[SELECT * FROM despesa]]></queryString> <field name="Descricao" class="java.lang.String"/> <field name="Fornecedor" class="java.lang.String"/> <field name="Valor" class="java.lang.Double"/> <field name="Data" class="java.lang.String"/> <field name="Evento" class="java.lang.String"/> <variable name="total_geral" class="java.lang.Double" resetType="Report" calculation="Sum"> <variableExpression><![CDATA[$F{Valor}]]></variableExpression> <initialValueExpression><![CDATA[new java.lang.Double(0)]]></initialValueExpression> </variable> <group name="total" isStartNewColumn="false" isStartNewPage="false" isResetPageNumber="false" isReprintHeaderOnEachPage="false" minHeightToStartNewPage="0" > <groupExpression><![CDATA[null]]></groupExpression> <groupHeader> <band height="0" isSplitAllowed="true" > </band> </groupHeader> 65 <groupFooter> <band height="25" isSplitAllowed="true" > <staticText> <reportElement mode="Opaque" x="302" y="4" width="98" height="20" forecolor="#000000" backcolor="#FFFFFF" key="staticText" stretchType="NoStretch" positionType="FixRelativeToTop" isPrintRepeatedValues="true" isRemoveLineWhenBlank="false" isPrintInFirstWholeBand="false" isPrintWhenDetailOverflows="false"/> <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/> <textElement textAlignment="Right" verticalAlignment="Middle" rotation="None" lineSpacing="Single"> <font fontName="SansSerif" pdfFontName="Helvetica" size="12" isBold="true" isItalic="false" isUnderline="false" isPdfEmbedded ="false" pdfEncoding ="CP1252" isStrikeThrough="false" /> </textElement> <text><![CDATA[Total Geral:]]></text> </staticText> <textField isStretchWithOverflow="false" pattern="#,##0.00" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement mode="Opaque" x="406" y="7" width="113" height="16" forecolor="#000000" backcolor="#FFFFFF" key="textField" stretchType="NoStretch" positionType="FixRelativeToTop" isPrintRepeatedValues="true" isRemoveLineWhenBlank="false" isPrintInFirstWholeBand="false" isPrintWhenDetailOverflows="false"/> <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/> <textElement textAlignment="Right" verticalAlignment="Middle" rotation="None" lineSpacing="Single"> <font fontName="SansSerif" pdfFontName="Helvetica" size="12" isBold="true" isItalic="false" isUnderline="false" isPdfEmbedded ="false" pdfEncoding ="CP1252" isStrikeThrough="false" /> </textElement> 66 <textFieldExpression class="java.lang.Double"><![CDATA[$V{total_geral}]]></textFieldExpression > </textField> <line direction="TopDown"> <reportElement mode="Opaque" x="6" y="3" width="520" height="0" forecolor="#000000" backcolor="#FFFFFF" key="line" stretchType="NoStretch" positionType="FixRelativeToTop" isPrintRepeatedValues="true" isRemoveLineWhenBlank="false" isPrintInFirstWholeBand="false" isPrintWhenDetailOverflows="false"/> <graphicElement stretchType="NoStretch" pen="Thin" fill="Solid" /> </line> </band> </groupFooter> </group> <background> <band height="0" isSplitAllowed="true" > </band> </background> <title> <band height="50" isSplitAllowed="true" > <rectangle radius="5" > <reportElement mode="Opaque" x="36" y="3" width="465" height="41" forecolor="#000000" backcolor="#FFFFFF" key="rectangle-1" stretchType="NoStretch" positionType="FixRelativeToTop" isPrintRepeatedValues="true" isRemoveLineWhenBlank="false" isPrintInFirstWholeBand="false" isPrintWhenDetailOverflows="false"/> <graphicElement stretchType="NoStretch" pen="Thin" fill="Solid" /> </rectangle> <textField isStretchWithOverflow="false" pattern="" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement mode="Opaque" x="166" y="10" width="208" height="28" 67 forecolor="#003333" backcolor="#FFFFFF" key="textField-1" stretchType="NoStretch" positionType="FixRelativeToTop" isPrintRepeatedValues="true" isRemoveLineWhenBlank="false" isPrintInFirstWholeBand="false" isPrintWhenDetailOverflows="false"/> <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/> <textElement textAlignment="Center" verticalAlignment="Middle" rotation="None" lineSpacing="Single"> <font fontName="Arial" pdfFontName="Helvetica" size="18" isBold="true" isItalic="false" isUnderline="false" isPdfEmbedded ="false" pdfEncoding ="Cp1252" isStrikeThrough="false" /> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$P{Titulo}]]></textFieldExpression> </textField> </band> </title> <pageHeader> <band height="0" isSplitAllowed="true" > </band> </pageHeader> <columnHeader> <band height="0" isSplitAllowed="true" > </band> </columnHeader> <detail> <band height="137" isSplitAllowed="true" > <textField isStretchWithOverflow="false" pattern="" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement mode="Opaque" x="5" y="24" width="161" height="31" forecolor="#000000" backcolor="#FFFFFF" key="textField" stretchType="NoStretch" positionType="FixRelativeToTop" isPrintRepeatedValues="true" isRemoveLineWhenBlank="false" isPrintInFirstWholeBand="false" isPrintWhenDetailOverflows="false"/> <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/> <textElement textAlignment="Left" verticalAlignment="Middle" rotation="None" lineSpacing="Single"> 68 <font fontName="Times New Roman" pdfFontName="Helvetica" size="12" isBold="false" isItalic="false" isUnderline="false" isPdfEmbedded ="false" pdfEncoding ="CP1252" isStrikeThrough="false" /> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{Evento}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" pattern="#,##0.00" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement mode="Opaque" x="471" y="24" width="52" height="22" forecolor="#000000" backcolor="#FFFFFF" key="textField" stretchType="NoStretch" positionType="FixRelativeToTop" isPrintRepeatedValues="true" isRemoveLineWhenBlank="false" isPrintInFirstWholeBand="false" isPrintWhenDetailOverflows="false"/> <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/> <textElement textAlignment="Right" verticalAlignment="Middle" rotation="None" lineSpacing="Single"> <font fontName="Times New Roman" pdfFontName="Helvetica" size="12" isBold="false" isItalic="false" isUnderline="false" isPdfEmbedded ="false" pdfEncoding ="CP1252" isStrikeThrough="false" /> </textElement> <textFieldExpression class="java.lang.Double"><![CDATA[$F{Valor}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" pattern="" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement mode="Opaque" x="366" y="24" width="97" height="22" forecolor="#000000" backcolor="#FFFFFF" key="textField-2" stretchType="NoStretch" positionType="FixRelativeToTop" isPrintRepeatedValues="true" isRemoveLineWhenBlank="false" isPrintInFirstWholeBand="false" isPrintWhenDetailOverflows="false"/> <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" 69 rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/> <textElement textAlignment="Left" verticalAlignment="Top" rotation="None" lineSpacing="Single"> <font fontName="Times New Roman" pdfFontName="Helvetica" size="12" isBold="false" isItalic="false" isUnderline="false" isPdfEmbedded ="false" pdfEncoding ="Cp1252" isStrikeThrough="false" /> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{Data}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" pattern="" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement mode="Opaque" x="168" y="24" width="192" height="32" forecolor="#000000" backcolor="#FFFFFF" key="textField-3" stretchType="NoStretch" positionType="FixRelativeToTop" isPrintRepeatedValues="true" isRemoveLineWhenBlank="false" isPrintInFirstWholeBand="false" isPrintWhenDetailOverflows="false"/> <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/> <textElement textAlignment="Left" verticalAlignment="Top" rotation="None" lineSpacing="Single"> <font fontName="Times New Roman" pdfFontName="Helvetica" size="12" isBold="false" isItalic="false" isUnderline="false" isPdfEmbedded ="false" pdfEncoding ="Cp1252" isStrikeThrough="false" /> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$F{Fornecedor}]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" pattern="" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement mode="Opaque" x="10" y="59" width="511" height="55" forecolor="#000000" backcolor="#FFFFFF" key="textField-4" stretchType="NoStretch" positionType="FixRelativeToTop" isPrintRepeatedValues="true" isRemoveLineWhenBlank="false" 70 isPrintInFirstWholeBand="false" isPrintWhenDetailOverflows="false"/> <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/> <textElement textAlignment="Left" verticalAlignment="Top" rotation="None" lineSpacing="Single"> <font fontName="Times New Roman" pdfFontName="Helvetica" size="12" isBold="false" isItalic="false" isUnderline="false" isPdfEmbedded ="false" pdfEncoding ="Cp1252" isStrikeThrough="false" /> </textElement> <textFieldExpression class="java.lang.String"><![CDATA["Descrição :\n"+$F{Descricao}]]></textFieldExpression> </textField> <staticText> <reportElement mode="Opaque" x="5" y="4" width="125" height="16" forecolor="#000000" backcolor="#FFFFFF" key="staticText-1" stretchType="NoStretch" positionType="FixRelativeToTop" isPrintRepeatedValues="true" isRemoveLineWhenBlank="false" isPrintInFirstWholeBand="false" isPrintWhenDetailOverflows="false"/> <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/> <textElement textAlignment="Left" verticalAlignment="Top" rotation="None" lineSpacing="Single"> <font fontName="Arial" pdfFontName="Helvetica" size="10" isBold="false" isItalic="false" isUnderline="false" isPdfEmbedded ="false" pdfEncoding ="Cp1252" isStrikeThrough="false" /> </textElement> <text><![CDATA[Evento :]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="169" y="5" width="125" height="16" forecolor="#000000" backcolor="#FFFFFF" key="staticText-2" stretchType="NoStretch" positionType="FixRelativeToTop" isPrintRepeatedValues="true" isRemoveLineWhenBlank="false" 71 isPrintInFirstWholeBand="false" isPrintWhenDetailOverflows="false"/> <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/> <textElement textAlignment="Left" verticalAlignment="Top" rotation="None" lineSpacing="Single"> <font fontName="Arial" pdfFontName="Helvetica" size="10" isBold="false" isItalic="false" isUnderline="false" isPdfEmbedded ="false" pdfEncoding ="Cp1252" isStrikeThrough="false" /> </textElement> <text><![CDATA[Fornecedor]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="366" y="5" width="92" height="13" forecolor="#000000" backcolor="#FFFFFF" key="staticText-3" stretchType="NoStretch" positionType="FixRelativeToTop" isPrintRepeatedValues="true" isRemoveLineWhenBlank="false" isPrintInFirstWholeBand="false" isPrintWhenDetailOverflows="false"/> <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/> <textElement textAlignment="Left" verticalAlignment="Top" rotation="None" lineSpacing="Single"> <font fontName="Arial" pdfFontName="Helvetica" size="10" isBold="false" isItalic="false" isUnderline="false" isPdfEmbedded ="false" pdfEncoding ="Cp1252" isStrikeThrough="false" /> </textElement> <text><![CDATA[Data :]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="478" y="3" width="50" height="16" forecolor="#000000" backcolor="#FFFFFF" key="staticText-4" stretchType="NoStretch" positionType="FixRelativeToTop" isPrintRepeatedValues="true" isRemoveLineWhenBlank="false" isPrintInFirstWholeBand="false" isPrintWhenDetailOverflows="false"/> 72 <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/> <textElement textAlignment="Left" verticalAlignment="Top" rotation="None" lineSpacing="Single"> <font fontName="Arial" pdfFontName="Helvetica" size="10" isBold="false" isItalic="false" isUnderline="false" isPdfEmbedded ="false" pdfEncoding ="Cp1252" isStrikeThrough="false" /> </textElement> <text><![CDATA[Valor :]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="3" y="117" width="527" height="14" forecolor="#000000" backcolor="#FFFFFF" key="staticText-5" stretchType="NoStretch" positionType="FixRelativeToTop" isPrintRepeatedValues="true" isRemoveLineWhenBlank="false" isPrintInFirstWholeBand="false" isPrintWhenDetailOverflows="false"/> <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/> <textElement textAlignment="Left" verticalAlignment="Top" rotation="None" lineSpacing="Single"> <font fontName="Arial" pdfFontName="Helvetica" size="10" isBold="false" isItalic="false" isUnderline="false" isPdfEmbedded ="false" pdfEncoding ="Cp1252" isStrikeThrough="false" /> </textElement> <text><![CDATA[----------------------------------------------------------------------------------------------------------------------------------------------------------------------------]]></text> </staticText> </band> </detail> <columnFooter> <band height="0" isSplitAllowed="true" > </band> </columnFooter> <pageFooter> <band height="29" isSplitAllowed="true" > <rectangle radius="0" > <reportElement mode="Opaque" x="89" y="6" width="435" height="20" 73 forecolor="#FFFFFF" backcolor="#CCCCCC" key="rectangle" stretchType="NoStretch" positionType="FixRelativeToTop" isPrintRepeatedValues="true" isRemoveLineWhenBlank="false" isPrintInFirstWholeBand="false" isPrintWhenDetailOverflows="false"/> <graphicElement stretchType="NoStretch" pen="Thin" fill="Solid" /> </rectangle> <textField isStretchWithOverflow="false" pattern="" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement mode="Transparent" x="282" y="8" width="192" height="17" forecolor="#000000" backcolor="#FFFFFF" key="textField" stretchType="NoStretch" positionType="FixRelativeToTop" isPrintRepeatedValues="true" isRemoveLineWhenBlank="false" isPrintInFirstWholeBand="false" isPrintWhenDetailOverflows="false"/> <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/> <textElement textAlignment="Right" verticalAlignment="Middle" rotation="None" lineSpacing="Single"> <font fontName="SansSerif" pdfFontName="Helvetica" size="12" isBold="false" isItalic="false" isUnderline="false" isPdfEmbedded ="false" pdfEncoding ="CP1252" isStrikeThrough="false" /> </textElement> <textFieldExpression class="java.lang.String"><![CDATA["Página " + $V{PAGE_NUMBER} + " de "]]></textFieldExpression> </textField> <textField isStretchWithOverflow="false" pattern="" isBlankWhenNull="false" evaluationTime="Report" hyperlinkType="None" hyperlinkTarget="Self" > <reportElement mode="Transparent" x="476" y="8" width="45" height="17" forecolor="#000000" backcolor="#FFFFFF" key="textField" stretchType="NoStretch" positionType="FixRelativeToTop" isPrintRepeatedValues="true" 74 isRemoveLineWhenBlank="false" isPrintInFirstWholeBand="false" isPrintWhenDetailOverflows="false"/> <box topBorder="None" topBorderColor="#000000" leftBorder="None" leftBorderColor="#000000" rightBorder="None" rightBorderColor="#000000" bottomBorder="None" bottomBorderColor="#000000"/> <textElement textAlignment="Left" verticalAlignment="Top" rotation="None" lineSpacing="Single"> <font fontName="SansSerif" pdfFontName="Helvetica" size="12" isBold="false" isItalic="false" isUnderline="false" isPdfEmbedded ="false" pdfEncoding ="CP1252" isStrikeThrough="false" /> </textElement> <textFieldExpression class="java.lang.String"><![CDATA["" + $V{PAGE_NUMBER}]]></textFieldExpression> </textField> </band> </pageFooter> <summary> <band height="0" isSplitAllowed="true" > </band> </summary> </jasperReport> ● Código da Aplicação Responsável por Fazer a Conexão com o Banco de Dados /* autor: Silvio Costa Moreira*/ package SGE.Conexao; import java.sql.*; public class conexao { public Connection conn; public conexao() {} public String abrirConexao(String _driver, String login, String senha) { String retorno = "OK"; String driver = "jdbc:odbc:"+_driver; String converte = ""; try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (Exception e1){ //System.out.println("Erro ao abrir a conexão! Erro: " + e1); retorno = converte.valueOf(e1); } 75 try{ conn = DriverManager.getConnection(driver, login, senha); } catch (Exception e1){ //System.out.println("Erro ao abrir o BD! Erro: " + e1); //retorno = e1; retorno = converte.valueOf(e1); } return retorno; }//fim do metodo abriConexao public void fecharConexao() { try{ conn.close(); } catch(SQLException e){ } }//fim do metodo fecharConexao }//fim da class ● Código da Aplicação Responsável por Fazer a as Operações (cadastrar, alterar pesquisar, excluir) no Banco de Dados /* Silvio Costa Moreira*/ package SGE.Conexao; import java.sql.*; import java.util.*; import java.util.Date; public class adicionar { //variaveis para fazer a conexão com o banco. private Connection objBD; private Statement objSQL; 76 //meto construtor vazio public adicionar() { } //metodo utizado para adicionar dados a base de dados public void adicionarDados(String instrucao, conexao obj) { try { objSQL = obj.conn.createStatement(); objSQL.execute(instrucao); } catch(SQLException e) { System.out.println("Erro ao executar a SQL! Erro: " + e); } catch(Exception e) { System.out.println("Houve um erro ao tentar consultar os materiais! Erro: " + e); } finally { //objSQL.close(); obj.fecharConexao(); } }//fim do metodo adicionar // metodo de atualizar dados da base de dados public void atualizarDados(String instrucao, conexao conet) { Statement stmt = null; try { stmt = conet.conn.createStatement(); stmt.execute(instrucao); stmt.close(); conet.fecharConexao(); } catch(SQLException e){ System.out.println("Erro ao executar a SQL! Erro: " + e); 77 } }//fim do metodo atualizar dados //metodo pesquisar dados da base de dados. public ResultSet pesquisarDados(String instrucao, conexao obj) { ResultSet objRS = null; try { objSQL = obj.conn.createStatement(); objRS = objSQL.executeQuery(instrucao); //objSQL.close(); //obj.fecharConexao(); } catch(SQLException e) { System.out.println("Erro ao executar a SQL! Erro: metodo " + e); } return objRS; }// fim do metodo buscar fornecedor // metodo para excluir um registro na tabela public void ExcluirDados(String instrucao, conexao conet) { Statement stmt = null; try { stmt = conet.conn.createStatement(); //String strSQL = " DELETE FROM oficios WHERE numero = '"+_numero+"'"; stmt.execute(instrucao); stmt.close(); conet.fecharConexao(); } catch(SQLException e){ System.out.println("Erro ao executar a SQL! Erro: " + e); } 78 }//fim do metodo alterarProduto } ● Código da Aplicação Responsável por Gerar os Relatórios para a Aplicação /*Silvio Costa Moreira*/ package SGE.Relatorio; import net.sf.jasperreports.engine.*; import net.sf.jasperreports.view.*; import java.sql.*; import java.util.*; import java.awt.*; import javax.swing.*; import SGE.Conexao.*; import SGE.Despesa.*; import SGE.Evento.*; public class relatorio { private Connection objBD; private Statement objSQL; conexao obj = new conexao(); adicionar add = new adicionar(); private static final String layout = "eventos.jrxml"; private static final String layoutJarper = "eventos.jasper"; public relatorio() { } //consultar todos os documentos //consulta do relatorio public ResultSet consultarTodos() { 79 obj.abrirConexao("eventos", "", ""); String sql = "SELECT * FROM despesa"; return add.pesquisarDados(sql, obj); }// fim do metodo buscar fornecedor public ResultSet consultarEvento(String evento) { obj.abrirConexao("eventos", "", ""); String sql = "SELECT * FROM despesa WHERE evento = '"+evento+"'"; return add.pesquisarDados(sql, obj); }// fim do metodo buscar fornecedor public void fechar() { try { objSQL.close(); obj.fecharConexao(); } catch(SQLException e) { System.out.println("Erro ao fechar a conexão: " + e); } } public void geraRelatorio(String evento, String nomeEvento) throws Exception { //JasperReport relatorio = JasperCompileManager.compileReport(layout); String titulo = "Evento " + nomeEvento; // // executa o relatório com o resultado da consulta Map parametros = new HashMap(); parametros.put("Titulo", titulo); parametros.put("Categoria", categoria); JRResultSetDataSource jrRS = new JRResultSetDataSource(consultarEvento(evento)); 80 JasperPrint impressao = JasperFillManager.fillReport(/*relatorio*/layoutJarper,parametros,jrRS ); //System.out.println(jrRS); //exibe o resultado da impressão na previsualização padrão Swing JasperViewer viewer = new JasperViewer(impressao, false); viewer.setTitle("Sistema de Gerenciamento de Eventos"); viewer.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); viewer.show(); fechar(); }//fim gerar relatorio*/ //gera relatorio de todos os documentos cadastrados public void geraRelatorioTodos() throws Exception { //Jdesktop dt = new Jdesktop(); //JasperReport relatorio = JasperCompileManager.compileReport(layout); String titulo = "Relatorio de Despesas de Eventos"; // // executa o relatório com o resultado da consulta Map parametros = new HashMap(); parametros.put("Titulo", titulo); parametros.put("Categoria", categoria); JRResultSetDataSource jrRS = new JRResultSetDataSource(consultarTodos()); JasperPrint impressao = JasperFillManager.fillReport(/*relatorio*/layoutJarper,parametros,jrRS ); //System.out.println(jrRS); //exibe o resultado da impressão na previsualização padrão Swing JasperViewer viewer = new JasperViewer(impressao, false); //dt.setJD(viewer); //System.out.println(viewer.getDefaultCloseOperation()); viewer.setTitle("Sistema de Gerenciamento de Eventos"); //viewer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); viewer.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); //viewer.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); viewer.show(); 81 fechar(); } }