iReport - construção de gráfico/query dinâmica
iReport - construção de gráfico/query dinâmica
11 Respostas
estuda ae.. pode lhe ser util (idéia basica de relatorio)
a classe Relatorio possui metodos onde vc passa a query a ser executada
package conexao;
import java.sql.*;
import com.mysql.jdbc.CommunicationsException;
/**
* Conexao.java<br/>
* Representa um conexao com um banco de dados
* @author Marcos Vinícius Soares
*/
public class Conexao {
private Connection conn_;
private Statement stmt_;
/**
* Cria uma nova conexão
*/
public Conexao(String servidor, String bd, String usuario, String senha)
throws CommunicationsException, SQLException, ClassNotFoundException {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://" + servidor + "/" + bd;
// conexão com o banco de dados
try {
Class.forName(driver);
conn_ = DriverManager.getConnection(url, usuario, senha);
}
catch (CommunicationsException exception) {
throw exception;
}
catch (SQLException exception) {
throw exception;
}
catch (ClassNotFoundException exception) {
throw exception;
}
// criação do statement
try {
stmt_ = conn_.createStatement();
}
catch (SQLException exception) {
throw exception;
}
}
/**
* Executa o SQL passado como parâmetro, podendo ser um INSERT, UPDATE ou DELETE
*/
public synchronized void executeUpdate(String sql) throws SQLException {
try {
stmt_.executeUpdate(sql);
}
catch (SQLException exception) {
throw exception;
}
}
/**
* Executa o SQL passado como parâmetro, retornando um objeto ResultSet
*/
public synchronized ResultSet executeQuery(String sql) throws SQLException {
try {
return stmt_.executeQuery(sql);
}
catch (SQLException exception) {
throw exception;
}
}
/**
* Fecha a conexao com o banco de dados
*/
public void fecharConexao() throws SQLException {
try {
stmt_.close();
}
catch (SQLException exception) {
throw exception;
}
}
/**
* Retorna o maior número de um campo da tabela, se ele for um inteiro.
*/
public int retornaMax(String tabela, String campo) throws SQLException {
try {
String sql = "SELECT max(" + campo + ") as valorMaximo FROM " + tabela;
ResultSet rs = executeQuery(sql);
rs.next();
return (rs.getInt("valorMaximo"));
}
catch (SQLException exception) { throw exception; }
}
/**
* Retorna o objeto Connection desta conexão
*/
public Connection getConnection() {
return this.conn_;
}
}
/*
* @(#)Relatorio.java 1.0
*
* Copyright 2006 Marcos Vinícius Soares. Todos os direitos reservados.
*
*/
package relatorio;
import java.sql.*;
import java.net.URL;
import java.util.HashMap;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;
import net.sf.jasperreports.engine.*;
import conexao.Conexao;
/**
* Relatorio.java<br>
*
* <p>A classe Relatorio deve ser utilizada para emissão de relatórios. Após a
* criação de algum relatório é possível exibí-lo na tela, exportá-lo para um
* arquivo pdf/html ou enviá-lo direto para impressão.</p>
*
* <p>A classe manipula relatórios desenvolvidos utilizando-se a ferramenta
* iReport e utiliza a ferramenta JasperReports para emissão dos relatórios</p>
*
* @author Marcos Vinícius Soares
*/
public class Relatorio {
/** Representa o relatório gerado. */
private JasperPrint jasperPrint_;
/**
* Cria um novo Relatorio.
*
* @param conn Conexão com o banco de dados.
* @param parameters Parâmetros a serem exibidos no relatório.
* @param localRelatorio Localização do relatório.
* @throws JRException Caso o relatório não seja encontrado ou haja
* algum problema com ele, uma exceção é gerada.
*/
public Relatorio(Conexao conn, HashMap parameters, URL localRelatorio) throws JRException{
try {
// O objeto JasperReport representa o objeto JasperDesign (arquivo .jrxml) compilado.
// Ou seja, o arquivo .jasper
JasperReport jr = (JasperReport)JRLoader.loadObject(localRelatorio);
// JasperPrint representa o relatório gerado.
// É criado um JasperPrint a partir de um JasperReport, contendo o relatório preenchido.
this.jasperPrint_ = JasperFillManager.fillReport(jr, parameters, conn.getConnection());
} catch (JRException e) { throw e; }
}
/**
* Cria um novo Relatorio.
*
* @param conn Conexão com o banco de dados.
* @param parameters Parâmetros a serem exibidos no relatório.
* @param localRelatorio Localização do relatório.
* @throws JRException Caso o relatório não seja encontrado ou haja
* algum problema com ele, uma exceção é gerada.
*/
public Relatorio(Conexao conn, HashMap parameters, String localRelatorio) throws JRException{
try {
// O objeto JasperReport representa o objeto JasperDesign (arquivo .jrxml) compilado.
// Ou seja, o arquivo .jasper
JasperReport jr = (JasperReport)JRLoader.loadObject(localRelatorio);
// JasperPrint representa o relatório gerado.
// É criado um JasperPrint a partir de um JasperReport, contendo o relatório preenchido.
this.jasperPrint_ = JasperFillManager.fillReport(jr, parameters, conn.getConnection());
} catch (JRException e) { throw e; }
}
/**
* Cria um novo Relatorio.
*
* @param conn Conexão com o banco de dados.
* @param sql Expressão SQL (SELECT...) a ser utilizada para preenchimento do relatório
* @param parameters Parâmetros a serem exibidos no relatório.
* @param localRelatorio Localização do relatório.
* @throws JRException Caso o relatório não seja encontrado ou haja
* algum problema com ele, uma exceção é gerada.
* @throws SQLException Caso exista alguma divergência ou problema com
* a Expressão SQL passada como parâmetro, uma exceção é gerada.
*/
public Relatorio(Conexao conn, String sql,
HashMap parameters, URL localRelatorio) throws SQLException, JRException {
try {
// O objeto JasperReport representa o objeto JasperDesign (arquivo .jrxml) compilado.
// Ou seja, o arquivo .jasper
JasperReport jr = (JasperReport)JRLoader.loadObject(localRelatorio);
// Resultado da consulta
ResultSet rs = conn.executeQuery(sql);
// JRResultSetDataSource é uma implementaçao de JRDataSource, o qual é requerido
// como parametro para preencher o relatório criado.
// Ele armazena o dados do ResultSet
JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
// JasperPrint representa o relatório gerado.
// É criado um JasperPrint a partir de um JasperReport, contendo o
// relatório preenchido.
this.jasperPrint_ = JasperFillManager.fillReport(jr, parameters, jrRS);
rs.close();
}
catch (SQLException e) { throw e; }
catch (JRException e) { throw e; }
}
/**
* Cria um novo Relatorio.
*
* @param conn Conexão com o banco de dados.
* @param sql Expressão SQL (SELECT...) a ser utilizada para preenchimento do relatório
* @param parameters Parâmetros a serem exibidos no relatório.
* @param localRelatorio Localização do relatório.
* @throws JRException Caso o relatório não seja encontrado ou haja
* algum problema com ele, uma exceção é gerada.
* @throws SQLException Caso exista alguma divergência ou problema com
* a Expressão SQL passada como parâmetro, uma exceção é gerada.
*/
public Relatorio(Conexao conn, String sql,
HashMap parameters, String localRelatorio) throws SQLException, JRException {
try {
// O objeto JasperReport representa o objeto JasperDesign (arquivo .jrxml) compilado.
// Ou seja, o arquivo .jasper
JasperReport jr = (JasperReport)JRLoader.loadObject(localRelatorio);
// Resultado da consulta
ResultSet rs = conn.executeQuery(sql);
// JRResultSetDataSource é uma implementaçao de JRDataSource, o qual é requerido
// como parametro para preencher o relatório criado.
// Ele armazena o dados do ResultSet
JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
// JasperPrint representa o relatório gerado.
// É criado um JasperPrint a partir de um JasperReport, contendo o
// relatório preenchido.
this.jasperPrint_ = JasperFillManager.fillReport(jr, parameters, jrRS);
rs.close();
}
catch (SQLException e) { throw e; }
catch (JRException e) { throw e; }
}
/**
* Cria um novo Relatorio.
*
* @param parameters Parâmetros a serem exibidos no relatório.
* @param localRelatorio Localização do relatório.
* @throws JRException Caso o relatório não seja encontrado ou haja
* algum problema com ele, uma exceção é gerada.
*/
public Relatorio(HashMap parameters, URL localRelatorio) throws JRException {
try {
// O objeto JasperReport representa o objeto JasperDesign (arquivo .jrxml) compilado.
// Ou seja, o arquivo .jasper
JasperReport jr = (JasperReport) JRLoader.loadObject(localRelatorio);
// JREmptyDataSource é uma implementaçao de JRDataSource, o qual é requerido
// como parametro para preencher o relatório criado.
// Ele armazena o dados do ResultSet, que, neste caso, é vazio
JREmptyDataSource jrEDS = new JREmptyDataSource();
// Jasper Print representa o relatório gerado.
// É criado um JasperPrint a partir de um JasperReport, contendo o
// relatório preenchido.
this.jasperPrint_ = JasperFillManager.fillReport(jr, parameters, jrEDS);
} catch (JRException e) { throw e; }
}
/**
* Cria um novo Relatorio
*
* @param parameters Parâmetros a serem exibidos no relatório.
* @param localRelatorio Localização do relatório.
* @throws JRException Caso o relatório não seja encontrado ou haja
* algum problema com ele, uma exceção é gerada.
*/
public Relatorio(HashMap parameters, String localRelatorio) throws JRException {
try {
// O objeto JasperReport representa o objeto JasperDesign (arquivo .jrxml) compilado.
// Ou seja, o arquivo .jasper
JasperReport jr = (JasperReport) JRLoader.loadObject(localRelatorio);
// JREmptyDataSource é uma implementaçao de JRDataSource, o qual é requerido
// como parametro para preencher o relatório criado.
// Ele armazena o dados do ResultSet, que, neste caso, é vazio
JREmptyDataSource jrEDS = new JREmptyDataSource();
// Jasper Print representa o relatório gerado.
// É criado um JasperPrint a partir de um JasperReport, contendo o
// relatório preenchido.
this.jasperPrint_ = JasperFillManager.fillReport(jr, parameters, jrEDS);
} catch (JRException e) { throw e; }
}
/**
* Exibe o relatório na tela.
*/
public void exibirRelatorio() {
// emite o relatório na tela
// false indica que a aplicação não será finalizada caso o relatório seja fechado
JasperViewer.viewReport(this.jasperPrint_, false);
}
/**
* Grava o relatório em um arquivo de formato pdf.
*
* @param caminhoDestino Caminho onde o arquivo será gravado.
*/
public void exportaParaPdf(String caminhoDestino) throws JRException {
try {
// Gera o arquivo PDF
JasperExportManager.exportReportToPdfFile(this.jasperPrint_, caminhoDestino);
} catch (JRException e) { throw e; }
}
/**
* Grava o relatório em um arquivo de formato html.
*
* @param caminhoDestino Caminho onde o arquivo será gravado.
*/
public void exportaParaHtml(String caminhoDestino) throws JRException {
try {
// Gera o arquivo PDF
JasperExportManager.exportReportToHtmlFile(this.jasperPrint_, caminhoDestino);
} catch (JRException e) { throw e; }
}
/**
* Envia o relatório para impressão, exibindo uma caixa de dialogo de impressão ou não.
*
* @param exibeCaixaDialogo Boolean indicando se será exibida uma caixa de diálogo ou não.
*/
public void imprimir(boolean exibeCaixaDialogo) throws JRException {
try {
// Imprime o relatório
// o segundo parâmetro indica se existirá uma caixa de dialogo antes ou nao
JasperPrintManager.printReport(this.jasperPrint_, exibeCaixaDialogo);
} catch (JRException e) { throw e; }
}
}
Tem duas maneiras de utilizar uma query dinâmica:
Uma é enviar a query via parâmetro e utilizar em “report query” algo tipo $P!{QUERY}, onde QUERY é o nome do parâmetro, não esquecendo o “!”, pois sem o “!” só é possível utilizá-lo na cláusula WHERE.
A outra maneira é montar um resultset ou um array de objetos ou maps na tua aplicação e mandar para o report… neste caso pode-se fazer o que quiser na montagem de dados, desde que utilize os mesmos campos que foram definidos no report.
Por favor,
eu tenho uma classe para gerar o relatorio, mas o eclipse está me mostrando um erro na classe: JasperDesign, vc sabe o pq? o código é o seguinte:
OBS: O que está em negrito é o que está com erro, acho que deve ser a falta de algum , jar, vc sabe me ajudar? obrigado!
public Relatorio() {
/* Efetua a conexao a base de dados e coleta os valores da base de dados armazenando-os
em um array para ser futuramente utilizado <em>/
try {
if (con == null) {
Class.forName(driver);
con = DriverManager.getConnection(endereco, user, pass);
Statement statement = con.createStatement();
rs = statement.executeQuery(“select * from cmn_listarJornalista”);
HashMap teste = new HashMap();
while(rs.next()) {
//for até o numero de campos da tabela
for (int i = 1; i < 10; i++) {
valores[i] = rs.getString(i);
}
}
}
}
catch (Exception e) {
System.err.println(“Problemas apresentados na operacao de conexao”);
e.printStackTrace();
}
/</em> Inicio do bloco que ira gerar nossos relatorios*/
try {
String array[] = valores;
JasperDesign design = JasperManager.loadXmlDesign(dir + “nrelDeclaracaoEstadoCivil.jrxml”);
JasperReport jr = JasperManager.compileReport(design);
HashMap parameters = new HashMap();
parameters.put(“nome”,array[1]);
parameters.put(“emailPesquisa”, array[2]);
parameters.put(“nomeVeiculoPesquisa”, array[5]);
JasperViewer jrviewer = new [b]JasperViewer<a>/b</a>;
jrviewer.show();
}
catch (Exception e) {
e.printStackTrace();
}
}
Tem duas maneiras de utilizar uma query dinâmica:Uma é enviar a query via parâmetro e utilizar em “report query” algo tipo $P!{QUERY}, onde QUERY é o nome do parâmetro, não esquecendo o “!”, pois sem o “!” só é possível utilizá-lo na cláusula WHERE.
Perfeito !
Esse ponto de exclamação (!) foi minha salvação
Tem algum tutorial aqui no GUJ que cite os “modificadores” para os parametros ? Pq os tutoriais que achei na internet são meio fracos.
Alguém sabe como faz pra retornar pdf’s com gráficos gerados pelo ireport no browser usando uma aplicação???
Tipo,
Tenho um relatório com uma query dentro dele e com um gráfico de barras a ser gerado… dai eu quero que esse pdf saia no browser usando uma aplicação web.
Se alguém souber e puder me ajudar eu agradeço muito porque o que eu consegui fazer não é muito prático e eu uso várias classe pra gerar um figura. Nada muito elegante. Quero uma coisa mais simples. Tipo relatorio, gráfico, query e algum servelet para colocar isso no browser. Vlw
eu particularmente prefiro passa uma lista de objetos
faço o filtro na aplicação, ai vc pode aproveitar o mesmo relatorio
pra vario casos
Assim eu conseguir fazer mas vai complicar a minha vida, preciso de alguma coisa do tipo. Criar o relatorio com a query e com o relatorio e passar a query para o relatorio e não para a classe.
eu particularmente prefiro passa uma lista de objetos
faço o filtro na aplicação, ai vc pode aproveitar o mesmo relatorio
pra vario casos
Costumo fazer assim e ao meu ver é a forma mais simples.
Concordo!
Me mostra o código que vocês usam então… dependendo se for mais simples mesmo eu posso utilizar, caso contrário eu continuo tentando… =) Não custa tentar
Porque o modo que eu to fazendo o jasper que fica na pasta de relatorios é um relatorio que nem gráfico não tem, ele tem uma imagem e encima dessa imagem que é colocado o gráfico JFreeChart… é muita loucura…
Olá… estou com um problema chato no iReport.
Tinha feito a seguinte query:
SELECT
*,
Usuario.`nome` AS Usuario_nome,
Usuario.`nomeUsuario` AS Usuario_nomeUsuario
FROM
`Usuario` Usuario
WHERE
nome = $F{nome}
Mas o iReport aponta o seguinte erro na validação da query:
Error:SQL problems: Unknown column '$F' in 'where clause'
Eu coloquei o ! como vi acima, mas aí o iReport diz que ocorre um erro de sintaxe.
Alguém já passou por isso.
Faz um tempo que eu não mexo com o IReport mas faça o segunte… verifique se tem esse field nome foi criado… $F{} é um text field no seu arquivo. Verifica se ele realmente existe no modo gráfico pois pelo que eu entendi do erro ele pode não estar encontrando esse $F{nome}. Qualquer coisa posta ai ! Espero ter ajudado 