iReport - construção de gráfico/query dinâmica

11 respostas
2

iReport - construção de gráfico/query dinâmica

11 Respostas

M

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; }
        
    }
    
    
    
}
M

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.

L

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();

}

}
J

mutano:
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.

A

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

R

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

A

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.

M

Robsonvnt:
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!

A

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…

B

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.

A

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 :smiley:

Criado 4 de agosto de 2006
Ultima resposta 14 de jul. de 2010
Respostas 11
Participantes 9