Você está na página 1de 8

Usando o iReport como gerador de

relatrios para PHP


29 de janeiro de 2010 por Marcus Vincius Souza Costa
Veremos hoje uma soluo para utilizar um
gerador de relatrios para a linguagem PHP. Consiste no uso do
trabalho em conjunto de relatrios JasperReports e o pacote
PHPJasperXML.
O
que me motivou a buscar esta soluo foi a procura por um gerador
de relatrios para PHP, na grande maioria das vezes com
insucesso.
A
linguagem PHP extremamente flexvel e muitos desenvolvedores que a
utilizam, quando necessitam desenvolver relatrios, fazem seu
prprio cdigo, desenvolvendo suas prprias quebras de linha etc. S que o
uso de softwares geradores de relatrios, os chamados
reports generators, trazem inmeras vantagens ao
desenvolvedor. Alm de ser mais profissional o uso destes softwares,
pois poupa tempo de desenvolvimento por serem muito mais fceis de
confeccionar do que se elaborar um cdigo para esta finalidade,
tambm til quando se necessita de suporte, pois diversos usurios
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, alm de conter
tutoriais. necessrio ter a sute JDK j instalada para fazer a
instalao do iReport. No o foco do artigo a explicao de
como utilizar o iReport.
Alm
de ser muito intuitivo e de fcil uso, til em praticamente
todas as necessidades na confeco de um relatrio. Traz diversas
opes como uso de cdigo de barras, sub-relatrios e etc. O
iReport permite que os relatrios sejam gerados em XML, PDF, HTML,
DOCX, ODT, dentre outros formatos.
Ao
inserir as informaes de conexo com o banco de dados (o iReport
traz diversas opes como JDBC, Conexo com Hibernate, XML e etc),
processo que pode ser visto aqui,
gerado um arquivo de extenso jrxml. Ao ser compilado, um arquivo
de extenso jasper tambm gerado (arquivo executvel do
relatrio). Faz analogia linguagem Java, que tem o cdigo
residente nos arquivos de extenso JAVA (no caso do iReport,
extenso jrxml). Depois de compilados so gerados arquivos de
extenso CLASS (no iReport, jasper).
PHPJasperXML
O
PHPJasperXML possibilita a leitura de arquivos jrxml, feitos
utilizando o iReport, para transform-los em relatrios no formato
PDF, com o auxlio da classe FPDF. escrito em PHP e muito fcil
de ser configurado. tambm uma soluo alternativa ao PHP/Java
Bridge.
Na
pgina
do projeto possvel fazer o download do cdigo.
Alm de conter tutoriais.
Para
seu uso necessrio basicamente editar o arquivo setting.php, que
contm as variveis indicativas da conexo com banco de dados.
O
arquivo PHPJasperXML.inc contm a classe PHPJasperXML, que faz todo
o trabalho pesado de conectar com o banco de dados (vem
configurada para MySQL), ler o contedo arquivo jrxml e junto com a
classe FPDF, gerar o relatrio em PDF.
Exemplo
de utilizao
Irei
exemplificar o uso do iReport com a classe PHPJasperXML.
Para
nosso exemplo necessrio 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');
Aps
criar nosso banco de dados, chamado ProjetoPHP, o momento de
elaborar o relatrio. Para nosso exemplo, o relatrio ser chamado
de phpjasperxml.jrxml. A conexo com o banco de dados que criamos
dever ser feita no iReport (esse processo exemplificado em um
link no texto introdutrio do iReport, acima). Aps criada a
conexo, vamos inserir a seguinte query no Report Query do relatrio
(para ver como inserir queries no iReport, confira aqui):
SELECT
* FROM usuarios;
Esta
query nos retornar dois fields (id e nome) que
devero estar no relatrio.
Finalizando
nosso relatrio, dever ser inserido um parmetro chamado
descricao. Para saber como adicionar parmetros em um
relatrio 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 elaborao deste relatrio no iReport:

Figura
1: Elaborao do relatrio 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
varivel $version no precisa ser editada. Voc pode criar
um arquivo que ir instanciar a classe PHPJasperXML. Vamos chamar
este arquivo de exemplo.php e seu contedo 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 parmetro descrio

$PHPJasperXML->arrayParameter=array("descricao"=>$descricao); //passa
o parmetro 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 aplicao. Basta ir ao browser e digitar
http://localhost/relatorioPHP/exemplo.php?descricao=HelloWord
Se
tudo ocorrer como o esperado, ser exibido o relatrio em PDF, de
acordo com a figura 2:

