none
como criar histórico de estoque RRS feed

  • Pergunta

  • Saudações a todos.

    eu tenho um estoque onde cadastro a entrada de produtos, porem se eu adicionar o mesmo produto em outra data ele soma no produto existente mas não grava a nova data. logo eu fico sem saber se os produtos foram adicionados em que data segue o código de salvar e atualizar:

                             

      Using con As OleDbConnection = getConnection()
                Dim total As Integer
                con.Open()
                Try
                    'esta variavel consulta a quantidade que tem no estoque
                    total = ObterProdutoEstoque(txtProduto.Text)
                    If total = 0 Then
                        Dim sql As String = "INSERT INTO Tab_Estoque (Produto,Quantidade,Tamanho,Data_Entrada,Total) VALUES (?,?,?,?,?)"
                        Dim cmd As OleDbCommand = New OleDbCommand(sql, con)

                        cmd.Parameters.Add(New OleDb.OleDbParameter("@Produto", txtProduto.Text))
                        cmd.Parameters.Add(New OleDb.OleDbParameter("@Quantidade", txtQuantidade.Text))
                        cmd.Parameters.Add(New OleDb.OleDbParameter("@Tamanho", txtTamanho.Text))
                        cmd.Parameters.Add(New OleDb.OleDbParameter("@Data", txtDataEstoque.Text))
                        cmd.Parameters.Add(New OleDb.OleDbParameter("@Total", txtQuantidade.Text))

                        cmd.ExecuteNonQuery()
                        MsgBox("PRODUTO INSERIDO COM  SUCESSO NO ESTOQUE", MsgBoxStyle.Information, Title:="Sucesso!")
                        txtTotal.Text = txtQuantidade.Text

      Else
                       
                        total = Val(total + txtQuantidade.Text)
                        Dim sql As String = "UPDATE Tab_Estoque SET Total='" & total & "'" & "  WHERE Produto='" & txtProduto.Text & "'"
                        Dim cmd As OleDbCommand = New OleDbCommand(sql, con)
                        cmd.ExecuteNonQuery()
                        MsgBox("ESTOQUE ATUALIZADO COM  SUCESSO NO ESTOQUE", MsgBoxStyle.Information, Title:="Sucesso!")

                        txtTotal.Text = total
                    End If

                Catch ex As Exception
                    MsgBox(ex.Message)
                Finally
                    con.Close()
                End Try

    segunda-feira, 31 de outubro de 2016 15:26

Respostas

