Relatórios PDF com PHP (CodeIgniter), Jasper Reports e Oracle (ou MySql ou PostgreSql) .
2. iReport-Designer (iReport)
O iReport, cuja versão mais recente no momento em que escrevo é a 5.0.4, pode ser baixado no link http://sourceforge.net/projects/ireport/files/iReport/. Baixe a versão compatível com o seu sistema operacional.
Os recursos oferecidos por esta ferramenta é tema para um livro inteiro, então demonstrarei apenas algo bem básico. Com ela é possível criar todo o relatório de forma visual, configurando o tamanho da página e posicionando os campos onde eles realmente irão aparecer no relatório. Ao final é gerado um arquivo com a extensão jrxml, que poderá ser executado dentro do próprio iReport e gerar a saída em vários formatos, dentre eles o PDF.
Os relatórios, geralmente, buscam informações em um banco de dados, que no nosso caso é o Oracle, e, para que o iReport acesse o banco, é necessário criar uma conexão (Datasource). O iReport não vem, por padrão, com o driver do Oracle instalado, mas este pode ser instalado da seguinte forma: baixe o arquivo ojdbc14.jar em http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-10201-088211.html (esse driver serve para o Oracle 10g em diante. É necessário fazer o cadastro no site da Oracle, que é indolor e gratuito); no iReport, acesse o menu Ferramentas/opções, clique na aba "Classpath" e depois em "Add JAR". Selecione o arquivo baixado (ojdbc14.jar) e clique em OK. Pronto, o driver está instalado. O iReport já possui, por padrão, os drivers para MySql e PostgreSql.
Agora, na tela principal do iReport, clique no botão "Report Datasources" e depois no botão "New"; em seguida, selecione a opção "Database JDBC connection" (padrão) e clique em next; na tela seguinte, digite um nome qualquer para a conexão e escolha o JDBC Driver Oracle (oracle.jdbc.driver.OracleDriver), ou PostgreSQL (org.postgresql.Driver) ou MySQL (com.mysql.jdbc.Driver), conforme o SGBD utilizado; adapte o JDBC URL, o usuário e a senha conforme a configuração do seu SGBD; marque "Save password" e clique em "Test"; Se estiver tudo certo, aparecerá a mensagem "Connection test successful!"
Para inserir sua consulta (query) no relatório, abra-o no iReport, clique em "Report Inspector", e depois com o botão direito no nome do relatório, escolha "Edit Query", conforme a figura abaixo:
Caso o "Report Inspector" não esteja visível, torne-o visível no menu "Janela/Report Inspector".
Digite, então, sua query no campo correspondente.
Geralmente as consultas estáticas não atendem às nossas necessidades, então devemos torná-las dinâmicas e, para isso, temos que criar parâmetros que serão passados à consulta.
Para criar um novo parâmetro, na mesma janela de edição da consulta no iReport, clique no botão "New parameter" e, na janela que se abre, em "Parameter name", digite o nome do parâmetro (FILTRO_PAIS, por exemplo); deixe os outros campos como estão. Podem ser criados tantos parâmetros quantos forem necessários. Neste exemplo fictício, criei dois: FILTRO_PAIS e FILTRO_ESTADO.
Há duas formas de passar os parâmetros para a consulta: passar toda a consulta como parâmetro (para mim a melhor opção, pois criaremos apenas um parâmetro) ou passar apenas parte dela. Para passar parte dela, na janela de edição da consulta no iReport, você poderia digitar algo do tipo:
SELECT * FROM CIDADES
WHERE COD_PAIS =
AND COD_ESTADO =
Depois, na mesma janela, selecione e arraste os parâmetros que você criou para a posição logo após o sinal de igual ( = ); então a consulta ficaria assim:
SELECT * FROM CIDADES
WHERE COD_PAIS = $P{FILTRO_PAIS}
AND COD_ESTADO = $P{FILTRO_ESTADO}
Para passar toda a consulta como parâmetro, apenas selecione e arraste o parâmetro que você criou (FILTRO, por exemplo) para a janela de edição; ficaria assim:
$P{FILTRO}
Agora acrescente o sinal de exclamação (!) logo após o "P"; ficaria assim:
$P!{FILTRO}
No seu código, por exemplo, você capturaria os valores dos campos de um formulário (os códigos do país e do estado), e poderia ter algo do tipo:
se não carregou a biblioteca e o model no autoload, carregue-os
$this->load->library('jasper');
$this->load->model('m_jasper');
$caminhoDoArquivo = 'system/application/views/relatorios/Relatorio.pdf'; (exemplo)
Para a opção de enviar apenas parte da consulta como parâmetro, poderia ser assim:
$pais = $_POST['pais']; (código do país)
$estado = $_POST['estado']; (código do estado)
$parametros = array("FILTRO_PAIS" => $pais, "FILTRO_ESTADO" => $estado); - "FILTRO_PAIS" e "FILTRO_ESTADO" são os nomes dos parâmetros que você criou no iReport, respeitando-se maiúsculas e minúsculas;
Para a opção de enviar toda a consulta como parâmetro, poderia ser assim:
$pais = $_POST['pais']; (código do país)
$estado = $_POST['estado']; (código do estado)
$consulta = "SELECT * FROM CIDADES WHERE COD_PAIS = $pais AND COD_ESTADO = $estado";
$parametros = array("FILTRO" => $consulta); - novamente, "FILTRO" é o nome do único parâmetro que você criou no iReport;
A parte seguinte é igual para ambas as formas de passagem de parâmetros.
$pdf = $this->m_jasper->gerarRelatorioPdf('/relatorios/', 'IdDoRelatorio', $parametros, $caminhoDoArquivo);
'/relatorios/' é nome da pasta no servidor jasper, e 'IdDoRelatorio' é o ID (e não o nome) do relatório.
Se deu tudo certo, o arquivo Relatorio.pdf foi criado na pasta system/application/views/relatorios.
Mais algumas informações sobre parâmetros estão no capítulo 5 deste artigo.
Depois disso, você poderá inserir no relatório, campos que correspondam aos campos da sua consulta. Vá no menu "Janela/Paleta" (se já não estiver visível), selecione e arraste o "Text Field" para a área do relatório. Geralmente, esse tipo de campo é colocado na parte "Detail", para que ele se repita quantas vezes forem o número de linhas da sua consulta, mas você poderá colocá-lo em qualquer parte, dependendo das suas necessidades.
Nas propriedades do "Text Field", clique no campo "Text Fiield Expression" (nos três pontinhos "...");
na janela que se abre, selecione (clique duplo), dentre os campos disponíveis na sua consulta, aquele que você desejar.
Observação: para que os campos de sua consulta apareçam aqui, é necessário colocar toda a consulta na janela de edição (SELECT * FROM CIDADES WHERE COD_PAIS = 001 AND COD_ESTADO = 005, por exemplo). Depois de inseridos todos os campos necessários, deve-se recolocar a consulta original:
SELECT * FROM CIDADES
WHERE COD_PAIS = $P{FILTRO_PAIS}
AND COD_ESTADO = $P{FILTRO_ESTADO}
ou
$P!{FILTRO}
Poderá ser feita a combinação de mais de um campo, conforme o exemplo da figura abaixo:
Depois de montado todo o relatório conforme as suas necessidades, é possível executá-lo, escolhendo o tipo de saída no menu "Preview", e clicando no botão Preview. Serão abertas janelas solicitando os parâmetros que foram criados.
As consultas inseridas nos relatórios podem ser estáticas ou dinâmicas, com a criação de parâmetros que serão passados quando da execução do relatório. Por exemplo, você poderia inserir no relatório a consulta genérica "SELECT * FROM TABELA", e passar como parâmetro "WHERE CAMPO = VALOR". No relatório, apareceriam apenas as linhas de acordo com a cláusula "WHERE".
O iReport/JasperServer são softwares com muitos recursos, possibiltando a criação de relatórios bastante eleborados, com título, cabeçalho (page header), cabeçalho da coluna (column header), detalhe (detail, onde os campos se repetirão de acordo com o número de linhas de sua consulta), rodapé da coluna (column footer), rodapé da página (page footer), sumário (summary, que aparecerá apenas na última página, como a assinatura, por exemplo), subrelatórios (que são arquivos jrxml à parte, e podem ser tão elaborados quanto o relatório principal, com consultas a outras tabelas, inclusive de outros bancos de dados) e muito mais. Aqui foi apresentado apenas o básico.
O iReport, cuja versão mais recente no momento em que escrevo é a 5.0.4, pode ser baixado no link http://sourceforge.net/projects/ireport/files/iReport/. Baixe a versão compatível com o seu sistema operacional.
Os recursos oferecidos por esta ferramenta é tema para um livro inteiro, então demonstrarei apenas algo bem básico. Com ela é possível criar todo o relatório de forma visual, configurando o tamanho da página e posicionando os campos onde eles realmente irão aparecer no relatório. Ao final é gerado um arquivo com a extensão jrxml, que poderá ser executado dentro do próprio iReport e gerar a saída em vários formatos, dentre eles o PDF.
Os relatórios, geralmente, buscam informações em um banco de dados, que no nosso caso é o Oracle, e, para que o iReport acesse o banco, é necessário criar uma conexão (Datasource). O iReport não vem, por padrão, com o driver do Oracle instalado, mas este pode ser instalado da seguinte forma: baixe o arquivo ojdbc14.jar em http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-10201-088211.html (esse driver serve para o Oracle 10g em diante. É necessário fazer o cadastro no site da Oracle, que é indolor e gratuito); no iReport, acesse o menu Ferramentas/opções, clique na aba "Classpath" e depois em "Add JAR". Selecione o arquivo baixado (ojdbc14.jar) e clique em OK. Pronto, o driver está instalado. O iReport já possui, por padrão, os drivers para MySql e PostgreSql.
Agora, na tela principal do iReport, clique no botão "Report Datasources" e depois no botão "New"; em seguida, selecione a opção "Database JDBC connection" (padrão) e clique em next; na tela seguinte, digite um nome qualquer para a conexão e escolha o JDBC Driver Oracle (oracle.jdbc.driver.OracleDriver), ou PostgreSQL (org.postgresql.Driver) ou MySQL (com.mysql.jdbc.Driver), conforme o SGBD utilizado; adapte o JDBC URL, o usuário e a senha conforme a configuração do seu SGBD; marque "Save password" e clique em "Test"; Se estiver tudo certo, aparecerá a mensagem "Connection test successful!"
Para inserir sua consulta (query) no relatório, abra-o no iReport, clique em "Report Inspector", e depois com o botão direito no nome do relatório, escolha "Edit Query", conforme a figura abaixo:
Caso o "Report Inspector" não esteja visível, torne-o visível no menu "Janela/Report Inspector".
Digite, então, sua query no campo correspondente.
Geralmente as consultas estáticas não atendem às nossas necessidades, então devemos torná-las dinâmicas e, para isso, temos que criar parâmetros que serão passados à consulta.
Para criar um novo parâmetro, na mesma janela de edição da consulta no iReport, clique no botão "New parameter" e, na janela que se abre, em "Parameter name", digite o nome do parâmetro (FILTRO_PAIS, por exemplo); deixe os outros campos como estão. Podem ser criados tantos parâmetros quantos forem necessários. Neste exemplo fictício, criei dois: FILTRO_PAIS e FILTRO_ESTADO.
Há duas formas de passar os parâmetros para a consulta: passar toda a consulta como parâmetro (para mim a melhor opção, pois criaremos apenas um parâmetro) ou passar apenas parte dela. Para passar parte dela, na janela de edição da consulta no iReport, você poderia digitar algo do tipo:
SELECT * FROM CIDADES
WHERE COD_PAIS =
AND COD_ESTADO =
Depois, na mesma janela, selecione e arraste os parâmetros que você criou para a posição logo após o sinal de igual ( = ); então a consulta ficaria assim:
SELECT * FROM CIDADES
WHERE COD_PAIS = $P{FILTRO_PAIS}
AND COD_ESTADO = $P{FILTRO_ESTADO}
Para passar toda a consulta como parâmetro, apenas selecione e arraste o parâmetro que você criou (FILTRO, por exemplo) para a janela de edição; ficaria assim:
$P{FILTRO}
Agora acrescente o sinal de exclamação (!) logo após o "P"; ficaria assim:
$P!{FILTRO}
No seu código, por exemplo, você capturaria os valores dos campos de um formulário (os códigos do país e do estado), e poderia ter algo do tipo:
se não carregou a biblioteca e o model no autoload, carregue-os
$this->load->library('jasper');
$this->load->model('m_jasper');
$caminhoDoArquivo = 'system/application/views/relatorios/Relatorio.pdf'; (exemplo)
Para a opção de enviar apenas parte da consulta como parâmetro, poderia ser assim:
$pais = $_POST['pais']; (código do país)
$estado = $_POST['estado']; (código do estado)
$parametros = array("FILTRO_PAIS" => $pais, "FILTRO_ESTADO" => $estado); - "FILTRO_PAIS" e "FILTRO_ESTADO" são os nomes dos parâmetros que você criou no iReport, respeitando-se maiúsculas e minúsculas;
Para a opção de enviar toda a consulta como parâmetro, poderia ser assim:
$pais = $_POST['pais']; (código do país)
$estado = $_POST['estado']; (código do estado)
$consulta = "SELECT * FROM CIDADES WHERE COD_PAIS = $pais AND COD_ESTADO = $estado";
$parametros = array("FILTRO" => $consulta); - novamente, "FILTRO" é o nome do único parâmetro que você criou no iReport;
A parte seguinte é igual para ambas as formas de passagem de parâmetros.
$pdf = $this->m_jasper->gerarRelatorioPdf('/relatorios/', 'IdDoRelatorio', $parametros, $caminhoDoArquivo);
'/relatorios/' é nome da pasta no servidor jasper, e 'IdDoRelatorio' é o ID (e não o nome) do relatório.
Se deu tudo certo, o arquivo Relatorio.pdf foi criado na pasta system/application/views/relatorios.
Mais algumas informações sobre parâmetros estão no capítulo 5 deste artigo.
Depois disso, você poderá inserir no relatório, campos que correspondam aos campos da sua consulta. Vá no menu "Janela/Paleta" (se já não estiver visível), selecione e arraste o "Text Field" para a área do relatório. Geralmente, esse tipo de campo é colocado na parte "Detail", para que ele se repita quantas vezes forem o número de linhas da sua consulta, mas você poderá colocá-lo em qualquer parte, dependendo das suas necessidades.
Nas propriedades do "Text Field", clique no campo "Text Fiield Expression" (nos três pontinhos "...");
na janela que se abre, selecione (clique duplo), dentre os campos disponíveis na sua consulta, aquele que você desejar.
Observação: para que os campos de sua consulta apareçam aqui, é necessário colocar toda a consulta na janela de edição (SELECT * FROM CIDADES WHERE COD_PAIS = 001 AND COD_ESTADO = 005, por exemplo). Depois de inseridos todos os campos necessários, deve-se recolocar a consulta original:
SELECT * FROM CIDADES
WHERE COD_PAIS = $P{FILTRO_PAIS}
AND COD_ESTADO = $P{FILTRO_ESTADO}
ou
$P!{FILTRO}
Poderá ser feita a combinação de mais de um campo, conforme o exemplo da figura abaixo:
Depois de montado todo o relatório conforme as suas necessidades, é possível executá-lo, escolhendo o tipo de saída no menu "Preview", e clicando no botão Preview. Serão abertas janelas solicitando os parâmetros que foram criados.
As consultas inseridas nos relatórios podem ser estáticas ou dinâmicas, com a criação de parâmetros que serão passados quando da execução do relatório. Por exemplo, você poderia inserir no relatório a consulta genérica "SELECT * FROM TABELA", e passar como parâmetro "WHERE CAMPO = VALOR". No relatório, apareceriam apenas as linhas de acordo com a cláusula "WHERE".
O iReport/JasperServer são softwares com muitos recursos, possibiltando a criação de relatórios bastante eleborados, com título, cabeçalho (page header), cabeçalho da coluna (column header), detalhe (detail, onde os campos se repetirão de acordo com o número de linhas de sua consulta), rodapé da coluna (column footer), rodapé da página (page footer), sumário (summary, que aparecerá apenas na última página, como a assinatura, por exemplo), subrelatórios (que são arquivos jrxml à parte, e podem ser tão elaborados quanto o relatório principal, com consultas a outras tabelas, inclusive de outros bancos de dados) e muito mais. Aqui foi apresentado apenas o básico.
Fiz um relatório no ireport 5 conseguir escrever um número por extenso (ex: 2,30) -Dois reais e trinta centavos. Tudo ok!
Mas, quando abro através de um link via php usando a classe phpjasper o relatório não abre. Sei que é problema no campo que escreve por extenso. Como resolver.
Sei que a classe phpjasper tem um monte de problemas. Conseguir contornar alguns. Mas, a escrita por extenso essa eu peço ajuda e desde já agradeço!
Mas, quando abro através de um link via php usando a classe phpjasper o relatório não abre. Sei que é problema no campo que escreve por extenso. Como resolver.
Sei que a classe phpjasper tem um monte de problemas. Conseguir contornar alguns. Mas, a escrita por extenso essa eu peço ajuda e desde já agradeço!
29/10/2014 10:09am
(~10 anos atrás)
Antonio,
Você está usando Oracle? Qual o charset? (as casas decimais estão separadas com ponto ou com vírgula?)
Que tipo de dado há nesse campo, no banco de dados?
Você está usando Oracle? Qual o charset? (as casas decimais estão separadas com ponto ou com vírgula?)
Que tipo de dado há nesse campo, no banco de dados?
25/06/2014 9:22pm
(~10 anos atrás)
Os campos de valores (double) de meu relatório saem no formato "americano" , ex.: 1,234.56 e não 1.234,56, apesar de eu configurar corretamente a propriedade "Pattern" do referido campo: #,##0.00
O que pode ser?
O que pode ser?
24/06/2014 10:19pm
(~10 anos atrás)
Parabéns Osmando...essa solução mostra a versatilidade de ser trabalhar com o PHP. Claro que existem diversas soluções possíveis, mas trabalhar com o iReport nos dá a confiabilidade de uma ferramenta gráfica já consagrada, com a flexibilidade do PHP.
Um abraço
Um abraço
02/09/2013 9:17am
(~11 anos atrás)
Você está passando este número por extenso como parâmetro para o jasper server? Caso positivo, tente usar a função do PHP utf8_encode ($parametros = array("PARAMETRO1" => utf8_encode($variavel)), por exemplo).
Se não resolver, informe mais detalhes sobre o seu problema, para que eu possa tentar resolvê-lo.
Sim, a clase phpjasper tem alguns bugs, mas, como ela atendeu às minhas necessidades, não me empenhei em tentar resolvê-los.
Osmando.