Somar ou subtrair um valor armazenado

9 respostas
CarlosFontana

Boa tarde pessoal, deparei-me com a seguinte situação, tenho uma tabela “Produto” com um campo “Quantidade” em um banco de dados. Fiz o seguinte na minha classe de persistência:

public static final String ACERTOESTOQUE = "UPDATE PRODUTO SET PRODQUANTIDADE = ? WHERE PRODCODIGO = ?";

public int getProdQuantidade() {
        return prodQuantidade;
}

public void setProdQuantidade(int prodQuantidade) {
        this.prodQuantidade = prodQuantidade;
}

e o método:

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

a minha dúvida é a seguinte, como eu faço para pegar o valor que está armazenado no campo “Quantidade” do banco e somar ou dimunir com a informação inserida em um JTextField? Estou pensando em algo como:

assim que confirmar, (JButton), ele chama o método acertoEstoque(), agora não sei como fazer o processo de pegar o valor que está armazenado no banco e somar ou diminuir e gravar novamente no banco, será que essa linha de raciocínio pode dar certo?

Algo como:

public void acertandoEstoque() {
        if (campoTipo.selectedIndex() == 0) {
            campoQuantidade = getProdQuantidade() + campoQuantidade;
        } else {
            campoQuantidade = getProdQuantidade() - campoQuantidade;
        }
    }

O campo campoTipo é um ComboBox e o index 0 é Entrada e o index 1 é Saída, então caso seja selecionado “Entrada” ele pega o valor que está no banco e soma com o valor que foi informado em um JTextfield, assim, atualiza essa informação.

Desde já agradeço!

9 Respostas

esdmorais

Boa tarde!
Para você fazer isso, você terá que fazer uma consulta ao banco de dados para saber a quantidade e jogar o valor na caixa de texto.
Esse somar/subtrair você fala que quer fazer inicialmente na tela ou você deseja primeiro fazer na tela e depois gravar no banco de dados?

CarlosFontana

Beleza Esd, a ideia é fazer o cálculo ocultamente, o usuário só informa o valor que deseja aumentar ou diminuir, após confirmar é gravado o novo valor.

S

Boa noite CarlosAlexandre,

Como o companheiro acima falou primeiro você deve fazer uma consulta e em seguida capturar o valor do campo e dar o seu update. Abaixo segue um exemplo que você poderá utilizar na sua aplicação adequando da forma correta.

Estoque estoque = new Estoque();
con = Conexao.abreConexaoDB();		
stmt = con.prepareStatement(sql);
stmt.setLong(1, <Aqui vai o seu valor da PK, você deve saber o que passar aqui>);
rs = stmt.executeQuery();
if (rs != null && rs.next()) { 
	//Aqui você pega o valor da coluna. Abaixo vai um exemplo			
	estoque.setQuantidade(rs.getDouble("QUANTIDADE"));											
}
stmt.close();
rs.close();
Conexao.fechaConexaoBD(con);

Depois de realizar a consulta é so você pegar o valor contido no objeto Estoque e fazer o seu calculo dando o update.
Abraço

CarlosFontana

Boa noite Strikezado, cara estou quase fundindo aqui :S, criei esses métodos de consulta:

public static final String SELECIONAUM = "SELECT * FROM PRODUTO WHERE PRODCODIGO = ?";
public static final String SELECIONACOMTELA = "SELECT PRODCODIGO, PRODDESCRICAO FROM PRODUTO WHERE PRODCODIGO = ?";

