Anda di halaman 1dari 47

Aplicaes normalmente precisam de algum tipo de relatrio.

Em Java existem alguns frameworks que podem ser utilizados para facilitar a gerao destes relatrios. entre os frameworks! o Jasper"eports com i"eport # um dos que faz mais sucesso! se$a para we% ou no.

JasperReports
&ramework open source escrito em Java para gerao de relatrios. 'i%lioteca motor que transforma o arquivo J"()* em um relatrio exportado para uma das extenses suportadas +, &! -.)*! etc/ usando a fonte de dados especificada esign definido via ()* Aps codificado! o arquivo deve ser compilado! gerando assim um arquivo .$asper esenvolvimento tra%al0oso.

iReport
&erramenta que visa facilitar a construo de relatrios +la1out/ utilizando a %i%lioteca Jasper"eports atrav#s de uma interface gr2fica desenvolvida em 3wing. &ornece suporte 4 construo de relatrios complexos. ,ermite inserir tipos de o%$etos como textos est2ticos! figuras geom#tricas! imagens! gr2ficos! su% relatrios entre outros. Elimina a necessidade de manipulao direta dos arquivos J"()*.

5 poss6vel adicionar complementos para acrescentar funcionalidades ou estender as existentes em um relatrio. Entre eles esto7
i.ext7 extenso para gerar e manipular arquivos ".&! ()*! -.)* e , &. J&ree80art7 9erao de gr2ficos Apac0e ,:;7 permite criar e manipular v2rios formatos do )icrosoft :ffice! al#m da extenso :*E <.

Campos +&ields/ so =2reas espec6ficas> no relatrio que rece%ero diretamente os dados das colunas referenciadas. Ex7
?field name@=Aome> class@=$ava.lang.3tring>BC

Parmetros so dados passados para a operao de preenc0imento! que no podem ser encontrados normalmente na fonte de dados.
?parameter name@=.itulo o"elatorio> class@=$ava.lang.3tring>BC
,assados via cdigo Java! atrav#s da classe -as0)ap. Ex7
)ap parametros @ new -as0)ap+ /D parametros.put+ =8liente>! =&ulano de .al> /D

Etilizados! por exemplo! na quer1 do relatrio


3E*E8. F &":) cliente G-E"E cliente @ H,I8lienteJ

Variveis so utilizadas para armazenar resultados tempor2rios necess2rios para gerao do relatrio
podem referenciar tipos internos de c2lculos! como contagem +count/! soma +sum/! m#dia +average/! menor +lowest/! maior +0ig0est/! etc. Ex ?varia%le name@=Kalor.otal8ompra3um> class@=$ava.lang. ou%le> calculation@=3um>C ?varia%le expressionC HIKalor,rodutoJ ?Bvaria%le expressionC ?Bvaria%leC

A ordem em que as vari2veis so declaradas no relatrio # importante. ,odemos definir o n6vel no qual uma vari2vel ir2 ser inicializada. ,ode ser no in6cio do relatrio +uma Lnica vez/! a cada p2gina! coluna ou grupo.
?varia%le name@=Kalor.otal8ompra3um> class@=$ava.lang. ou%le> reset.1pe@=,age> calculation@=3um>C ?varia%le expressionC HIKalor,rodutoJ ?Bvaria%le expressionC ?initialKalueExpressionC new ou%le+ M / ?BinitialKalueExpressionC ?Bvaria%leC

Kari2veis internas da ferramenta7 ,A9ENAE)'E"! 8:*E)ANAE)'E"! "E,:".N8:EA.! ,A9EN8:EA.! 8:*E)AN8:EA..

Expresses +Expressions/ so utilizadas para especificar o conteLdo de campos de texto! na realizao de c2lculos freqOentes .odas elas so expresses Java que podem conter em sua sintaxe7
campos7 acessado com H&InomeJ parPmetros7 acessado com H,InomeJ vari2veis de relatrio7 acessado com HKInomeJ.

