Vous êtes sur la page 1sur 16

RelatriosemAplicativosWEB

MarceloAtie1,MarcioBeloR.Silva1
1

InstitutoSuperiordeTecnologiaemCinciasdaComputaodoRiodeJaneiro (ISTRio) RiodeJaneiroRJBrazil

marceloatie@gmail.com,mbelo.istrio@faetec.rj.gov.br

Abstract. Reportsplayanspecialroleininformationsystemsandtheusers expectations about their functionalities are growing as the time goes on. Nowadays,requirementslikecombiningtable,graphsandimagesinthesame reportarecommonplaceinbuildingsuchanartifact.WiththeWEBage,a newchallengearises:toproducereportswithformattingsophisticationtobe reproduced either in a traditional computer window or in a paper report seamlessly.Thisarticleexplainstwosolutionstocreatereportsusingopen sourcetools,eachonetargetingahighusedtechnologyfordevelopingWeb Applications. Resumo. Relatrios sempre foram uma necessidade bsica em sistemas informatizados e,com otempo, aumentou aexpectativa dos usurios com relaoaeles.Atualmente,sorequisitoscomunsrelatriosquecombinem tabelas,grficoseimagens.ComoadventodaWEB,surgiuumnovodesafio: produzir relatrios com formatao sofisticada tanto paravisualizao na tela quanto para impresso. Este artigo aborda duas solues para o problemaempregandosoftwarelivre,cadaqualvoltadaparaumadeduas dasprincipaistecnologiasadotadasnaconstruodesistemasWEB.

1.Introduo
Nosprimrdiosdaeradainformtica,aprincipalformadesadadedadosproduzidos porsistemasdecomputaoerapormeioderelatriosimpressos.Emalgunssistemas, alis, eram a nica forma de interface de sada de informaes. Ainda eram raros terminais devdeoondesepudesseprvisualizar as informaes armazenadas e/ou produzidas. Com o advento da microcomputao, cada vez mais prezase pela visualizao em vdeo e armazenamento digital das informaes, deixando para imprimirempapelapenasoestritamentenecessrio. Na era dos aplicativos com interface grfica com o usurio (GUI), vrias plataformasdedesenvolvimentodesoftwaresurgiramcomsoluesparageraode relatrios,tantoparavisualizaoemvdeoquantoparaimpresso.Essassolueseram proprietriasetotalmentedependentesdaslinguagenseferramentasnasquaisestavam embutidas.Comoexemplodetecnologiasdessaeradeaplicativosdejanelapodemos citar:PowerBuildereseuDataWindow,VisualBasiceoCrystalReports,eoDelphi com o QuickReports. A figura 1 mostra o editor de template da ferramenta QuickReports[1],soluoaindamuitoutilizadaemaplicaesparaosistemaoperativo WindowsemambienteDelphi[2].NoVisualBasic6[3],existeaferramentaacoplada

ao IDE chamada DataReport. A figura 2 mostra o editor visual do template dessa soluo.

Figura1:EditordetemplatederelatriosdoQuickReports (retiradodositedaQBSSoftwareLimited)

Figura2:DataReportDesignerdoVisualBasic6

Naatualidade,predominanteousodeaplicaesbaseadosemWEBque,por suanatureza,ricaemrecursosdevisualizaodedadosemtela.Entretanto,emboraa visualizaoemteladeumrelatrioemHTML [4] purosejaadequadaparaexibio usando os navegadores modernos, nem sempre o resultado da impresso da pgina HTML satisfatria para os requisitos do usurio. Pginas, grficos e tabelas mal formatadas, quando impressas pelo prprio navegador, ocorrem com frequncia em vriasdessassolues.

Emboraexistam recursos paraacriao depginas HTMLcombinadas com CSSqueminimizemoproblema,nemsempresatisfazemosusuriosmaisexigentes quantos aos formatos impressos. Por isso, tornouse praticamente um padro nos aplicativos WEB a gerao de relatrios no formato PDF [5]. Sendo esse formato adequado para resolver tanto a necessidade de visualizao em tela quanto para impresso,analisaremosassoluesquesebaseiamnageraodessecontedodigital.

