Você está na página 1de 17

Mini-Tutorial

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

Você também pode gostar