Pular para o conteúdo principal

ST_ATUALIZATABVENDAPROD - Reprocessa Preço Venda dos Produtos com Ficha de Produção

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Notas Fiscais → Parâmetros de Notas (label visível: "Reprocessa Preço Venda dos Produtos com Ficha de Produção" — UMFA001.dfm:6405) Tabela: PARMFATUR.ST_ATUALIZATABVENDAPROD (VARCHAR(1)) Valor padrão: N (Não) — definido em UdmMFA001.pas:540 (AfterInsert)

Este parâmetro ativa uma propagação em cascata dentro da procedure SQL ATUALIZA_PRECOVENDA: quando o preço de venda de uma matéria-prima é recalculado (ex.: por entrada de NF no MNF001 ou alteração de custo no cadastro de produto TPO001), o sistema identifica todos os produtos acabados cuja ficha de produção (ITEMPRODUCAO) utiliza essa matéria-prima, recalcula o custo total desses acabados somando a participação de cada insumo (à entrada + saldo em estoque) e chama recursivamente ATUALIZA_PRECOVENDA para cada produto acabado — atualizando também o preço de venda deles.

Sem o parâmetro ligado, apenas a matéria-prima tem seu preço de venda recalculado; os produtos finais mantêm o preço antigo até que uma operação específica os atinja.

Telas impactadas​

MóduloCódigoDescriçãoUso
Parâmetros de FaturamentoMFA001Tela de configuração do parâmetro (combo cmbST_ATUALIZATABVENDAPROD, UMFA001.dfm:7385)Leitura/gravação
Entrada / Nota Fiscal de CompraMNF001Chama ATUALIZA_PRECOVENDA no rateio de frete (UFRETENF.pas:563) — dispara a cascata de produtos acabados quando ST_ATUALIZATABVENDAPROD = 'S'Leitura indireta (via procedure)
Cadastro de ProdutoTPO001Chama ATUALIZA_PRECOVENDA ao atualizar preços do produto (UdmTPO001.pas:1291) com TP_LANCAMENTO = 'P'Leitura indireta (via procedure)

Observação: UCUSTOREPOSICAONF.pas também monta uma chamada a ATUALIZA_PRECOVENDA (linha 386), mas o trecho está comentado no código atual.

Procedures impactadas​

ProcedureArquivoDescrição
ATUALIZA_PRECOVENDAScripts/ATUALIZA_PRECOVENDA.sqlProcedure central de recálculo de preço de venda. Lê V_ST_ATUALIZATABVENDAPROD (linha 42-46) junto com TP_ATUALIZACAOTABELAVENDA e QT_CASASDECIMAISPRECOVENDA. Após concluir o UPDATE em ITEMTABPRECO da matéria-prima, avalia o bloco da linha 293 — se V_ST_ATUALIZATABVENDAPROD = 'S' e V_VL_PRECOVENDA > 0, abre cursor sobre ITEMPRODUCAO buscando produtos acabados onde CD_MATERIAPRIMA = I_CD_ITEM, recalcula V_VL_CUSTOTOT somando QT_PARTICIPACAO * VL_CUSTO de cada insumo (usando o novo I_VL_UNITARIO para a matéria-prima atualizada e RETORNA_SALDOESTOQUE para os demais) e executa recursivamente ATUALIZA_PRECOVENDA para cada produto acabado.

Campos envolvidos​

Campo / TabelaDescrição
PARMFATUR.ST_ATUALIZATABVENDAPRODParâmetro em si ('S' / 'N').
PARMFATUR.TP_ATUALIZACAOTABELAVENDALido no mesmo SELECT (ATUALIZA_PRECOVENDA.sql:42). Define o escopo de tabelas que o recálculo de cada produto acabado vai afetar — ver TP_ATUALIZACAOTABELAVENDA.
PARMFATUR.QT_CASASDECIMAISPRECOVENDALido no mesmo SELECT. Aplicado via AJUSTA_PRECOVENDA antes do UPDATE em ITEMTABPRECO.
ITEMPRODUCAO.CD_ITEMProduto acabado (alvo da cascata).
ITEMPRODUCAO.CD_MATERIAPRIMAMatéria-prima — o cursor seleciona DISTINCT CD_ITEM onde CD_MATERIAPRIMA = I_CD_ITEM (linha 297-301).
ITEMPRODUCAO.QT_PARTICIPACAO, ITEMPRODUCAO.NR_VERSAO, ITEMPRODUCAO.TP_PRODUCAOCompõem o recálculo de V_VL_CUSTOTOT (linhas 314-331).
PRODUCAO.ST_PRODUCAO = 'V'Somente a primeira ficha de produção válida do produto é considerada (FIRST 1, linhas 307-312).
ITEM.PC_MARGEMLUCROMargem do produto acabado passada na chamada recursiva (linha 297, campo T.PC_MARGEMLUCRO).
RETORNA_SALDOESTOQUEFunction que traz o custo atual (O_VL_CUSTO) de cada matéria-prima que não seja a que está sendo atualizada agora — usada no LEFT JOIN do cursor interno (linha 316).
ITEMTABPRECO.VL_PRECOAlvo do UPDATE dentro de cada chamada recursiva (linhas 281-285).

