CONTROLE DE LOTE E VENCIMENTO

ARES 19/02/2015 15:18:28
#444609
Amigos, boa tarde!

Estou com um programa rodando em um cliente e ele resolveu utilizar controle de lote e vencimento dos produtos, sendo assim,
surgiu a necessidade de integrar esse modulo ao meu programa.

Criei 2 tabelas onde em uma coloco os dados dos lotes e em outra irei colocar os movimentos de estoque para consultas futuras.

No código estou colocando todos os processos automáticos para não ocorrer do usuário escolher um lote errado na hora de faturar.

Minha ideia inicial é quando for solicitado o produto ele busque o primeiro lote e vencimento; depois verifica se a quantidade solicitada e <= ao lote, caso a quantidade solicitada seja maior que o disponível para o lote ele baixa a quantidade do lote e faz um loop até finalizar a quantidade solicitada.

Contudo estou apanhando no loop, veja o código para <= ao lote. Caso vocês possam me ajudar a desenvolver esse loop ou uma outra dica.

[ô]controle de lote
If Me.txtlote >= Me.txtQtde Then
Dim lote_2 As Integer

lote_2 = Me.txtlote - Me.txtQtde

.CommandText = [Ô]update est017 set [Ô] & _
[Ô]estoque = [ô][Ô] & Val(lote_2) & [Ô][ô],[Ô] & _
[Ô]finalizado = [ô][Ô] & Val(IIf(lote_2 = 0, [Ô]1[Ô], [Ô]0[Ô])) & [Ô][ô][Ô] & _
[Ô]where id = [Ô] & Val(Me.txtID_lote) & [Ô][Ô]
.Execute

.CommandText = [Ô]insert into est018 [Ô] & [Ô] (nf, ddata, codigo, lote, vencimento, qtde)values([ô][Ô] & Me.txtnumero & [Ô][ô],[Ô] & [Ô][ô][Ô] & _
Format(Me.txtddata, [Ô]YYYY/MM/DD[Ô]) & [Ô][ô],[Ô] & [Ô][ô][Ô] & _
Me.txtcodigoproduto & [Ô][ô],[Ô] & [Ô][ô][Ô] & _
Me.txtpartida & [Ô][ô],[Ô] & [Ô][ô][Ô] & _
Format(Me.txtvencimento_lote, [Ô]YYYY/MM/DD[Ô]) & [Ô][ô],[Ô] & [Ô][ô][Ô] & _
Val(Me.txtQtde) & [Ô][ô])[Ô]
.Execute

End If

Desde já agradeço a ajuda.
FBGSYSTEMS 19/02/2015 18:31:34
#444622
Resposta escolhida
Antes de ver o loop.
Eu sugiro que você faça o cliente selecionar o lote que vai utilizar. Pois será que o fulano que vai pegar o produto na prateleira, vai pegar exatamente o lote que o sistema considerou que vai sair ?

Se seu cliente é fora do normal/natural essa regra do sistema será ideal, porém nem sempre é assim. O que voce pode fazer é ao exibir a list pro cliente selecionar o lote, exibir em ordem de vencimento.

MARCELO.TREZE 19/02/2015 21:31:20
#444625
amigo qual é o banco de dados? não sei se entendi sua ideia de loop, pois não vejo esta necessidade, quanto a baixar pelo lote bastaria ir subtraindo a quantidade do estoque.

mas o que eu iria sugerir de verdade seria uma trigger assim vc não teria problemas e tornaria o processo mais rapido

ARES 20/02/2015 11:52:23
#444639
Amigos, obrigado pelas respostas!

FBGSYSYEMS estive pensando em fazer da forma que vc sugeriu adicionado uma etiqueta que baixaria o produto correto, mas como usamos leitura de código de barras demandaria mais tempo do caixa na operação. Estive pensando em orientar o lojista a disponibilizar na gondola os produtos na ordem de saída.

Marcelo, nesse cliente estou usando o MYSQL remoto com a base em nuvem.
Como eu faria a aplicação do triggers no meu código?

Desde já agradeço.
FFCOUTO 20/02/2015 13:12:35
#444643
ARES, que tipo de estabelecimento o seu cliente possui?
Esse assunto me interessa bastante pois terei de ajustar meu sistema aqui para o controle de lotes uma vez que a partir de 2016 essa informação será obrigatória para o SPED.
MARCELO.TREZE 20/02/2015 21:19:24
#444658
vamos lá, trigger chega a ser simples de se usar, porém seria necessário entender melhor como funciona.