Exemplo de uma expresso7


?text&ieldExpressionC =3r.+a/ > Q H&I8lienteJ Q R realizou um total de compras no valor de R Q HKIKalor.otal8ompra3umJ Q R no dia R Q +new 3imple ate&ormat+RddB))B1111R// .format+H&I ata8ompraJ/ Q R.R ?Btext&ieldExpressionC

: Jasper"eports divide o la1out do relatrio em 2reas =pr#Sdefinidas>! c0amadas sees ou %andas. As sees ou %andas! levam em considero a estrutura visual de um relatrio. 3o elas7 background! title! pageHeader! columnHeader! detail! columnFoter! pageFooter! lastPageFooter, summary e noData.

: conteLdo colocado na %anda background # exi%ido como plano de fundo das p2ginas do relatrio. ,or padro este # exi%ido em todas as p2ginas! mas isto pode ser configurado. : conteLdo da %anda title aparece somente uma vez no comeo do relatrio. : que definimos na %anda pageHeader aparece no alto de cada p2gina do mesmo.
Esta parte pode! por exemplo! conter a dataB0ora eBou o nome da organizao.

: columnHeader lista nomes daqueles campos espec6ficos que vocT quer apresentar.
,or exemplo do =Aome do empregado>! =-ora de ;n6cio>! =-ora de t#rmino>! =-oras tra%al0adas>! etc.

: detail # a %anda onde os valores dos campos so apresentados. ,or exemplo! =Jorge -oracio>! =U<7MM0>! =UV7MM0>! =MW 0oras> : columnFooter pode indicar a soma de alguns dos campos. ,or exemplo =.otal de 0oras tra%al0adas7 UVM> : pageFooter aparece no final de cada p2gina. ,ode conter por exemplo! o nLmero da p2gina como =U de X>. : lastPageFooter permite colocar uma informao diferenciada no rodap# da Lltima p2gina. : summary # a %anda onde a informao inferida a partir dos dados da %anda =detal0e> # indicada.
,or exemplo! aps ter listado as 0oras tra%al0adas para cada empregado na %anda =detail>! as 0oras totais tra%al0adas para cada empregado podem ser apresentadas em um gr2fico de pizza.

A %anda noData # impressa quando no existem dados para impresso no relatrio.

Ys vezes pode ser necess2rio agrupar algumas informaes em comum no seu relatrio. : i"eport permite que vocT crie sees adicionais de agrupamento7 Group Header e Group Footer. A %anda Group Header exi%e as informaes so%re o grupo +ex7 nome do grupo/! antes que as informaes agrupadas se$am exi%idas. Ex7
Mamferos
8avalo! Kaca! Elefante.

Insetos
&ormiga! )osca! A%el0a.

A %anda Group Footer exi%e informaes finais do grupo +ex7 total de registro no grupo/! aps as informaes agrupadas terem sido exi%idas. Ex7
8avalo! Kaca! Elefante.

Total de Mamferos! "


&ormiga! )osca! A%el0a.

Total de Insetos! "

O relatrio pode ser desenvolvido no programa externo iReport que pode ser obtido no endereo http://community.jaspersoft.com/project/ireport-designer, ou pode-se incluir um plugin no eclipse que permite a criao e edio do relatrio dentro do prprio eclipse. Utilizaremos a segunda opo.

Clique no menu elp ! "clipse #ar$etplace

%esquise por &asperso't studio "m seguida clique no boto (nstall. )iga os passos da instalao. *o concluir a instalao, reinicie o "clipse.

*ntes de comear, crie o pacote uni'imes.pd+.relatorios *cesse o menu ,ile ! -e+ ! .asper Report -esse ponto, voc/ pode optar por criar um relatrio em branco 0mais trabal1oso, por2m mais 'lex3vel4 ou utilizar um dos modelos o'erecidos. %ara o nosso exemplo, selecione o modelo Co''ee Clique em -ext

