Pular para o conteúdo principal

TP_ATUALIZACAOTABELAVENDA - Escopo de Atualização das Tabelas de Venda (Atualiza Quais Tabelas de Venda)

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Notas Fiscais → Parâmetros de Notas (label visível: "Atualiza Quais Tabelas de Venda") Tabela: PARMFATUR.TP_ATUALIZACAOTABELAVENDA (VARCHAR(1), FixedChar) Valor padrão: T (Todas Com Margem) — definido em UdmMFA001.pas:498

Este parâmetro define o escopo (quais tabelas do item serão afetadas) quando o sistema recalcula preços de venda através da procedure ATUALIZA_PRECOVENDA. Enquanto o parâmetro ST_PRECOVENDA determina qual base de custo e qual método (De Cima / De Baixo) usar, o TP_ATUALIZACAOTABELAVENDA responde à pergunta "quais tabelas do produto serão atualizadas?" (todas, só as com margem, só as que têm regra por empresa no MFA006, etc.).

Telas impactadas​

MóduloCódigoDescriçãoUso
Parâmetros de FaturamentoMFA001Tela de configuração do parâmetro (combo cmbTP_ATUALIZACAOTABELAVENDA)Leitura/gravação
Parâmetros por Empresa x Tabela de PreçoMFA006Tabela PARMTABPRECO — define quais tabelas possuem regra para a empresa. É consultada pela procedure quando o tipo é M ou EOrigem da regra de filtragem
Conferência de NF de EntradaCNF017Dispara ATUALIZA_PRECOVENDA ao confirmar/recalcular entrada, propagando o escopoLeitura indireta

Procedures impactadas​

ProcedureDescrição
ATUALIZA_PRECOVENDAProcedure central. Lê PARMFATUR.TP_ATUALIZACAOTABELAVENDA em V_TP_ATUALIZACAO e decide o filtro/cursor aplicado ao ITEMTABPRECO: T = todas, M/E = somente tabelas com regra em PARMTABPRECO (MFA006), P = apenas a padrão (fallback quando não está em T/M/E).

Campos envolvidos​

CampoDescrição
PARMFATUR.TP_ATUALIZACAOTABELAVENDAParâmetro em si (VARCHAR(1) FixedChar). Valores: T, P, M, E.
PARMFATUR.ST_PRECOVENDAParâmetro irmão — quando vale T ou N, força TP_ATUALIZACAOTABELAVENDA = 'T' e desabilita o combo (UdmMFA001.pas:1680-1691).
PARMFATUR.CD_TABPRECOTabela de Venda padrão — usada como exclusão no modo T (a padrão é atualizada por outro caminho) e como inclusão no modo P.
PARMTABPRECO.CD_TABPRECO, PARMTABPRECO.CD_EMPRESATabela do MFA006 — é contada (V_QT_TABPRECO) para decidir se a tabela do item entra no cálculo nos modos M e E.
ITEMTABPRECO.CD_ITEM, ITEMTABPRECO.PC_MARGEM, ITEMTABPRECO.VL_PRECOAlvo da atualização — o SET VL_PRECO = :V_VL_PRECOVENDA é executado aqui.
TABPRECO.CD_TABPRECO, TABPRECO.PC_MARGEMJOIN do cursor — a margem da tabela também é considerada na filtragem (nos modos M/E, a cláusula COALESCE(I.PC_MARGEM, T.PC_MARGEM) IS NOT NULL exige margem preenchida).

Opções disponíveis​

T - Todas Com Margem​

O que fazDetalhe
EscopoAtualiza todas as tabelas de venda associadas ao item (exceto a padrão, que é tratada separadamente)
Cursor SQLATUALIZA_PRECOVENDA.sql:66-71 — SELECT em ITEMTABPRECO + TABPRECO filtrando por CD_ITEM e CD_TABPRECO <> CD_TABPRECO_PADRAO, sem exigência de margem preenchida
Exige regra MFA006?Não
Valida preço maior?Não (fluxo irrestrito)
Condição no IF principalIF (v_pc_margemitemtab IS NOT NULL) OR (v_pc_margemtab IS NOT NULL) OR (i_pc_margemitem IS NOT NULL) — só atualiza se houver alguma margem na cadeia item-tabela-padrão
Quando é forçadoSempre que ST_PRECOVENDA = 'T' ou 'N' (combo fica desabilitado) — ver UdmMFA001.pas:1682-1691 e UMFA001.pas:924-925

