Atualizar vários registros de uma vez

boa tarde a todos!

eu estava querendo fazer o seguinte: tenho um textfield que será inserido um preço de combustível (o qual é quinzenal) que quando clicado no botão ele pegasse o valor deste textfield, multiplicasse pela quantidade de litros de cada abastecimento assim obtendo um “valor total” o qual seria inserido(nesse caso atuallizado) no campo valor_tot da tabela de abastecimento. Tentei fazer assim:

try
{
            con_abast.executaSQL("select * from abastecimento where comb_id = 1 and abast_data between 'xx/xx/xxxx' and  'xx/xx/xxxx' order by id_abast"); //trazendo apenas os registros que são gasolina(comb_id) e estao dentro das datas corretas
            con_abast.resultse.first(); //aponta pro primeiro registro do resultset
            do
            {
                Id = con_abast.resultse.getInt("id_abast"); //pega o id do primeiro abastecimento do resultset
                Litros = con_abast.resultse.getDouble("litros"); //pega a quantidade de litros do primeiro abastecimento do resultset
                ValorTotal = ((Double.parseDouble(tf_valorquin.getText())) * Litros); //calcula o valor total
                String sqledita = "update abastecimento set valor_tot = "+ValorTotal+" where id_abast = "+Id;
                con_abast.statmen.executeUpdate(sqledita); //executa a atualização
            }
            while (con_abast.resultse.next());
            JOptionPane.showMessageDialog(null, "atualizado com sucesso");
        }
        catch (SQLException ex)
        {
            JOptionPane.showMessageDialog(null, "Erro = "+ex);
        }

Ele chega a executar a primeira vez bem certinho e atualiza no banco, mas qnd vai tentar ir pro próximo registro ele cai no catch e para… mesmo clicando no botao novamente ele não grava mais e apenas continua dando a a msg: org.postgresql.util.PSQLException: Este ResultSet está fechado.

Aonde estaria o erro neste caso? talvez na classe de conexão? segue ela:

import java.sql.*;
import javax.swing.*;

public class conexao
{
    final private String driver = "org.postgresql.Driver";
    final private String url = "jdbc:postgresql://10.0.55.126/postgres";
    final private String usuario = "postgres";
    final private String senha = "postgres";
    private Connection conexao;
    public Statement statmen;
    public ResultSet resultse;

     public boolean conecta()
    {
         boolean resultado = true;

         try
         {
             Class.forName(driver);
             conexao = DriverManager.getConnection(url, usuario, senha);
         }
         catch(ClassNotFoundException drive)
         {
             JOptionPane.showMessageDialog(null, "Driver não loclizado: "+drive);
             resultado = false;
         }
         catch(SQLException banco)
         {
            JOptionPane.showMessageDialog(null, "Erro na conexão com o banco de dados: "+banco);
            resultado = false;
         }
         return resultado;
    }

     public void desconecta()
    {
         boolean resultado = true;
         try
         {
             conexao.close();
             JOptionPane.showMessageDialog(null, "desconectou");
         }
         catch(SQLException errobanco)
         {
             JOptionPane.showMessageDialog(null, "Não foi possível fechar o banco de dados: "+errobanco);
             resultado = false;
         }
    }

     public void executaSQL(String sql)
    {
         try
         {
             statmen = conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
             resultse = statmen.executeQuery(sql);
         }
         catch(SQLException sqlex)
         {
            JOptionPane.showMessageDialog(null, sqlex);
         }
     }
}

Obrigado.

Oi, awaybr

Parece que o problema é que você está executando updates enquanto você percorre o ResultSet. Não tenho certeza, mas acho que quando você manda sua classe de conexão executar o SQL de atualizar o registro ele tem que fechar o ResultSet anterior. Acho que você teria que guardar os resultados da sua conta para depois fazer todas as atualizações de uma vez. Apesar de que eu acho que, dependendo do banco de dados que você está usando (não sei se o Postgres aceita isso; o MySQL aceita), você pode fazer o update direto com essa conta que o banco resolve. Algo do tipo:

con_abast.executaSQL("update abastecimento set valor_tot = litros * " + tf_valorquin.getText() + " where comb_id = 1 and abast_data between 'xx/xx/xxxx' and  'xx/xx/xxxx'");

olá sr.saude, obrigado pela resposta

pois então como eu poderia proceder neste caso? ou teria alguma outra forma diferente de fazer isso?

mas neste caso aqui

con_abast.executaSQL("update abastecimento set valor_tot = litros * " + tf_valorquin.getText() + " where comb_id = 1 and abast_data between 'xx/xx/xxxx' and  'xx/xx/xxxx'"); 

me desculpa se eu não estiver entendido bem e estiver falando bobagem mas ele iria atualizar todos os registros com o msm valor_tot não? e no caso cada quantidade de litros difere de registro para registro e tbm no caso teria que usar con_abast.statmen.executeUpdate(sql...) né, pq o con_abast.executaSQL só executa consultas

awaybr,

seu código está muito misturado, o ideal é vc pegar os dados do textfield e guardar num Bean, ter um método só para o seu update e outro para consulta.

Dá uma olhada na apostila da caelum a fJ11, pois vai clarear bastante suas idéias.

flw!

No caso do update ele vai atualizar com um valor diferente para cada registro. Ele faz a conta para cada registro que ele vai atualizar, pegando os litros de cada registro de uma vez. Mas é com o executeUpdate, sim… Falha minha :roll:

Agora, o que o gilmaslima é verdade: sua classe de conexão está expondo muita coisa para quem usa ela. Qualquer você precisar mexer nela, possivelmente vai ter que mexer em muitos lugares. E, por outro lado, o que ela faz não me parece muito claro… Também recomendo uma lida na apostila da Caelum :wink:

É realmente nao parei pra analisar o update direito, apenas li um vez bem rápido e já fui falando hehe, minhas desculpas :lol:
deu certinho, obrigado =)

agradeço pela ajuda de todos, irei sim ler essas apostilas entre outros materiais pois comecei com java a menos de 1 mes, sou bem iniciante, vim de linguagens de bem baixo nivel hehe mas é q precisava terminar esse aplicativinho até a outa semana. mas assim q terminar aqui vou começar os estudos.