(ndique o local onde o relatrio dever5 ser salvo. "m nosso exemplo, vamos deixar dentro do pacote uni'imes.pd+.relatorios. Clique em -ext.

-este ponto, voc/ deve selecionar uma 'onte de dados. : i"eport provT suporte a diversas fontes de dados7 J '8! -i%ernate! etc. )e no existir nen1uma con'igurada, clique em -e+. )e existir, selecione-a e pule os 6 prximos slides desta apresentao.

-esta tela, selecione o tipo da 'onte de dados. "m nosso exemplo iremos trabal1ar com conexo .78C, ento selecione a opo 7atabase .78C Connection. Clique em -ext

-esta tela, in'orme os dados da conexo


9ual o driver: 9ual a url do banco de dados: 9ual o usu5rio: 9ual a sen1a:

*ps in'ormar os dados acima, alterne para a aba 7river Classpat1.

-esta aba, in'orme o conector 0arquivo .&ar4 do banco. "m nosso exemplo, in'orme o conector #;)9< utilizado nos exemplos anteriores. )e voc/ no possui, ele pode ser obtido no endereo= 1ttp=>>dev.m;sql.com>do+nload s>connector>&> Clique no boto ?est. )e os dados 'oram in'ormados corretamente, voc/ dever5 obter uma mensagem de sucesso. Caso contr5rio, revise os dados in'ormados. Clique em ,inis1.

Com a 'onte de dados selecionada, in'orme o cdigo )9< para obter os dados que iro preenc1er o relatrio. "m nosso exemplo, digite= select @ 'rom produto Clique em -ext.

)e a consulta estiver correta, esta tela deve exibir os campos retornados por ela, para que voc/ selecione apenas os que sero exibidos no relatrio. "m nosso exemplo, selecione os campos= id, nome, valor e validade. Clique em -ext.

-esta tela, voc/ deve in'ormar o0s4 campo0s4 pelo qual os registros sero agrupados. "m nosso exemplo, no 1aver5 agrupamento de in'ormaAes, logo, no selecione nen1um. Clique em ,inis1.

*ps concluir, o eclipse deve alternar para a perspectiva Report 7esign que permite a edio do relatrio.

-o iReport 2 poss3vel adicionar m5scaras de 'ormatao aos valores do tipo 7ate e -um2rico. %ara isto, selecione o campo a ser 'ormatado, v5 at2 as propriedades e selecione a aba ?ext ,ield. <ocalize a opo %attern, clique na retic/ncias e selecione o padro dese&ado ou crie o seu prprio. )e algum campo estiver com valor nulo, o iReport ir5 imprimir por padro a string null. %ara alterar isto, v5 at2 as propriedades e selecione a aba ?ext ,ield. %rocure pela opo 8lan$ +1en null e marque-a.

Aps o desen0o do relatrio! devemos compil2Slo.


Esse processo corresponde a gerar uma representao em formato %in2rio do relatrio. "esultado da compilao # um arquivo com a extenso .$asper. 5 essa representao que usamos com o Jasper"eport para =preenc0er> o relatrio. ,ara que o eclipse faa a compilao e exi%io dos arquivos .$asper! clique com o %oto direito no nome do pro$eto e acesse a opo Jasper"eports C .oggle Jasper"eports Aature. A partir da6! a compilao do arquivo J"()* no eclipse # feita $untamente com a do pro$eto. 3e a opo 'uild Automaticall1 estiver ativa! ela deve ocorrer sempre que uma modificao for salva.

Uma vez compilado o relatrio, pode-se c1amar o relatrio via .ava, para que a aplicao exiba os relatrios dese&ados. * seguir con1eceremos algumas classes que a&udam nesta tare'a.

Ateno= B poss3vel compilar o arquivo .RC#< e gerar o arquivo .&asper via cdigo &ava. Contudo, a menos que isto se&a 'undamental, recomenda-se compil5-lo previamente e s e'etuar as requisiAes ao .&asper via cdigo &ava, de 'orma a evitar constantes compilaAes a cada nova requisio do relatrio.

