JRResultSetDataSource

Galera, alguem pode me ajudar:
Tenho um relatorio em jrxml pronto com uma consulta e na classe em que uso ele faço outra query usando JRREsultSetDataSource para personalizar a data de abrangencia da pesquisa, porem quando o relatorio é gerado pela classe se não encontra nenhum resultado da query personalizada ele faz uso da query padrão do relatório gerado no IReports…alguem sabe como impedir que ele faça isso?

Como vc está utilizando para fazer a chamada do relatório?

Olha o trecho de código

 onnection con = getConnection( );
Statement stm = con.createStatement( );
String query = "select * from visita where nome = 'arochafademac'";
ResultSet rs = stm.executeQuery( query );
JRResultSetDataSource jrRS = new JRResultSetDataSource( rs );
JasperReport report = JasperCompileManager.compileReport("Relatorios/visita.jrxml");

Map parameters = new HashMap();
JasperPrint printer = JasperFillManager.fillReport(report, parameters, jrRS);
viewer.setVisible(true);

No IREPORT a query é “select * from visita”.
Como eu disse se ele não encontra nenhum registro para ‘arochafademac’ ele usa aquery padrão ‘*’;

Obrigado pela ajuda

Bom dia arochafademac!
Não eh exatamente a solução para seu problema,
mas talvez pode ajuda-lo.
Eu não gosto de fazer relatórios criando consultas no IReport, então
eu crio todas as variaveis, fields que preciso na mão e depois passo para o relatório os dados por JRResultSetDataSource personalizado.

code:
public class JasperUtil {

public static void gerarRelatorio(List dados, String nomeRelatorio) throws JRException, Exception {
    JPRDataSource ds = new JPRDataSource(dados);
    JasperPrint jasperPrint = JasperFillManager.fillReport(nomeRelatorio + ".jasper", new HashMap(), ds);
    JasperViewer.viewReport(jasperPrint, false);
}

/* Gera Relatorio e visualiza-o */
public static void gerarRelatorio(ResultSet rs, String nomeRelatorio) throws JRException, Exception {
    JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
    JasperPrint jasperPrint = JasperFillManager.fillReport(nomeRelatorio + ".jasper", new HashMap(), jrRS);
    JasperViewer.viewReport(jasperPrint);
}

public static void gerarRelatorio(JPRDataSource dados, String nomeRelatorio) throws JRException, Exception {
    JasperPrint jasperPrint = JasperFillManager.fillReport(nomeRelatorio + ".jasper", new HashMap(), dados);
    JasperViewer.viewReport(jasperPrint);
}

}