2.Tecnologiasparageraoderelatrios
Desdeasaplicaesdejanela,amaioriadassoluesdegeraoderelatriosutilizam osmesmosprincpiosbsicos,entreelesodacriaodeum template derelatrio.O templatederelatrioumartefatodesoftwarecriadopelodesenvolvedorquedefineo arcabouo do relatrio. Esse template , em tempo de execuo, submetido a um processadorderelatrioquemesclaosdadosquepodemvirdeumaoumaisfontesde dadoscomotemplate,gerandooprodutofinalqueorelatriopronto.

Template Processador deRelatrios

Fontede Dados

Figura3:Modelotpicodesoluoparageraoderelatrios

OProcessadordeRelatrioosoftwareresponsvelporreceberosdadoseo arquivo de template como entrada e produzir o relatrio final para o usurio. O processador de relatrio pode ser embutido dentro do aplicativo principal contido comoumabibliotecaoucomoumsoftwareindependente.Emalgumassolues,os relatriossoproduzidostotalmenteindependentesdosoftwareprincipal(quegerae processaosdadosutilizadosnosrelatrios).Odiagramadafigura 3 exemplificaessa arquitetura. Acriaodotemplatederelatriopodeocorreremvriosnveisdeabstrao. Emboraos templates possamsercriadosdeformacruausandoumeditordetexto simplestipicamenteodesenvolvedorutilizasedeumaferramentaqueoauxiliano desenvolvimento do cdigofonte do template de maneira visual. As ferramentas mostradas nas figuras 1 e 2 so exemplos de geradores visuais de cdigofonte de templates. Comoofocodesteartigomostrarduassoluesmaiscomunsnaatualidade parageraoderelatriosnaWEB,decidimosescolhersoluesparaduasdaprincipais plataformas para desenvolvimento WEB. Desta forma, escolhemos apresentar uma soluo para Java usando o JasperReports e uma soluo para PHP usando a bibliotecaFPDF[7]. Paratornarmaisconsisteosexemplosapresentados,edemaneiraapermitiruma comparaomaisuniformedasduassolues,adotaremosumnicobancodedados comum para ambas. Para tal, criamos o banco de dados intitulado 'Farmcia Tarja

Preta',voltadoumsistemadecomrciodevarejoderemdios.Comodiferencial,que essafarmciafictciavendesomenteparaclientesassociadosaconvnios.Afigura 4 mostraodiagramafsicodedadosdessebanco,usandoanotaodoMartinChen[8].

Figura4:Modelofsicodedadosdobancode dadosdafictcia'TarjaPreta'

3.AplicaesPHPeoFPDF
A linguagem PHP possui seu principal nicho de mercado na web e umas das linguagensmaisutilizadasnomundo,segundoositedaTIOBE[9].umalinguagem veloz, robusta e portvel, sendo utilizada desde pequenos sites at companhias que precisamdealtadisponibilidadecomoFaceBook,Flickr,Twitter,WikipediaeYahoo; segundoositeHighScalability[13]. ExistemvriasformasdesegerarumrelatrioemPHP,sendoamaispopularo FPDF devido, principalmente, sua simplicidade, facilidade eseu cdigo fonte ser disponibilizadolivremente. ParaobteroFPDF,bastaacessarositehttp://www.fpdf.org/enavegarparaa seodeDownloads,ondepossvelobteroFPDFassimcomoseumanualoficialem diversaslinguagens. 3.1Ofuncionamentobsico OFPDFumanicaclasseescritapuramenteemPHPquedeveserincludana classe do relatrio utilizandose a funo require_once( ), assim ela poder ser utilizada para gerar objetos que representaro um arquivo em formato PDF. Estes objetospossuemmtodosqueauxiliamnoprocessodemontagemdeumrelatriopara, posteriormente,utilizarseomtodoOutput( )paratransformaloemumarquivoque serenviadoaonavegadordousurioquedesejaorelatrio. A listagem 1 mostra um trecho de cdigo com um exemplo simples do funcionamentodaclasseFPDF.

<php> require_once('fpdf.php'); $meuPDF = new FPDF(); $meuPDF->AddPage(); $meuPDF->SetFont('Arial','B',16); $meuPDF->Write(5, 'Bem Vindo ao FPDF'); $meuPDF->Output(); </php>

