INICIANDO PDV- BAIXA NO ESTOQUE

JANDSONSISTENS 07/09/2016 22:44:19
#466617
Boa noite galera, queria um auxilio na logica.
estou montando meu PDV com vendas. ai minha dúvida é o seguinte.
eu estou fazendo o update qnd finalizo a venda certo? ate ai tudo bem.

ai me veio uns problemas. tipo...
Produto A tem 10 no estoque.... daí eu adiciono no datagrid. desse produto A insiro 5 ai depois insiro mais 6 ficou 11 inseridos...
qnd gravar tudo.. qnd vejo meu estoque esta [txt-color=#e80000] -1 [/txt-color]

------- Antes de add ao datagird eu fiz a seguinte validação ------


   Private Sub Ler_qtd_Estoque_Venda()
Using con As OleDbConnection = GetConnection()
Dim dr As OleDbDataReader = Nothing
Try
con.Open()
Dim sql As String
Dim cmd As OleDbCommand

sql = [Ô]SELECT codigo, qtdEstoque FROM produtos WHERE codigo=?[Ô]
cmd = New OleDbCommand(sql, con)

cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@codigo[Ô], codProduto.Text)) [ô]COD.PRODUTO

dr = cmd.ExecuteReader
If dr.HasRows Then
dr.Read()

If Not IsDBNull(dr.Item([Ô]qtdEstoque[Ô])) Then Ler_qtd_Estoque = dr.Item([Ô]qtdEstoque[Ô])

Result_qtd_Estoque = (Ler_qtd_Estoque) - (txtQuantidade.Text)

Else

End If

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


------- E no evendo Leave do textbox eu chamo minha função ---

   Private Function verifica_qtd_Estoque() As Boolean

If Result_qtd_Estoque < 0 Then
MsgBox([Ô]Estoque Baixo! Quantidade Inserida: [Ô] & txtQuantidade.Text & [Ô] Superior ao Estoque Existente![Ô], MsgBoxStyle.Information)
txtCodBarra.Focus()
txtCodBarra.SelectAll()
txtQuantidade.Text = [Ô]1[Ô]
Return False
End If

Return True
End Function


-----Mais isso q fiz. so serve se eu adicionar uma quantidade maior q tenho no estoque... agora se eu digitar 2 vezes o valor e ficar maior. passa direto.. dae qnd for no update. fica [txt-color=#e80000] Negativo [/txt-color]

   Private Sub PUpdateNoEstoque()
Using con As OleDbConnection = GetConnection()
Dim dr As OleDbDataReader = Nothing
Try
con.Open()
Dim sql As String
Dim cmd As OleDbCommand
Dim intEntradaProduto As Decimal

For j = 0 To dgvProdutos.Rows.Count - 1

sql = [Ô]SELECT codigo,qtdEstoque from produtos where codigo=?[Ô]
cmd = New OleDbCommand(sql, con)

cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@codigo[Ô], dgvProdutos.Rows(j).Cells(0).Value.ToString())) [ô]COD.PRODUTO

dr = cmd.ExecuteReader
If dr.HasRows Then
dr.Read()

If Not IsDBNull(dr.Item([Ô]qtdEstoque[Ô])) Then Estoque_Baixa = dr.Item([Ô]qtdEstoque[Ô])

intEntradaProduto = (Estoque_Baixa) - CDec(dgvProdutos.Rows(j).Cells(3).Value.ToString())

sql = [Ô]UPDATE produtos SET qtdEstoque=@qtdEstoque WHERE ((codigo=@codigo))[Ô]
cmd = New OleDbCommand(sql, con)
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@qtdEstoque[Ô], intEntradaProduto)) [ô]Resultado
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@codigo[Ô], dgvProdutos.Rows(j).Cells(0).Value.ToString())) [ô]COD.PRODUTO
cmd.ExecuteNonQuery()

Else

End If

Next

MsgBox([Ô]Update do estoque gravado com sucesso.[Ô], MsgBoxStyle.Information)