/** Classe usada para mostrar dados no relatório sem a necessidade

  • de um ResultSet.
    */
    class JPRDataSource implements JRDataSource {

    //Vector que conterá outro(s) vector(s)
    //com os dados do relatório.
    private Vector dados = null;
    //Posição atual. Funciona como um ResultSet,
    //a posição inicial eh sempre -1.
    private int posic = -1;
    //Para enconomizar, configura esta variável com os
    //campos que serão realmente utilizados no relatório.
    //Se esta variável não for configura diretamente pelo
    //programador, ela será automaticamente setada com os
    //nomes dos campos do bean.
    //Exemplo: Cliente com clienteId, nome, tipo
    //então, fieldsName = ["clienteId", "nome", "tipo"]
    private String[] fieldsName = null;

    public JPRDataSource(List beans) {
    this(beans, null);
    }

    public JPRDataSource(List beans, String[] fieldsShow) {
    this.dados = new Vector();
    if (fieldsShow != null) {
    this.fieldsName = fieldsShow;
    } else if (beans != null && beans.size() &gt 0) {
    setFieldsName(beans.get(0));
    }
    for (Object o : beans) {
    this.addValue(o);
    }
    }

    /**Método que recebe um bean (Cliente, Usuario, Produto)

    • e converte internamente este bean em um vector.
      */
      private void addValue(Object bean) {
      dados.add(convertBeanToVector(bean));
      }

    /**Método que recebe um vector contendo todos os dados

    • quere serão usados na impressão.
    • Se ja existir algum dado, este será excluido.
      */
      private void setValues(Vector dados) {
      this.dados = dados;
      }

    public boolean next() throws JRException {
    if (dados == null || dados.size() == 0) {
    return false;
    }
    if (posic &gt= (dados.size() - 1)) {
    return false;
    } else {
    posic++;
    return true;
    }
    }

    public Object getFieldValue(JRField field) throws JRException {
    return ((Vector) dados.get(posic)).get(getFieldIndex(field.getName()));
    }

    /**Método que recebe um bean (Cliente, Usuario por exemplo) e os campos

    • que serão exibidos e retorna um Vector com os valores dos campos.
    • Se o parametro fieldsShow for null, então serão armazenados todos
    • os campos do bean no vector.
      */
      private Vector convertBeanToVector(Object bean) {
      Field[] fields = bean.getClass().getDeclaredFields();
      Vector v = new Vector();
      //Se o programador necessitar não informar os campos que
      //será usandos o método converterá o bean inteiro para um vector.
      for (String nameField : fieldsName) {
      for (Field f : fields) {
      if (f.getName().equalsIgnoreCase(nameField)) {
      try {
      v.addElement(f.get(bean));
      break;
      } catch (Exception ex) {
      ex.printStackTrace();
      }
      }
      }
      }
      return v;
      }

    //Usado internamente para localizar o nome do campo no array
    private int getFieldIndex(String fieldName) {
    for (int i = 0; i &lt fieldsName.length; i++) {
    if (fieldsName[i].equalsIgnoreCase(fieldName)) {
    return i;
    }
    }
    return -1;
    }

    //Caso não seja setado diretamente os campos que serão
    //realmente usados no relatório, este método será usado
    //para setar fieldsName com todos os fields do bean.
    private void setFieldsName(Object bean) {
    Field[] fields = bean.getClass().getDeclaredFields();
    fieldsName = new String[fields.length];
    for (int i = 0; i &lt fields.length; i++) {
    fieldsName[i] = fields[i].getName();
    }
    }

    /** Campos que serão usados no relatório.

    • Isso servirá em momentos que vc tem um bean (cliente, usuario)
    • mas não irá usar todos os campos do bean no relatório,
    • então, para economizar, passe um array de string com os campos
    • que realmente serão utilizados no relatório.
      */
      public void setShowFields(String[] showFields){
      this.fieldsName = showFields;
      }
      }

Tente usar isso, se tiver algum problema, me avise por favor.
geraldoimidias@hotmail.com

Vc tentou remover a query do relatório?

Desculpe-me pelo código da mensagem anterior

public class JasperUtil {

    public static void gerarRelatorio(List dados, String nomeRelatorio) throws JRException, Exception {
        JPRDataSource ds = new JPRDataSource(dados);
        JasperPrint jasperPrint = JasperFillManager.fillReport(nomeRelatorio + ".jasper", new HashMap(), ds);
        JasperViewer.viewReport(jasperPrint, false);
    }
    
    /* Gera Relatorio e visualiza-o */
    public static void gerarRelatorio(ResultSet rs, String nomeRelatorio) throws JRException, Exception {
        JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);
        JasperPrint jasperPrint = JasperFillManager.fillReport(nomeRelatorio + ".jasper", new HashMap(), jrRS);
        JasperViewer.viewReport(jasperPrint);
    }

    public static void gerarRelatorio(JPRDataSource dados, String nomeRelatorio) throws JRException, Exception {
        JasperPrint jasperPrint = JasperFillManager.fillReport(nomeRelatorio + ".jasper", new HashMap(), dados);
        JasperViewer.viewReport(jasperPrint);
    }
}

/** Classe usada para mostrar dados no relatório sem a necessidade
 *  de um ResultSet.
 */
class JPRDataSource implements JRDataSource {

    //Vector que conterá outro(s) vector(s)
    //com os dados do relatório.
    private Vector dados = null;
    //Posição atual. Funciona como um ResultSet,
    //a posição inicial eh sempre -1.
    private int posic = -1;
    //Para enconomizar, configura esta variável com os 
    //campos que serão realmente utilizados no relatório.
    //Se esta variável não for configura diretamente pelo
    //programador, ela será automaticamente setada com os
    //nomes dos campos do bean.
    //Exemplo: Cliente com clienteId, nome, tipo
    //então, fieldsName = ["clienteId", "nome", "tipo"]
    private String[] fieldsName = null;


