Relatórios na WEB

Transcrição

Relatórios na WEB
Relatórios em Aplicativos WEB
Marcelo Atie1, Marcio Belo R. Silva1
Instituto Superior de Tecnologia em Ciências da Computação do Rio de Janeiro (IST­Rio)
Rio de Janeiro – RJ – Brazil 1
[email protected], mbelo.ist­[email protected]
Abstract. Reports play an special role in information systems and the users´ expectations about their functionalities are growing as the time goes on. Nowadays, requirements like combining table, graphs and images in the same report are commonplace in building such an artifact. With the WEB age, a new challenge arises: to produce reports with formatting sophistication to be reproduced either in a traditional computer window or in a paper report seamlessly. This article explains two solutions to create reports using open source tools, each one targeting a high used technology for developing Web Applications.
Resumo. Relatórios sempre foram uma necessidade básica em sistemas informatizados e, com o tempo, aumentou a expectativa dos usuários com relação a eles. Atualmente, são requisitos comuns relatórios que combinem tabelas, gráficos e imagens. Com o advento da WEB, surgiu um novo desafio: produzir relatórios com formatação sofisticada tanto para visualização na tela quanto para impressão. Este artigo aborda duas soluções para o problema empregando software livre, cada qual voltada para uma de duas das principais tecnologias adotadas na construção de sistemas WEB.
1. Introdução
Nos primórdios da era da informática, a principal forma de saída de dados produzidos por sistemas de computação era por meio de relatórios impressos. Em alguns sistemas, aliás, eram a única forma de interface de saída de informações. Ainda eram raros terminais de vídeo onde se pudesse pré­visualizar as informações armazenadas e/ou produzidas. Com o advento da microcomputação, cada vez mais preza­se pela visualização em vídeo e armazenamento digital das informações, deixando para imprimir em papel apenas o estritamente necessário.
Na era dos aplicativos com interface gráfica com o usuário (GUI), várias plataformas de desenvolvimento de software surgiram com soluções para geração de relatórios, tanto para visualização em vídeo quanto para impressão. Essas soluções eram proprietárias e totalmente dependentes das linguagens e ferramentas nas quais estavam embutidas. Como exemplo de tecnologias dessa era de aplicativos de janela podemos citar: PowerBuilder e seu DataWindow, Visual Basic e o Crystal Reports, e o Delphi com o QuickReports. A figura 1 mostra o editor de template da ferramenta QuickReports [1], solução ainda muito utilizada em aplicações para o sistema operativo Windows em ambiente Delphi [2]. No Visual Basic 6 [3], existe a ferramenta acoplada ao IDE chamada DataReport. A figura 2 mostra o editor visual do template dessa solução.
Figura 1: Editor de template de relatórios do Quick Reports (retirado do site da QBS Software Limited)
Figura 2: DataReport Designer do Visual Basic 6
Na atualidade, é predominante o uso de aplicações baseados em WEB que, por sua natureza, é rica em recursos de visualização de dados em tela. Entretanto, embora a visualização em tela de um relatório em HTML [4] puro seja adequada para exibição usando os navegadores modernos, nem sempre o resultado da impressão da página HTML é satisfatória para os requisitos do usuário. Páginas, gráficos e tabelas mal formatadas, quando impressas pelo próprio navegador, ocorrem com frequência em várias dessas soluções.
Embora existam recursos para a criação de páginas HTML combinadas com CSS que minimizem o problema, nem sempre satisfazem os usuários mais exigentes quantos aos formatos impressos. Por isso, tornou­se praticamente um padrão nos aplicativos WEB a geração de relatórios no formato PDF [5]. Sendo esse formato adequado para resolver tanto a necessidade de visualização em tela quanto para impressão, analisaremos as soluções que se baseiam na geração desse conteúdo digital.
2. Tecnologias para geração de relatórios Desde as aplicações de janela, a maioria das soluções de geração de relatórios utilizam os mesmos princípios básicos, entre eles o da criação de um template de relatório. O template de relatório é um artefato de software criado pelo desenvolvedor que define o arcabouço do relatório. Esse template é, em tempo de execução, submetido a um processador de relatório que mescla os dados ­ que podem vir de uma ou mais fontes de dados ­ com o template, gerando o produto final que é o relatório pronto.
Template
Processador de Relatórios
Fonte de Dados
Figura 3: Modelo típico de solução para geração de relatórios
O Processador de Relatório é o software responsável por receber os dados e o arquivo de template como entrada e produzir o relatório final para o usuário. O processador de relatório pode ser embutido dentro do aplicativo principal ­ contido como uma biblioteca ­ ou como um software independente. Em algumas soluções, os relatórios são produzidos totalmente independentes do software principal (que gera e processa os dados utilizados nos relatórios). O diagrama da figura 3 exemplifica essa arquitetura.
A criação do template de relatório pode ocorrer em vários níveis de abstração. Embora os templates possam ser criados de forma crua ­ usando um editor de texto simples ­ tipicamente o desenvolvedor utiliza­se de uma ferramenta que o auxilia no desenvolvimento do código­fonte do template de maneira visual. As ferramentas mostradas nas figuras 1 e 2 são exemplos de geradores visuais de código­fonte de templates. Como o foco deste artigo é mostrar duas soluções mais comuns na atualidade para geração de relatórios na WEB, decidimos escolher soluções para duas da principais plataformas para desenvolvimento WEB. Desta forma, escolhemos apresentar uma solução para Java ­ usando o JasperReports ­ e uma solução para PHP ­ usando a biblioteca FPDF [7].
Para tornar mais consiste os exemplos apresentados, e de maneira a permitir uma comparação mais uniforme das duas soluções, adotaremos um único banco de dados comum para ambas. Para tal, criamos o banco de dados intitulado 'Farmácia Tarja Preta', voltado um sistema de comércio de varejo de remédios. Como diferencial, que essa farmácia fictícia vende somente para clientes associados a convênios. A figura 4 mostra o diagrama físico de dados desse banco, usando a notação do Martin Chen [8].
Figura 4: Modelo físico de dados do banco de dados da fictícia 'Tarja Preta'
3. Aplicações PHP e o FPDF
A linguagem PHP possui seu principal nicho de mercado na web e é umas das linguagens mais utilizadas no mundo, segundo o site da TIOBE [9]. É uma linguagem veloz, robusta e portável, sendo utilizada desde pequenos sites até companhias que precisam de alta disponibilidade como FaceBook, Flickr, Twitter, Wikipedia e Yahoo; segundo o site High Scalability [13].
Existem várias formas de se gerar um relatório em PHP, sendo a mais popular o FPDF devido, principalmente, à sua simplicidade, facilidade e seu código fonte ser disponibilizado livremente.
Para obter o FPDF, basta acessar o site http://www.fpdf.org/ e navegar para a seção de Downloads, onde é possível obter o FPDF assim como seu manual oficial em diversas linguagens.
3.1 O funcionamento básico
O FPDF é uma única classe escrita puramente em PHP que deve ser incluída na classe do relatório utilizando­se a função require_once( ), assim ela poderá ser utilizada para gerar objetos que representarão um arquivo em formato PDF. Estes objetos possuem métodos que auxiliam no processo de montagem de um relatório para, posteriormente, utilizar­se o método Output( ) para transforma­lo em um arquivo que será enviado ao navegador do usuário que deseja o relatório.
A listagem 1 mostra um trecho de código com um exemplo simples do funcionamento da classe FPDF.
<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>
Listagem 1: Demonstração básica de utilização
3.3.2 Organização da lógica em vários métodos
O relatório é dividido em várias partes que em conjunto formam o template. O template de um relatório referente a uma pesquisa, por exemplo, poderia ser dividido em 4 partes: cabeçalho, critério da pesquisa, lista de resultados e rodapé. A decomposição de um relatório em vários elementos visuais e independentes é fundamental para que haja manutenibilidade no sistema, permitindo que estes elementos visuais possam ser modificados, removidos, ou até mesmo que novos elementos sejam incluídos no template sem que haja trabalho excessivo para desvendar a lógica da construção do documento.
3.3.1 Extensão da classe FPDF
É aconselhável criar uma nova classe responsável por desenhar o nosso arquivo PDF. Esta classe deve estender a classe FPDF, pois, somente desta forma, é possível usufruir de todos os recursos do FPDF e realizar um desenvolvimento claro, simples e organizado, pois são necessários que certos métodos sejam sobrescritos.
A listagem 2 mostra um trecho de código contendo uma classe nomeada OlaPDF que estende a classe FPDF e sobrescreve o método header.
class OlaPDF extends FPDF {
}
}
function header(){
$this->SetFont('Arial','B',16);
$this->Text(65,12,"Cabeçalho automático");
$this->Ln();
function olaMundo(){
$this->SetFont('Arial','B',16);
$this->Write(6,"Ola Mundo");
}
Listagem 2: Extensão da classe FPDF
3.3.3 Utilizando Sessões
Ao atender uma requisição HTTP, o servidor WEB pode começar a enviar um cabeçalho HTTP referente a uma página no formato HTML, quando, na verdade, o que de fato queremos é enviar um arquivo no formato PDF. Sempre que tal erro ocorrer, será exibida uma mensagem de erro contendo o texto “FPDF error: Some data has
already been output , can't send PDF file”. Para garantir que o servidor WEB sempre atenderá à requisição HTTP da forma correta, basta enviar um cabeçalho HTTP contendo “Content-type: application/pdf” ou limitar o cache da sessão ao nível de private ou nocache anteriormente à inicia­la. Desta forma os cabeçalhos enviados não conterão informações que impossibilitarão o envio do arquivo PDF.
A listagem 3 apresenta um exemplo do uso do FPDF em conjunto ao acesso à variáveis de sessão para construir um relatório contendo todos os valores presentes na sessão do usuário que estaria visualizando o relatório.
<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 sessão:');
$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>
Listagem 3: Limitando o cache da sessão ao nível de privado
3.4 Recursos do FPDF
O FPDF possui recursos nativos para manipulação dos elementos mais comuns presentes em relatórios como textos, imagens e tabelas; excluindo­se apenas os gráficos, mas ainda assim, é possível incluir gráficos no relatório utilizando bibliotecas como PHPlot [14] ou JPGraph [15], sendo apenas a primeira um software livre.
3.4.1 Recursos de Textos
Existem dois métodos responsáveis por escrever textos em um relatório. O primeiro é o Text() e deve ser evitado, pois necessita que sejam especificadas as coordenadas da posição onde o texto será impresso. Já o método Write() não necessita que as coordenadas sejam informadas pois ele escreve o texto a partir do ponto em que o cursor se encontra, além de realizar quebra de linha caso o texto ultrapasse o tamanho suportado pela mesma.
A listagem 4 demonstra a utilização dos métodos Write() e Text() para formar um arquivo PDF contendo dois textos de exemplo.
<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>
Listagem 4: Utilizando recursos de texto
3.4.2 Recursos de cabeçalhos e rodapés automáticos
Os cabeçalhos e rodapés automáticos estarão presentes em cada uma das páginas do documento. Para utiliza­los, basta que os métodos Header (Cabeçalho) e o Footer (Rodapé) sejam sobrescritos. É importante atentar que nem todo relatório deve possuir um rodapé em cada página. É comum existirem relatórios em que, independente da quantidade de páginas presentes, apenas a última página contenha um rodapé (conhecido como rodapé de formulário). Nestes casos não é aconselhável que o Footer seja sobrescrito, pois é melhor que seja criado um novo método com o nome de RodapeDeFormulario() ou similar, e que este seja explicitamente invocado ao término do relatório.
A listagem 5 apresenta uma classe onde os métodos header e footer foram sobrescritos para que o relatório tenha um cabeçalho e um rodapé em cada uma das páginas do relatório.
class MeuPDF extends FPDF {
function header(){
$this->SetFont('Arial','B',14);
$this->Text(65,12,"Exemplo de Cabeçalho automático no FPDF");
$this->SetY(25);
}
function footer() {
$this->SetFont('Arial','',10);
$this->Text(80,280,"Rodapé da página: ".$this->PageNo());
}
}
Listagem 5: Utilizando cabeçalhos e rodapés automáticos
3.4.3 Recursos de geração de tabelas
A construção de tabelas é realizada construindo uma célula por vez através do método Cell( ). Cada célula possui características próprias, são elas: altura, largura, conteúdo textual, borda, alinhamento do texto e a cor de seu preenchimento.
O desenvolvimento de uma tabela se torna muito rápido e simples ao utilizarmos uma estrutura de repetição para que a rotina responsável por desenhar uma linha da tabela seja repetida para cada linha que desejamos desenhar. Desta forma não importa quantas linhas a tabela possua, pois a rotina responsável por desenhar as linhas se repetirá quantas vezes forem necessárias.
A listagem 6 apresenta uma classe que possui os métodos geraCabecalhoDaTabela e geraConteudoDaTabela, os quais são responsáveis respectivamente por gerar a linha que informará ao usuário qual dado é esperado em cada coluna e gerar as linhas posteriores que conterão os dados do relatório.
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,"Convênio",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();
}
}
Listagem 6: Gerando tabelas através de celulas
3.4.5 Recursos de imagens
A inclusão de uma imagem em um relatório é realizada utilizando o método Image( ). Seus recursos permitem especificar o tamanho da imagem de três formas: o tamanho original, um tamanho proporcional ou um tamanho específico.
Este recurso possui pequenas limitações, pois apenas as imagens no formato JPEG, PNG ou GIF podem ser utilizadas, onde os recursos de controle de tonalidade e escala de cinza apenas são suportados no formato JPEG.
3.4.6 Recursos de desenhos geométricos
Os únicos recursos de desenhos geométricos suportados pelo FPDF são as linhas e os retângulos. Para desenhar uma linha é necessário apenas que sejam informadas a coordenada do ponto inicial e a coordenada do ponto final para que a reta que liga um ponto ao outro seja desenhada.
A formulação de um retângulo necessita de uma coordenada em que se localizará o canto superior esquerdo e as medidas de altura e largura do retângulo. Opcionalmente, pode ser informado um dentre os três estilos de retângulos: apenas com borda, apenas preenchido com uma cor, ou com borda e preenchido.
3.4.7 Recursos de cores
O FPDF permite que alteremos a cor de textos, linhas e preenchimentos. Não importando nunca se o elemento foi inserido explicitamente ou implicitamente. A célula de uma tabela pode possuir todos os três elementos de forma implícita, pois uma célula pode possuir bordas (linhas), preenchimento e o próprio texto do conteúdo.
Os métodos utilizados para ajustar as cores são SetTextColor( ) (cor do texto), SetDrawColor( ) (cor da linha) e SetFillColor( ) (cor do preenchimento). Ambos podem receber por parâmetro uma cor no formato RGB1 ou uma escala de tonalidade de cinza.
A listagem 7 apresenta um trecho de código que complementa o da listagem 6 e alterado para que o cabeçalho da tabela seja preenchido com a cor cinza e o texto do cabeçalho seja azul.
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,"Convênio",1,0,'C',1);
$this->SetFillColor(255);
$this->SetTextColor(0);
}
$this->Ln();
Listagem 7: Ajuste da cor de preenchimento e fonte
3.4.8 Recursos de âncoras e links
O recurso de link é utilizado para que um elemento visual do relatório (somente os métodos Cell, Write ou Image suportam o recurso de links), ao ser clicado, direcione o usuário para um site ou a uma âncora (ponto específico) presente dentro do próprio documento. Ele somente é funcional enquanto o relatório encontra­se no formato digital, possibilitando melhor usabilidade durante a navegação pelo relatório.
Para criar uma âncora, é necessário utilizar o método AddLink() para obter um identificador que representará uma âncora e, seguidamente, é necessário informar a coordenada vertical e a página à qual a âncora indicará.
O fragmento de código presente na listagem 8 resultará em um relatório com três páginas sendo que, na segunda página, será apresentado um link para um endereço da internet e na terceira página apresentado um link para uma âncora presente no início da primeira página do documento.
1 Modelo onde são utilizadas as cores aditivas vermelho (red), verde (green) e azul (blue) para a representação de cores
$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',12);
$pdf->Write(6,'Primeira página');
$pdf->AddPage();
$pdf->Write(6,'Segunda página');
$pdf->Ln();
$pdf->Write(6,'Ir para Google.com','www.google.com');
$pdf->AddPage();
$pdf->Write(6,'Terceira página');
$pdf->Ln();
$ancoraNaPrimeiraPagina = $pdf->AddLink();
$pdf->SetLink($ancoraNaPrimeiraPagina, 0, 1);
$pdf->Write(6,'Voltar à primeira página',$ancoraNaPrimeiraPagina);
$pdf->Output();
Listagem 8: Utilização de links internos e externos
4. Aplicações Java WEB e o Jasper Reports
A plataforma de programação Java [10] é amplamente usada em aplicações empresariais que exigem robustez e escalabilidade, mais especificamente a plataforma Java Enterprise Edition. E, como não podia deixar de ser, a maioria desses aplicativos na atualidade são desenvolvidos para a Web. Embora existam outras opções para a geração de relatórios Web em Java, como o BIRT [11], escolhemos a solução Jasper Reports [12] por ser uma biblioteca de software livre e disponibilizar uma excelente IDE gratuita para a criação de templates de relatórios.
4.1. O JasperReports
O JasperReports é uma biblioteca escrita em Java que funciona como um processador de relatórios. Junto com outras bibliotecas acessórias e opcionais, pode­se gerar relatórios que contenham gráficos e outros recursos, além de exportar o resultado para uma série de formatos, entre eles o PDF e o XLS. O JasperReports dá suporte para o uso de várias opções de fonte de dados, podendo acessar diretamente o banco de dados relacional ou receber um coleção de objetos (no padrão Java Beans), entre outros. Neste artigo, abordaremos a primeira opção como introdução a um exemplo simples, embora o uso de coleções de objetos como fonte de dados nos parece uma solução mais robusta e flexível.
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 versão 3.7.2 do JasperReports, portanto, precisamos do arquivo 'jasperreports­3.7.2.jar'. Entretanto, uma extensa lista de bibliotecas de terceiros é necessária para que o processador Jasper funcione (um ponto negativo, sem dúvida). As dependências básicas necessárias são:
– Jakarta Commons BeanUtils Component, versão 1.7 ou mais recente, disponível em http://jakarta.apache.org/commons/beanutils/
2 lista de diretórios e/ou arquivos de pacote no formato JAR que contém classes Java executáveis, de forma que a máquina virtual saiba onde as encontrar quando requeridas sob demanda.
­ Jakarta Commons Collections Component versão 2.1 ou mais recente, disponível em http://jakarta.apache.org/commons/collections/
­ Jakarta Commons Javaflow versão conhecida como Sandbox, disponível em http://jakarta.apache.org/commons/sandbox/javaflow/
­ Jakarta Commons Logging Component versão 1.0 ou mais recente, disponível em http://jakarta.apache.org/commons/logging/
­ Jakarta Commons Digester Component versão 1.7 ou mais recente, disponível em http://jakarta.apache.org/commons/digester/
Para exportar o relatório para formato PDF, que é um dos requisitos que estabelecemos para este artigo, precisamos da biblioteca iText versão 1.3.1 ou mais recente, disponível em http://www.lowagie.com/iText/.
Para utilizar gráficos nos relatórios, precisamos de mais duas bibliotecas: JFreeChart versão 1.0.0 ou mais recente, disponível em http://www.jfree.org/jfreechart/ e sua dependência, a JCommon, disponível em http://www.jfree.org/jcommon/.
Um forma de obter de maneira fácil todas as bibliotecas para o JasperReports é localizar o diretório de instalação do iReport (ver seção a seguir), subdiretório modules/
ext, onde todas as bibliotecas acima estão disponíveis, entre outras.
4.1. A Ferramenta iReport
O iReport [12] é uma ferramenta visual para construção de templates para o JasperReports que pode ser obtida gratuitamente na internet através da URL http://jasperforge.org/projects/ireport. Na figura 5 é mostrada a tela do iReport de um template para geração de um relatório com a listagem de clientes agrupados por convênios. A ferramenta é similar às outras com o mesmo propósito, apresentando uma visualização do template com as seções que compõem o relatório (cabeçalho, grupos, detalhes, rodapé, etc.) e os campos que serão obtidos de uma fonte de dados para mesclagem e geração do relatório final. A ferramenta possui um recurso de pré­
visualização do relatório quando configurado para acessar a fonte de dados de maneira adequada. No caso deste exemplo, configuramos para o relatório acessar diretamente o banco de dados MySQL criado para este exemplo. O iReport traz na instalação padrão um driver JDBC para acessar banco MySQL. Entretanto, caso se queira instalar outro driver, pode­se configurá­lo na ferramenta usando o menu Tools → Options → Classpath → Add JAR.
Figura 5: Tela do iReport com a visualização do template do relatório de Clientes agrupados por Convênios.
4.2. O template do JasperReports
O template do JasperReports é um arquivo XML de extensão JRXML. Ele contém o código­fonte com a definição sobre como o relatório final será gerado. Na listagem 9 mostramos uma versão reduzida de parte do código­fonte do template mostrado na figura 5.
<?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>
Listagem 9: Trecho do código­fonte do template do relatórios de Clientes
Uma vez montado o template do relatório, deve­se gerar seu código compilado. Uma forma de compilar é acionando o comando de visualização do relatório na ferramenta iReport, mesmo que a fonte de dados do relatório não esteja disponível. Entretanto, a API do JasperReports fornece diretivas para que o processo de compilação seja integrado na IDE com a compilação dos demais arquivos fonte Java. Para disponibilizar o relatório na aplicação WEB, basta colocar o arquivo compilado dele (extensão .jasper) no diretório WEB­INF da aplicação.
4.2. A API do JasperReports para geração de relatórios na WEB
Com o arquivo compilado do JasperReports disponível, pode­se utilizar a API do JasperReports com seu conjunto de diretivas para a execução do processador do relatórios. Para tal, basta fornecer o arquivo que contém o template e os dados (ou sua localização) para que o relatório seja gerado. Com APIs auxiliares, podemos exportar o relatórios para uma série de formatos de interesse da aplicação, entre eles, para este estudo de caso, o formato PDF.
No exemplo da listagem 10, ao invés de deixar que o próprio JasperReport acesse diretamente o banco de dados MySQL para obter os dados, criamos uma coleção de objetos da classe Cliente (que, por sua vez, cada cliente tem sua associação a um objeto de convênio), e empacotamos num objeto de JRBeanCollectionDataSource. Dessa forma, a obtenção dos dados para a geração do relatório fica totalmente embutida na aplicação que hospeda o relatório, facilitando a manutenção frente a uma mudança de requisito. Em seguida, executamos o método runReportToPdfStream da classe JasperRunManager, fornecendo como argumentos o InputStream do arquivo .JASPER e o objeto que contém a coleção de objetos de Cliente. No template, os atributos de Cliente são referenciados em fields com os seus respectivos tipos que, no caso do atributo para Convênio, o Field Class estará configurado como modelo.Convenio, que é o nome da classe no nosso código­fonte.
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);
}
}
Listagem 10: Trecho da Servlet que gera o relatório de clientes em PDF
O segundo parâmetro do método runReportToPdfStream, que no caso da listagem 10 estamos passando null, pode receber um Map de String para Object (Map<String,Object>) que corresponde aos parâmetros para o relatório. Esses parâmetros podem ser utilizados de diversas maneiras, sendo a principal delas preencher objetos de campo de texto com conteúdo fornecido pela aplicação. No trecho da listagem 11, adaptamos o código da listagem 10 para fornecer um parâmetro com o nome da empresa, que confere a possibilidade de parametrizar na aplicação tal informação. No template do relatório, deve­se criar um elemento de parâmetro com o mesmo nome de chave fornecido no Map e, para exibí­lo no relatório, basta criar um campo de texto indicando como expressão (Text Field Expression) $P{nomeEmpresa}.
Map<String,Object> params=new HashMap<String,Object>();
params.put("nomeEmpresa","Tarja Preta Inc.");
JasperRunManager.runReportToPdfStream(reportStream,
servletOutputStream,params,jrbcds);
Listagem 11: Trecho para envio de parâmetro ao relatório
Um dos recursos mais interessantes na criação de relatórios usando o JasperReports é a utilização de gráficos. Usando a biblioteca JFreeChart, podemos adicionar gráficos de forma fácil e rápida aos nossos relatórios. Para exemplificar, criamos um relatórios dos produtos mais vendidos, limitando a exibição a até os 4 mais vendidos. A listagem 12 mostra a consulta SQL utilizada para a geração deste relatório.
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;
Listagem 12: Query SQL para obter os produtos mais vendidos do Tarja Preta
Para esse tipo de relatório, que frequentemente combinam dados de diversas entidades, é comum a criação de um objeto JavaBean específico para os dados desse relatório. No nosso exemplo, criamos a classe 'RelProdutoMaisVendido' contendo dois atributos: produto (a descrição do produto) e qtde (quantidade de itens vendidos desse produto).
A coleção de objetos de 'RelProdutoMaisVendido' é então passada ao relatório, que possui dois campos preparados para receber os dois atributos dessa classe. Com eles podemos produzir nosso relatório contendo o gráfico. A figura 6 exibe o resultado final da geração do relatório de exemplo.
Figura 6: Relatórios de produtos mais vendidos com gráfico de pizza
5. Conclusões
Embora as duas soluções tenham o mesmo potencial e capacidades, a solução combinando o JasperReports com o iReport apresenta produtividade nitidamente superior à que utiliza o FPDF, pelo menos conforme mostrado neste trabalho. Cabe ressaltar que existem soluções para a criação gráfica de relatórios em PHP que não foram exploradas neste artigo. Optamos por escolher as soluções mais utilizadas na prática em desenvolvimentos usando as duas plataformas (Java e PHP).
Referências
[1] QBS Software Limited, QuickReports ,http://www.qusoft.com, acessado em abril de 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, acessado em maio de 2010.
[5] PDF, http://pt.wikipedia.org/wiki/Portable_Document_Format, acessado em maio de 2010.
[7] Biblioteca FPDF, http://www.fpdf.org/, acessado em maio de 2010.
[8] ER Model, seção Diagramming Conventions, http://en.wikipedia.org/wiki/Entity­
relationship_model, acessado em maio de 2010.
[9] TIOBE Software. http://www.tiobe.com. Acessado em maio de 2010.
[10] Kathy Sierra,Bert Bates. Use a Cabeça! Java. 2ª edição. 2005. Editora Alta Books.
[11] BIRT, http://www.eclipse.org/birt/phoenix/, acessado em maio de 2010.
[12] Gonçalves, Edson. Dominando Relatórios JasperReport com iReport. 1ª edição. 2008. Ed. Ciência Moderna.
[13] High Scalability, http://highscalability.com/, acessado em maio de 2010. [14] PHPlot , http://phplot.sourceforge.net/ , acessado em maio de 2010.
[15] JPGraph, http://www.aditus.nu/jpgraoph/ , acessado em maio de 2010.

Documentos relacionados

Visualizar - Polis Educacional

Visualizar - Polis Educacional criar e agilizar alguns meios de negócio, ainda como DEITEL (2005) afirma “Com certeza, a internet e a World Wide Web são as criações mais importantes e profundas que já ocorreram na área de tecnol...

Leia mais