Simulação passo a passo​

  1. MFA001 → aba Parâmetros → Notas Fiscais → Parâmetros de Notas
  2. Atualiza Tabela de Venda (ST_PRECOVENDA) = C (Última Compra De Cima) — importante: valor diferente de T e N para o combo ficar editável
  3. Atualiza Quais Tabelas de Venda = Todas Com Margem (T)
  4. Salve (F6)
  5. Cadastre um produto associado a 3 tabelas de venda (ex.: TAB1-padrão, TAB2, TAB3), todas com margem preenchida
  6. Dê entrada em uma NF (CNF017) com VL_UNITARIO = 100,00 e PC_MARGEM = 30%
  7. Ao confirmar, a procedure ATUALIZA_PRECOVENDA percorre o cursor de ITEMTABPRECO para o item, encontra TAB2 e TAB3 e atualiza VL_PRECO de ambas
  8. Resultado: TAB2.VL_PRECO e TAB3.VL_PRECO ← 130,00 (ou conforme margem própria de cada uma)

Resultado esperado: Todas as tabelas do item recebem novo preço, desde que alguma margem esteja disponível (no item, na tabela ou padrão da empresa).


P - Somente a Padrão​

O que fazDetalhe
EscopoAtualiza apenas a Tabela de Venda Padrão da empresa (PARMFATUR.CD_TABPRECO) ou as informadas em I_CD_TABPRECOTFA006
Cursor SQLATUALIZA_PRECOVENDA.sql:129-134 — cai no bloco ELSE (quando V_TP_ATUALIZACAO NOT IN ('T','M','E')), SELECT filtrando T.CD_TABPRECO IN (:I_CD_TABPRECOTFA006) e exigindo COALESCE(I.PC_MARGEM, T.PC_MARGEM) IS NOT NULL
Exige margem preenchida?Sim (obrigatório na cláusula WHERE)
Suporta métodos De Baixo?Sim — o bloco ELSE também implementa IN ('D','B','G') com fator 1 - margem/100 (ATUALIZA_PRECOVENDA.sql:161-175)
Validação de preço maiorNão aplica regra V_TP_ATUALIZACAO = 'M' neste ramo

Simulação passo a passo​

  1. MFA001 → Atualiza Tabela de Venda = C ou outra opção ≠ T/N
  2. Atualiza Quais Tabelas de Venda = Somente a Padrão (P)
  3. Salve (F6)
  4. Produto com 3 tabelas (TAB1=padrão, TAB2, TAB3), todas com margem informada
  5. Entrada de NF com custo 100,00 e margem 30%
  6. Apenas TAB1 (ou as tabelas explicitamente informadas em I_CD_TABPRECOTFA006) terá VL_PRECO atualizado
  7. TAB2 e TAB3 permanecem com os preços antigos

Resultado esperado: Somente a tabela padrão (ou o conjunto passado ao procedimento) é recalculada, e apenas se possuir margem definida.


M - Com Margem, Valor Maior, Empresa (MFA006)​

O que fazDetalhe
EscopoAtualiza tabelas com margem preenchida E que tenham regra por empresa cadastrada em PARMTABPRECO (MFA006), somente quando o novo preço calculado for maior que o atual
Cursor SQLATUALIZA_PRECOVENDA.sql:66-71 — cursor base é o mesmo do T, mas com cláusula adicional AND COALESCE(I.PC_MARGEM, T.PC_MARGEM) IS NOT NULL (linha 71)
Validação MFA006ATUALIZA_PRECOVENDA.sql:78-82, 88 — conta PARMTABPRECO para (CD_TABPRECO, CD_EMPRESA); só prossegue se V_QT_TABPRECO > 0
Validação preço maiorATUALIZA_PRECOVENDA.sql:106 — IF (V_VL_PRECOVENDA > V_VL_ITEMTABPRECO) OR (V_TP_ATUALIZACAO <> 'M') — em modo M a comparação é obrigatória
Origem da regraChamados 480039 e 444560 — comentário em ATUALIZA_PRECOVENDA.sql:87

