Veremos hoje uma solução para utilizar um
gerador de relatórios para a linguagem PHP. Consiste no uso do
trabalho em conjunto de relatórios JasperReports e o pacote
PHPJasperXML.
O
que me motivou a buscar esta solução foi a procura por um gerador
de relatórios para PHP, na grande maioria das vezes com
insucesso.
A
linguagem PHP é extremamente flexível e muitos desenvolvedores que a utilizam, quando necessitam desenvolver relatórios, fazem seu
próprio código, desenvolvendo suas próprias quebras de linha etc. Só que o uso de softwares geradores de relatórios, os chamados
reports generators, trazem inúmeras vantagens ao
desenvolvedor. Além de ser mais profissional o uso destes softwares,
pois poupa tempo de desenvolvimento por serem muito mais fáceis de
confeccionar do que se elaborar um código para esta finalidade, é
também útil quando se necessita de suporte, pois diversos usuários
do mundo inteiro utilizam desses softwares.
iReport
O
iReport é um desenhador de layouts para JasperReports. É muito
utilizado por desenvolvedores da linguagem Java, sendo uma
alternativa livre ao excelente Crystal Reports. Neste
link o download pode ser feito, além de conter
tutoriais. É necessário ter a suíte JDK já instalada para fazer a
instalação do iReport. Não é o foco do artigo a explicação de
como utilizar o iReport.
Além
de ser muito intuitivo e de fácil uso, é útil em praticamente
todas as necessidades na confecção de um relatório. Traz diversas
opções como uso de código de barras, sub-relatórios e etc. O
iReport permite que os relatórios sejam gerados em XML, PDF, HTML,
DOCX, ODT, dentre outros formatos.
Ao
inserir as informações de conexão com o banco de dados (o iReport
traz diversas opções como JDBC, Conexão com Hibernate, XML e etc),
processo que pode ser visto aqui,
é gerado um arquivo de extensão jrxml. Ao ser compilado, um arquivo
de extensão jasper também é gerado (arquivo executável do
relatório). Faz analogia à linguagem Java, que tem o código
residente nos arquivos de extensão JAVA (no caso do iReport,
extensão jrxml). Depois de compilados são gerados arquivos de
extensão CLASS (no iReport, jasper).
PHPJasperXML
O
PHPJasperXML possibilita a leitura de arquivos jrxml, feitos
utilizando o iReport, para transformá-los em relatórios no formato
PDF, com o auxílio da classe FPDF. É escrito em PHP e muito fácil
de ser configurado. É também uma solução alternativa ao PHP/Java
Bridge.
Na
página
do projeto é possível fazer o download do código.
Além de conter tutoriais.
Para
seu uso é necessário basicamente editar o arquivo setting.php, que
contém as variáveis indicativas da conexão com banco de dados.
O
arquivo PHPJasperXML.inc contém a classe PHPJasperXML, que faz todo
o “trabalho pesado” de conectar com o banco de dados (vem
configurada para MySQL), ler o conteúdo arquivo jrxml e junto com a
classe FPDF, gerar o relatório em PDF.
Exemplo
de utilização
Irei
exemplificar o uso do iReport com a classe PHPJasperXML.
Para
nosso exemplo é necessário ter o SGBD MySQL instalado. Crie o banco
de dados com os seguintes comandos:
CREATE DATABASE ProjetoPHP;
USE ProjetoPHP;
CREATE TABLE usuarios (
id INT(11) NOT NULL AUTO_INCREMENT, nome VARCHAR(50),
PRIMARY KEY (id)
);
INSERT INTO usuarios (nome) VALUES ('PHP'), ('MySQL'), ('JasperReports'), ('PHPJasperXML');
Após
criar nosso banco de dados, chamado ProjetoPHP, é o momento de
elaborar o relatório. Para nosso exemplo, o relatório será chamado
de phpjasperxml.jrxml. A conexão com o banco de dados que criamos
deverá ser feita no iReport (esse processo é exemplificado em um
link no texto introdutório do iReport, acima). Após criada a
conexão, vamos inserir a seguinte query no Report Query do relatório
(para ver como inserir queries no iReport, confira aqui):
SELECT
* FROM usuarios;
Esta
query nos retornará dois fields (id e nome) que
deverão estar no relatório.
Finalizando
nosso relatório, deverá ser inserido um parâmetro chamado
descricao. Para saber como adicionar parâmetros em um
relatório com o iReport, confira aqui.
Depois
de feito o download do PHPJasperXML, basta extrair a pasta class e o
arquivo setting.php para a pasta de seu projeto.
A
figura abaixo mostra a elaboração deste relatório no iReport:
Figura
1: Elaboração do relatório no iReport.
Para
nosso exemplo, o projeto será chamado relatorioPHP. No arquivo
setting.php, você deve informar o caminho para seu banco de dados,
como a seguir:
<?php
$server="localhost";
$db="phpjasperxml";
$user="root";
$pass="phpmaster";
$version="0.6d";
?>
A
variável $version não precisa ser editada. Você pode criar
um arquivo que irá instanciar a classe PHPJasperXML. Vamos chamar
este arquivo de exemplo.php e seu conteúdo é descrito abaixo:
<?php
include_once('class/fpdf/FPDF.php');
include_once("class/PHPJasperXML.inc");
include_once ('setting.php');
$xml = simplexml_load_file("phpjasperxml.jrxml"); //informe onde está seu arquivo jrxml
$PHPJasperXML = new PHPJasperXML();
$PHPJasperXML->debugsql=false;
$descricao=$_GET["descricao"]; //recebendo o parâmetro descrição
$PHPJasperXML->arrayParameter=array("descricao"=>$descricao); //passa o parâmetro cadastrado no iReport
$PHPJasperXML->xml_dismantle($xml);
$PHPJasperXML->connect($server,$user,$pass,$db);
$PHPJasperXML->transferDBtoArray($server,$user,$pass,$db);
$PHPJasperXML->outpage("I");
?>
Agora
vamos testar nossa aplicação. Basta ir ao browser e digitar
http://localhost/relatorioPHP/exemplo.php?descricao=HelloWord
Se
tudo ocorrer como o esperado, será exibido o relatório em PDF, de
acordo com a figura 2:
Figura
2: Relatório gerado
O
parâmetro é passado pelo método GET e tratado no nosso arquivo
exemplo.php. Como este parâmetro já é esperado pelo relatório,
definido em sua criação, é repassado pela classe PHPJasperXML ao
nosso relatório.
Uma
observação é que no momento da elaboração do iReport, não se
deve colocar nenhum objeto (Fields, parâmetros, Labels e etc) nas
bandas Title e Column Header do relatório. Isso porque a classe
PHPJasperXML não trata essas bandas e os objetos contidos nela
simplesmente não são exibidos no relatório. Essa observação só
vale caso você queira utilizar o iReport com a classe PHPJasperXML,
que é o nosso caso. Nos relatórios gerados pelo iReport (e não
pela classe PHPJapserXML), os elementos contidos nestas bandas são
exibidos normalmente.
Como
foi dito, PHPJasperXML vem configurado para um conexão com MySQL.
Para o que precisei foi necessário adaptar esta classe ao
PostgreSQL. Meu amigo Ronaldo Meneguite disponibilizou em seu site,
em artigo publicado também por ele, a classe modificada, que pode
ser vista aqui.
*
Gostaria de agradecer à colega de trabalho, Jéssica Boalente
Carvalho, pela ajuda na procura desta solução e na utilização da
mesma. Ao amigo Ronaldo Louro Meneguite, por postar em seu site a
classe PHPJasperXML que modifiquei aos moldes do PostgreSQL e pela
troca de experiências sobre o assunto.