Listagem1:Demonstraobsicadeutilizao

3.3.2Organizaodalgicaemvriosmtodos Orelatriodivididoemvriaspartesqueemconjuntoformamotemplate.Otemplate de um relatrio referente a uma pesquisa, por exemplo, poderia ser dividido em 4 partes:cabealho,critriodapesquisa,listaderesultadoserodap.Adecomposiode umrelatrioemvrioselementosvisuaiseindependentesfundamentalparaquehaja manutenibilidade no sistema, permitindo que estes elementos visuais possam ser modificados, removidos, ou at mesmo que novos elementos sejam includos no template semquehajatrabalhoexcessivoparadesvendaralgicadaconstruodo documento. 3.3.1ExtensodaclasseFPDF aconselhvelcriarumanovaclasseresponsvelpordesenharonossoarquivoPDF. EstaclassedeveestenderaclasseFPDF,pois,somentedestaforma,possvelusufruir de todos os recursos do FPDF e realizar um desenvolvimento claro, simples e organizado,poissonecessriosquecertosmtodossejamsobrescritos. A listagem 2 mostra um trecho de cdigo contendo uma classe nomeada OlaPDFqueestendeaclasseFPDFesobrescreveomtodoheader.
class OlaPDF extends FPDF { function header(){ $this->SetFont('Arial','B',16); $this->Text(65,12,"Cabealho automtico"); $this->Ln(); function olaMundo(){ $this->SetFont('Arial','B',16); $this->Write(6,"Ola Mundo"); }

Listagem2:ExtensodaclasseFPDF

3.3.3UtilizandoSesses Ao atender uma requisio HTTP, o servidor WEB pode comear a enviar um cabealhoHTTPreferenteaumapginanoformatoHTML,quando,naverdade,oque defatoqueremosenviarumarquivonoformatoPDF.Semprequetalerroocorrer, serexibidaumamensagemdeerrocontendootextoFPDF error: Some data has already been output , can't send PDF file.ParagarantirqueoservidorWEB

sempreatenderrequisioHTTPdaformacorreta,bastaenviarumcabealhoHTTP contendo Content-type: application/pdf oulimitarocachedasessoaonvelde privateounocacheanteriormenteiniciala.Destaformaoscabealhosenviadosno conteroinformaesqueimpossibilitarooenviodoarquivoPDF. Alistagem3apresentaumexemplodousodoFPDFemconjuntoaoacesso variveisdesessoparaconstruirumrelatriocontendotodososvalorespresentesna sessodousurioqueestariavisualizandoorelatrio.
<php> require_once('fpdf.php'); session_cache_limiter('private'); session_start(); $pdf=new FPDF(); $pdf->AddPage(); $pdf->SetFont('Arial','B',16); $pdf->Write(5, 'Valores presentes nesta sesso:'); $pdf->Ln(); foreach ( $_SESSION as $chave => $valor){ //Escreve uma chave e respectivo valor $pdf->Write(5, 'Chave: '.$chave.' Valor: '.$valor); //Realiza uma quebra de linha $pdf->Ln();

$pdf->Output(); </php>

Listagem3:Limitandoocachedasessoaonveldeprivado

3.4RecursosdoFPDF O FPDF possui recursos nativos para manipulao dos elementos mais comuns presentes em relatrios como textos, imagens e tabelas; excluindose apenas os grficos,masaindaassim,possvelincluirgrficosnorelatrioutilizandobibliotecas comoPHPlot[14]ouJPGraph[15],sendoapenasaprimeiraumsoftwarelivre. 3.4.1RecursosdeTextos Existemdoismtodosresponsveisporescrevertextosemumrelatrio.Oprimeiroo Text() edeveserevitado,poisnecessitaquesejamespecificadasascoordenadasda posio onde o texto ser impresso. J o mtodo Write() no necessita que as coordenadas sejaminformadas poiseleescreveotexto apartirdopontoemqueo cursorseencontra,almderealizarquebradelinhacasootextoultrapasseotamanho suportadopelamesma. Alistagem4demonstraautilizaodosmtodosWrite()eText()paraformar umarquivoPDFcontendodoistextosdeexemplo.

<php> require_once('fpdf.php'); $pdf=new FPDF(); $pdf->AddPage(); $pdf->SetFont('Arial','B',16); $pdf->Write(8, 'Texto um'); $pdf->Text(65,12,'Texto dois'); } $pdf->Output(); </php>

Listagem4:Utilizandorecursosdetexto

3.4.2Recursosdecabealhoserodapsautomticos Oscabealhoserodapsautomticosestaropresentesemcadaumadaspginasdo documento. Para utilizalos, basta que os mtodos Header (Cabealho) e o Footer (Rodap)sejamsobrescritos.importanteatentarquenemtodorelatriodevepossuir umrodapemcadapgina.comumexistiremrelatrios emque,independenteda quantidade de pginas presentes, apenas a ltima pgina contenha um rodap (conhecidocomorodapdeformulrio).NestescasosnoaconselhvelqueoFooter seja sobrescrito, pois melhor que seja criado um novo mtodo com o nome de RodapeDeFormulario() ousimilar,equeestesejaexplicitamenteinvocadoaotrmino dorelatrio. A listagem 5 apresenta uma classe onde os mtodos header e footer foram sobrescritosparaqueorelatriotenhaumcabealhoeumrodapemcadaumadas pginasdorelatrio.
class MeuPDF extends FPDF { function header(){ $this->SetFont('Arial','B',14); $this->Text(65,12,"Exemplo de Cabealho automtico no FPDF"); $this->SetY(25); } function footer() { $this->SetFont('Arial','',10); $this->Text(80,280,"Rodap da pgina: ".$this->PageNo()); } }

Listagem5:Utilizandocabealhoserodapsautomticos

3.4.3Recursosdegeraodetabelas Aconstruodetabelasrealizadaconstruindoumaclulaporvezatravsdomtodo Cell( ).Cadaclulapossuicaractersticasprprias,soelas:altura,largura,contedo textual,borda,alinhamentodotextoeacordeseupreenchimento. Odesenvolvimentodeumatabelasetornamuitorpidoesimplesaoutilizarmos umaestruturaderepetioparaquearotinaresponsvelpordesenharumalinhada tabelasejarepetidaparacadalinhaquedesejamosdesenhar.Destaformanoimporta

quantas linhas a tabela possua, pois a rotina responsvel por desenhar as linhas se repetirquantasvezesforemnecessrias. A listagem 6 apresenta uma classe que possui os mtodos geraCabecalhoDaTabela e geraConteudoDaTabela, os quais so responsveis respectivamenteporgeraralinhaqueinformaraousurioqualdadoesperadoem cadacolunaegeraraslinhasposterioresqueconteroosdadosdorelatrio.
class MeuPDF extends FPDF { function geraCabecalhoDaTabela(){ $this->SetFont('Arial','B',12); $this->Cell(90,5,"Nome",1,0,'C',1); $this->Cell(50,5,"CPF",1,0,'C',1); $this->Cell(50,5,"Convnio",1,0,'C',1); $this->Ln(); } function geraConteudoDaTabela($listaDeClientes){ $this->SetFont('Arial','',11); foreach ($listaDeClientes as $cliente) { $this->Cell(90,5,$cliente->getNome(),1); $this->Cell(50,5,$cliente->getCPF(),1); $this->Cell(50,5,$cliente->getConvenioCnpj(),1); $this->Ln(); } }

Listagem6:Gerandotabelasatravsdecelulas

3.4.5Recursosdeimagens AinclusodeumaimagememumrelatriorealizadautilizandoomtodoImage( ). Seusrecursospermitemespecificarotamanhodaimagemdetrsformas:otamanho original,umtamanhoproporcionalouumtamanhoespecfico. Esterecursopossuipequenas limitaes, pois apenas asimagens noformato JPEG,PNGouGIFpodemserutilizadas,ondeosrecursosdecontroledetonalidadee escaladecinzaapenassosuportadosnoformatoJPEG. 3.4.6Recursosdedesenhosgeomtricos OsnicosrecursosdedesenhosgeomtricossuportadospeloFPDFsoaslinhaseos retngulos. Para desenhar uma linha necessrio apenas que sejam informadas a coordenadadopontoinicialeacoordenadadopontofinalparaquearetaqueligaum pontoaooutrosejadesenhada. A formulao de um retngulo necessita de uma coordenada em que se localizar ocanto superior esquerdoeas medidas dealtura elargura doretngulo. Opcionalmente,podeserinformadoumdentreostrsestilosderetngulos:apenascom borda,apenaspreenchidocomumacor,oucombordaepreenchido. 3.4.7Recursosdecores O FPDF permite que alteremos a cor de textos, linhas e preenchimentos. No importandonuncaseoelementofoiinseridoexplicitamenteouimplicitamente.Aclula

deumatabelapodepossuirtodosostrselementosdeformaimplcita,poisumaclula podepossuirbordas(linhas),preenchimentoeoprpriotextodocontedo. OsmtodosutilizadosparaajustarascoressoSetTextColor( )(cordotexto), SetDrawColor( ) (cordalinha)e SetFillColor( ) (cordopreenchimento). Ambos podemreceberporparmetroumacornoformatoRGB1ouumaescaladetonalidadede cinza. Alistagem7apresentaumtrechodecdigoquecomplementaodalistagem6e alteradoparaqueocabealhodatabelasejapreenchidocomacorcinzaeotextodo cabealhosejaazul.
function geraCabecalhoDaTabela(){ $this->SetFillColor(200); $this->SetTextColor(50, 50, 200); $this->SetFont('Arial','B',12); $this->Cell(90,5,"Nome",1,0,'C',1); $this->Cell(50,5,"CPF",1,0,'C',1); $this->Cell(50,5,"Convnio",1,0,'C',1); $this->SetFillColor(255); $this->SetTextColor(0); } $this->Ln();

Listagem7:Ajustedacordepreenchimentoefonte

3.4.8Recursosdencoraselinks Orecursode link utilizadoparaqueumelementovisualdorelatrio(somenteos mtodosCell,WriteouImagesuportamorecursodelinks),aoserclicado,direcioneo usurioparaum site ouaumancora(pontoespecfico)presentedentrodoprprio documento. Ele somente funcional enquanto o relatrio encontrase no formato digital,possibilitandomelhorusabilidadeduranteanavegaopelorelatrio. Paracriarumancora,necessrioutilizaromtodoAddLink()paraobterum identificador que representar uma ncora e, seguidamente, necessrio informar a coordenadaverticaleapginaqualancoraindicar. Ofragmentodecdigopresentenalistagem8resultaremumrelatriocomtrs pginassendoque,nasegundapgina,serapresentadoumlinkparaumendereoda internetenaterceirapginaapresentadoumlinkparaumancorapresentenoincioda primeirapginadodocumento.

1 Modeloondesoutilizadas ascores aditivas vermelho(red), verde(green)eazul (blue)paraa representaodecores

$pdf=new FPDF(); $pdf->AddPage(); $pdf->SetFont('Arial','B',12); $pdf->Write(6,'Primeira pgina'); $pdf->AddPage(); $pdf->Write(6,'Segunda pgina'); $pdf->Ln(); $pdf->Write(6,'Ir para Google.com','www.google.com'); $pdf->AddPage(); $pdf->Write(6,'Terceira pgina'); $pdf->Ln(); $ancoraNaPrimeiraPagina = $pdf->AddLink(); $pdf->SetLink($ancoraNaPrimeiraPagina, 0, 1); $pdf->Write(6,'Voltar primeira pgina',$ancoraNaPrimeiraPagina); $pdf->Output();

Listagem8:Utilizaodelinksinternoseexternos

4.AplicaesJavaWEBeoJasperReports
A plataforma de programao Java [10] amplamente usada em aplicaes empresariaisqueexigemrobustezeescalabilidade,maisespecificamenteaplataforma JavaEnterpriseEdition.E,comonopodiadeixardeser,amaioriadessesaplicativos na atualidade sodesenvolvidos paraaWeb.Emboraexistam outras opes paraa geraoderelatriosWebemJava,comooBIRT [11],escolhemosasoluoJasper Reports [12] porserumabibliotecadesoftwarelivreedisponibilizarumaexcelente IDEgratuitaparaacriaodetemplatesderelatrios. 4.1.OJasperReports OJasperReportsumabibliotecaescritaemJavaquefuncionacomoumprocessador de relatrios. Junto com outras bibliotecas acessrias e opcionais, podese gerar relatriosquecontenhamgrficoseoutrosrecursos,almdeexportaroresultadopara umasriedeformatos,entreelesoPDFeoXLS.OJasperReportsdsuporteparaouso devriasopesdefontededados,podendoacessardiretamenteobancodedados relacionaloureceberumcoleodeobjetos(nopadroJavaBeans),entreoutros.Neste artigo,abordaremosaprimeiraopocomointroduoaumexemplosimples,embora ousodecoleesdeobjetoscomofontededadosnospareceumasoluomaisrobusta eflexvel. Para se utilizar o JasperReports num projeto Java, a biblioteca dele e as bibliotecas da quais ele depende devem estar no CLASSPATH2 do projeto. Para os aplicativos desenvolvidos nos exemplos desse artigo, utilizamos a verso 3.7.2 do JasperReports,portanto,precisamosdoarquivo'jasperreports3.7.2.jar'.Entretanto,uma extensa lista de bibliotecas de terceiros necessria para que o processador Jasper funcione(umpontonegativo,semdvida).Asdependnciasbsicasnecessriasso: JakartaCommonsBeanUtilsComponent,verso1.7oumaisrecente,disponvel emhttp://jakarta.apache.org/commons/beanutils/
2 listadediretriose/ouarquivosdepacotenoformatoJARquecontmclassesJavaexecutveis,de formaqueamquinavirtualsaibaondeasencontrarquandorequeridassobdemanda.

JakartaCommonsCollectionsComponentverso2.1oumaisrecente,disponvelem http://jakarta.apache.org/commons/collections/ Jakarta Commons Javaflow verso conhecida como Sandbox, disponvel em http://jakarta.apache.org/commons/sandbox/javaflow/ JakartaCommonsLoggingComponent verso1.0oumais recente, disponvelem http://jakarta.apache.org/commons/logging/ JakartaCommonsDigesterComponent verso1.7oumaisrecente,disponvelem http://jakarta.apache.org/commons/digester/ Para exportar o relatrio para formato PDF, que um dos requisitos que estabelecemos paraesteartigo,precisamos dabiblioteca iText verso1.3.1oumais recente,disponvelemhttp://www.lowagie.com/iText/. Para utilizar grficos nos relatrios, precisamos de mais duas bibliotecas: JFreeChartverso1.0.0oumaisrecente,disponvelemhttp://www.jfree.org/jfreechart/ esuadependncia,aJCommon,disponvelemhttp://www.jfree.org/jcommon/. UmformadeobterdemaneirafciltodasasbibliotecasparaoJasperReports localizarodiretriodeinstalaodoiReport(verseoaseguir),subdiretriomodules/ ext,ondetodasasbibliotecasacimaestodisponveis,entreoutras.

4.1.AFerramentaiReport O iReport [12] uma ferramenta visual para construo de templates para o JasperReports que pode ser obtida gratuitamente na internet atravs da URL http://jasperforge.org/projects/ireport.Nafigura 5 mostradaateladoiReportdeum template para gerao de um relatrio com a listagem de clientes agrupados por convnios.Aferramentasimilarsoutrascomomesmopropsito,apresentandouma visualizaodo template comasseesquecompemorelatrio(cabealho,grupos, detalhes, rodap, etc.) e os campos que sero obtidos de uma fonte de dados para mesclagem e gerao do relatrio final. A ferramenta possui um recurso de pr visualizaodorelatrioquandoconfiguradoparaacessarafontededadosdemaneira adequada.Nocasodesteexemplo,configuramosparaorelatrioacessardiretamenteo bancodedadosMySQLcriadoparaesteexemplo.OiReporttraznainstalaopadro umdriverJDBCparaacessarbancoMySQL.Entretanto,casosequeirainstalaroutro driver,podeseconfigurlonaferramentausandoomenuToolsOptionsClasspath AddJAR.

Figura5:TeladoiReportcomavisualizaodotemplatedorelatriode ClientesagrupadosporConvnios.

4.2.OtemplatedoJasperReports O template doJasperReportsumarquivoXMLdeextensoJRXML.Elecontmo cdigofontecomadefiniosobrecomoorelatriofinalsergerado.Nalistagem 9 mostramos uma verso reduzida de parte do cdigofonte do template mostrado na figura5.
<?xml version="1.0" encoding="UTF-8"?> <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="ClientesAgrupadosPorConvenio" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20"> <queryString> <![CDATA[select convenio.razao_social,cliente.nome,cliente.cpf from convenio inner join cliente on convenio.cnpj=cliente.convenio_cnpj;]]> </queryString> <field name="razao_social" class="java.lang.String"/> <field name="nome" class="java.lang.String"/> <field name="cpf" class="java.lang.Integer"/> <detail> <band height="20" splitType="Stretch"> <textField> <reportElement x="26" y="0" width="252" height="20"/> <textElement/> <textFieldExpression class="java.lang.String"><! [CDATA[$F{nome}]]></textFieldExpression> </textField> </band> </detail> </jasperReport>

Listagem9:TrechodocdigofontedotemplatedorelatriosdeClientes

Umavezmontadootemplatedorelatrio,devesegerarseucdigocompilado. Uma forma de compilar acionando o comando de visualizao do relatrio na ferramenta iReport,mesmoqueafontededadosdorelatrionoestejadisponvel. Entretanto,aAPIdoJasperReportsfornecediretivasparaqueoprocessodecompilao seja integrado na IDE com a compilao dos demais arquivos fonte Java. Para disponibilizarorelatrionaaplicaoWEB,bastacolocaroarquivocompiladodele (extenso.jasper)nodiretrioWEBINFdaaplicao. 4.2.AAPIdoJasperReportsparageraoderelatriosnaWEB Com o arquivo compilado do JasperReports disponvel, podese utilizar a API do JasperReports com seu conjunto de diretivas para a execuo do processador do relatrios.Paratal,bastaforneceroarquivoquecontmotemplateeosdados(ousua localizao)paraqueorelatriosejagerado.ComAPIsauxiliares,podemosexportaro relatriosparaumasriedeformatosdeinteressedaaplicao,entreeles,paraeste estudodecaso,oformatoPDF. No exemplo da listagem 10, ao invs de deixar que o prprio JasperReport acessediretamenteobancodedadosMySQLparaobterosdados,criamosumacoleo deobjetosdaclasseCliente(que,porsuavez,cadaclientetemsuaassociaoaum objeto de convnio), e empacotamos num objeto de JRBeanCollectionDataSource. Dessaforma,aobtenodosdadosparaageraodorelatrioficatotalmenteembutida naaplicaoquehospedaorelatrio,facilitandoamanutenofrenteaumamudana de requisito. Em seguida, executamos o mtodo runReportToPdfStream da classe JasperRunManager,fornecendocomoargumentosoInputStreamdoarquivo.JASPER eoobjetoquecontmacoleodeobjetosdeCliente.No template,osatributosde Cliente so referenciados em fields com os seus respectivos tipos que, no caso do atributoparaConvnio,oFieldClassestarconfiguradocomomodelo.Convenio,que onomedaclassenonossocdigofonte.
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletOutputStream servletOutputStream=response.getOutputStream(); String arquivo="/WEB-INF/classes/relatorios/clientesPorConvenios.jasper"; InputStream reportStream=getServletConfig().getServletContext(). getResourceAsStream(arquivo); try { ClienteDAO dao=new ClienteDAO(); List<Cliente> lista=dao.findAll(); JRBeanCollectionDataSource jrbcds=new JRBeanCollectionDataSource(lista); JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream,null,jrbcds); response.setContentType("application/pdf"); servletOutputStream.flush(); servletOutputStream.close(); } catch(Exception ex) { Logger.getLogger("global").log(Level.SEVERE,null,ex); } }

Listagem10:TrechodaServletquegeraorelatriodeclientesemPDF

O segundo parmetro do mtodo runReportToPdfStream, que no caso da listagem 10 estamos passando null, pode receber um Map de String para Object

(Map<String,Object>) que corresponde aos parmetros para o relatrio. Esses parmetrospodemserutilizadosdediversasmaneiras,sendoaprincipaldelaspreencher objetos de campo de texto com contedo fornecido pela aplicao. No trecho da listagem 11,adaptamosocdigodalistagem 10 parafornecerumparmetrocomo nome da empresa, que confere a possibilidade de parametrizar na aplicao tal informao.Notemplatedorelatrio,devesecriarumelementodeparmetrocomo mesmonomedechavefornecidonoMape,paraexiblonorelatrio,bastacriarum campodetextoindicandocomoexpresso(TextFieldExpression)$P{nomeEmpresa}.
Map<String,Object> params=new HashMap<String,Object>(); params.put("nomeEmpresa","Tarja Preta Inc."); JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream,params,jrbcds);