    public JPRDataSource(List beans) {
        this(beans, null);
    }

    public JPRDataSource(List beans, String[] fieldsShow) {
        this.dados = new Vector();
        if (fieldsShow != null) {
            this.fieldsName = fieldsShow;
        } else if (beans != null && beans.size() &gt 0) {
            setFieldsName(beans.get(0));
        }
        for (Object o : beans) {
            this.addValue(o);
        }
    }
    
    /**Método que recebe um bean (Cliente, Usuario, Produto)
     * e converte internamente este bean em um vector.
     */
    private void addValue(Object bean) {
        dados.add(convertBeanToVector(bean));
    }

    /**Método que recebe um vector contendo todos os dados
     * quere serão usados na impressão.
     * Se ja existir algum dado, este será excluido.
     */
    private void setValues(Vector dados) {
        this.dados = dados;
    }

    public boolean next() throws JRException {
        if (dados == null || dados.size() == 0) {
            return false;
        }
        if (posic &gt= (dados.size() - 1)) {
            return false;
        } else {
            posic++;
            return true;
        }
    }

    public Object getFieldValue(JRField field) throws JRException {
        return ((Vector) dados.get(posic)).get(getFieldIndex(field.getName()));
    }

    /**Método que recebe um bean (Cliente, Usuario por exemplo) e os campos
     * que serão exibidos e retorna um Vector com os valores dos campos.
     * Se o parametro fieldsShow for null, então serão armazenados todos
     * os campos do bean no vector.
     */
    private Vector convertBeanToVector(Object bean) {
        Field[] fields = bean.getClass().getDeclaredFields();
        Vector v = new Vector();
        //Se o programador necessitar não informar os campos que
        //será usandos o método converterá o bean inteiro para um vector.
        for (String nameField : fieldsName) {
            for (Field f : fields) {
                if (f.getName().equalsIgnoreCase(nameField)) {
                    try {
                        v.addElement(f.get(bean));
                        break;
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }
        }
        return v;
    }

    //Usado internamente para localizar o nome do campo no array
    private int getFieldIndex(String fieldName) {
        for (int i = 0; i &lt fieldsName.length; i++) {
            if (fieldsName[i].equalsIgnoreCase(fieldName)) {
                return i;
            }
        }
        return -1;
    }

    //Caso não seja setado diretamente os campos que serão 
    //realmente usados no relatório, este método será usado
    //para setar fieldsName com todos os fields do bean.
    private void setFieldsName(Object bean) {
        Field[] fields = bean.getClass().getDeclaredFields();
        fieldsName = new String[fields.length];
        for (int i = 0; i &lt fields.length; i++) {
            fieldsName[i] = fields[i].getName();
        }
    }
    
    /** Campos que serão usados no relatório.
     * Isso servirá em momentos que vc tem um bean (cliente, usuario)
     * mas não irá usar todos os campos do bean no relatório,
     * então, para economizar, passe um array de string com os campos
     * que realmente serão utilizados no relatório.
     */ 
    public void setShowFields(String[] showFields){
        this.fieldsName = showFields;
    }
}

Pode me explicar como fazer para remover a query?

No IReport:

Data / Report Query

Apaga a query, dá ok e salva.

Até mais!

Removi a query mas o problema continua…acho q a consulta que estou executando que está dando pau…olha um exemplo de como ela é:

"select v.numero, v.visitante, v.visitado, vp.placa, v.datae, v.datas, v.obs from visita v left joint visitaveiculo vp on (vp.visitanum = v.num) where v.visitante = 'andre' and v.datae between '10/01/07' and 20/01/2007'".

Tá ocorrendo que quando ele não encontra no periodo especificado ele busca todos que contenham andre…sabe oq ta errado?

Que banco que você está usando? Acho que a formatação da data tem problemas.

Tenta formatar usando padrão yyyy-MM-dd

Ficaria assim:

'2007-01-10' and '2007-01-20'

Se vc copiou sua query do seu código tbm está faltando uma aspas simples antes da segunda data (ja coloquei no exemplo acima)

Até mais!

Desculpe…eu não fui feliz no exemplo…mas no código está formatado corretamente antes da consulta…só quis exemplificar…inclusive executando a query e mostrando o retorno vem tudo certinho…mas o jasper que está gerando o problema que mensionei…