Parâmetro de Alerta de Estoque Negativo
Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Ambos → Opção 1 Tabela:
PARMFATUR.ST_ALERTAESTOQUENEGATIVOValor padrão:N(Não)
Telas impactadas
| Módulo | Código | Descrição |
|---|---|---|
| Pedido de Venda | MPD002 | Pedido de venda — alerta quando quantidade exceder saldo (físico ou comprometido) |
| Pedido (Simplificado) | MPD005 | Pedido simples — propaga o parâmetro para VERIFICA_ESTOQUENEGATIVOOS |
| Orçamento | MPD018 | Orçamento — valida saldo ao salvar (apenas opção 'S') |
| Pedido com Controle de Ordem | MPD010 | Pedido — valida saldo ao salvar (apenas 'S') |
| Pedido (Apoio) | MPD011 | Pedido — trata 'S' e 'F' em diferentes fluxos |
| Pedido Mobile/Simplificado | MPD020 | Pedido mobile — trata 'S' e 'F', verifica ao inserir item |
| Pedido Concretagem/Armadura/Oficina | MPD058 | 3 sub-forms de produção (concretagem/armadura/oficina) — apenas 'S' |
| Pedido Produção | MPD073 | Pedido de produção — apenas 'S' |
| Pedido de Compra | MPD092 | Pedido de compra — apenas 'S' |
| NF Saída (Outra) / Confirmação | MNF017 | NF de saída outra, confirmação de pedido — trata 'S' e 'F' |
| Nota Fiscal Saída | MNF002 | Apenas no SELECT que carrega PARMFATUR (sem uso direto encontrado) |
| NF Entrada (Avulsa) | MNF008 | Apenas no SELECT do PARMFATUR (sem uso efetivo) |
| Ordem de Serviço | MOF001 | OS — valida saldo em ITEMCONSUMO e SERVICOITEM, trata 'S' e 'F' |
| Ordem de Serviço (Outra) | MOF002 | OS — carrega o parâmetro (sem uso direto encontrado) |
| Ordem Carregamento/Romaneio | MRC019 | Romaneio — apenas 'S' |
| Recap NF | MRC020 | Recap NF — carrega em iST_ALERTAESTOQUENEGATIVO |
| Contas a Receber | MCO006 | Apenas no SELECT do PARMFATUR (sem uso efetivo) |
| Consulta Pedidos | CPD009 | Inclui o campo no UPDATE/SELECT do PARMFATUR |
| Cadastro Auxiliar | RCA006 | Inclui o campo no UPDATE/SELECT do PARMFATUR |
Procedures impactadas
Procedures de verificação de estoque
| Procedure | Arquivo | Descrição |
|---|---|---|
VERIFICA_ESTOQUENEGATIVONOTA | Scripts/VERIFICA_ESTOQUENEGATIVONOTA.sql | Valida saldo de itens da NF. Escolhe entre saldo físico (RETORNA_SALDOESTOQUE) ou comprometido (RETORNA_ESTOQUECOMPROMETIDO) conforme opção 'F' ou 'S' |
VERIFICA_ESTOQUENEGATIVOPEDIDO | Scripts/VERIFICA_ESTOQUENEGATIVOPEDIDO.sql | Valida saldo de itens do Pedido. Mesmo padrão de escolha físico vs comprometido |
VERIFICA_ESTOQUENEGATIVOOS | Scripts/VERIFICA_ESTOQUENEGATIVOOS.sql | Valida saldo em Ordem de Serviço. Retorna O_ST_ALERTAESTOQUENEGATIVO baseado no parâmetro |
Procedures de saldo por grade
| Procedure | Arquivo | Descrição |
|---|---|---|
RETORNA_QTDEESTOQUEGRADE | Scripts/RETORNA_QTDEESTOQUEGRADE.sql | Retorna quantidade em estoque por grade. Usa ST_ALERTAESTOQUENEGATIVO (em variável V_ST_ESTOQUENEG) em conjunto com ST_ESTOQUENEGATIVO para decidir se considera saldo físico ou comprometido |
RETORNA_ESTOQUECOMPROMETGRADE | Scripts/RETORNA_ESTOQUECOMPROMETGRADE.sql | Retorna estoque comprometido por grade. Lê o parâmetro para aplicar regra |
Campos envolvidos
| Campo | Descrição |
|---|---|
PARMFATUR.ST_ALERTAESTOQUENEGATIVO | Flag (F/S/N) que define se o sistema alerta quando item ficaria com estoque negativo, e qual base de cálculo usar |
PARMFATUR.ST_ESTOQUENEGATIVO | Parâmetro complementar que bloqueia (em vez de apenas alertar) a operação com estoque negativo |
ITEMPEDIDO.QT_PEDIDA / ITEMNOTA.QT_ITEMNOTA | Quantidade do item comparada com saldo |
ITEMPEDIDO.PS_PEDIDO / ITEMNOTA.PS_ITEMNOTA | Peso do item (comparado com saldo quando aplicável) |
ITEM.ST_ESTOQUE | Controle de estoque do produto ('S' = controla estoque). Itens que não controlam estoque são ignorados pela validação |
Opções disponíveis
F - Sim (Saldo Físico)
| O que faz | Detalhe |
|---|---|
| Alerta estoque negativo? | Sim |
| Base de cálculo | Saldo físico puro — consulta RETORNA_SALDOESTOQUE (ou RETORNA_SALDOESTOQUEGRADE para grades) |
| Ignora pedidos pendentes? | Sim — desconsidera compromisso de saída já gravado (pedidos abertos) |
| No Delphi (MPD002, MPD020, MNF017, MOF001, MPD011) | Compara PS_PEDIDO ou QT_PEDIDA com QT_SALDOFISICO/QT_FISICO |
No SQL (VERIFICA_ESTOQUENEGATIVO*) | Ramo IF V_ST_ALERTAESTOQUENEGATIVO = 'F' → usa RETORNA_SALDOESTOQUE |
| Comportamento se exceder | Monta mensagem: "O Item XXX não possui saldo suficiente para operação! Quantidade necessária: ... Quantidade em Estoque: ..." |
Simulação passo a passo
- Vá em MFA001 → Parâmetros → Ambos → Opção 1 → ST_ALERTAESTOQUENEGATIVO = "Sim (Saldo Físico)"
- Salve os parâmetros (F6)
- Tenha um produto com saldo físico de 10 unidades (nenhum pedido pendente)
- Abra um Pedido de Venda (MPD002)
- Adicione o produto com quantidade 15 → Sistema exibe alerta: "Quantidade necessária: 15, Quantidade em Estoque: 10"
- Adicione o mesmo produto com quantidade 8 → Não alerta (saldo físico suficiente)
- Crie uma reserva do produto em outro pedido (5 unidades). O saldo físico continua 10 (não foi baixado ainda)
- Adicione o produto com quantidade 9 → Não alerta (ignora os 5 já comprometidos; só olha saldo físico)
Resultado esperado: O sistema alerta com base no estoque físico puro, desconsiderando pedidos em aberto. Útil para operações onde a entrega é imediata e o comprometimento de outros pedidos não é relevante.
S - Sim (Saldo Comprometido)
| O que faz | Detalhe |
|---|---|
| Alerta estoque negativo? | Sim |
| Base de cálculo | Saldo comprometido — consulta RETORNA_ESTOQUECOMPROMETIDO (ou RETORNA_ESTOQUECOMPROMETGRADE para grades) |
| Ignora pedidos pendentes? | Não — desconta do saldo físico todas as quantidades já comprometidas em pedidos abertos |
Depende de PARMESTOQUE.ST_ESTOQUECOMPROMETIDO | Sim — se for 'N' o ramo cai para RETORNA_SALDOESTOQUE (comportamento igual a 'F') |
| No Delphi | Compara PS_PEDIDO / QT_PEDIDA com O_QT_SALDO (saldo comprometido calculado) |
No SQL (VERIFICA_ESTOQUENEGATIVO*) | Ramo IF V_ST_ALERTAESTOQUENEGATIVO = 'S' → usa RETORNA_ESTOQUECOMPROMETIDO e soma pedidos abertos (PEDIDONOTA) |
| Comportamento se exceder | Mesma mensagem de 'F', mas com QT_ESTCOMPROMETIDO (saldo após descontar compromissos) |
Simulação passo a passo
- MFA001 → ST_ALERTAESTOQUENEGATIVO = "Sim (Saldo Comprometido)"
- Salve os parâmetros (F6)
- Confirme que
PARMESTOQUE.ST_ESTOQUECOMPROMETIDOestá diferente de'N'(caso contrário cai para comportamento de'F') - Tenha um produto com saldo físico de 10 unidades e 5 unidades já comprometidas em pedidos abertos (saldo comprometido disponível: 5)
- Abra um Pedido de Venda (MPD002)
- Adicione o produto com quantidade 6 → Alerta! (5 disponíveis após descontar compromissos)
- Adicione o produto com quantidade 4 → Não alerta (cabe nos 5 comprometidos disponíveis)
- Adicione o produto com quantidade 11 → Alerta também ao superar o físico total
Resultado esperado: O sistema alerta considerando pedidos já em aberto. Evita aceitar nova venda que já está reservada para outro cliente.
N - Não (Sem Alerta)
| O que faz | Detalhe |
|---|---|
| Alerta estoque negativo? | Não |
| Base de cálculo | — (não verifica) |
| SQL do MPD002 | O SQL de tabITEMPEDIDO é modificado em tempo de execução: remove o LEFT JOIN RETORNA_SALDOESTOQUE e substitui RSE.O_QT_SALDO por CAST(Null AS NUMERIC(15,5)) |
SQL das procedures VERIFICA_ESTOQUENEGATIVO* | Entra no IF principal apenas se ST_ESTOQUENEGATIVO <> 'N' (parâmetro de bloqueio). Se ambos forem 'N', a procedure não valida nada |
| Comportamento | Usuário digita qualquer quantidade livremente, sem nenhuma advertência |
Simulação passo a passo
- MFA001 → ST_ALERTAESTOQUENEGATIVO = "Não"
- Salve os parâmetros (F6)
- Abra um Pedido de Venda (MPD002)
- Adicione produto com quantidade muito acima do saldo → Não alerta, salva normalmente
- O sistema não executa a consulta de
RETORNA_SALDOESTOQUEno grid de itens (SQL é reescrito em runtime)
Resultado esperado: Total liberdade para operar com valores acima do saldo. Alerta desativado.
Este é o valor padrão ao criar um novo registro no MFA001.
Observação Importante: Interação com ST_ESTOQUENEGATIVO
Os parâmetros ST_ALERTAESTOQUENEGATIVO e ST_ESTOQUENEGATIVO funcionam em conjunto:
| ST_ALERTAESTOQUENEGATIVO | ST_ESTOQUENEGATIVO | Comportamento |
|---|---|---|
F ou S | N | Só alerta — usuário pode prosseguir apesar do alerta |
F ou S | S | Alerta e pode bloquear — procedures também validam bloqueio |
N | S | Valida bloqueio por ST_ESTOQUENEGATIVO, mas sem alerta antecipado |
N | N | Nenhuma validação de estoque negativo |
No código SQL (VERIFICA_ESTOQUENEGATIVONOTA):
A validação é disparada quando pelo menos um dos dois parâmetros está ativo.
No código Delphi do MPD002 , o alerta só dispara quando ST_ESTOQUENEGATIVO = 'N' (para não duplicar com o bloqueio):
Observação Importante: Dependência de CD_OPERACAO e flagEstoqueNegativo
O alerta no MPD002 só dispara quando:
ST_ALERTAESTOQUENEGATIVO='S'ou'F'.tabITEMPEDIDOCD_OPERACAOestá preenchido (item tem operação de movimentação definida).flagEstoqueNegativoestá habilitado (flag interna que indica que aquela movimentação faz baixa no estoque — consultaMOVIMENTACAO.ST_ESTOQUENEGATIVO/TP_ESTOQUE).
Itens sem operação ou com operação que não baixa estoque nunca geram alerta, independentemente do parâmetro.
Observação Importante: Dependência de PARMESTOQUE.ST_ESTOQUECOMPROMETIDO
Quando ST_ALERTAESTOQUENEGATIVO = 'S' nas procedures SQL, o cálculo de saldo comprometido só acontece se PARMESTOQUE.ST_ESTOQUECOMPROMETIDO <> 'N' (configurado em CAD001 / Parâmetros de Estoque). Se ST_ESTOQUECOMPROMETIDO = 'N', o comportamento de 'S' degrada para 'F' (usa apenas saldo físico via RETORNA_SALDOESTOQUE).
Ver VERIFICA_ESTOQUENEGATIVONOTA e VERIFICA_ESTOQUENEGATIVOPEDIDO.
Observação Importante: SQL Dinâmico no MPD002
No MPD002, quando ST_ALERTAESTOQUENEGATIVO = 'N', o código modifica o SQL do grid de itens em runtime removendo o LEFT JOIN RETORNA_SALDOESTOQUE. Isso evita o custo da consulta de saldo quando o alerta está desativado:
Tabela Comparativa Resumida
| Opção | Descrição | Alerta? | Considera pedidos pendentes? | Procedure SQL usada | SQL do grid modificado? |
|---|---|---|---|---|---|
| F | Sim (Saldo Físico) | Sim | Não | RETORNA_SALDOESTOQUE | Não |
| S | Sim (Saldo Comprometido) | Sim | Sim (desconta compromissos) | RETORNA_ESTOQUECOMPROMETIDO | Não |
| N | Não | Não | — | Nenhuma (pula o IF principal) | Sim (remove JOIN de saldo) |