Pular para o conteúdo principal

Avisar quando o lote selecionado estiver vencido ou vencendo hoje

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Ambos (Pedido/Nota) → Opção 2 → campo Validar Vencimento Lote Produto Tabela: PARMFATUR.ST_VALIDAVENCIMENTOLOTE Valor padrão: 'S' (Sim) — definido em UdmMFA001.pas:567 (AfterInsert de tabPARMFATUR)

Telas impactadas​

MóduloCódigoOnde lêPapel
Parâmetros Faturamento (tela de configuração)MFA001UMFA001.dfm:3977-3990 (label lblST_VALIDAVENCIMENTOLOTE "Validar Vencimento Lote Produto"), UMFA001.dfm:4686-4713 (ComboBox cmbST_VALIDAVENCIMENTOLOTE, items Sim=S / Não=N), UdmMFA001.dfm:1933-1936 (campo tabPARMFATURST_VALIDAVENCIMENTOLOTE), UdmMFA001.dfm:2442, 2614, 2869, 3172 (INSERT/UPDATE/SELECT de PARMFATUR), UdmMFA001.pas:276, 567 (declaração do campo + default)Produtora — onde o usuário configura o valor
Tela de Seleção de Lote na ENTRADA (devoluções/retornos de material)jLoteProducao/ULoteEntradaULoteEntrada.pas:107, 194 (lê o parâmetro em iStValidaVencimentoLote), ULoteEntrada.pas:223, 246 (aplica filtro SQL AND 1 = IIF( (L.DT_VALIDADE >= CURRENT_DATE), 1,0) somente quando = 'S')Consumidora ativa — com 'S' filtra a grade, ocultando lotes já vencidos
Tela de Seleção de Lote na SAÍDA (pedido / nota fiscal individual)jLoteProducao/ULoteSaidaULoteSaida.pas:109, 200 (leitura), ULoteSaida.pas:1326 (evento tabLoteSTATUSValidate → exibe aviso "Este Lote Está Vencido!" / "Este Lote Vence Hoje!" ao marcar um lote)Consumidora ativa — com 'S' avisa (sem bloquear) ao marcar lote vencido/vencendo hoje
Tela de Rateio de Lote AgrupadojLoteProducao/ULoteSaidaAgrupadoULoteSaidaAgrupado.pas:103 (declaração iST_VALIDAVENCIMENTOLOTE), ULoteSaidaAgrupado.pas:184-188 (SELECT dedicado em PARMFATUR), ULoteSaidaAgrupado.pas:709-716 (evento tabLoteSTATUSValidate → aviso ao marcar lote vencido/vencendo hoje)Consumidora ativa — mesmo comportamento de aviso da saída individual
Tela de Seleção de Lote para DevoluçãojLoteProducao/ULoteDevolULoteDevol.pas:114, 203 (leitura em iStValidaVencimentoLote)Consumidora — lê o parâmetro no ShowModal (mantém simetria com as demais telas de lote)
Tela de Seleção de Lote para Selo (sementes com selo E/C/P/S)jLoteProducao/ULoteSeloULoteSelo.pas:78, 167 (leitura em iStValidaVencimentoLote)Consumidora — lê o parâmetro no ShowModal
MPD002 — Pedido de Venda—chama jLoteProducao.ULoteSaida / ULoteSaidaAgrupado para seleção de loteConsumidora indireta
MNF002 — Nota Fiscal—idem, via jLoteProducaoConsumidora indireta

Procedures impactadas​

Nenhuma stored procedure no diretório Scripts/ referencia ST_VALIDAVENCIMENTOLOTE — a validação é 100 % Delphi (UI + filtro SQL dinâmico).

Campos envolvidos​

CampoTabelaDescrição
ST_VALIDAVENCIMENTOLOTEPARMFATURHabilita filtro / aviso de lote vencido
DT_VALIDADELOTESEMENTE / LOTEITEM / LOTEData de validade do lote — comparada com CURRENT_DATE / now
ST_LOTEPEDIDOPARMFATURHabilita controle de lote em pedidos (gate obrigatório — sem ele as telas de lote não abrem)
TP_CONTROLELOTEPARMFATUR'I' → ULoteSaida (aviso); 'A' → ULoteSaidaAgrupado (aviso no mesmo evento)
ST_SELECIONALOTEANTIGOPARMFATURLido em paralelo no mesmo SELECT (ULoteSaidaAgrupado.pas:184); complementa a estratégia FIFO por validade
ST_LOTENEGATIVOPARMESTOQUEFiltro adjacente no SQL da entrada (ULoteEntrada.pas:224, 247)
STATUS / NaoMostraMsggrid interno tabLoteSTATUS = 'Å' marca o lote escolhido; NaoMostraMsg suprime o aviso durante carga automática

