Como criar relatrios Java para Web com JasperReports e iReport
por Roberto J. Furutani 20/07/2005 www.furutani.eti.br 1. Introduo O objetivo deste trabalho mostrar de forma prtica como criar relatrios e subrelatrios para o ambiente Web usando Java. Ser apresentado neste mini-tutorial o JasperReports e iReport ue s!o os componentes mais conhecidos para a "era#!o de relatrios em java$ por serem open-source e terem muitos recursos. O iReport uma ferramenta para facilitar os testes e principalmente facilitar a cria#!o do la%out dos relatrios. &as uem "era de fato os relatrios em pdf$ 'ls$ html e outros formatos o JasperReports. 2. Obtendo os programas ( vers!o do iReport ue ser usado nesse mini-tutorial ).*.) e do JasperReports +ue acompanha o iReport, ).-... /ara fa0er o do1nload do iReport acesse http233ireport.sourcefor"e.net3 ou diretamente no Source4or"e http233sourcefor"e.net3project3sho1files.php5"roup6id7-*8*9 (ps o do1nload descompacte o aruivo iReport-).*.).0ip em al"um diretrio$ neste trabalho ser usado :2;iReport-).*.) <ntre no site 111.m%sl.or" e fa#a o do1nload do &%S=> database server *... ?o site 111.eclipse.or" pe"ue o <clipse 8.. ou mais recente. O@S2 ?esta vers!o do iReport a vers!o do driver do &%S=> anti"a$ para atuali0ar$ na pasta :2;iReport-).*.);lib apa"ue o mysql-connector-java-3.0.8-stable-bin.jar e insira o mysql-connector-java-3.0.16-ga-bin.jar ue acompanha os fontes. 3. Criando as tabelas Os dados usados ser!o bem simples$ s!o apenas 8 tabelas +livro$ livro6autor e autor,$ suficientes para mostrar como "erar. (s tabelas est!o no banco de dados relatrio. (bai'o est o conjunto de comandos S=> para a cria#!o das tabelas. Os fontes est!o disponAveis em http233111.furutani.eti.br3tutoriais3relatorio6jasperreports.0ip CREATE TABLE `autores` ( `cd_autor` int(11) unsigned NOT NULL auto_increment, `Nome` varchar(60) default NULL, PRIMARY KEY (`cd_autor`), UNIQUE KEY `cd_autor` (`cd_autor`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE `livro_autor` ( `cd_livro` int(11) unsigned NOT NULL default '0', `cd_autor` int(11) unsigned NOT NULL default '0', PRIMARY KEY (`cd_livro`,`cd_autor`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE `livros` ( `cd_livro` int(11) unsigned NOT NULL auto_increment, `Titulo` varchar(100) default NULL, `ISBN` int(15) default NULL, `DataLancamento` datetime default NULL, PRIMARY KEY (`cd_livro`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; INSERT INTO `autores` (`cd_autor`, `Nome`) VALUES (1,'Kathy Sierra'), (2,'Bryan Basham'), (3,'Bert bates'), (4,'Carlos H. Poderoso de Oliveira'); INSERT INTO `livros` (`cd_livro`, `Titulo`, `ISBN`, `DataLancamento`) VALUES (1,'Head First Servlets & JSP',596005407,'2004-07-01 00:00:00'), (2,'SQL Curso Prtico',857522041,'2005-02-10 00:00:00'); INSERT INTO `livro_autor` (`cd_livro`, `cd_autor`) VALUES (1,1), (1,2), (1,3), (2,4); 4. Montando o relatrio (ntes de criar o relatrio master ou relatrio principal$ preciso confi"urar um data source +fonte de dados, ue neste caso ser o m%sl. B ao menu fonte de dados e selecione Cone'Ces34onte de dados. ?a janela ue se abre cliue em ne1 e confi"ure as propriedades conforme a fi"ura abai'o2 Se o teste foi bem sucedido$ cliue em save. ("ora preciso definir uma cone'!o ativa$ ue ser a cone'!o criada anteriormente. ?o menu Criar+build, cliue em :efinir a cone'!o ativa. Selecione Relatorio:S e cliue em OD. ("ora possAvel prosse"uir com a cria#!o do relatrio principal. ?o menu aruivo selecione novo documento$ ir abrir a tela (ltere somente o nome do relatrio. ?a barra de ferramentas procure por static te't tool $ esse ferramenta possibilita inserir te'to estticos$ ou seja$ te'tos ue n!o vir!o do banco de dados$ no relatrio. Seu uso simples$ basta clicar nele e depois desenhar no relatrio. (o lado do static te't tool tem o te'tfield tool $ este sim serve para pEr te'tos ue vir!o do banco de dados. Coloue no relatrio os te'to estticos FRelatrio de >ivrosG na banda title e os te'to GHitulo2G$ FIS@?2G e F:ata de >an#amentoG na banda detail. ( banda detail onde colocamos os te'tos ue se repetir!o para cada linha retornada pelo banco de dados. Coloue tambm trJs te'tfields. 4a#a al"o parecido com a fi"ura abai'o. /recisamos di0er a esses trJs te'tfields o ue eles mostrar!o. /ara isso vamos confi"urar um comando S=> para pu'ar os dados do m%sl. B ao menu visuali0ar$ selecione Consultas do Relatrio$ vai abrir a janela2 Provavelmente quando estiver digitando o comando SQL vai abrir uma janela com o desenho de duas chaves, ele est pedindo a senha do mysql. Digite-a. o !inal da digita"#o do SQL, dever aparecer em bai$o quatro campos e seus respectivos tipos, guarde bem o nome deles voc% ir utili&a-los mais para !rente, sen#o aparecer, o SQL deve estar errado. 'lique em (). *gora d% um duplo clique em cima do te$t !ield re!erente ao +t,tulo- do livro. * janela abai$o vai se abrir. /a"a as con!igura"0es destacadas na !igura. /eche essa janela e d% um duplo clique no te$t!ield re!erente ao 1S2 e !a"a como mostrado na !igura abai$o. /a"a o mesmo para o te$t!ield dataLancamento ( conte3do da propriedade te$t!ield e$pression deve coincidir com o nome do campo obtido quando digitamos o SQL. ( 4elat5rio deve !icar assim. este momento o relat5rio j est !uncionando mas sem o subreport, clique em 4un a report using a connection para visuali&ar o relat5rio. ( relat5rio principal j est pronto. 5. Montando o subrelatrio O subrelatrio +subreport, simples$ s ter um te'tfield para o nome do autor. Crie um novo relatrio$ menu aruivo selecione novo documento. (ltere as propriedades das mar"ens da p"ina +/a"e &ar"in,. :efina a cone'!o ativa +j foi mostrado,. Redu0a o tamanho de todos as bands$ para ficar s o detail visAvel. (dicione um te'tfield$ dei'ando ele assim2 B ao menu Bisuali0ar selecione Consultas do Relatrio e insira o cdi"o S=> mostrado abai'o. Se tudo estiver certo cliue em OD. :J um duplo cliue no te't field e confi"ure dessa forma2 O relatrio j deve estar funcionando$ cliue em Run a report usin" a connection . O resultado ser2 :esta forma$ o subrelatrio ir mostrar todos os autores$ o ue se deseja mostrar os autores de acordo com o livro. Beremos como fa0er isso no pr'imo tpico. Observa#!o2 /ara alternar entre um relatrio e outro dJ um duplo cliue no nome dele na rvore ue fica do lado esuerdo . !"igando# o relatrio ao subrelatrio ("ora che"ou a parte mais le"al do tutorial. ?o relatrio principal acrescente o subrelatrio usando a ferramenta Subreport . :J um duplo cliue no subreport para ver as propriedades dele. ?o campo Subreport <'pression informe o caminho do relatrio compilado +.jasper,. >o"o abai'o confi"urado os parKmetros ue ser!o passados para o subrelatrio. ?este caso estamos passando o cdi"o do livro +L4Mcd6livroN, com o nome de CO:6>IBRO (inda nessa janela selecione a aba Subreport e selecione Ose connection e'pression. Bolte ao subreport$ pois necessrio fa0er uma modifica#Ces. O $P{COD_LIVRO} o nome do parametro ue foi definido anteriormente. /ara ue o subrelatrio aceite o parKmetro $P{COD_LIVRO} preciso confi"ur-lo ent!o$ v ao menu visuali0ar selecione parametros do relatrio. < confi"ure assim2 O valor para o campo :efault value e'pression somente para poder testar o comando S=> abai'o$ caso n!o coloue um valor padr!o para o parKmetro ver um erro2 /lease set a default value for the parameter PCO:6>IBROP. ( depois mude o S=> para2 SELECT at.nome FROM `autores` at INNER JOIN `livro_autor` la ON la.cd_autor = at.cd_autor INNER JOIN `livros` lv ON lv.cd_livro = la.cd_livro WHERE lv.cd_livro = $P{COD_LIVRO} 'ompile o relat5rio clicando em . 6olte ao relat5rio principal, cliue em Run a report usin" a connection $ se tudo correr bem esse ser o resultado $. Colo%ando na &eb 9. ( parte mais fcil do tutorial a"ora. Colocar esse relatrio para ser "erado na 1eb. Saber um pouco de servlets e JS/ pr-reuisito para este tpico. > atrs colocamos como caminho para o subreport a constante D:/iReport- 0..0/Rel!"tores.jasper#$ a"ora n!o pode mais ser assim. Q preciso passar o caminho para o Rel(utores.jasper por parKmetro$ pois o nome do conte'to entre outros fatores podem alterar esse caminho. ?o relatrio principal v ao menu visuali0ar$ selecione /arKmetros do Relatrio e crie um novo parKmetro. :J um duplo cliue no subreport$ v na aba Subreport +other, e subtitua D:/iReport- 0..0/Rel!"tores.jasper# por L/M/athRel(utoresN Compile o relatrio clicando em .?!o rode. Se vocJ tentar rodar vai dar um erro ou vai criar um relatrio sem p"inas. ?essa fase utili0aremos o <clipse 8.. para codificar um Servlet e o tomcat R.R.S. 4oi criado a se"uinte estrutura de diretrios +Os detalhes podem ser analisados bai'ando os fontes em http233111.furutani.eti.br3tutoriais3relatorio6jasperreports.0ip, O servlet ue foi criado para "erar o relatrio est listado abai'o com al"uns comentrios. package br.eti.furutani; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperManager; import net.sf.jasperreports.engine.JasperPrint; public class Relatorio extends HttpServlet { public static Connection con; public static String banco = "relatorio"; // Nome do banco de dados public static String usuario = "root"; // Usuario do banco public static String senha = "4122"; // Senha protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { conexao(); // Faz a conexo // Na variavel pathJasper ficara o caminho do diretrio para // os relatrios compilados (.jasper) String pathJasper = getServletContext().getRealPath( "/WEB-INF/classes/br/eti/furutani/") + "/"; // A variavel path armazena o caminho real para o contexto // isso util pois o seu web container pode estar instalado em lugares diferentes String path = getServletContext().getRealPath("/"); // Parametros do relatorio Map parametros = new HashMap(); // O nico parametro que devemos passar o PathRelAutores // o caminho pro RelAutores.jasper (que foi subtituido pelo // valor fixo D:/iReport-0.4.0/RelAutores.jasper) parametros.put("PathRelAutores", pathJasper + "RelAutores.jasper"); try { // Aqui ele cria o relatrio JasperPrint impressao = JasperFillManager.fillReport(pathJasper + "RelLivros.jasper", parametros, con); // Grava o relatrio em disco em pdf JasperManager.printReportToPdfFile(impressao, path + "/RelatorioLivros.pdf"); // Redireciona para o pdf gerado res.sendRedirect("RelatorioLivros.pdf"); } catch (Exception e) { res.getWriter().println("Erro ao gerar o relatrio: " + e); } } // Cria a conexo public void conexao() { try { if (con == null || con.isClosed()) { Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection( "jdbc:mysql://localhost:3306/" + banco, usuario, senha); } } catch (Exception e) { System.out.println("no foi possvel conectar ao banco ->"); e.printStackTrace(); } } protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { doPost(arg0, arg1); } } S falta fa0er o mapeamento desse servlet no 1eb.'ml <servlet> <servlet-name>RelatorioServlet</servlet-name> <servlet-class>br.eti.furutani.Relatorio</servlet-class> </servlet> <servlet-mapping> <servlet-name>RelatorioServlet</servlet-name> <url-pattern>/RelLivro</url-pattern> </servlet-mapping> 4a#a o deplo% da aplica#!o e acesse http233.TS.).)..29)9)3e'emplo3Rel>ivro O@S2 /ara uem for usar o build do (?H$ n!o se esue#a de trocar o valor do atributo Deploy.Dir no common.ant.properties '. (e)er*n%ias http://ireport.sourceforge.net/ http://jasperreports.sourceforge.net/ www.guj.com.br www.javafree.com.br http.77geocities.yahoo.com.br7roberto!urutani7java78utorial9:asper4eports7 ;;;.eclipse.org