Opções disponíveis​

S - Sim (reprocessa produtos acabados em cascata)​

O que fazDetalhe
Bloco disparadoATUALIZA_PRECOVENDA.sql:293-340 — if ((V_ST_ATUALIZATABVENDAPROD = 'S') and (coalesce(V_VL_PRECOVENDA,0) > 0 ))
Cursor externoSELECT DISTINCT I.CD_ITEM, T.PC_MARGEMLUCRO FROM ITEMPRODUCAO I INNER JOIN ITEM T ON T.CD_ITEM = I.CD_ITEM WHERE I.CD_EMPRESA = :I_CD_EMPRESA AND I.CD_MATERIAPRIMA = :I_CD_ITEM
Ficha usadaFIRST 1 ficha válida (ST_PRODUCAO = 'V') do produto acabado
Cálculo do custoV_VL_CUSTOTOT = SUM(QT_PARTICIPACAO * VL_CUSTO) — para a matéria-prima atualizada usa I_VL_UNITARIO; para as demais usa RETORNA_SALDOESTOQUE(CD_EMPRESA, CD_MATERIAPRIMA, CD_TIPOLOCALORIGEM, CD_LOCALORIGEM, CURRENT_DATE).O_VL_CUSTO
RecursãoEXECUTE PROCEDURE ATUALIZA_PRECOVENDA(:I_CD_EMPRESA, :I_CD_TABPRECO, :V_CD_ITEMPRINC, :I_PC_MARGEMVENDA, :V_PC_MARGEMLUCRO, :V_VL_CUSTOTOT, :I_ST_PRECOVENDA, :I_TP_LANCAMENTO) (linhas 335-336)
PrecondiçãoV_VL_PRECOVENDA > 0 — se o recálculo da matéria-prima não gerou preço positivo (por exemplo, não há margem), a cascata não ocorre
HistóricoComentário Rogério 15/06/2015 - Chamado 103829 (linhas 290-292) — criado para que a atualização de uma matéria-prima propague automaticamente para todos os produtos acabados que a utilizam

Simulação passo a passo​

  1. Em MFA001 → Parâmetros → Faturamento → Opção 1, ajuste "Reprocessa Preço Venda dos Produtos com Ficha de Produção" = Sim.
  2. Garanta que ST_PRECOVENDA esteja configurado de modo que a entrada recalcule preço da matéria-prima (ex.: 'C', 'B', 'F' ou 'G' para entrada via NF).
  3. Cadastre a ficha de produção (tela de Produção) de um produto acabado ACAB-1 com duas matérias-primas: MP-A (QT_PARTICIPACAO = 2) e MP-B (QT_PARTICIPACAO = 3), com ST_PRODUCAO = 'V'.
  4. Abra MNF001 e lance uma NF de entrada onde MP-A chega com VL_UNITARIO = R$ 10,00.
  5. Ao confirmar, o sistema chama ATUALIZA_PRECOVENDA(cdEmpresa, tabelaVenda, CD_ITEM=MP-A, ..., VL_UNITARIO=10, 'C', 'N').
  6. A procedure atualiza ITEMTABPRECO.VL_PRECO de MP-A conforme TP_ATUALIZACAOTABELAVENDA, gerando V_VL_PRECOVENDA > 0.
  7. O bloco da linha 293 dispara: cursor encontra ACAB-1 em ITEMPRODUCAO.CD_MATERIAPRIMA = MP-A.
  8. Sistema lê FIRST 1 ficha válida de ACAB-1, itera os insumos:
    • MP-A (QT_PARTICIPACAO = 2) → usa I_VL_UNITARIO = R$ 10,00 → contribui R$ 20,00.
    • MP-B (QT_PARTICIPACAO = 3) → busca RETORNA_SALDOESTOQUE(..., MP-B, ..., CURRENT_DATE).O_VL_CUSTO (ex.: R$ 4,00) → contribui R$ 12,00.
    • V_VL_CUSTOTOT = R$ 32,00.
  9. Chama recursivamente ATUALIZA_PRECOVENDA(cdEmpresa, tabelaVenda, CD_ITEM=ACAB-1, I_PC_MARGEMVENDA, PC_MARGEMLUCRO_ACAB-1, 32.00, 'C', 'N').
  10. ACAB-1 tem sua ITEMTABPRECO.VL_PRECO recalculada na mesma tabela (e demais conforme TP_ATUALIZACAOTABELAVENDA).

