Desenvolvimento PHP - Relatórios Jasper

De DTI Wiki

Ir para: navegação, pesquisa

Tabela de conteúdo

Arquivos

Para uso dos relatórios jasper no PHP é preciso que se modele o relatório e seus sub-relatórios e os compile gerando o binário .jasper de cada um. Estes arquivos gerados, devem ser alocados na pasta reps no mesmo nível e aos moldes de apps e html.
Exemplo:

Ponto de Funcionários
 
\apps\rh\ponto\       <---- pasta dos scripts .php
\html\rh\ponto\       <---- pasta dos templates .html
 
\reps\rh\ponto\ <---- caminho dos binários dos relatórios da aplicação acima.


require_once("../../lib/JasperReport.class.php");

Para que seja possível gerar relatórios é necessário que se carregue a classe JasperReport.class.php que se encontra no diretório lib.

Exemplo (SQL + PDF):

require_once("../configDB.inc.php");
require_once("../../lib/JasperReport.class.php");
 
$app = new UpfTpl($orauser,$orapassw,$oradb,"","",0,false);
 
$relatorio = new JasperReport($app, $orauser, $orapassw, $oradb);
$relatorio->setJFile("t/report3.jasper");
$relatorio->setUseDb(true);
$relatorio->setParam("MAIS_UM_PARAMETRO", "LALALALALALA");
$relatorio->render();
$relatorio->get();


$relatorio = new JasperReport($app, $orauser, $orapassw, $oradb);

Linha que instancia a classe passando por parâmetro a classe UpfTpl já instanciada também. Demais parâmetros são para conexão com o banco de dados, que já estão setados no configDB.inc.php.

$relatorio->setJFile("t/report3.jasper");

Seta o arquivo binário do relatório, caso haja sub-relatórios estes são carregados automaticamente pelo relatório pricipal. Neste caso o arquivo localiza-se em \reps\t\report3.jasper.

$relatorio->setUseDb(true);

Diz à classe que a conexão será através do banco de dados, a consulta fica dentro do arquivo binário editado no iReport previamente.

$relatorio->setParam("MAIS_UM_PARAMETRO", "LALALALALALA");

É possível atribuir valores à parâmetros setados nos relatórios, usado frequentemente nos filtros de sql ou parâmetros que se deseja passar para o datasource em XML.

$relatorio->render();

Gera o relatório e o salva em um diretório temporário. Seu caminho e nome podem ser recuperados através da função $relatorio->getOutputFilePath().

$relatorio->get();

Seta os headers e envia o arquivo em forma de download, existem 2 parâmetros para essa função que por padrão são $inline=false, $unlink=true.
$inline é para o caso de querer mostrar o PDF na janela do browser, se false efetua o download.
$unlink é para o caso de excluir ou não o arquivo no servidor após o download.

Exemplo (XML + XLS):

A diferença entre o uso de xml ou banco e pdf ou xls é sutil, veja o exemplo:

	require_once("../configDB.inc.php");
	require_once("../../lib/JasperReport.class.php");
 
	$app = new UpfTpl($orauser,$orapassw,$oradb,"","",0,false);
 
	$relatorio = new JasperReport($app, $orauser, $orapassw, $oradb);
	$relatorio->setJFile("t/report3.jasper");
	$relatorio->setParam("XML_POST_PARAM_DBOBJECT", "pkg_intranet.prc_getdadosdti");
	$relatorio->setParam("XML_POST_PARAM_parametro", "2");
	$relatorio->setRetXls(true);
	$relatorio->render();
	$relatorio->get();

$relatorio->setXmlLocation("http://ffurst.wwwdev.upf.br/apps/xmlDatasource.php");

Seta o caminho do serviço que retorna a consulta em XML através de cursores no banco. É possível que se crie um serviço personalizado ou até mesmo que se acesse um arquivo XML através da rede, basta mudar o caminho. Para relatórios que utilizam XML como datasource é necessária a modificação da query no iReport, para XPath2 e que se sete o caminho nos nodos do XML para os registros. Exemplo: /dataset/row

$relatorio->setParam("XML_POST_PARAM_DBOBJECT", "pkg_intranet.prc_getdadosdti");

Seta o valor de um parâmetro dentro do relatório. Este parâmetro deve ser definido dentro do relatório, neste caso a estou mandando um campo através de post no serviço, a variável estará na seguinte forma - $_POST['DBOBJECT'] - e o valor será "pkg_intranet.prc_getdadosdti".

$relatorio->setParam("XML_POST_PARAM_parametro", "2");

Semelhante ao caso acima. $_POST['parametro'] Valor: 2

$relatorio->setRetXls(true);

Seta o retorno para arquivo XLS, ao invés de gerar um PDF irá gerar um XLS

Considerações

new ByteArrayInputStream(new  Base64().decodeBase64($F{CAMPO}.getBytes("UTF-8")))
Créditos: Furst

Relatórios com SQL

Relatórios que utilizam muitas informações (ex.: muitas imagens e subreports) ou que geram um grande quantidade de páginas, podem acabar apresentando problemas na sua geração. Nesses casos é recomenando utilizar SQL ao invés do xmlDatasource.
Veja aqui as instruções de como criar esse tipo de relatório.

Ferramentas pessoais
Espaços nominais
Variantes
Ações
Navegação
Ferramentas