Simulação passo a passo​

  1. MFA001 → Atualiza Tabela de Venda = C (ou outra ≠ T/N)
  2. Atualiza Quais Tabelas de Venda = Com Margem, Valor Maior, Empresa (MFA006) (M)
  3. Salve (F6)
  4. Vá em MFA006 e cadastre regras em PARMTABPRECO para TAB2 e TAB3 (a TAB1 fica sem regra)
  5. Produto com TAB2 VL_PRECO = 150,00, TAB3 VL_PRECO = 100,00, margens preenchidas
  6. Entrada de NF que produziria novo preço calculado de 130,00
  7. Para TAB2 → 130 não é maior que 150 → não atualiza
  8. Para TAB3 → 130 é maior que 100 → atualiza para 130,00
  9. TAB1 (sem regra MFA006) é ignorada

Resultado esperado: Apenas tabelas que (a) possuem margem, (b) possuem regra no MFA006 para a empresa e (c) resultam em preço maior que o atual são atualizadas. Útil para proteger tabelas cujo preço atual já está acima do novo cálculo.


E - Com Margem e Tab Empresa (MFA006)​

O que fazDetalhe
EscopoIgual ao M (margem preenchida + regra MFA006), porém sem a validação de preço maior
Cursor SQLATUALIZA_PRECOVENDA.sql:66-71 — mesma base do T, com COALESCE(I.PC_MARGEM, T.PC_MARGEM) IS NOT NULL
Validação MFA006ATUALIZA_PRECOVENDA.sql:88 — requer V_QT_TABPRECO > 0
Validação preço maiorNão — o trecho (V_VL_PRECOVENDA > V_VL_ITEMTABPRECO) OR (V_TP_ATUALIZACAO <> 'M') permite a atualização porque V_TP_ATUALIZACAO = 'E' ≠ 'M'
Comentário do autorATUALIZA_PRECOVENDA.sql:86 — "Se o tipo for E ele faz o calculo normalmente porém não valida se o preço é maior." — Lucas F

Simulação passo a passo​

  1. MFA001 → Atualiza Tabela de Venda = C
  2. Atualiza Quais Tabelas de Venda = Com Margem e Tab Empresa (MFA006) (E)
  3. Salve (F6)
  4. MFA006: cadastre regras em PARMTABPRECO para TAB2 e TAB3
  5. Produto: TAB2 VL_PRECO = 150,00, TAB3 VL_PRECO = 100,00, margens preenchidas
  6. Entrada de NF que produziria novo preço calculado de 130,00
  7. TAB2 → atualiza para 130,00 (mesmo sendo menor que 150)
  8. TAB3 → atualiza para 130,00
  9. TAB1 (sem regra MFA006) é ignorada

Resultado esperado: Mesmo público-alvo do M (tabelas com margem + regra MFA006), porém sempre atualiza, mesmo que o preço novo seja menor que o atual.


Interação com ST_PRECOVENDA​

Este parâmetro é diretamente dependente de ST_PRECOVENDA:

ST_PRECOVENDAEstado do combo TP_ATUALIZACAOTABELAVENDAValor forçado
T (Tabela de Venda Padrão)Desabilitado'T'
N (Não Atualiza)Desabilitado'T'
C, E, B, D, F, GHabilitado (editável)valor escolhido pelo usuário

Referências do comportamento:

  • source/MFA001/UdmMFA001.pas:1680-1691 — handler tabPARMFATURST_PRECOVENDAValidate que força 'T' e desabilita o combo
  • source/MFA001/UMFA001.pas:924-925 — reforço da habilitação na carga inicial da tela:
    frmMFA001.cmbTP_ATUALIZACAOTABELAVENDA.Enabled :=
    not(((dmMFA001.tabPARMFATURST_PRECOVENDA.AsString = 'T') or (dmMFA001.tabPARMFATURST_PRECOVENDA.AsString = 'N')));

Por quê? Quando ST_PRECOVENDA = 'T', o fluxo da ATUALIZA_PRECOVENDA já entra no ramo dedicado a "Tabela de Venda Padrão" (linha 64) que sempre percorre todas as demais tabelas via cursor dinâmico — não faz sentido restringir o escopo. Quando ST_PRECOVENDA = 'N', nenhuma atualização ocorre, tornando o escopo irrelevante.

Regra da Procedure (pseudocódigo)​

