Inquiridor
Dar Baixa no Estoque C#

Discussão Geral
-
Boa noite galera, tenho um projeto no Visual Studio onde cliente se cadastra, e faz pedido de alguns produtos, tenho banco de dados SQL Server, tudo certo bem controla, só não consigo dar baixa na coluna quantidade (produto) que é como se fosse um estoque, na hora em que o cliente efetua o pedido ele colocar a quantidade que quer do produto em um TexBox, gostaria que esse valor diminuísse da coluna quantidade.
segue a baixo o código de de inserir o pedido na tabela :
string sqlQuery;
SqlConnection conCliente = Conexao.getConnection();sqlQuery = "INSERT INTO Pedido(Id_Produto,Id_Cliente,desc_pedido,Pagamento,Quantidade,Valor,Data) VALUES(@Id_Produto,@Id_Cliente,@desc_pedido,@Pagamento,@Quantidade,@Valor,@Data)";
try
{
//abre a conexão com o banco de dados
conCliente.Open();
//cria um objeto do tipo SqlCommand com a instrução SQL e a conexão
SqlCommand cmd = new SqlCommand(sqlQuery, conCliente);
//define, adiciona os parametros
cmd.Parameters.Add(new SqlParameter("@Id_Produto", txtProcessador.Text));
cmd.Parameters.Add(new SqlParameter("@Id_Cliente", txtId.Text));
cmd.Parameters.Add(new SqlParameter("@desc_pedido", comboProcessador.Text));
cmd.Parameters.Add(new SqlParameter("@Quantidade",txtQuantidade.Text));
cmd.Parameters.Add(new SqlParameter("@valor", lblTotal.Text));
cmd.Parameters.Add(new SqlParameter("@Pagamento", comboPagamento.Text));
cmd.Parameters.Add(new SqlParameter("@Data", Convert.ToDateTime(maskData.Text)));
cmd.ExecuteNonQuery();
MessageBox.Show("Pedido enviado com sucesso", "MDragon", MessageBoxButtons.OK, MessageBoxIcon.Information);
Cancelar();
}
catch (Exception ex)
{
MessageBox.Show("Problema ao enviar pedido " + ex, "MDragon", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
finally
{
if (conCliente != null)
{
conCliente.Close();
}
}- Tipo Alterado Marcos SJ quarta-feira, 20 de abril de 2016 17:07 How to
Todas as Respostas
-
Olá Walter.
Depende da regra de negócio da sua aplicação. Assim que o pedido do cliente for registrado na sua tabela Pedido a tabela Estoque deve ser atualizada?
Se sim uma opção é criar uma Trigger na sua base de dados que executa um Update na tabela Estoque sempre que houver um insert na tabela Pedido.
CREATE TRIGGER AtualizaEstoque ON Pedido AFTER INSERT AS BEGIN UPDATE Estoque Set Quantidade = (SELECT Quantidade FROM INSERTED) WHERE PRODID = (SELECT PRODID FROM INSERTED) END GO
Ai outra possibilidade é do usuário cancelar o pedido. Nesse caso você pode criar outra Trigger para atualizar novamente adicionando esta quantidade de novo.
Verifique bem as possibilidades do seu sistema para que não haja um contraponto que pode conflitar com estas alterações.
{}'s
- Editado Rogério dos Santos Fernandes terça-feira, 19 de abril de 2016 23:33
-
Bom dia,
Walter, não consegui entender o seu problema. A alteração do "Estoque" você gostaria de fazer no banco por "Trigger" como o colega citou ou via programação ?
Se quiser fazer isso via programação, você pode executar um novo script "query" após o "insert" na tabela de pedidos. Aconselho neste caso, que você utilize Transaction "Transação". Segue um exemplo:
public void Transacao()
{
bool sucesso = false;
using (TransactionScope ts = new TransactionScope())
{
try
{
//Seu código para inserir pedido
//Seu código para alterar o estoque - update pedido set quantidade = novaQuantidade where idProduto = Convert.ToInt32(txtProcessador.Text)
sucesso = true;
}
catch (Exception ex)
{
sucesso = false;
}
finally
{
if (sucesso)
ts.Complete();
ts.Dispose();
}
}
}Obervação: Para utilizar "Transaction" você precisa adicionar a referência "System.Transactions"
Att,
Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.
-
-
O INSERT deu certo ou da erro?
Se o INSERT deu certo, você pode fazer o UPDATE assim (após a inclusão do pedido):
//selecione a quantidade atual no banco sqlQuery = "SELECT estoque FROM Produto where Id_Produto = @Id_Produto"; cmd = new SqlCommand(sqlQuery, conCliente); cmd.Parameters.Add(new SqlParameter("@Id_Produto", txtProcessador.Text)); SqlDataReader dr = cmd.ExecuteReader(); int quantidadeNoBanco = 0; while (dr.Read()) { quantidadeNoBanco = Convert.ToInt32(dr["estoque"]); } int quantidadeAtual = quantidadeNoBanco - Convert.ToInt32(txtQuantidade.Text); //Altere a nova quantidade sqlQuery = "UPDATE Produto set estoque = @Quantidade where Id_Produto = @Id_Produto"; cmd = new SqlCommand(sqlQuery, conCliente); cmd.Parameters.Add(new SqlParameter("@Quantidade", quantidadeAtual)); cmd.Parameters.Add(new SqlParameter("@Id_Produto", txtProcessador.Text)); cmd.ExecuteNonQuery();
Confira os nomes dos campos, pois como não sei a estrutura do seu banco, fiz apenas um exemplo para demonstrar a lógica.
Att,
Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.
-
-
Vamos ver o SQL para Subtrair um Valor do campo da quantidade:
UPDATE produtos SET quantidade = quantidade-1 WHERE nome_produto = 'Tênis de Futebol'
Agora, vamos ver o SQL para Somar um Valor no mesmo campo:
UPDATE produtos SET quantidade = quantidade+1 WHERE nome_produto = 'Tênis de Futebol'Atenciosamente,
José Henrique Sabino -
-
Pode ser dentro do try{....} após o cmd.ExecuteNoQuery().
Se preferir utilizar a transação informada anteriormente, segue o passo a passo e o método completo (Com inclusão do pedido e alteração do estoque).
Para utilizar, clique com o direito do mouse em "References", "Add Reference...", selecione a guia "Assemblies", marque "System.Trasactions".
Agora adicione o using na sua class :
using System.Transactions;string sqlQuery; SqlConnection conCliente = Conexao.getConnection(); sqlQuery = "INSERT INTO Pedido(Id_Produto,Id_Cliente,desc_pedido,Pagamento,Quantidade,Valor,Data) VALUES(@Id_Produto,@Id_Cliente,@desc_pedido,@Pagamento,@Quantidade,@Valor,@Data)"; bool sucesso = false; using (TransactionScope ts = new TransactionScope()) { try { /abre a conexão com o banco de dados conCliente.Open(); //cria um objeto do tipo SqlCommand com a instrução SQL e a conexão SqlCommand cmd = new SqlCommand(sqlQuery, conCliente); //define, adiciona os parametros cmd.Parameters.Add(new SqlParameter("@Id_Produto", txtProcessador.Text)); cmd.Parameters.Add(new SqlParameter("@Id_Cliente", txtId.Text)); cmd.Parameters.Add(new SqlParameter("@desc_pedido", comboProcessador.Text)); cmd.Parameters.Add(new SqlParameter("@Quantidade",txtQuantidade.Text)); cmd.Parameters.Add(new SqlParameter("@valor", lblTotal.Text)); cmd.Parameters.Add(new SqlParameter("@Pagamento", comboPagamento.Text)); cmd.Parameters.Add(new SqlParameter("@Data", Convert.ToDateTime(maskData.Text))); cmd.ExecuteNonQuery(); //selecione a quantidade atual no banco sqlQuery = "SELECT estoque FROM Produto where Id_Produto = @Id_Produto"; cmd = new SqlCommand(sqlQuery, conCliente); cmd.Parameters.Add(new SqlParameter("@Id_Produto", txtProcessador.Text)); SqlDataReader dr = cmd.ExecuteReader(); int quantidadeNoBanco = 0; while (dr.Read()) { quantidadeNoBanco = Convert.ToInt32(dr["estoque"]); } int quantidadeAtual = quantidadeNoBanco - Convert.ToInt32(txtQuantidade.Text); //Altere a nova quantidade sqlQuery = "UPDATE Produto set estoque = @Quantidade where Id_Produto = @Id_Produto"; cmd = new SqlCommand(sqlQuery, conCliente); cmd.Parameters.Add(new SqlParameter("@Quantidade", quantidadeAtual)); cmd.Parameters.Add(new SqlParameter("@Id_Produto", txtProcessador.Text)); cmd.ExecuteNonQuery(); //Seu código para alterar o estoque - update pedido set quantidade = novaQuantidade where idProduto = Convert.ToInt32(txtProcessador.Text) MessageBox.Show("Pedido enviado com sucesso", "MDragon", MessageBoxButtons.OK, MessageBoxIcon.Information); sucesso = true; } catch (Exception ex) { sucesso = false; MessageBox.Show("Problema ao enviar pedido " + ex, "MDragon", MessageBoxButtons.OK, MessageBoxIcon.Warning); } finally { if (sucesso) ts.Complete(); ts.Dispose(); conCliente.Close(); } }
Att,
Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.
-
-
Boa noite,
Após realizar a leitura do banco, feche o SqlDataReader. Após "while(dr.Read(){})" adicione:
dr.Close();
Vai ficar assim então:
while (dr.Read()) { quantidadeNoBanco = Convert.ToInt32(dr["estoque"]); } dr.Close();
Att,Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.
-
-
-
-