Tabelas gravadas​

Este parâmetro é apenas de leitura pelos módulos consumidores — ele é gravado somente pelo próprio MFA001 em PARMFATUR (INSERT/UPDATE via UdmMFA001.dfm).


Opções disponíveis​

S - Sim (Validar vencimento do lote)​

O que fazDetalhe
Entrada de lote (ULoteEntrada)Adiciona ao SELECT da grade o filtro AND 1 = IIF( (L.DT_VALIDADE >= CURRENT_DATE), 1,0) — lotes cuja data de validade já passou não aparecem na lista (ULoteEntrada.pas:223, 246)
Saída individual (ULoteSaida)No evento tabLoteSTATUSValidate (ULoteSaida.pas:1323-1334), ao o usuário marcar um lote (STATUS = 'Å'): se DT_VALIDADE < hoje dispara msgCodigo('I-0000', ['Este Lote Está Vencido!']); se DT_VALIDADE = hoje dispara 'Este Lote Vence Hoje!'
Saída agrupada (ULoteSaidaAgrupado)Mesmo evento (ULoteSaidaAgrupado.pas:705-718), porém com severidade W-0000 (warning) em vez de I-0000
O que não fazNão bloqueia a seleção — todos os avisos são informativos; o usuário pode prosseguir com um lote vencido (só no caso de ENTRADA é que o filtro SQL efetivamente esconde os lotes vencidos). Na SAÍDA / RATEIO AGRUPADO o lote vencido continua listado e selecionável, apenas com aviso
Flag NaoMostraMsgQuando uma rotina automática preenche lotes (ex.: pré-seleção do FIFO via ST_SELECIONALOTEANTIGO), a flag é ligada para suprimir o aviso e evitar spam de mensagens durante o ciclo de escrita no grid

Simulação passo a passo (Saída — pedido de venda)​

  1. Vá em MFA001 → Parâmetros → Ambos → Opção 2 → campo Validar Vencimento Lote Produto
  2. Marque "Sim" ('S') e salve (F6)
  3. Cadastre em LOTESEMENTE dois lotes do mesmo item: lote A com DT_VALIDADE = hoje - 10 dias (vencido) e lote B com DT_VALIDADE = hoje + 60 dias
  4. Em MPD002, crie um pedido do item, dispare a tela de rateio de lote
  5. Marque o lote A (vencido) — o sistema exibe msgCodigo('I-0000', ['Este Lote Está Vencido!'])
  6. Feche o aviso: o lote A continua marcado — a seleção é permitida, apenas sinalizada

Resultado esperado: usuário é avisado ao marcar lote vencido/vencendo hoje, mas nada é bloqueado. A responsabilidade de decidir se usa ou não é do operador.

Simulação passo a passo (Entrada — devolução / retorno)​

  1. Mesma configuração ('S')
  2. Abra uma tela que consome lote de entrada (cadastro de devolução / retorno de material) — ela usa jLoteProducao.ULoteEntrada
  3. A grade de lotes não exibe os lotes com DT_VALIDADE < CURRENT_DATE — eles foram removidos pelo filtro SQL

Resultado esperado: diferente da saída, aqui os vencidos não aparecem (filtro estrutural no SELECT, não apenas aviso).


N - Não (Não validar vencimento)​

O que fazDetalhe
EntradaO filtro AND 1 = IIF( (L.DT_VALIDADE >= CURRENT_DATE), 1,0) não é adicionado ao SELECT — lotes vencidos aparecem normalmente na grade
Saída individual / AgrupadaO IF do tabLoteSTATUSValidate não entra — nenhum aviso é exibido ao marcar lotes vencidos
Uso típicoEmpresas que mantêm lotes históricos só para rastreabilidade, ou onde a "validade" registrada não é crítica para o faturamento (ex.: lote = número de controle interno sem relação com vida útil)

Simulação passo a passo​

  1. Em MFA001 → Parâmetros → Ambos → Opção 2, marque Validar Vencimento Lote Produto = "Não" e salve
  2. Cadastre um lote com DT_VALIDADE = hoje - 30 dias
  3. Em MPD002 / MNF002, abra a seleção de lote: o lote vencido aparece na grade
  4. Marque-o — nenhum aviso é disparado