Figura
2: Relatrio gerado
O
parmetro passado pelo mtodo GET e tratado no nosso arquivo
exemplo.php. Como este parmetro j esperado pelo relatrio,
definido em sua criao, repassado pela classe PHPJasperXML ao
nosso relatrio.
Uma
observao que no momento da elaborao do iReport, no se
deve colocar nenhum objeto (Fields, parmetros, Labels e etc) nas
bandas Title e Column Header do relatrio. Isso porque a classe
PHPJasperXML no trata essas bandas e os objetos contidos nela
simplesmente no so exibidos no relatrio. Essa observao s
vale caso voc queira utilizar o iReport com a classe PHPJasperXML,
que o nosso caso. Nos relatrios gerados pelo iReport (e no
pela classe PHPJapserXML), os elementos contidos nestas bandas so
exibidos normalmente.
Como
foi dito, PHPJasperXML vem configurado para um conexo com MySQL.
Para o que precisei foi necessrio adaptar esta classe ao
PostgreSQL. Meu amigo Ronaldo Meneguite disponibilizou em seu site,
em artigo publicado tambm por ele, a classe modificada, que pode
ser vista aqui.
*
Gostaria de agradecer colega de trabalho, Jssica Boalente
Carvalho, pela ajuda na procura desta soluo e na utilizao 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 experincias sobre o assunto.
DB.PHP
<?php
$mysql_hostname = "localhost";
$mysql_user = "root";
$mysql_password = "";
$mysql_database = "web";
$bd = mysql_connect($mysql_hostname, $mysql_user, $mysql_password) or
die("Can't connect to database");
mysql_select_db($mysql_database, $bd) or die("Opps some thing went
wrong");
?>

LOGIN.PHP
<?php
include("db.php");
session_start();
if($_SERVER["REQUEST_METHOD"] == "POST")
{
// username and password sent from Form
$username=mysql_real_escape_string($_POST['username']);
$password=mysql_real_escape_string($_POST['password']);
$password=md5($password); // Encrypted Password
$sql="SELECT id FROM admin WHERE username='$username' and
passcode='$password'";
$result=mysql_query($sql);
$count=mysql_num_rows($result);

// If result matched $username and $password, table row must be 1 row
if($count==1)
{
session_register("username");
$_SESSION['login_user']=$username;

header("location: welcome.php");
}
else
{
$error="Your Login Name or Password is invalid";
}
}
?>
<form action="login.php" method="post">
<label>UserName :</label>
<input type="text" name="username"/><br />
<label>Password :</label>
<input type="password" name="password"/><br/>
<input type="submit" value=" Login "/><br />
</form>
EXEMPLO PDO


<?php
//really basic connection wrapper class
class DB{
protected $_conn;

public function __construct(){
$mysql_hostname = "localhost";
$mysql_user = "root";
$mysql_password = "";
$mysql_database = "web";
//http://php.net/manual/en/pdo.construct.php
$this->_conn = new PDO(
'mysql:host=' . $mysql_hostname . ';' . 'dbname=' .
$mysql_database,
$mysql_user,
$mysql_password
);
}

public function getConn(){
return $this->_conn;
}
/*
$bd = mysql_connect($mysql_hostname, $mysql_user,
$mysql_password) or die("Can't connect to database");
mysql_select_db($mysql_database, $bd) or die("Opps some thing
went wrong");
*/
}
?>

//any space or new lines here ( before the open PHP tag ) will prevent
the redirect
<?php
ini_set('display_errors', 1); //turn on error reporting when developing
include("db.php");
session_start();
if($_SERVER["REQUEST_METHOD"] == "POST"){
$DB = new DB();

// username and password sent from Form
$username = $_POST['username'];
$password = $_POST['password'];
$password = md5($password); // Encrypted Password - update this as
others have stated
$sql="SELECT id FROM admin WHERE username = ? and passcode = ?";
//http://php.net/manual/en/pdo.prepare.php
$stmt = $DB->getConn()->prepare($sql);
//http://php.net/manual/en/pdostatement.execute.php
$stmt->execute( array( $username, $password ) );
//http://php.net/manual/en/pdostatement.fetchall.php
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

// If result matched $username and $password, table row must be 1 row
if(count( $results ) ){
//session_register("username"); this is deprecated
$_SESSION['login_user']=$username;

header("location: welcome.php");
exit(); //add exit here
}else {
$error="Your Login Name or Password is invalid";
}
}
?>
<form action="login.php" method="post">
<label>UserName :</label>
<input type="text" name="username"/><br />
<label>Password :</label>
<input type="password" name="password"/><br/>
<input type="submit" value=" Login "/><br />
</form>

Você também pode gostar