Atualizando valores de uma JTable

Bom dia, estou tentando fazer uma vizualização em uma jtable e não sei onde eu estou errando, talvez alguém que não esteja envolvido no projeto encontre logo de primeira o meu erro :S.

Tenho essa tabela:

http://i414.photobucket.com/albums/pp227/carlosfontana/Semttulo.jpg

Quando eu realizo uma operação de acerto de estoque a coluna “Quantidade” demonstra as quantidades de cada operação, mas as colunas “Est. Anterior” e “Est. Atual” repetem o valor para todas as operações, é isso que eu não estou entendendo.

Esta é a forma em que eu atualizo o coluna “Quantidade”

public static final String ACERTOESTOQUEENTRADA = "UPDATE PRODUTO SET PRODQUANTIDADE = PRODQUANTIDADE + ? WHERE PRODCODIGO = ?";
public static final String ACERTOESTOQUESAIDA = "UPDATE PRODUTO SET PRODQUANTIDADE = PRODQUANTIDADE - ? WHERE PRODCODIGO = ?";

public boolean acertoEstoqueEntrada() {
        try {
            PreparedStatement ps = BancoDados.getConexao().prepareStatement(ACERTOESTOQUEENTRADA);
            ps.setInt(1, getAcertoEstQuantidade());
            ps.setInt(2, produto.getProdCodigo());
            ps.execute();
            return true;
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "Não foi possível alterar o estoque!");
                e.printStackTrace();
                return false;
            }
    }

    public boolean acertoEstoqueSaida() {
        try {
            PreparedStatement ps = BancoDados.getConexao().prepareStatement(ACERTOESTOQUESAIDA);
            ps.setInt(1, getAcertoEstQuantidade());
            ps.setInt(2, produto.getProdCodigo());
            ps.execute();
            return true;
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "Não foi possível alterar o estoque!");
                e.printStackTrace();
                return false;
            }
    }

Para as colunas “Est. Anterior” e “Estoque Atual” eu utilizo o mesmo processo porém, no comando SQL eu altero o “SET PRODQUANTIDADE” para “SET PRODQUANTANTER” para a coluna “Est. Anterior” e “SET PRODQUANTATUAL” para a coluna “Est. Atual”. Tentei fazer Trigger mas não consegui :S

Desde já agradeço!

Executei seu código e o banco foi alterado aqui… fiz desta forma:

package conexao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.swing.JOptionPane;

class Exemplo1 {
	Produto produto = new Produto();
	public static final String ACERTOESTOQUEENTRADA = "UPDATE PRODUTO SET PRODQUANTIDADE = PRODQUANTIDADE + ? WHERE PRODCODIGO = ?";  
	public static final String ACERTOESTOQUESAIDA = "UPDATE PRODUTO SET PRODQUANTIDADE = PRODQUANTIDADE - ? WHERE PRODCODIGO = ?";  

	int getAcertoEstQuantidade(){
		return 3;
	}
	
	public boolean acertoEstoqueEntrada() {  
        try {  
            PreparedStatement ps = BancoDados.getConexao().prepareStatement(ACERTOESTOQUEENTRADA);  
            ps.setInt(1, getAcertoEstQuantidade());  
            ps.setInt(2, produto.getProdCodigo());  //esta fixo retornando 1
            ps.execute();  
            return true;  
            } catch (Exception e) {  
                JOptionPane.showMessageDialog(null, "Não foi possível alterar o estoque!");  
                e.printStackTrace();  
                return false;  
            }  
    }  
	
	public boolean acertoEstoqueSaida() {  
        try {  
            PreparedStatement ps = BancoDados.getConexao().prepareStatement(ACERTOESTOQUESAIDA);  
            ps.setInt(1, getAcertoEstQuantidade());  
            ps.setInt(2, produto.getProdCodigo());  
            ps.execute();  
            return true;  
            } catch (Exception e) {  
                JOptionPane.showMessageDialog(null, "Não foi possível alterar o estoque!");  
                e.printStackTrace();  
                return false;  
            }  
    }  