Listagem11:Trechoparaenviodeparmetroaorelatrio

Um dos recursos mais interessantes na criao de relatrios usando o JasperReports a utilizao de grficos. Usando a biblioteca JFreeChart, podemos adicionar grficos de forma fcil e rpida aos nossos relatrios. Para exemplificar, criamosumrelatriosdosprodutosmaisvendidos,limitandoaexibioaatos4mais vendidos.Alistagem12mostraaconsultaSQLutilizadaparaageraodesterelatrio.
select tab.produto,tab.qtde from ( select p.descricao as produto,sum(v.qtde) as qtde from produto p inner join vende v on p.cod_produto=v.cod_produto group by p.descricao limit 4 ) tab order by tab.qtde DESC;

Listagem12:QuerySQLparaobterosprodutosmaisvendidosdoTarjaPreta

Paraessetipoderelatrio, quefrequentemente combinam dados dediversas entidades,comumacriaodeumobjeto JavaBean especficoparaosdadosdesse relatrio.Nonossoexemplo,criamosaclasse'RelProdutoMaisVendido'contendodois atributos:produto(adescriodoproduto)eqtde(quantidadedeitensvendidosdesse produto). Acoleodeobjetosde'RelProdutoMaisVendido'entopassadaaorelatrio, quepossuidoiscampospreparadosparareceberosdoisatributosdessaclasse.Comeles podemosproduzirnossorelatriocontendoogrfico.Afigura6exibeoresultadofinal dageraodorelatriodeexemplo.