Resultado esperado: A entrada de uma matéria-prima no MNF001 sobe a cascata e atualiza automaticamente o preço de venda de todos os produtos acabados que a utilizam na ficha de produção.


N - Não (padrão — não propaga)​

O que fazDetalhe
Bloco bypassO IF da linha 293 falha — bloco linhas 294-340 é ignorado
EfeitoApenas a matéria-prima (item que chegou como I_CD_ITEM) tem seu ITEMTABPRECO.VL_PRECO atualizado
Produtos acabadosMantêm o preço antigo, mesmo que o custo da matéria-prima tenha variado significativamente
É o valor padrãoSim — tabPARMFATURST_ATUALIZATABVENDAPROD.AsString := 'N' em UdmMFA001.pas:540
Quando usarQuando a empresa prefere controlar manualmente os preços dos produtos acabados (ex.: revisão periódica de tabela em bloco) em vez de recalcular a cada movimentação de matéria-prima

Simulação passo a passo​

  1. Em MFA001 → Parâmetros → Faturamento → Opção 1, mantenha "Reprocessa Preço Venda dos Produtos com Ficha de Produção" = Não (padrão).
  2. Cenário idêntico ao da opção S: ficha de ACAB-1 usa MP-A e MP-B, e chega uma NF com MP-A a R$ 10,00.
  3. ATUALIZA_PRECOVENDA atualiza ITEMTABPRECO.VL_PRECO de MP-A.
  4. Ao chegar na linha 293, V_ST_ATUALIZATABVENDAPROD = 'N' → bloco é pulado.
  5. ACAB-1 não é tocado.

Resultado esperado: Preço de MP-A atualizado; preço de ACAB-1 permanece como estava. Caberá à empresa rodar uma rotina manual (ex.: TPO001 chamando ATUALIZA_PRECOVENDA com TP_LANCAMENTO = 'P') quando desejar propagar.


Interação com ST_ATUALIZATABPRECO / TP_ATUALIZACAOTABELAVENDA​

Os três parâmetros atuam em dimensões diferentes — gatilho, escopo e propagação — do recálculo de preço de venda:

ParâmetroMomentoO que decideOnde é consumido
ST_ATUALIZATABPRECOConfirmação de Custo de Reposição Manual em NF de entrada (MNF001)Qual coluna do grid (VL_ANTIGO vs VL_VENDA) é gravada em ITEMTABPRECO.VL_PRECODelphi (UCUSTOREPOSICAONF.pas) — não dispara ATUALIZA_PRECOVENDA
TP_ATUALIZACAOTABELAVENDADentro de ATUALIZA_PRECOVENDAQuais tabelas de venda (todas / só com regra em MFA006 / só a padrão) são atualizadas para o item correnteProcedure SQL ATUALIZA_PRECOVENDA (campo V_TP_ATUALIZACAO)
ST_ATUALIZATABVENDAPROD (este)Ao final do UPDATE do item corrente em ATUALIZA_PRECOVENDASe propaga a atualização para todos os produtos acabados que consomem o item na ficha de produçãoProcedure SQL ATUALIZA_PRECOVENDA (bloco linha 293)

Pontos-chave:

  • ST_ATUALIZATABVENDAPROD só age dentro de ATUALIZA_PRECOVENDA, portanto depende de outra tela/procedure chamar ATUALIZA_PRECOVENDA primeiro. Os chamadores reais em Delphi são MNF001 (UFRETENF.pas) e TPO001 (UdmTPO001.pas).
  • A recursão herda o mesmo ST_PRECOVENDA e TP_LANCAMENTO da chamada original (I_ST_PRECOVENDA, I_TP_LANCAMENTO nos parâmetros 7 e 8). Isso significa que os filtros do IF da linha 47 (combinações permitidas de TP_LANCAMENTO × ST_PRECOVENDA) continuam valendo nas chamadas recursivas.
  • TP_ATUALIZACAOTABELAVENDA também é relido a cada recursão (ele é lido uma vez por chamada da procedure). O escopo de tabelas aplicado ao produto acabado é o mesmo configurado para a empresa — não há como pedir "todas para a matéria-prima e só a padrão para o acabado".
  • Diferente de ST_ATUALIZATABPRECO, este parâmetro não tem relação com o fluxo de Custo de Reposição Manual. Ele só faz sentido quando a empresa trabalha com ficha de produção (ITEMPRODUCAO populada).
  • A precondição V_VL_PRECOVENDA > 0 (linha 293) significa que, se o item corrente não teve preço de venda positivo gerado (ex.: por falta de margem configurada no IF da linha 55 — v_pc_margemitemtab IS NOT NULL etc.), a cascata não dispara, mesmo com ST_ATUALIZATABVENDAPROD = 'S'.