Resultado esperado: o sistema ignora completamente DT_VALIDADE na seleção de lotes. Não há filtro, não há aviso.


Interação com ST_LOTEPEDIDO / TP_CONTROLELOTE / ST_SELECIONALOTEANTIGO​

  • ST_LOTEPEDIDO é pré-requisito hierárquico. Se estiver desligado ('N'), a tela de seleção de lote nunca abre em pedido / nota — e portanto ST_VALIDAVENCIMENTOLOTE é inócuo nesses fluxos. Só volta a ter efeito quando ST_LOTEPEDIDO = 'S' (ou, para ordem de produção, independentemente desse parâmetro).
  • TP_CONTROLELOTE decide qual tela é aberta: 'I' (Individual) → ULoteSaida (aviso I-0000); 'A' (Agrupado) → ULoteSaidaAgrupado (aviso W-0000). O comportamento de ST_VALIDAVENCIMENTOLOTE é o mesmo nos dois — só muda o código de severidade da mensagem.
  • ST_SELECIONALOTEANTIGO é complementar (FIFO). Em ULoteSaidaAgrupado.pas:184 os dois são lidos no mesmo SELECT. Se ST_SELECIONALOTEANTIGO = 'S' já pré-seleciona o lote de validade mais próxima; com ST_VALIDAVENCIMENTOLOTE = 'S' os avisos de vencido/vencendo hoje são suprimidos durante essa pré-seleção automática via flag NaoMostraMsg — evita bombardear o usuário de mensagens enquanto o sistema escreve no grid. Combinação recomendada para semente: ambos em 'S'.

Tabela Comparativa Resumida​

ValorEntrada (ULoteEntrada)Saída Individual (ULoteSaida)Saída Agrupada (ULoteSaidaAgrupado)Bloqueia operação?
'S' (default)Filtra SELECT — oculta lotes vencidosAviso I-0000 "Lote Vencido/Vence Hoje"Aviso W-0000 "Lote Vencido/Vence Hoje"Não (só avisa; na entrada esconde do select)
'N'SELECT sem filtro — lotes vencidos aparecemNenhum avisoNenhum avisoNão

Referências no Código Fonte​

Delphi (source/)​

ArquivoLinhasO que faz
source/MFA001/UMFA001.dfm3977-3990Label lblST_VALIDAVENCIMENTOLOTE — Caption = "Validar Vencimento Lote Produto"
source/MFA001/UMFA001.dfm4686-4713ComboBox cmbST_VALIDAVENCIMENTOLOTE — DataField = 'ST_VALIDAVENCIMENTOLOTE', items Sim\tS / Não\tN
source/MFA001/UMFA001.pas536-537Declaração do label e combobox
source/MFA001/UdmMFA001.pas276Declaração tabPARMFATURST_VALIDAVENCIMENTOLOTE: TStringField
source/MFA001/UdmMFA001.pas567Default 'S' no AfterInsert de tabPARMFATUR
source/MFA001/UdmMFA001.dfm292, 1933-1937, 2442, 2614, 2869, 3172SELECT / INSERT / UPDATE / TField do campo na tabPARMFATUR
source/jLoteProducao/ULoteEntrada.pas107, 194, 223, 246Leitura + filtro SQL AND 1 = IIF( (L.DT_VALIDADE >= CURRENT_DATE), 1,0) condicional
source/jLoteProducao/ULoteSaida.pas109, 200, 1326-1332Leitura + aviso I-0000 no tabLoteSTATUSValidate
source/jLoteProducao/ULoteSaidaAgrupado.pas103, 184-188, 709-716SELECT direto em PARMFATUR + aviso W-0000 no tabLoteSTATUSValidate
source/jLoteProducao/ULoteDevol.pas114, 203Leitura em iStValidaVencimentoLote (ShowModal da seleção de lote de devolução)
source/jLoteProducao/ULoteSelo.pas78, 167Leitura em iStValidaVencimentoLote (ShowModal da seleção de lote com selo)

SQL (Scripts/)​

Nenhuma stored procedure referencia ST_VALIDAVENCIMENTOLOTE — toda a lógica é Delphi (filtro SQL dinâmico montado em ULoteEntrada e eventos OnValidate em ULoteSaida / ULoteSaidaAgrupado).