Todas as Respostas

  • Olá Arlindo

    Perceba que a sua condição faz com que seu código sempre caia no "else" se houver o produto cadastrado e o código que está dentro do bloco "else" é para atualizar os dados (UPDATE) e não inserir um novo, por esse motivo está somando e causando o problema que mencionou.

    Acredito que sempre tenha que inserir um registro para não perder o histórico. Caso precise de uma consulta que retorne a quantidade de produtos em uma data específica, consegue fazer essa soma agrupando por data e produto de forma bem tranquilo com SQL


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco


    segunda-feira, 31 de outubro de 2016 15:32
  • Boa tarde Andre,

    como ficaria para fazer do jeito que desejo?

    segunda-feira, 31 de outubro de 2016 15:37
  • O que você quer?

    Quer que ele sempre insira um novo registro como mencionei?

    Basta remover a condição if/else

                Using con As OleDbConnection = getConnection()
                Dim total As Integer
                con.Open()
                Try
                    
                        Dim sql As String = "INSERT INTO Tab_Estoque (Produto,Quantidade,Tamanho,Data_Entrada,Total) VALUES (?,?,?,?,?)"
                        Dim cmd As OleDbCommand = New OleDbCommand(sql, con)
    
                        cmd.Parameters.Add(New OleDb.OleDbParameter("@Produto", txtProduto.Text))
                        cmd.Parameters.Add(New OleDb.OleDbParameter("@Quantidade", txtQuantidade.Text))
                        cmd.Parameters.Add(New OleDb.OleDbParameter("@Tamanho", txtTamanho.Text))
                        cmd.Parameters.Add(New OleDb.OleDbParameter("@Data", txtDataEstoque.Text))
                        cmd.Parameters.Add(New OleDb.OleDbParameter("@Total", txtQuantidade.Text))
    
                        cmd.ExecuteNonQuery()
                        MsgBox("PRODUTO INSERIDO COM  SUCESSO NO ESTOQUE", MsgBoxStyle.Information, Title:="Sucesso!")
                        txtTotal.Text = txtQuantidade.Text
    
                Catch ex As Exception
                    MsgBox(ex.Message)
                Finally
                    con.Close()
                End Try


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    segunda-feira, 31 de outubro de 2016 15:52
  • boa tarde mais uma vez,

     a minha ideia é somas os produtos e saber quando cada produto foi inserido,  se o produto já existir ele deve somar e gravar tb a data que eu adicionei o produto já existente

    segunda-feira, 31 de outubro de 2016 15:58
  • Ok, se entendi bem então você não quer guardar um histórico de cada atualização.

    Se o produto já existir, quer somar a quantidade e atualizar a data dessa nova atualização, isso?

    Se for isso, então pode fazer assim:

    Using con As OleDbConnection = getConnection()
                Dim total As Integer
                con.Open()
                Try
                    'esta variavel consulta a quantidade que tem no estoque
                    total = ObterProdutoEstoque(txtProduto.Text)
                    If total = 0 Then
                        Dim sql As String = "INSERT INTO Tab_Estoque (Produto,Quantidade,Tamanho,Data_Entrada,Total) VALUES (?,?,?,?,?)"
                        Dim cmd As OleDbCommand = New OleDbCommand(sql, con)
    
                        cmd.Parameters.Add(New OleDb.OleDbParameter("@Produto", txtProduto.Text))
                        cmd.Parameters.Add(New OleDb.OleDbParameter("@Quantidade", txtQuantidade.Text))
                        cmd.Parameters.Add(New OleDb.OleDbParameter("@Tamanho", txtTamanho.Text))
                        cmd.Parameters.Add(New OleDb.OleDbParameter("@Data", txtDataEstoque.Text))
                        cmd.Parameters.Add(New OleDb.OleDbParameter("@Total", txtQuantidade.Text))
    
                        cmd.ExecuteNonQuery()
                        MsgBox("PRODUTO INSERIDO COM  SUCESSO NO ESTOQUE", MsgBoxStyle.Information, Title:="Sucesso!")
                        txtTotal.Text = txtQuantidade.Text
    
                     Else
                       
                        total = Val(total + txtQuantidade.Text)
                        Dim sql As String = "UPDATE Tab_Estoque SET Total='" & total & "', Data_Entrada='" & DateTime.Now.ToString() & "' WHERE Produto='" & txtProduto.Text & "'"
                        Dim cmd As OleDbCommand = New OleDbCommand(sql, con)
                        cmd.ExecuteNonQuery()
                        MsgBox("ESTOQUE ATUALIZADO COM  SUCESSO NO ESTOQUE", MsgBoxStyle.Information, Title:="Sucesso!")
    
                        txtTotal.Text = total
                    End If
    
                Catch ex As Exception
                    MsgBox(ex.Message)
                Finally
                    con.Close()
                End Try

    Isso fará com que atualize a quantidade e altere a data para a data atual da atualização do produto


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco



    segunda-feira, 31 de outubro de 2016 16:11
  • boa tare mais uma vez André,

    eu gostaria de manter um histórico com base na data quando eu inseri cada dados exemplo;

    no dia 01/01/2016 eu inserir produto = teclado, quantidade =5 total no estoque =5

    no dia 31/10/2016 eu inserir produto = teclado, quantidade =3 total no estoque =8

    quando eu pesquisar o produto teclado ele mostrar o histórico acima,

    será que consegui expressar o que desejo?

    segunda-feira, 31 de outubro de 2016 16:53
  • Então Arlindo,

    Acredito não ser uma modelagem correta deixar a coluna Total na tabela. Na minha visão, como falei no início, você deveria apenas inserir novos registros nessa tabela, identificando o produto, data e a quantidade.

    Caso queira saber o total, deve fazer uma consulta sql que agrupe por produtos, exemplo:

    SELECT Produto, SUM(Quantidade)
    FROM Tab_Estoque
    GROUP BY Produto
    
    //PARA TER O EFEITO QUE QUER COM O TOTAL, PODE FAZER ASSIM:
    
    SELECT Data_Entrada, Produto, SUM(Quantidade), Total.Quantidade
    FROM Tab_Estoque te CROSS APPLY
          (SELECT SUM(Quantidade) AS Quantidade FROM Tab_Estoque
           WHERE Produto = te.Produto AND Data_Entrada <= te.Data_Entrada) Total
    GROUP BY Data_Entrada, Produto, Total.Quantidade


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    segunda-feira, 31 de outubro de 2016 17:10
  • Andre podes falar comigo no e-mail:

    ar.li.28200@Hotmail.com ou

    whatsapp (11)944279433

    segunda-feira, 31 de outubro de 2016 17:28
  • Andre, dessa forma não funcionou, vc teria uma outra ideia de como montar? estou com urgência e precisando muito de ajuda

    segunda-feira, 31 de outubro de 2016 18:16
  • Qual o erro? Como está montando aí?

    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    segunda-feira, 31 de outubro de 2016 18:21
  • ele nem executa, apresenta muitos erros,

    segunda-feira, 31 de outubro de 2016 18:29
  • Cara,

    Os exemplos dados aqui não estão prontos, precisam ser interpretados.

    Você já fez algum tipo de consulta SQL no VB.NET? Então sabe que não pode jogar um comando SQL dentro de um evento de click de botão sem ao menos utilizar os objetos para trabalhar com SQL no VB.

    Caso não saiba como faz, recomendo dar uma estudada em alguns materiais para poder prosseguir, por exemplo: http://www.macoratti.net/vbn5_adb.htm


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    segunda-feira, 31 de outubro de 2016 18:43