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ódulo | Código | Descrição | Uso |
|---|
| Parâmetros de Faturamento | MFA001 | Tela de configuração do parâmetro (combo cmbST_ATUALIZATABVENDAPROD, UMFA001.dfm:7385) | Leitura/gravação |
| Entrada / Nota Fiscal de Compra | MNF001 | Chama 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 Produto | TPO001 | Chama 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
| Procedure | Arquivo | Descrição |
|---|
ATUALIZA_PRECOVENDA | Scripts/ATUALIZA_PRECOVENDA.sql | Procedure 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 / Tabela | Descrição |
|---|
PARMFATUR.ST_ATUALIZATABVENDAPROD | Parâmetro em si ('S' / 'N'). |
PARMFATUR.TP_ATUALIZACAOTABELAVENDA | Lido 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_CASASDECIMAISPRECOVENDA | Lido no mesmo SELECT. Aplicado via AJUSTA_PRECOVENDA antes do UPDATE em ITEMTABPRECO. |
ITEMPRODUCAO.CD_ITEM | Produto acabado (alvo da cascata). |
ITEMPRODUCAO.CD_MATERIAPRIMA | Maté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_PRODUCAO | Compõ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_MARGEMLUCRO | Margem do produto acabado passada na chamada recursiva (linha 297, campo T.PC_MARGEMLUCRO). |
RETORNA_SALDOESTOQUE | Function 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_PRECO | Alvo do UPDATE dentro de cada chamada recursiva (linhas 281-285). |
Opções disponíveis
S - Sim (reprocessa produtos acabados em cascata)
| O que faz | Detalhe |
|---|
| Bloco disparado | ATUALIZA_PRECOVENDA.sql:293-340 — if ((V_ST_ATUALIZATABVENDAPROD = 'S') and (coalesce(V_VL_PRECOVENDA,0) > 0 )) |
| Cursor externo | SELECT 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 usada | FIRST 1 ficha válida (ST_PRODUCAO = 'V') do produto acabado |
| Cálculo do custo | V_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ão | EXECUTE 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ção | V_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órico | Comentá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
- Em MFA001 → Parâmetros → Faturamento → Opção 1, ajuste "Reprocessa Preço Venda dos Produtos com Ficha de Produção" = Sim.
- 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).
- 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'.
- Abra MNF001 e lance uma NF de entrada onde MP-A chega com
VL_UNITARIO = R$ 10,00.
- Ao confirmar, o sistema chama
ATUALIZA_PRECOVENDA(cdEmpresa, tabelaVenda, CD_ITEM=MP-A, ..., VL_UNITARIO=10, 'C', 'N').
- A procedure atualiza
ITEMTABPRECO.VL_PRECO de MP-A conforme TP_ATUALIZACAOTABELAVENDA, gerando V_VL_PRECOVENDA > 0.
- O bloco da linha 293 dispara: cursor encontra ACAB-1 em
ITEMPRODUCAO.CD_MATERIAPRIMA = MP-A.
- 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.
- Chama recursivamente
ATUALIZA_PRECOVENDA(cdEmpresa, tabelaVenda, CD_ITEM=ACAB-1, I_PC_MARGEMVENDA, PC_MARGEMLUCRO_ACAB-1, 32.00, 'C', 'N').
- 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 faz | Detalhe |
|---|
| Bloco bypass | O IF da linha 293 falha — bloco linhas 294-340 é ignorado |
| Efeito | Apenas a matéria-prima (item que chegou como I_CD_ITEM) tem seu ITEMTABPRECO.VL_PRECO atualizado |
| Produtos acabados | Mantêm o preço antigo, mesmo que o custo da matéria-prima tenha variado significativamente |
| É o valor padrão | Sim — tabPARMFATURST_ATUALIZATABVENDAPROD.AsString := 'N' em UdmMFA001.pas:540 |
| Quando usar | Quando 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
- Em MFA001 → Parâmetros → Faturamento → Opção 1, mantenha "Reprocessa Preço Venda dos Produtos com Ficha de Produção" = Não (padrão).
- 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.
ATUALIZA_PRECOVENDA atualiza ITEMTABPRECO.VL_PRECO de MP-A.
- Ao chegar na linha 293,
V_ST_ATUALIZATABVENDAPROD = 'N' → bloco é pulado.
- 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.
Os três parâmetros atuam em dimensões diferentes — gatilho, escopo e propagação — do recálculo de preço de venda:
| Parâmetro | Momento | O que decide | Onde é consumido |
|---|
| ST_ATUALIZATABPRECO | Confirmaçã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_PRECO | Delphi (UCUSTOREPOSICAONF.pas) — não dispara ATUALIZA_PRECOVENDA |
| TP_ATUALIZACAOTABELAVENDA | Dentro de ATUALIZA_PRECOVENDA | Quais tabelas de venda (todas / só com regra em MFA006 / só a padrão) são atualizadas para o item corrente | Procedure SQL ATUALIZA_PRECOVENDA (campo V_TP_ATUALIZACAO) |
| ST_ATUALIZATABVENDAPROD (este) | Ao final do UPDATE do item corrente em ATUALIZA_PRECOVENDA | Se propaga a atualização para todos os produtos acabados que consomem o item na ficha de produção | Procedure 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ção | Descrição | Propaga para produtos acabados? | Tabelas afetadas por produto acabado | Valor padrão? |
|---|
| S | Sim | Sim — recursão em ITEMPRODUCAO onde CD_MATERIAPRIMA = CD_ITEM atualizado | Definidas por TP_ATUALIZACAOTABELAVENDA para cada acabado | Não |
| N | Não | Não — apenas o item corrente é atualizado | — | Sim |
Referências no Código Fonte
Delphi
| Arquivo | Linha | Uso |
|---|
source/MFA001/UMFA001.dfm | 6399-6413 | Label Label81.Caption = 'Reprocessa Preço Venda dos Produtos com Ficha de Produção' (FocusControl = cmbST_ATUALIZATABVENDAPROD) |
source/MFA001/UMFA001.dfm | 7385-7409 | ComboBox 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.dfm | 7395 | DataField = 'ST_ATUALIZATABVENDAPROD' / DataSource = dmMFA001.dsPARMFATUR |
source/MFA001/UMFA001.pas | 429 | Declaração cmbST_ATUALIZATABVENDAPROD: TwwDBComboBox |
source/MFA001/UdmMFA001.pas | 240 | Declaração tabPARMFATURST_ATUALIZATABVENDAPROD: TStringField |
source/MFA001/UdmMFA001.pas | 540 | Valor padrão em AfterInsert: tabPARMFATURST_ATUALIZATABVENDAPROD.ASString := 'N' |
source/MFA001/UdmMFA001.dfm | 255, 3135 | Campo listado nos SELECTs do dataset tabPARMFATUR |
source/MFA001/UdmMFA001.dfm | 1728-1732 | TStringField tabPARMFATURST_ATUALIZATABVENDAPROD (Origin "PARMFATUR"."ST_ATUALIZATABVENDAPROD") |
source/MFA001/UdmMFA001.dfm | 2420, 2593, 2835 | INSERT/UPDATE do PARMFATUR incluindo o campo |
source/MNF001/UFRETENF.pas | 563-567 | Chama EXECUTE PROCEDURE ATUALIZA_PRECOVENDA(...) no rateio de frete — é o principal caminho de disparo da cascata no módulo de notas |
source/TPO001/UdmTPO001.pas | 1291 | Chama 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
| Arquivo | Linha | Uso |
|---|
Scripts/ATUALIZA_PRECOVENDA.sql | 22 | DECLARE VARIABLE V_ST_ATUALIZATABVENDAPROD DOM_CHAR1; |
Scripts/ATUALIZA_PRECOVENDA.sql | 42-46 | SELECT PF.TP_ATUALIZACAOTABELAVENDA, PF.ST_ATUALIZATABVENDAPROD, PF.QT_CASASDECIMAISPRECOVENDA FROM PARMFATUR ... INTO :V_TP_ATUALIZACAO, :V_ST_ATUALIZATABVENDAPROD, :V_QT_CASADECIMAIS; |
Scripts/ATUALIZA_PRECOVENDA.sql | 290-292 | Comentá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.sql | 293-340 | Bloco 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 |