Catch ex As Exception
MsgBox(ex.Message)
Finally
con.Close()
End Try
End Using
End Sub
NILSONTRES 08/09/2016 00:10:07
#466618
Então,
Pdv dificilmente vc vende algo que não tem, o cliente tem o produto na mão, isso é mais para venda pré entrega, tipo material de construção que vc vende um azulejo para posterior entrega, e o produto esta la no estoque.
Ideal é deixar tudo pré configurável, o seu cliente decide se quer só um aviso que o estoque é negativo, ou se avisa e bloqueia a venda ou se nem mesmo avisa.
Você vai encontra todo tipo de cliente, uns que nem querem saber de controlar estoque, meu sistema tudo é pré configurado a gosto do cliente.
No seu exemplo deveria também ter a opção de deixar lançar duas vezes o mesmo item ou bloquear obrigando o caixa a remover o item já existente e lançando novamente com a quantidade total, mas isso dificilmente o cliente opta, pois pdv é paulera e como eu disse a mercadoria esta na mão, então vai lançando e se faltar estoque o cliente que faça a conferencia, afinal ele que quis assim. 99% dos meus clientes trabalham dessa forma, observe supermercado, já te bloquearam no caixa por falta de estoque ?
NILSONTRES 08/09/2016 00:12:30
#466619
Outra coisa, não esqueça das transações, Commit e Rollback
MILTONSILVA94 08/09/2016 06:48:59
#466620
Crie uma função que ao adicionar o produto no datagrid ele veja a quantia que tem no estoque.
Caso este mesmo item seja informado novamente coloque uma mensagem e some as duas quantidades numa mesma linha.
Com isso dá pra fazer a condição que falou: se for < q qtd no estoque pode bloquear, e
se for > que a qtd no estoque ele segue em frente...
JANDSONSISTENS 08/09/2016 07:40:56
#466621
Citação:

:
Outra coisa, não esqueça das transações, Commit e Rollback



Nilson é verdade essas configurações q vc falou é sempre bom ter. pq cliente tem q todo tipo. e eles querem é vender passar pra frente e nao bloquear a mercadoria .

eu nunca fui barrado no caixa por falta de estoque.. nunca vi isso. kkkk
pq o empresario quer é vender e nao barrar os clientes por falta de estoque.