	public static void main(String args[]) {
		Exemplo1 ex1 = new Exemplo1();
		ex1.acertoEstoqueEntrada();
		
	}
	
}
class BancoDados{
	public static Connection getConexao() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException{
		
		Class.forName("com.mysql.jdbc.Driver").newInstance();

		return  DriverManager.getConnection("jdbc:mysql://localhost:3306/titan", "root", "root");
	}
}

Aqui o banco voi atualizado normalmente… ou seja o problema deve ser no seu codigo que monta a tabela, de forma a popular os objetos com o estado
atuallizado no banco…

Blz ribclauport, para a coluna “Quantidade” esse código já está funcionando, o problema é que eu utilizei a mesma forma (porém alterando o campo PRODQUANTIDADE PARA PRODQUANTATUAL e PRODQUANTANTER), mas ele atualiza o campo PRODQUANTATUAL/PRODQUANTANTER para todas as operações, pretendo que fique sempre atualizado a coluna Est. Atual / Est. Anterior.
Exemplo:

Realizei um acerto de estoque (Sequência - 1) com entrada na quantidade de 5 para um produto que já possui uma quantidade 5, logo em seguida fiz mais uma operação de entrada (Sequência - 2) com entrada na quantidade de 5 para o mesmo produto, então ficaria:

Sequência - Quantidade da Operação - Est. Anterior - Est. Atual

  1_______________5_________________5__________10
  2_______________5________________10__________15

Mas está atualizando o último valor para todas as operações “Est. Anterior” e "Est. Atual:

Sequência - Quantidade da Operação - Est. Anterior - Est. Atual

  1_______________5_________________10___________15
  2_______________5_________________10___________15

Enão poste o código com a alteração dos metodos como eles ficaram ae eu rodo aqui e verifico, pois é necessário ter o codigo da forma que ele está sendo executado ae blz?

aguardo.

public static final String ACERTOQUANTIDADEESTOQUEATUALENTRADA = "UPDATE PRODUTO SET PRODQUANTATUAL = PRODQUANTATUAL + ? WHERE PRODCODIGO = ?";
public static final String ACERTOQUANTIDADEESTOQUEATUALSAIDA = "UPDATE PRODUTO SET PRODQUANTATUAL = PRODQUANTATUAL - ? WHERE PRODCODIGO = ?";


public static final String ACERTOQUANTIDADEESTOQUEANTERIORENTRADA = "UPDATE PRODUTO SET PRODQUANTANTER = PRODQUANTANTER + ? WHERE PRODCODIGO = ?";
public static final String ACERTOQUANTIDADEESTOQUEANTERIORSAIDA = "UPDATE PRODUTO SET PRODQUANTANTER = PRODQUANTANTER - ? WHERE PRODCODIGO = ?";


public boolean acertoQuantidadeEstoqueAnteriorEntrada() {
        try {
            PreparedStatement ps = BancoDados.getConexao().prepareStatement(ACERTOQUANTIDADEESTOQUEANTERIORENTRADA);
            ps.setInt(1, getAcertoEstQuantidade());
            ps.setInt(2, produto.getProdCodigo());
            ps.execute();
            return true;
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "Não foi possível atualizar o estoque anterior!");
                e.printStackTrace();
                return false;
            }
    }

    public boolean acertoQuantidadeEstoqueAnteriorSaida() {
        try {
            PreparedStatement ps = BancoDados.getConexao().prepareStatement(ACERTOQUANTIDADEESTOQUEANTERIORSAIDA);
            ps.setInt(1, getAcertoEstQuantidade());
            ps.setInt(2, produto.getProdCodigo());
            ps.execute();
            return true;
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "Não foi possível atualizar o estoque anterior!");
                e.printStackTrace();
                return false;
            }
    }

    public boolean acertoQuantidadeEstoqueAtualEntrada() {
        try {
            PreparedStatement ps = BancoDados.getConexao().prepareStatement(ACERTOQUANTIDADEESTOQUEATUALENTRADA);
            ps.setInt(1, getAcertoEstQuantidade());
            ps.setInt(2, produto.getProdCodigo());
            ps.execute();
            return true;
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "Não foi possível atualizar o estoque atual!");
                e.printStackTrace();
                return false;
            }
    }

    public boolean acertoQuantidadeEstoqueAtualSaida() {
        try {
            PreparedStatement ps = BancoDados.getConexao().prepareStatement(ACERTOQUANTIDADEESTOQUEATUALSAIDA);
            ps.setInt(1, getAcertoEstQuantidade());
            ps.setInt(2, produto.getProdCodigo());
            ps.execute();
            return true;
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "Não foi possível atualizar o estoque atual!");
                e.printStackTrace();
                return false;
            }
    }