Figura6:Relatriosdeprodutosmaisvendidoscomgrfico depizza

5.Concluses
Embora as duas solues tenham o mesmo potencial e capacidades, a soluo combinando o JasperReports com o iReport apresenta produtividade nitidamente superiorqueutilizaoFPDF,pelomenosconformemostradonestetrabalho.Cabe ressaltarqueexistemsoluesparaacriaogrficaderelatrios emPHPqueno foram exploradas neste artigo.Optamos porescolher as solues mais utilizadas na prticaemdesenvolvimentosusandoasduasplataformas(JavaePHP).

Referncias
[1]QBSSoftwareLimited,QuickReports,http://www.qusoft.com,acessadoemabrilde 2010. [2] Delphi IDE, http://www.embarcadero.com/products/delphi, acessado em maio de 2010. [3] Visual Basic 6, http://pt.wikipedia.org/wiki/Visual_Basic, acessado em maio de 2010. [4]HTML,http://pt.wikipedia.org/wiki/HTML,acessadoemmaiode2010. [5]PDF,http://pt.wikipedia.org/wiki/Portable_Document_Format,acessadoemmaiode 2010. [7]BibliotecaFPDF,http://www.fpdf.org/,acessadoemmaiode2010.

[8] ER Model, seo Diagramming Conventions, http://en.wikipedia.org/wiki/Entity relationship_model,acessadoemmaiode2010. [9]TIOBESoftware.http://www.tiobe.com.Acessadoemmaiode2010. [10]KathySierra,BertBates.UseaCabea!Java.2edio.2005.EditoraAltaBooks. [11]BIRT,http://www.eclipse.org/birt/phoenix/,acessadoemmaiode2010. [12] Gonalves,Edson.DominandoRelatriosJasperReportcomiReport.1edio. 2008.Ed.CinciaModerna. [13]HighScalability,http://highscalability.com/,acessadoemmaiode2010. [14]PHPlot,http://phplot.sourceforge.net/,acessadoemmaiode2010. [15]JPGraph,http://www.aditus.nu/jpgraoph/,acessadoemmaiode2010.