Outra coisa Nilson. eu ja conclui o XML da NFCe. ja estou emitindo em homologação e produção.
dae tava corrigindo só essa questao da baixa no estoque. que tava ficando [txt-color=#e80000] Negativo [/txt-color]

como seria essas transações ? [txt-color=#0000f0] Commit e Rollback [/txt-color] ?
JANDSONSISTENS 08/09/2016 07:52:14
#466622
Citação:

:
Crie uma função que ao adicionar o produto no datagrid ele veja a quantia que tem no estoque.
Caso este mesmo item seja informado novamente coloque uma mensagem e some as duas quantidades numa mesma linha.
Com isso dá pra fazer a condição que falou: se for < q qtd no estoque pode bloquear, e
se for > que a qtd no estoque ele segue em frente...



Milton, eu ja tentei fazer referencia dentro do datagrid mais achei muito complicado. nao consegui fazer.. eu fiz essas validações. antes de adicionar no datagrid. verificar se tem produto no estoque.. joguei minha função no evento LEAVE do textbox Quantidade... q assim q for digitado a quantidade .. ja tenho meu resultado do estoque. se for superior...
agora se for inferior ele passa quantas vezes for inserido.. Tipo
produto A tem 10 qtd dae se eu for adicionar 3 vezes esse produto A, tpo..
insiro 9
insiro 9
insiro 9
ficou inserido [txt-color=#e80000] 27 [/txt-color] no datagrid. sendo que só tem [txt-color=#e80000] 10 [/txt-color] no estoque.
essa minha função so verifica se a quantidade q foi digitada. é superior a quantidade q tem no estoque. no meu SELECT.
so jeito q sitei no exemplo ai ... [txt-color=#e80000] 27 - 10 = -17 [/txt-color] é isso q ta acontecendo nas minhas vendas.
e nao pode ficar negativo.. :(
NILSONTRES 08/09/2016 08:17:37
#466623
Citação:

como seria essas transações ? Commit e Rollback ?


Então, isso é indispensável,
Dim Transacao As MySqlTransaction = oCn_MYSQL.BeginTransaction(IsolationLevel.ReadCommitted)[ô]para quem utiliza Mysql
if insert produtos=err then
Transacao.Rollback()[ô]reverte qualquer insert ou update até o momento
Transacao.Dispose()
else
Transacao.Commit()[ô]conclui qualquer insert ou update até o momento
Transacao.Dispose()
end if

Imagine que vc após uma venda, insere o registro de venda, depois os itens da venda, depois as comissões e outras coisas mais.
Suponhamos que algo aconteceu logo após gerar o registro da tabela vendas, erro/queda de energia, o que ia acontecer sem as transações ? Você teria um enorme pepino nas mãos, uma venda sem itens, sem as comissões e etc.
Já com as transações, se o código não chegar até o Commit nada é gravado.
Tenho dito que um sistema sem transações é uma bomba relógio, mas tem muita gente que desenvolve e não se atenta para isso.



JANDSONSISTENS 08/09/2016 09:51:00
#466626
Citação:

:
como seria essas transações ? Commit e Rollback ?
Então, isso é indispensável,
Dim Transacao As MySqlTransaction = oCn_MYSQL.BeginTransaction(IsolationLevel.ReadCommitted)[ô]para quem utiliza Mysql
if insert produtos=err then
Transacao.Rollback()[ô]reverte qualquer insert ou update até o momento
Transacao.Dispose()
else
Transacao.Commit()[ô]conclui qualquer insert ou update até o momento
Transacao.Dispose()
end if

Imagine que vc após uma venda, insere o registro de venda, depois os itens da venda, depois as comissões e outras coisas mais.
Suponhamos que algo aconteceu logo após gerar o registro da tabela vendas, erro/queda de energia, o que ia acontecer sem as transações ? Você teria um enorme pepino nas mãos, uma venda sem itens, sem as comissões e etc.
Já com as transações, se o código não chegar até o Commit nada é gravado.
Tenho dito que um sistema sem transações é uma bomba relógio, mas tem muita gente que desenvolve e não se atenta para isso.





nosssaa NilSon. eu nunca sabia disso..
eu uso banco de dados Access.

eu tenho q chamar essa função antes do update no banco ?
NILSONTRES 08/09/2016 11:12:11
#466628
Access também tem o recurso, mas não me lembro bem como inicia, mas é + ou - igual.
Agora, já que esta começando ainda o projeto, recomendo migrar para um banco de dados mesmo, quanto mais cedo menos dor de cabeça.
FILMAN 09/09/2016 00:48:25
#466654
Resposta escolhida
---Esse aqui é um método para fazer o teste que pretende
Private Function Ler_qtd_Estoque_Venda(ByVal codigoProd As String) As Boolean
Dim resultado As Integer = 0
Dim qtdGrid As Integer = 0

[ô]Verifica Qtde do produto no grid se existir
For Each DataGridViewRow row In dgvProdutos.Rows
If row.Cells(1).Value.ToString() = codigoProd Then [ô]Estou suponhando que o código do produto seja a primeira com valor
qtdGrid += Convert.ToInt32(row.Cells(3).Value.ToString())
End If
Next

[ô]Verifica estoque no banco de dados
Using con As OleDbConnection = GetConnection()
Try
con.Open()
Dim cmd As New OleDbCommand([Ô]SELECT codigo, qtdEstoque FROM produtos WHERE codigo=?[Ô], con)

cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@codigo[Ô], codProduto.Text)) [ô]COD.PRODUTO

Dim dr As OleDbDataReader = cmd.ExecuteReader
If dr.HasRows Then
dr.Read()

If Not IsDBNull(dr.Item([Ô]qtdEstoque[Ô])) Then resultado = Convert.ToInt32(dr.Item([Ô]qtdEstoque[Ô]))
End If

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

If resultado = 0 Then
MessageBox.Show([Ô]Seu estoque está zerado, não é possível vender esse produto.[Ô])
Return False
ElseIf (resultado - (Convert.ToInt32(txtQuantidade.Text) + qtdGrid)) < 0 Then
[ô]Aqui você pode permitir ou não. Vai de sua escolha.
MessageBox.Show([Ô]Seu estoque ficará negativo se vender addicionar essa quantidade do produto.[Ô] & _
Environment.NewLine & _
[Ô]Estoque atual: [Ô] & resultado & _
Environment.NewLine & _
[Ô]Qtde na grade: [Ô] & qtdGrid & _
Environment.NewLine & _
[Ô]Qtde inserção: [Ô] & txtQuantidade.Text)

Return False
End If

Return True
End Function



---Esse código vai no seu Leave do TextBox
If Not Ler_qtd_Estoque_Venda(txtCodigoProduto.Text) Then
Return False
Else
[ô]Faz o prodimento normal do Leave do seu TextBox
End If


Não testei o código, mas acho que deve estar funcionando! Qualquer coisa posta ai.

Pra validar o seu estoque só precisa disso que estou postando pra você! Porém a lógica que está querendo seguir é falha.
O mais correto é você já baixar o estoque no ato em que o produto entra no grid, pois você está vendendo e não fazendo um pedido de compras.

Faz o teste ai e me fala
JANDSONSISTENS 09/09/2016 19:57:27
#466691
Citação:

:
---Esse aqui é um método para fazer o teste que pretende

Private Function Ler_qtd_Estoque_Venda(ByVal codigoProd As String) As Boolean
Dim resultado As Integer = 0
Dim qtdGrid As Integer = 0

[ô]Verifica Qtde do produto no grid se existir
For Each DataGridViewRow row In dgvProdutos.Rows
If row.Cells(1).Value.ToString() = codigoProd Then [ô]Estou suponhando que o código do produto seja a primeira com valor
qtdGrid += Convert.ToInt32(row.Cells(3).Value.ToString())
End If
Next

[ô]Verifica estoque no banco de dados
Using con As OleDbConnection = GetConnection()
Try
con.Open()
Dim cmd As New OleDbCommand([Ô]SELECT codigo, qtdEstoque FROM produtos WHERE codigo=?[Ô], con)

cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@codigo[Ô], codProduto.Text)) [ô]COD.PRODUTO

Dim dr As OleDbDataReader = cmd.ExecuteReader
If dr.HasRows Then
dr.Read()

If Not IsDBNull(dr.Item([Ô]qtdEstoque[Ô])) Then resultado = Convert.ToInt32(dr.Item([Ô]qtdEstoque[Ô]))
End If

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

If resultado = 0 Then
MessageBox.Show([Ô]Seu estoque está zerado, não é possível vender esse produto.[Ô])
Return False
ElseIf (resultado - (Convert.ToInt32(txtQuantidade.Text) + qtdGrid)) < 0 Then
[ô]Aqui você pode permitir ou não. Vai de sua escolha.
MessageBox.Show([Ô]Seu estoque ficará negativo se vender addicionar essa quantidade do produto.[Ô] & _
Environment.NewLine & _
[Ô]Estoque atual: [Ô] & resultado & _
Environment.NewLine & _
[Ô]Qtde na grade: [Ô] & qtdGrid & _
Environment.NewLine & _
[Ô]Qtde inserção: [Ô] & txtQuantidade.Text)

Return False
End If

Return True
End Function



---Esse código vai no seu Leave do TextBox
If Not Ler_qtd_Estoque_Venda(txtCodigoProduto.Text) Then
Return False
Else
[ô]Faz o prodimento normal do Leave do seu TextBox
End If


Não testei o código, mas acho que deve estar funcionando! Qualquer coisa posta ai.

Pra validar o seu estoque só precisa disso que estou postando pra você! Porém a lógica que está querendo seguir é falha.
O mais correto é você já baixar o estoque no ato em que o produto entra no grid, pois você está vendendo e não fazendo um pedido de compras.

Faz o teste ai e me fala




vlw brother FILMAN
Tópico encerrado , respostas não são mais permitidas