Classe .R<oader %rincipais #2todos=


loadOb&ect,rom,ile0&ava.lang.)tring str4D loadOb&ect0&ava.io.,ile 'ile4 loadOb&ect0&ava.net.UR< url4 loadOb&ect0&ava.io.(nput)tream is4D

8lasse Jasper&ill)anager ,rincipal m#todo7 fill"eport +est2tico/


"etorna o%$eto Jasper,rint

Assinatura7
Jasper,rint fill"eport+ 3tring sourceFile#ame! -as0)ap parameters! 8onnection connection/D

,arPmetros de fill"eport7
3tring sourceFile#ame7 corresponde ao nome do relatrio compilado +.$asper/. -as0)ap parameters7 lista de parPmetros do relatrio +e.g.! t6tulo! data! sesso/ 8onnection connection7 conexo +J '8/ com a fonte de dados utilizada para preenc0er o relatrio.

J"Exporter
8lasse Ltil quando queremos exportar o relatrio para diversos formatos.

Exemplos!
JR$%porter &rPdf ' new JRPdfExporter !" jrPdf.#exportReport !"#//exporta#para#pdf JR$%porter &rHtml ' new JR$tm%Exporter !" jr$tm%.#exportReport !"#//exporta#para#htm% JR$%porter &r(ls ' new JR&%sExporter !" jr&%s.#exportReport !" //exporta#para#exce% JR$%porter &r)dt ' new JR'dtExporter !" jr'dt.#exportReport !"#//exporta#para#odt

Crie um pacote c1amado uni'imes.pd+.relatorios. *dicione os arquivos abaixo dentro de EebContent ! E"8-(-, ! lib
commons-beanutils-x.x.x.&ar commons-collections-x.x.x.&ar commons-digester-x.x.&ar commons-&ava'lo+-x.&ar groov;-all-x.x.x.&ar i?ext-x.x.x.&ar &asperreports-x.x.x.&ar poi-x.x-x.&ar prime'aces-x.x.&ar

Crie o pacote uni'imes.pd+.util. Crie uma classe c1amada RelatorioUtil.&ava

pu%lic class "elatorioEtil I pu%lic static final int "E*A.:";:N, & @ UD pu%lic static final int "E*A.:";:NE(8E* @ <D pu%lic static final int "E*A.:";:N-.)* @ ZD pu%lic static final int "E*A.:";:N,*AA;*-AN:,EAN:&&;8E @ [D pu%lic static final int"E*A.:";:NE ;.:"NG:" @ \D pu%lic static final int"E*A.:";:NE ;.:"N:,EAN:&&;8E @ WD pu%lic 3treamed8ontent gera"elatorio+-as0)ap?3tring! :%$ectC parametros"elatorio! Jasper"eport relatorioJasper! 3tring nome"elatorio3aida! int tipo"elatorio! 8onnection con/ t0rows Exception I 3treamed8ontent arquivo"etorno @ nullD tr1 I &aces8ontext context @ &aces8ontext.get8urrent;nstance+/D 3tring camin0o"elatorio @ context.getExternal8ontext+/.get"eal,at0+RBR/D 3tring camin0oArquivo"elatorio @ nullD Jasper,rint impressoraJasper @ Jasper&ill)anager.fill"eport+relatorioJasper! parametros"elatorio! con/D J"Exporter tipoArquivoExportado @ nullD 3tring extensaoArquivoExportado @ RRD &ile arquivo9erado @ nullD

