Desenvolvimento PHP - Relatórios Jasper
De DTI Wiki
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
- Para que se passe um parâmetro via PHP o mesmo deve ser definido no relatório.
- Setar o parâmetro SUBREPORT_DIR no relatório para o caminho dos sub-relatórios (inclusive no caso de sub-relatórios dentro de sub-relatórios)
- Em datasources via XML deve se passar o parâmetro XML_URL do relatório principal para os sub-relatórios.
- O uso do xmlDatasource.php implica também na utilização deste parâmetro XML_POST_PARAM_QPARAM que serve para informar a quantidade de parâmetros que a procedure possui.
- Caso algum campo seja uma imagem, deve ser definido o parâmetro XML_POST_PARAM_B64_CAMPO, com o valor default sendo "S".
Esse parâmetro informa que esse campo será convertido para Base64. - Faça o import da biblioteca da Base64 no iReport "org.apache.commons.codec.binary.Base64"
- Certifique-se que a pasta T:\lib está atualizada
- Caso tenha modificado o xmlDatasource.php na apps, não se atualizar os arquivos na test e sun.
- Para decodificar um campo binário deve ser utilizado o seguinte código:
new ByteArrayInputStream(new Base64().decodeBase64($F{CAMPO}.getBytes("UTF-8")))
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.