eu não entendi o seu código acima veja:

Citação:

If Me.txtlote >= Me.txtQtde Then
Dim lote_2 As Integer

lote_2 = Me.txtlote - Me.txtQtde



o que não entendo no código acima porque existe o txtbox (txtlote) vc lança a quantidade no lote e depois também lança a quantidade em txtQtde, posso estar enganado e você pode estar lança por uma query o valor em txtLote, porém penso assim, corrija-me se eu estiver errado, o certo seria vc ao lançar verificar se a quantidade vendida existe em estoque, e caso não exista tomar alguma atitude, tipo exibir uma mensagem, ou diminuir na quantidade existem no lote e buscar o restante em outro lote. vai ficar mais fá

se você poder explicar um pouquinho melhor ficara mais fá de ajudar.








ARES 23/02/2015 16:01:17
#444708
Marcelo,boa tarde!

A ideia é fazer a query buscando um novo lote sempre que a quantidade do lote com vencimento menor não for suficiente para a quantidade solicitada.

Desculpe-me ter mantido a condição no lote, pois eu gosto de ir tirando a prova enquanto faço os testes.

Estou aberto a novos aprendizados, qualquer ajuda é muito bem vinda.

******************

FFCOUTO

é um mini mercado registrado como MEI, está desobrigado da apresentação dos SPED[ô]s, mas a ideia é deixa-lo pronto para a validação do bloco K, assim que estiver validado posso lhe encaminhar o que fiz para vc adaptar ao seu projeto.


Desde já agrade a todos.
FOXMAN 25/02/2015 18:56:59
#444790
Bem, eu implantei o controle de lote e validade no meu sistema a pelo menos 3 anos.
A idéia básica é essa mesmo que vc está seguindo.

Ao lançar o item eu checo os lotes e ordeno por data de vencimento e jogo em um listview. Se o lote solicitado atender ao pedido, faço a baixa(somente no final do pedido), caso contrário vou calculando e subtraindo a quantidade até zerar a quantidade desejada.

Porém isso é tudo automático, e já checo todos os lotes disponiveis e que serão utilizado. Caso o cliente desmarque um lote, eu refaço o calculo ignorando o lote desmarcado. Se ele marcar um outro lote, refaço o calculo .
Dou a opção do cliente selecionar o lote que quiser, mas de cara já trago selecionado os lotes que serão utilizado. Se ele mudar o lote o sistema refaz os calculos.


FBGSYSTEMS 26/02/2015 10:43:45
#444800
Se você quer mesmo fazer de forma automática, talvez essa rotina que eu fiz para baixa de credito para abastecimento te sirva de alguma coisa:


    Set dsBaixa = New ADODB.Recordset
dsBaixa.open [Ô]select * from controleabastecimento where placa =[ô][Ô] & lstPesq.SelectedItem.SubItems(1) & [Ô][ô] and (isnull(habilitado) or habilitado=[ô]S[ô]) order by qtddisponivel[Ô], con, adOpenDynamic, adLockOptimistic
If Not dsBaixa.EOF Then
Do While Not dsBaixa.EOF
If dsBaixa!datalimite = lstPesq.SelectedItem.SubItems(4) Then
If CDbl(varQtd) > 0 Then
If CDbl(varQtd) >= CDbl(dsBaixa!qtddisponivel) Then
dsBaixa!qtdusada = IIf(IsNull(dsBaixa!qtdusada), 0, dsBaixa!qtdusada) + dsBaixa!qtddisponivel
varQtd = CDbl(varQtd) - CDbl(dsBaixa!qtddisponivel)

dsBaixa!habilitado = [Ô]N[Ô]
dsBaixa!qtddisponivel = 0


dsBaixa.Update
Else

dsBaixa!qtdusada = CDbl(IIf(IsNull(dsBaixa!qtdusada), 0, dsBaixa!qtdusada)) + CDbl(varQtd)
dsBaixa!qtddisponivel = CDbl(dsBaixa!qtddisponivel) - CDbl(varQtd)

varQtd = 0
[ô]dsBaixa!dtabasteceu = txtDtAbasteceu
dsBaixa.Update
End If
End If
End If
dsBaixa.MoveNext
Loop


Basicamente ele pega a quantidade solicitada e varre os registros válidos. A cada um ele verifica a quantidade ainda restante do solicitado e da baixa na quantidade do registro.
Tópico encerrado , respostas não são mais permitidas