Erro em fazer pesquisa entre Datas

11 respostas
L

Estai o banco completo, sendo 3 movimentções por dia

http://www.mh2img.net/showoriginal-39690/pesquisa__entre_datas_1.png

Na hora que vou fazer a pesquisa somente de um dia, mostra duas transações sendo que foram tres.

http://www.mh2img.net/showoriginal-39692/pesquisa__entre_datas_2.png

try
     {  
      String sql="SELECT * FROM relatControleBancario WHERE horaData  BETWEEN '"+tf_dataInicial.getText()+"' AND '"+tf_dataFinal.getText()+"'";  
      con_relatControleBancario.executeSQL(sql);  
      con_relatControleBancario.resultset.first();                     
     }  
     catch(SQLException erro)  
     {  
      JOptionPane.showMessageDialog(null,"erro de sql"+ erro);     
     } 
    preencherGrade();//preenche fTable...com o resultado da pesquisa
    somaEntradas();//soma resultado da pesquisa 
    somaRetiradas();//soma resultado da pesquisa

acredito que seja devido a questão de iniciar 123… tem que ser 0123…

11 Respostas

B

Não consigo ver as imagens, mas dê uma olhada nos parâmetros que está passando, se não está occorrendo um problema de limites. Por exemplo, se você passar o inicio como 23/02/2010, e a data fim como 24/02/2010, o banco pode interpretar como 24/02/2010 00:00:00.000, quando na verdade você quer que ele cheque até 24/02/2010 23:59:59.999. Um relatório do meio dia dia 24 não apareceria no primeiro caso.

Z

Concordo com o Bruno, já cai muito nessas…

pmlm

Mostra ai o preencherGrade. Talvez seja aquele con_relatControleBancario.resultset.first(); que esteja a mais.

L
public void preencherGrade()
   {
        jt_relatControleBancario.getColumnModel().getColumn(0).setPreferredWidth(40);
        jt_relatControleBancario.getColumnModel().getColumn(1).setPreferredWidth(40);
        jt_relatControleBancario.getColumnModel().getColumn(2).setPreferredWidth(40);
        jt_relatControleBancario.getColumnModel().getColumn(3).setPreferredWidth(40);
        jt_relatControleBancario.getColumnModel().getColumn(4).setPreferredWidth(40);

        DefaultTableModel modelo = (DefaultTableModel)jt_relatControleBancario.getModel();
       modelo.setNumRows(0);
       
       try
       {
           while(con_relatControleBancario.resultset.next())
           modelo.addRow(new Object [] {con_relatControleBancario.resultset.getString("codigo")
           ,con_relatControleBancario.resultset.getString("entradas")
           ,con_relatControleBancario.resultset.getString("retiradas"),
           con_relatControleBancario.resultset.getString("operador")
           ,con_relatControleBancario.resultset.getString("horaData")});
           con_relatControleBancario.executeSQL("SELECT * FROM relatControleBancario");
           con_relatControleBancario.resultset.first();//aqui ???
       }
       catch(SQLException erro)
       {
         JOptionPane.showMessageDialog(null,"Erro ao Carregar Tabela"," .::S.A.F::. Informa",JOptionPane.ERROR_MESSAGE);
       }
   }
pmlm

Tal como eu suspeitava, estás a fazer first() e depois next(), e só depois é que tratas os valores do resultset. Ou seja, nunca vais apanhar a primeira linha.
Tira a linha con_relatControleBancario.resultset.first();

Scoobydoo

Uhum… é uma possibilidade…
Se você notar, a data 24 que não está aparecendo é do código 141 <- o Primeiro código que veio no seu select…

try { String sql="SELECT * FROM relatControleBancario WHERE horaData BETWEEN '"+tf_dataInicial.getText()+"' AND '"+tf_dataFinal.getText()+"'"; con_relatControleBancario.executeSQL(sql); con_relatControleBancario.resultset.first(); // Esse aqui você tem que tirar }

Esse first ali está indo para o 1º código(141)…
quando voce executa o procedimento seu select ja está na primeira linha…
Porém, voce da um resultset.next() > indo para a 2 linha(142)

E

Uma vez recebi até um documento de um cliente nosso que indicava, entre as boas práticas de SQL, tomar cuidado com isso.
Como na base dele havia muitos campos de data (timestamp), era preciso sempre checar isso.
Como não havia transações que fossem exatamente às 00:00 no caso dele, ele simplesmente indicava que o “and” era para ser feito para o próximo dia, para simplificar e não precisar pôr “23:59:59.999”.

L

private void jb_pesquisarActionPerformed(java.awt.event.ActionEvent evt) { try { String sql = "SELECT * FROM relatControleBancario WHERE horaData BETWEEN '"+jf_tf_dataInicial.getText()+"' AND '"+jf_tf_dataFinal.getText()+"'"; con_relatControleBancario.executeSQL(sql); con_relatControleBancario.resultset.previous();//entendi a lógica, substitui por previous(), funcionou Beleza; obg Scoobydoo. } catch(SQLException erro) { JOptionPane.showMessageDialog(null,"erro de sql"+ erro); } preencherGrade(); somaEntradas(); somaRetiradas();

Obg a todos;

pmlm

Não tens de por previous. Simplesmente tira a linha.

L

simplismente retirei e não funcionou…que será???

pmlm

No preencherGrade estás a fazer uma query depois de adicionar as linhas à tabela.

Isso vai fazer com que os teus metodos somaEntradas() e somaRetiradas() dêem valores incorrectos com o resultado da pesquisa.

Para garantir que o resultSet está na posição correcta, e uma vez que o usas 3 vezes, faz um beforeFirst() antes de cada utilização (preencheGrade, somaEntradas e somaRetiradas)

(...)
 try {  
       con_relatControleBancario.resultset.beforeFirst();
       while(con_relatControleBancario.resultset.next())  
             modelo.addRow(new Object [] {con_relatControleBancario.resultset.getString("codigo"),
                     con_relatControleBancario.resultset.getString("entradas"),  
                     con_relatControleBancario.resultset.getString("retiradas"),  
                     con_relatControleBancario.resultset.getString("operador"),  
                     con_relatControleBancario.resultset.getString("horaData")});  

 }  catch(SQLException erro)  
 (...)
Criado 24 de fevereiro de 2010
Ultima resposta 25 de fev. de 2010
Respostas 11
Participantes 6