Tabela Comparativa Resumida​

OpçãoDescriçãoPropaga para produtos acabados?Tabelas afetadas por produto acabadoValor padrão?
SSimSim — recursão em ITEMPRODUCAO onde CD_MATERIAPRIMA = CD_ITEM atualizadoDefinidas por TP_ATUALIZACAOTABELAVENDA para cada acabadoNão
NNãoNão — apenas o item corrente é atualizado—Sim

Referências no Código Fonte​

Delphi​

ArquivoLinhaUso
source/MFA001/UMFA001.dfm6399-6413Label Label81.Caption = 'Reprocessa Preço Venda dos Produtos com Ficha de Produção' (FocusControl = cmbST_ATUALIZATABVENDAPROD)
source/MFA001/UMFA001.dfm7385-7409ComboBox cmbST_ATUALIZATABVENDAPROD (items 'Sim'=S, 'Não'=N), dentro de pagPARMAMETROS → pagAmbos ("Faturamento") → pagFatOp1 ("Opção 1") → grpAmbos ("Parâmetros Comum a Notas Fiscais / Pedido")
source/MFA001/UMFA001.dfm7395DataField = 'ST_ATUALIZATABVENDAPROD' / DataSource = dmMFA001.dsPARMFATUR
source/MFA001/UMFA001.pas429Declaração cmbST_ATUALIZATABVENDAPROD: TwwDBComboBox
source/MFA001/UdmMFA001.pas240Declaração tabPARMFATURST_ATUALIZATABVENDAPROD: TStringField
source/MFA001/UdmMFA001.pas540Valor padrão em AfterInsert: tabPARMFATURST_ATUALIZATABVENDAPROD.ASString := 'N'
source/MFA001/UdmMFA001.dfm255, 3135Campo listado nos SELECTs do dataset tabPARMFATUR
source/MFA001/UdmMFA001.dfm1728-1732TStringField tabPARMFATURST_ATUALIZATABVENDAPROD (Origin "PARMFATUR"."ST_ATUALIZATABVENDAPROD")
source/MFA001/UdmMFA001.dfm2420, 2593, 2835INSERT/UPDATE do PARMFATUR incluindo o campo
source/MNF001/UFRETENF.pas563-567Chama EXECUTE PROCEDURE ATUALIZA_PRECOVENDA(...) no rateio de frete — é o principal caminho de disparo da cascata no módulo de notas
source/TPO001/UdmTPO001.pas1291Chama ATUALIZA_PRECOVENDA a partir do cadastro de produto (TP_LANCAMENTO = 'P') — dispara a cascata quando o usuário atualiza o preço de uma matéria-prima via cadastro

SQL​

ArquivoLinhaUso
Scripts/ATUALIZA_PRECOVENDA.sql22DECLARE VARIABLE V_ST_ATUALIZATABVENDAPROD DOM_CHAR1;
Scripts/ATUALIZA_PRECOVENDA.sql42-46SELECT PF.TP_ATUALIZACAOTABELAVENDA, PF.ST_ATUALIZATABVENDAPROD, PF.QT_CASASDECIMAISPRECOVENDA FROM PARMFATUR ... INTO :V_TP_ATUALIZACAO, :V_ST_ATUALIZATABVENDAPROD, :V_QT_CASADECIMAIS;
Scripts/ATUALIZA_PRECOVENDA.sql290-292Comentário Rogério 15/06/2015 - Chamado 103829 - Atualizar todos os prod. acabados em que a matéria prima atualizada faça parte da ficha
Scripts/ATUALIZA_PRECOVENDA.sql293-340Bloco principal: if ((V_ST_ATUALIZATABVENDAPROD = 'S') and (coalesce(V_VL_PRECOVENDA,0) > 0 )) — cursor sobre ITEMPRODUCAO, recálculo de V_VL_CUSTOTOT e chamada recursiva EXECUTE PROCEDURE ATUALIZA_PRECOVENDA(...) para cada produto acabado afetado