Valeu pelo apoio!

é o seguinte a sua tabela tem este campo sequencia? gostaria de saber como está a estrutura da tabela, para eu poder montar a minha igual, pois a minha esta assim

PRODCODIGO
PRODQUANTIDADE
PRODQUANTANTER

pois voce inseri uma linnha nova, e esta linha nova tem informações da linha anterior para ser atualizada… enfim preciso saber como esta a tabela,
e como voce esta chamando estes metodos certo a ordem deles… aguardo.

Minha tabela Produto:

create table Produto (
prodCodigo integer not null primary key,
prodData date not null,
prodDescricao varchar(30) not null,
prodCodBarras varchar(20) not null,
prodQuantidade integer ,
prodQuantAnter integer,
prodQuantAtual integer,
prodLucro decimal(18,2),
prodPrecoCompra decimal(18,2),
prodPrecoVenda decimal(18,2),
prodAtivo char(1),
marcCodigo integer not null,
grupCodigo integer not null,
foreign key (marcCodigo) references Marca (marcCodigo),
foreign key (grupCodigo) references Grupo (grupCodigo)
);

e a tabela AcertoEstoque:

create table AcertoEstoque (
acertoEstCodigo integer not null primary key,
acertoEstData date not null,
acertoEstQuantidade integer not null,
acertoEstTipo varchar(8) not null,
acertoEstHistorico varchar(30) not null,
acertoEstDescOperacao varchar(40) not null,
prodCodigo integer not null,
foreign key (prodCodigo) references Produto (prodCodigo)
);

chamo os métodos na classe AcertoEstoque

public class TelaMovimentoAcertoEstoque extends TelaCadastro implements ActionListener {

    private static TelaMovimentoAcertoEstoque telaMovimentoAcertoEstoque = null;
    private boolean retorno = false;
    private MeuCampoCodigo campoCodigo = new MeuCampoCodigo("Código", true, 5, false, 7);
    private MinhaData campoData = new MinhaData("Data", true);
    private MeuCampoEstender campoProduto = new MeuCampoEstender("Produto", true, TelaCadastroProduto.class, 5, PersistenciaProduto.SELECIONAUM);
    private MeuJTextField campoDescricao = new MeuJTextField("Descrição", false, 20, 39);
    private MeuInteiro campoEstoqueDisponivel = new MeuInteiro("Estoque Disponível", false, 10, 10);
    private MeuInteiro campoQuantidade = new MeuInteiro("Quantidade", true, 5, 10);
    private MeuComboBoxAcertoEstoque campoTipo = new MeuComboBoxAcertoEstoque("Tipo", true);
    private MeuJTextField campoHistorico = new MeuJTextField("Histórico", true, 25, 39);
    private MeuJTextField campoDescricaoOperacao = new MeuJTextField ("Descrição da Operação", false, 20,20);
    private PersistenciaAcertoEstoque acertoEstoque = new PersistenciaAcertoEstoque();

    public TelaMovimentoAcertoEstoque() {
        super("Acerto de Estoque");
        montaTela();
        pack();
    }