public boolean selecionar() {
        try {
            PreparedStatement ps = BancoDados.getConexao().prepareStatement(SELECIONAUM);
            ps.setInt(1, getProdCodigo());
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                setProdCodigo(rs.getInt("PRODCODIGO"));
                setProdData(rs.getDate("PRODDATA"));
                setProdDescricao(rs.getString("PRODDESCRICAO"));
                setProdCodBarras(rs.getString("PRODCODBARRAS"));
                setProdQuantidade(rs.getInt("PRODQUANTIDADE"));
                setProdLucro(rs.getBigDecimal("PRODLUCRO"));
                setProdPrecoCompra(rs.getBigDecimal("PRODPRECOCOMPRA"));
                setProdPrecoVenda(rs.getBigDecimal("PRODPRECOVENDA"));
                setProdAtivo(rs.getBoolean("PRODATIVO"));
                marca.setMarcCodigo(rs.getInt("MARCCODIGO"));
                grupo.setGrupCodigo(rs.getInt("GRUPCODIGO"));
                if (!marca.selecionar() || (!grupo.selecionar())) {
                    return false;
                }
            } 
            return false;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Não foi possível consultar o Produto");
            e.printStackTrace();
            return false;
        }
    }

    public boolean selecionarComTela() {
        try {
            PreparedStatement ps = BancoDados.getConexao().prepareStatement(SELECIONACOMTELA);
            ps.setInt(1, getProdCodigo());
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                setProdCodigo(rs.getInt("PRODCODIGO"));
                setProdDescricao(rs.getString("PRODDESCRICAO"));
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Não foi possível consultar o produto com tela.");
            e.printStackTrace();
            return false;
        }
    }

Pensei no seguinte, se eu chamar selecionar() depois o acertoEstoque() (que é o update), mas não sei, e sobre aumentar ou diminuir, estou pensando em criar uma variável que receba o valor que está no banco e em seguida eu faço com que o campo “Quantidade” recebe o valor do banco mais a soma ou a subtração que foi informado no JTextField, vou descansar e mexer com isso amanhã quando estiver com a cabeça fria.

Obrigado pela dica, vou analisar. Valeu!

esdmorais

Esse seu aumentar/diminuir será invocado através de um botão, certo?
Você pode criar um método, onde você possui o valor pesquisado e o valor que o cliente pesquisou, e depois disso é só persistir no banco de dados!
Por exemplo:

private void atualizaHistorico() {
    int quantidade;

    // Faz a pesquisa do valor no banco de dados e atribui na variável quantidade.

    // 
    if (somar) {
        quantidade += Integer.parseInt(txtValorAtualizar.getText());
    } else {
        quantidade -= Integer.parseInt(txtValorAtualizar.getText());
    } 

    // O valor da quantidade  está atualizada, agora é  gravar no banco de dados.
}

Não sei se te ajudou muito, mas é isso ai cara!
Pelo o que você explicou e eu entendi, acho que uma solução boa seria essa :smiley:

gustavotorquato

Cara, talvez seja mais complicado que isso, mas eu fiz uma vez um update deste tipo, no meu caso eu tinha um lote, cada lote tem uma posição, por exemplo: Lote 1 tem a posição numero 2, Lote 2 tem a posição 3, e asim por diante, ai eu queria fazer o lote 2 ir para a posicao2. o meu update saiu assim:

UPDATE lote SET posicao_lote = posicao_lote+1 WHERE posicao_lote >= posicaoLote;

No teu caso imagino que vai ficar assim:

UPDATE PRODUTO SET PRODQUANTIDADE =   PRODQUANTIDADE + ?  WHERE PRODCODIGO = ?

Ai você passa no seu primeiro parâmetro do prepared statement o valor que vc quer passar, no caso, um negativo ou um positivo.

CarlosFontana

Maneiro isso Gustavo, vou verificar!

Obrigado

Lucas_Abbatepaolo

creio que como o gustavo falou resolve o seu problema:

crie 2 scripts:

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

e no metodo que vc faz o acerto verifique se é entrada ou saida e crie o PreparedStatement com o script q vc precisa…

abç

CarlosFontana

Realmente Lucas, eu fiz o seguinte na minha classe de persistência do 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 = ?";

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

e na minha classe AcertoEstoque:

public void confirmar() {
        super.confirmar();
        if (acertoEstoque.getAcertoEstTipo().equals("Entrada")) {
            produto.acertoEstoqueEntrada();
        } else if (acertoEstoque.getAcertoEstTipo().equals("Saída")) {
            produto.acertoEstoqueSaida();
        }
    }

mas nada acontece… :s

Criado 17 de dezembro de 2011
Ultima resposta 21 de dez. de 2011
Respostas 9
Participantes 5