SELECT PF.TP_ATUALIZACAOTABELAVENDA INTO V_TP_ATUALIZACAO FROM PARMFATUR
SE V_TP_ATUALIZACAO IN ('T', 'M', 'E'):
SE ST_PRECOVENDA = 'T':
cursor: ITEMTABPRECO do item, exceto a tabela padrão
(+ filtro "margem preenchida" se M/E)
SENAO:
cursor: ITEMTABPRECO do item, exceto a tabela padrão
(+ filtro "margem preenchida" se M/E)
PARA cada linha:
SE (V_TP_ATUALIZACAO IN ('M','E') E existe regra MFA006) OU
V_TP_ATUALIZACAO = 'T':
calcula novo preço (método depende de ST_PRECOVENDA)
SE (novo_preço > preço_atual) OU V_TP_ATUALIZACAO <> 'M':
UPDATE ITEMTABPRECO SET VL_PRECO = novo_preço
SENAO (V_TP_ATUALIZACAO = 'P' ou qualquer outro valor):
cursor: ITEMTABPRECO do item FILTRADO por I_CD_TABPRECOTFA006
com margem obrigatória
(aplica métodos 'De Baixo' para B/D/G e 'De Cima' para os demais)

Tabela Comparativa Resumida​

OpçãoEscopo de tabelas atualizadasExige Margem?Exige regra MFA006 (PARMTABPRECO)?Exige preço novo > atual?Habilitado quando
TTodas as tabelas do item (exceto a padrão)Só se houver alguma na cadeiaNãoNãoSempre (forçado quando ST_PRECOVENDA ∈ T/N)
PApenas as informadas (I_CD_TABPRECOTFA006) / padrãoSimNãoNãoST_PRECOVENDA ∉ T/N
MTodas com margem E regra MFA006SimSimSimST_PRECOVENDA ∉ T/N
ETodas com margem E regra MFA006SimSimNãoST_PRECOVENDA ∉ T/N

Referências no Código Fonte​

Delphi​

ArquivoLinhasDescrição
source/MFA001/UMFA001.dfm6271-6284Label "Atualiza Quais Tabelas de Venda" (label Label54, FocusControl cmbTP_ATUALIZACAOTABELAVENDA)
source/MFA001/UMFA001.dfm7139-7168ComboBox cmbTP_ATUALIZACAOTABELAVENDA: TwwDBComboBox com Items.Strings = ('Todas Com Margem'#9'T', 'Somente a Padrão'#9'P', 'Com Margem, Valor Maior, Empresa (MFA006)'#9'M', 'Com Margem e Tab Empresa (MFA006)'#9'E')
source/MFA001/UMFA001.pas399Declaração cmbTP_ATUALIZACAOTABELAVENDA: TwwDBComboBox
source/MFA001/UMFA001.pas924-925Habilitação do combo na carga da tela (depende de ST_PRECOVENDA)
source/MFA001/UdmMFA001.pas180Declaração do TField tabPARMFATURTP_ATUALIZACAOTABELAVENDA: TStringField
source/MFA001/UdmMFA001.pas498Valor padrão 'T' no AfterInsert
source/MFA001/UdmMFA001.pas1680-1691Handler tabPARMFATURST_PRECOVENDAValidate — força 'T' e desabilita combo quando ST_PRECOVENDA ∈ T/N
source/MFA001/UdmMFA001.dfm189, 1377-1382, 2398, 2561, 2786, 3069Definição do TField, SELECTs/INSERT/UPDATE do dataset tabPARMFATUR

SQL (Firebird)​

ArquivoLinhasDescrição
Scripts/ATUALIZA_PRECOVENDA.sql41-46SELECT de PARMFATUR.TP_ATUALIZACAOTABELAVENDA para V_TP_ATUALIZACAO
Scripts/ATUALIZA_PRECOVENDA.sql61IF (COALESCE(V_TP_ATUALIZACAO, 'T') IN ('T', 'M', 'E')) — ramo principal
Scripts/ATUALIZA_PRECOVENDA.sql66-71Cursor base para T/M/E — inclui filtro adicional de margem quando V_TP_ATUALIZACAO IN ('M', 'E')
Scripts/ATUALIZA_PRECOVENDA.sql78-88Validação V_QT_TABPRECO > 0 (regra MFA006) para M/E
Scripts/ATUALIZA_PRECOVENDA.sql106Validação de preço maior: (V_VL_PRECOVENDA > V_VL_ITEMTABPRECO) OR (V_TP_ATUALIZACAO <> 'M')
Scripts/ATUALIZA_PRECOVENDA.sql129-134Cursor do ramo ELSE (equivalente a P e outros valores) — filtra por I_CD_TABPRECOTFA006 e exige margem
Scripts/ATUALIZA_PRECOVENDA.sql149, 198Reaplicação das validações MFA006 e preço-maior no ramo ELSE