Pessoal é o seguinte, estou a fazer actualização da quantidade dos produtos em stock em um sistema de venda, so que acontece a seguinte situação: se por acaso eu testar apenas a venda de um produto ele diminui a quantidade normalmente, agora se eu vender dois os mais produtos ele ele pega na quantidade do primeiro, segundo…n produtos soma tudo e subtrai na ultimo produto cadastrado no stock.
Exemplo:
Tabela stock
codigo_produto codigo_fornecedor quantidade preço data
1 2 4 ------ ------
2 4 19 ------ ------
Tendo em conta essa tabela se eu vender dois produtos (os produtos com codigo 1 e 2) e digamos que a cada produto vendido eu coloque como quantidade 2 ele irá somar 2 + 2 = 4 e vai pegar nesse 4 e subtrair por 19. O correcto seria ele ir no produto com codigo 1 e fazer 4-2 e no produto com codigo 2 fazer 19-2.
Eis o codigo:
StockDao.java
private final String ACTUALIZAR_QUANTIDADE = "UPDATE stock SET quantidade = quantidade - ? WHERE codigo_produto = ? and codigo_fornecedor = ?";
public void actualizarQuantidade(Stock s) {
try {
conexao = Conexao.ligarBd();
ps = conexao.prepareStatement(ACTUALIZAR_QUANTIDADE);
ps.setInt(1, s.getQuantidade());
ps.setInt(2, s.getCodigoProduto());
ps.setInt(3, s.getCodigoFornecedor());
ps.executeUpdate();
ps.close();
conexao.close();
} catch (SQLException exception) {
JOptionPane.showMessageDialog(null, "Impossivel actualizar quantidade do stock " + exception, "Stock", JOptionPane.ERROR_MESSAGE);
}
}
Gui
public void actualizarQuantidadeStock() {
Stock s = new Stock();
StockDao sd = new StockDao();
ls = new ArrayList<Stock>();
s.setQuantidade(Integer.parseInt(txtQuantidadeVendida.getText()));
s.setCodigoProduto(lsp.get(cboNomeProduto.getSelectedIndex()).getCodigoProduto());
s.setCodigoFornecedor(lsf.get(cboNomeFornecedor.getSelectedIndex()).getCodigoFornecedor());
ls.add(s);
for (int i = 0; i < ls.size(); i++) {
sd.actualizarQuantidade(ls.get(i));
}
//JOptionPane.showMessageDialog(null, lsp.get(cboNomeProduto.getSelectedIndex()).getCodigoProduto(), "Stock", JOptionPane.ERROR_MESSAGE);
//JOptionPane.showMessageDialog(null, lsf.get(cboNomeFornecedor.getSelectedIndex()).getCodigoFornecedor(), "Stock", JOptionPane.ERROR_MESSAGE);
JOptionPane.showMessageDialog(null, "Quantidade actualizada com sucesso", "Stock", JOptionPane.ERROR_MESSAGE);
}
public void inserir() {
if (ldv.size() == 0) {
JOptionPane.showMessageDialog(null, "Erro: Informe pelo menos uma venda a ser efectuada", "Venda", JOptionPane.ERROR_MESSAGE);
} else {
DetalhesVendaDao dvd = new DetalhesVendaDao();
DetalhesVenda dv = new DetalhesVenda();
for (int i = 0; i < ldv.size(); i++) {
dvd.inserir(ldv.get(i));
actualizarQuantidadeStock();
}
JOptionPane.showMessageDialog(null, "Nova venda efectuada com sucesso", "Venda", JOptionPane.INFORMATION_MESSAGE);
}
}