s+itc1 0tipoRelatorio4 F case RelatorioUtil.R"<*?OR(OG%7, = tipo*rquivo"xportado H ne+ .R%d'"xporter04D extensao*rquivo"xportado H Ipd'ID brea$D case RelatorioUtil.R"<*?OR(OG ?#< = tipo*rquivo"xportado H ne+ .R tml"xporter04D extensao*rquivo"xportado H I1tmlID brea$D case RelatorioUtil.R"<*?OR(OG"CC"< = tipo*rquivo"xportado H ne+ .RCls"xporter04D extensao*rquivo"xportado H IxlsID brea$D case RelatorioUtil.R"<*?OR(OG%<*-(< *GO%"-GO,,(C" = tipo*rquivo"xportado H ne+ .ROds"xporter04D extensao*rquivo"xportado H IodsID brea$D case RelatorioUtil.R"<*?OR(OG"7(?ORGEOR7 = tipo*rquivo"xportado H ne+ .R7ocx"xporter04D extensao*rquivo"xportado H IdocxID brea$D case RelatorioUtil.R"<*?OR(OG"7(?ORGO%"-GO,,(C" = tipo*rquivo"xportado H ne+ .ROdt"xporter04D extensao*rquivo"xportado H IodtID brea$D de'ault = tipo*rquivo"xportado H ne+ .R%d'"xporter04D extensao*rquivo"xportado H Ipd'ID 8rea$D

camin1o*rquivoRelatorio H camin1oRelatorio K ,ile.separator K nomeRelatorio)aida K I.I K extensao*rquivo"xportadoD arquivoLerado H ne+ &ava.io.,ile0camin1o*rquivoRelatorio4D tipo*rquivo"xportado.set%arameter0.R"xporter%arameter..*)%"RG%R(-?, impressora.asper4D tipo*rquivo"xportado.set%arameter0.R"xporter%arameter.OU?%U?G,(<", arquivoLerado4D tipo*rquivo"xportado.exportReport04D arquivoLerado.deleteOn"xit04D (nput)tream conteudoRelatorio H ne+ ,ile(nput)tream0arquivoLerado4D arquivoRetorno H ne+ 7e'ault)treamedContent0conteudoRelatorio, Iapplication>I K extensao*rquivo"xportado, nomeRelatorio)aida K I.I K extensao*rquivo"xportado4D J catc1 0.R"xception e4 F t1ro+ ne+ "xception0I-o 'oi poss3vel gerar o relatrio.I, e4D J catc1 0,ile-ot,ound"xception e4 F t1ro+ ne+ "xception0I*rquivo do relatrio no encontrado.I, e4D J return arquivoRetornoD J

*ltere sua classe %roduto8ean.&ava e adicione o cdigo a seguir=


private 3treamed8ontent retornoD private ;nteger tipoD pu%lic 3treamed8ontent get"etorno+/ I imprimir+/D return retornoD J pu%lic void set"etorno+3treamed8ontent retorno/ I t0is.retorno @ retornoD J pu%lic ;nteger get.ipo+/ Ireturn tipoD J pu%lic void set.ipo+;nteger tipo/ I t0is.tipo @ tipoD J pu%lic void imprimir +/ I 3tring relatorioJasper @ new 3tring+/D &aces8ontext faces8ontext @ &aces8ontext.getCurrentInstance(); tr1 I E"* url"elatorio @ get8lass+/.get"esource+relatorioJasper/D Jasper"eport $r @ +Jasper"eport/ J"*oader.loadObject(urlRelatorio); 8onexao com @ new 8onexao+/.get8onexao+/D t0is.arquivo"etorno @ new "elatorioEtil+/.gera"elatorio+null! $r! RrelatorioR! tipo! con/D J catc0 +Exception ex/ I faces8ontext.add)essage+null! new &aces)essage+&aces)essage.SEVERITY_ERROR, RErro ao visualizar certificadoR! R etal0es7 =Q ex.get)essage+///D J J

*ltere produtos.x1tml e acrescente o cdigo abaixo aps os componentes datatable e message= .ipo7 ?p7select:ne"adio id@RoptionsR value@R]Iproduto.tipoJRC ?f7select;tem item*a%el@R, &R itemKalue@RUR BC ?f7select;tem item*a%el@R(*3R itemKalue@R<R BC ?f7select;tem item*a%el@R-.)*R itemKalue@RZR BC ?f7select;tem item*a%el@R: 3R itemKalue@R[R BC ?f7select;tem item*a%el@R :8(R itemKalue@R\R BC ?f7select;tem item*a%el@R: .R itemKalue@RWR BC ?Bp7select:ne"adioC ?p7command'utton a$ax@RfalseR value@REmitir "elatrioRC ?p7file ownload value@R]Iproduto.arquivo"etornoJ=BC ?Bp7command'uttonC

*ltere produtos.x1ml e adicione o cdigo abaixo para criar uma nova coluna no datatable. ?p7column sort'1@R]Iprod.idJRC ?f7facet name@R0eaderRC?p7output*a%el value@R"elatrioRBC?Bf7facetC ?p7command*ink value@R9erar , &R a$ax@RfalseRC ?f7set,ropert1Action*istener target@R]Iproduto.idJR value@R]Iprod.idJRC?Bf7set,ropert1Action*istenerC ?p7file ownload value@R]Iproduto.produto"etornadoJRC?Bp7file ownloadC ?Bp7command*inkC ?Bp7columnC

*ltere %roduto8ean.&ava e adicione o cdigo abaixo= private 3treamed8ontent produto"etornadoD pu%lic 3treamed8ontent get,roduto"etornado+/ I imprimir,roduto+/D return produto"etornadoD J pu%lic void set,roduto"etornado+3treamed8ontent produto"etornado/I t0is.produto"etornado @ produto"etornadoD J private void imprimir,roduto+/ I 3tring relatorioJasper @ new 3tring+/D relatorioJasper @ RBpdwBrelatoriosBproduto.$asperRD &aces8ontext faces8ontext @ &aces8ontext.get8urrent;nstance+/D tr1 I E"* url"elatorio @ get8lass+/.get"esource+relatorioJasper/D Jasper"eport $r @ +Jasper"eport/ J"*oader.load:%$ect+url"elatorio/D -as0)ap?3tring! :%$ectC parametro @ new -as0)ap?3tring! :%$ectC+/D parametro.put+Rid,rodutoR! id/D 8onnection con @ new 8onexao+/.get8onexao+/D produto"etornado @ new "elatorioEtil+/.gera"elatorio+parametro! $r! RrelatorioR! U! con/D J catc0 +Exception ex/ I faces8ontext.add)essage+null! new &aces)essage+&aces)essage.3EKE";.^NE"":"! RErro ao visualizar certificadoR! R etal0es7 = Q ex.get)essage+///D J J

Crie um novo relatrio assim como o anterior, mas desta vez, agrupe os dados pelo nome do produto. *ps criar o produto, crie um novo parMmetro 0Boto direito em Parameters > Create Parameter4 c1amado id%roduto

*ltere o tipo do parMmetro criado 0Selecione o parmetro e v em propriedades4 para &ava.lang.(nteger.

3AA.:3! ;smael -. &. M*dulo III + Relat*rios e Gr,ficos em Ja-a. ispon6vel em7 0ttp7BBwww.tecgraf.pucS rio.%rB_ismaelB8ursosB8idadeN&,3GBaulasB)oduloZN9raficosN"elatoriosBJavaN"elatorios.pdf. Acesso em7 MZ de $un0o de <MUZ. .:&&:*;! 9iulio. iReport + .ser Manual. ispon6vel em7 0ttp7BBpt.scri%d.comBdocB`X\`[WM`Bi"eportS EserS)anual. Acesso em7 M\ de $un0o de <MUZ. A"AaJ:! Everton 8oim%ra de. Desen-ol-imento para /$0 com Ja-a. &lorianpolis7 Kisual 'ooks! <MUM. *E8b:G! #cio -einzelmannD )E*:! Alexandre Altair de. Programa12o Ja-a para a /$0. 3o ,aulo7 Aovatec Editora! <MUM.

Anda mungkin juga menyukai