    public void confirmar() {
        super.confirmar();
        if (acertoEstoque.getAcertoEstTipo().equals("Entrada")) {
            acertoEstoque.acertoEstoqueEntrada();
            acertoEstoque.acertoQuantidadeEstoqueAtualEntrada();   // Aqui eu executo os métodos
            acertoEstoque.acertoQuantidadeEstoqueAnteriorEntrada();
        } else if (acertoEstoque.getAcertoEstTipo().equals("Saída")) {
            acertoEstoque.acertoEstoqueSaida();
            acertoEstoque.acertoQuantidadeEstoqueAtualSaida();
            acertoEstoque.acertoQuantidadeEstoqueAnteriorSaida();
        } else {
            JOptionPane.showMessageDialog(null, "Erro");
        }
    }

Executei aqui, começei com a seguinte massa de dados:

SELECT
produto.PRODCODIGO,
produto.PRODQUANTIDADE,
produto.PRODQUANTANTER
FROM titan.produto;

PRODCODIGO PRODQUANTIDADE PRODQUANTANTER
1 12 5

executei o método ex1.acertoQuantidadeEstoqueAnteriorSaida(); e como viu tenho o metodo que sempre retonra quantidade 3
ficou assim o resultado:

PRODCODIGO PRODQUANTIDADE PRODQUANTANTER
1 12 2

repare que seu método vai ter o sequinte sql:

UPDATE PRODUTO SET PRODQUANTANTER = PRODQUANTANTER - 3 WHERE PRODCODIGO = 1,

OU seja vai atualizar todas as entradas para o ultimo valor para o produto de codigo 1…
penso que ficaria mais fácil no caso voce fazer um insert com base no reultado anterior entende… ou seja voce da um select anteriormente…
pega o ultimo valor anterior, grava na coluna valor anterior e na coluna atual se for entrada grava quantidadeanterior+quantidadeatual entende?
sendo assim não precisa dar update, e sim insert com base no valor da ultima linha…

Aguardo.

Pô valeu, vou tentar fazer!
Obrigado!

Seria algo do tipo:

SELECT PRODQUANTANTER FROM PRODUTO WHERE PRODCODIGO = 1;
INSERT INTO PRODUTO (PRODQUANTANTER) VALUES (PRODQUANTANTER + 1);

mas não sei como “pegar e gravar o valor” :S

Bom, no caso ae ta com o meu banco “titan” o select, mas repare que esse select apenas retorna o “pordquantanter”, ou seja voce poderia fazer direto, mas acho que fica melhor voce criar um metodo chamado retornaQtdAnteriorProduto(), ae dentro dele voce faz esse select ae, depois da um insert ou somando
ou diminuindo deste valor que é a ultima entrada da quantidade anterior entendeu? Seque abaixo o select.

select prodquantanter from titan.produto where prodcodigo = (SELECT MAX(prodcodigo) FROM titan.produto)

ficaria algoa assim…

[code]public static final String RETORNA_QDT_ANTERIOR = “SELECT PRODQUANTANTER FROM TITAN.PRODUTO WHERE PRODCODIGO = (SELECT MAX(PRODCODIGO) FROM TITAN.PRODUTO)”;

public int retornaQtdAnteriorProduto() throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException{
	 Statement st = BancoDados.getConexao().createStatement();
	 ResultSet rs = st.executeQuery(RETORNA_QDT_ANTERIOR);
	 if(rs.next()){
		 return rs.getInt(1);
	 }
	return -1;
 }

[/code]

ae voce pode fazer um insert com prepared Statement e usar o metodo acima para inserir o valor anterior ou somar ou subrtrarir… enfim ae e só lógica
qualquer coisa posa ae…

Se resolver coloque resolvido no tópico por favor.

Blz ribclauport, não consegui implementar mas estou tentando fazer, assim que conseguir eu posto.
Até mais!