BAIXAR ESTOQUE

SANROMAN 18/11/2013 15:39:19
#431231
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.

KERPLUNK 18/11/2013 15:57:35
#431232
Resposta escolhida
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
OMAR2011 18/11/2013 16:04:11
#431234
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.
SANROMAN 18/11/2013 18:16:40
#431238
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.

KERPLUNK 19/11/2013 10:42:32
#431250
  
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()

SANROMAN 19/11/2013 11:12:39
#431256
Valeu KERPLUNK

Estou encerrando o tópico.

Muito obrigado pela ajuda.
Tópico encerrado , respostas não são mais permitidas