BAIXAR ESTOQUE
Olá amigos
Estou tendo um problema para baixar itens de uma listview em meu formulário de controle estoque.
Se meu listview tem apenas um produto vendido baixa perfeitamente, mas se tenho dois ou mais produtos vendidos baixa apenas o primeiro produto da listview.
Segue o código para análise:
Private Sub baixaEstoque()
Dim sql As String = [Ô][Ô]
Dim qtde As Integer
Dim baixaest As Double
Dim cod_Produto As Integer = Val(frmVendaBalcao.listVendaDireta.Items(0).SubItems(4).Text)
Dim qtdeVendida As Integer = Val(frmVendaBalcao.listVendaDireta.Items(0).SubItems(2).Text)
Dim strConn As String = My.Settings.OBotecoConnectionString.ToString
Dim qtde_menos_estoque = ([Ô]SELECT EstoqueAtual FROM TB_Produtos WHERE idProdutos =[Ô] & cod_Produto)
Dim con As New SqlConnection(strConn)
Dim cmd As SqlCommand
con.Open()
Try
cmd = New SqlCommand(qtde_menos_estoque, con)
qtde_menos_estoque = CInt(cmd.ExecuteScalar())
qtde = qtdeVendida
baixaest = qtde_menos_estoque - qtde
sql = [Ô]UPDATE TB_produtos SET EstoqueAtual = [ô][Ô] & Val(baixaest) & [Ô][ô] WHERE idProdutos = [Ô] & (cod_Produto)
cmd = New SqlCommand(sql, con)
cmd.ExecuteNonQuery()
Finally
con.Close()
cmd = Nothing
End Try
End Sub
Fico no aguardo para tentarmos resolver esse problema.
Estou tendo um problema para baixar itens de uma listview em meu formulário de controle estoque.
Se meu listview tem apenas um produto vendido baixa perfeitamente, mas se tenho dois ou mais produtos vendidos baixa apenas o primeiro produto da listview.
Segue o código para análise:
Private Sub baixaEstoque()
Dim sql As String = [Ô][Ô]
Dim qtde As Integer
Dim baixaest As Double
Dim cod_Produto As Integer = Val(frmVendaBalcao.listVendaDireta.Items(0).SubItems(4).Text)
Dim qtdeVendida As Integer = Val(frmVendaBalcao.listVendaDireta.Items(0).SubItems(2).Text)
Dim strConn As String = My.Settings.OBotecoConnectionString.ToString
Dim qtde_menos_estoque = ([Ô]SELECT EstoqueAtual FROM TB_Produtos WHERE idProdutos =[Ô] & cod_Produto)
Dim con As New SqlConnection(strConn)
Dim cmd As SqlCommand
con.Open()
Try
cmd = New SqlCommand(qtde_menos_estoque, con)
qtde_menos_estoque = CInt(cmd.ExecuteScalar())
qtde = qtdeVendida
baixaest = qtde_menos_estoque - qtde
sql = [Ô]UPDATE TB_produtos SET EstoqueAtual = [ô][Ô] & Val(baixaest) & [Ô][ô] WHERE idProdutos = [Ô] & (cod_Produto)
cmd = New SqlCommand(sql, con)
cmd.ExecuteNonQuery()
Finally
con.Close()
cmd = Nothing
End Try
End Sub
Fico no aguardo para tentarmos resolver esse problema.
1 - O saldo de produto não é caracterÃstica de produto, mas sim de movimentação. Logo, deve ser a conta de uma tabela de movimentação e não ser um campo na tabela de produto.
2 - Para fazer o que você quer, você deve fazer um loop pelas linhas do seu datagrid e fazer a baixa de um a um.
3 - Use comandos parametrizados para evitar problemas de SQL Injection
2 - Para fazer o que você quer, você deve fazer um loop pelas linhas do seu datagrid e fazer a baixa de um a um.
3 - Use comandos parametrizados para evitar problemas de SQL Injection
Apenas uma dica.
Terá de usa o comando For.
Então quando tem mais de um registro no
listview só pega o primeiro.
For nele, ai pode ter certeza que vai dar certo.
Valeu.
Terá de usa o comando For.
Então quando tem mais de um registro no
listview só pega o primeiro.
For nele, ai pode ter certeza que vai dar certo.
Valeu.
Olá KerpLunk
Fiz conforme sua dica e funcionou perfeitamente, o código ficou assim:
rivate Sub baixaEstoque()
Dim con As New SqlConnection(strCmd)
Dim cmd As SqlCommand
con.Open()
Try
For i As Integer = 0 To frmVendaBalcao.listVendaDireta.Items.Count - 1
Dim sql As String = [Ô][Ô]
Dim qtde As Integer
Dim baixaest As Double
Dim codProduto As Integer = Val(frmVendaBalcao.listVendaDireta.Items(i).SubItems(4).Text)
Dim qtdeVendida As Integer = Val(frmVendaBalcao.listVendaDireta.Items(i).SubItems(2).Text)
Dim qtde_menos_estoque As String = [Ô]SELECT EstoqueAtual FROM TB_Produtos WHERE idProdutos =[Ô] & codProduto
cmd = New SqlCommand(qtde_menos_estoque, con)
qtde_menos_estoque = CInt(cmd.ExecuteScalar())
qtde = qtdeVendida
baixaest = qtde_menos_estoque - qtde
sql = [Ô]UPDATE TB_produtos SET EstoqueAtual = [ô][Ô] & Val(baixaest) & [Ô][ô] WHERE idProdutos = [Ô] & (codProduto)
cmd = New SqlCommand(sql, con)
cmd.ExecuteNonQuery()
Next
Catch ex As Exception
MsgBox(ex.Message)
Finally
con.Close()
cmd = Nothing
End Try
End Sub
Sou iniciante e sinceramente não consegui entender sua terceira colocação em que me da a dica de usar comandos parametrizados para evitar problemas de SQL INJECTION. Por favor, se possÃvel me explique melhor essa colocação.
Um abraço no Omar2011 que tb ajudou.
Fiz conforme sua dica e funcionou perfeitamente, o código ficou assim:
rivate Sub baixaEstoque()
Dim con As New SqlConnection(strCmd)
Dim cmd As SqlCommand
con.Open()
Try
For i As Integer = 0 To frmVendaBalcao.listVendaDireta.Items.Count - 1
Dim sql As String = [Ô][Ô]
Dim qtde As Integer
Dim baixaest As Double
Dim codProduto As Integer = Val(frmVendaBalcao.listVendaDireta.Items(i).SubItems(4).Text)
Dim qtdeVendida As Integer = Val(frmVendaBalcao.listVendaDireta.Items(i).SubItems(2).Text)
Dim qtde_menos_estoque As String = [Ô]SELECT EstoqueAtual FROM TB_Produtos WHERE idProdutos =[Ô] & codProduto
cmd = New SqlCommand(qtde_menos_estoque, con)
qtde_menos_estoque = CInt(cmd.ExecuteScalar())
qtde = qtdeVendida
baixaest = qtde_menos_estoque - qtde
sql = [Ô]UPDATE TB_produtos SET EstoqueAtual = [ô][Ô] & Val(baixaest) & [Ô][ô] WHERE idProdutos = [Ô] & (codProduto)
cmd = New SqlCommand(sql, con)
cmd.ExecuteNonQuery()
Next
Catch ex As Exception
MsgBox(ex.Message)
Finally
con.Close()
cmd = Nothing
End Try
End Sub
Sou iniciante e sinceramente não consegui entender sua terceira colocação em que me da a dica de usar comandos parametrizados para evitar problemas de SQL INJECTION. Por favor, se possÃvel me explique melhor essa colocação.
Um abraço no Omar2011 que tb ajudou.
sql = [Ô]UPDATE TB_produtos SET EstoqueAtual = @estoqueAtual WHERE idProdutos = @idProduto[Ô]
cmd = New SqlCommand(sql, con)
cmd.Parameters.AddWithValue([Ô]@estoqueAtual[Ô], Val(baixaest))
cmd.Parameters.AddWithValue([Ô]@idProduto[Ô], codproduto)
cmd.ExecuteNonQuery()
Valeu KERPLUNK
Estou encerrando o tópico.
Muito obrigado pela ajuda.
Estou encerrando o tópico.
Muito obrigado pela ajuda.
Tópico encerrado , respostas não são mais permitidas