none
Dar Baixa no Estoque C# RRS feed

  • 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
    terça-feira, 19 de abril de 2016 23:06

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


    terça-feira, 19 de abril de 2016 23:30
  • 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.

    quarta-feira, 20 de abril de 2016 11:22
  • ola Silvaney, gostaria de fazer como programação acredito que usando o update, mas estou com dificuldade. o INSERT eu uso para colocar na Tabela pedido, a atualização é na coluna estoque que esta n tabela chamada Produto.

    quarta-feira, 20 de abril de 2016 16:19
  • 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.

    quarta-feira, 20 de abril de 2016 17:43
  • O INSERT para inserir os dados dos pedidos ocorre normalmente, apenas o UPDATE para atualizar que nao estou conseguindo. Tentarei acrescentar esse modelo pra ver 
    quarta-feira, 20 de abril de 2016 18:00
  • 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

    quarta-feira, 20 de abril de 2016 18:01
  • esse codigo coloca ele dentro do try {......} antes ou depois ??
    quarta-feira, 20 de abril de 2016 19:48
  • 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.

    quarta-feira, 20 de abril de 2016 20:09
  • esse é o erro que aparce pra mim 

    ed

    quarta-feira, 20 de abril de 2016 20:34
  • 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.

    quinta-feira, 21 de abril de 2016 01:59
  • obg Deu muito certo 
    sexta-feira, 22 de abril de 2016 16:43
  • obg.
    sexta-feira, 22 de abril de 2016 16:44
  • Walter,  

    não esqueça de retribuir a ajuda marcando como resposta! 


    Natan

    sábado, 23 de abril de 2016 11:59
  • nao estou conseguindo marcar como resposta, nao aparece essa opção

    terça-feira, 26 de abril de 2016 17:16