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ódulo | Código | Descrição | Uso |
|---|
| Parâmetros de Faturamento | MFA001 | Tela de configuração do parâmetro (combo cmbTP_ATUALIZACAOTABELAVENDA) | Leitura/gravação |
| Parâmetros por Empresa x Tabela de Preço | MFA006 | Tabela PARMTABPRECO — define quais tabelas possuem regra para a empresa. É consultada pela procedure quando o tipo é M ou E | Origem da regra de filtragem |
| Conferência de NF de Entrada | CNF017 | Dispara ATUALIZA_PRECOVENDA ao confirmar/recalcular entrada, propagando o escopo | Leitura indireta |
Procedures impactadas
| Procedure | Descrição |
|---|
ATUALIZA_PRECOVENDA | Procedure 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
| Campo | Descrição |
|---|
PARMFATUR.TP_ATUALIZACAOTABELAVENDA | Parâmetro em si (VARCHAR(1) FixedChar). Valores: T, P, M, E. |
PARMFATUR.ST_PRECOVENDA | Parâmetro irmão — quando vale T ou N, força TP_ATUALIZACAOTABELAVENDA = 'T' e desabilita o combo (UdmMFA001.pas:1680-1691). |
PARMFATUR.CD_TABPRECO | Tabela 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_EMPRESA | Tabela 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_PRECO | Alvo da atualização — o SET VL_PRECO = :V_VL_PRECOVENDA é executado aqui. |
TABPRECO.CD_TABPRECO, TABPRECO.PC_MARGEM | JOIN 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
| O que faz | Detalhe |
|---|
| Escopo | Atualiza todas as tabelas de venda associadas ao item (exceto a padrão, que é tratada separadamente) |
| Cursor SQL | ATUALIZA_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 principal | IF (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çado | Sempre que ST_PRECOVENDA = 'T' ou 'N' (combo fica desabilitado) — ver UdmMFA001.pas:1682-1691 e UMFA001.pas:924-925 |
Simulação passo a passo
- MFA001 → aba Parâmetros → Notas Fiscais → Parâmetros de Notas
- Atualiza Tabela de Venda (
ST_PRECOVENDA) = C (Última Compra De Cima) — importante: valor diferente de T e N para o combo ficar editável
- Atualiza Quais Tabelas de Venda =
Todas Com Margem (T)
- Salve (F6)
- Cadastre um produto associado a 3 tabelas de venda (ex.: TAB1-padrão, TAB2, TAB3), todas com margem preenchida
- Dê entrada em uma NF (CNF017) com
VL_UNITARIO = 100,00 e PC_MARGEM = 30%
- Ao confirmar, a procedure
ATUALIZA_PRECOVENDA percorre o cursor de ITEMTABPRECO para o item, encontra TAB2 e TAB3 e atualiza VL_PRECO de ambas
- 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 faz | Detalhe |
|---|
| Escopo | Atualiza apenas a Tabela de Venda Padrão da empresa (PARMFATUR.CD_TABPRECO) ou as informadas em I_CD_TABPRECOTFA006 |
| Cursor SQL | ATUALIZA_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 maior | Não aplica regra V_TP_ATUALIZACAO = 'M' neste ramo |
Simulação passo a passo
- MFA001 → Atualiza Tabela de Venda =
C ou outra opção ≠ T/N
- Atualiza Quais Tabelas de Venda =
Somente a Padrão (P)
- Salve (F6)
- Produto com 3 tabelas (TAB1=padrão, TAB2, TAB3), todas com margem informada
- Entrada de NF com custo 100,00 e margem 30%
- Apenas TAB1 (ou as tabelas explicitamente informadas em
I_CD_TABPRECOTFA006) terá VL_PRECO atualizado
- 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.
| O que faz | Detalhe |
|---|
| Escopo | Atualiza 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 SQL | ATUALIZA_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 MFA006 | ATUALIZA_PRECOVENDA.sql:78-82, 88 — conta PARMTABPRECO para (CD_TABPRECO, CD_EMPRESA); só prossegue se V_QT_TABPRECO > 0 |
| Validação preço maior | ATUALIZA_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 regra | Chamados 480039 e 444560 — comentário em ATUALIZA_PRECOVENDA.sql:87 |
Simulação passo a passo
- MFA001 → Atualiza Tabela de Venda =
C (ou outra ≠ T/N)
- Atualiza Quais Tabelas de Venda =
Com Margem, Valor Maior, Empresa (MFA006) (M)
- Salve (F6)
- Vá em MFA006 e cadastre regras em
PARMTABPRECO para TAB2 e TAB3 (a TAB1 fica sem regra)
- Produto com TAB2
VL_PRECO = 150,00, TAB3 VL_PRECO = 100,00, margens preenchidas
- Entrada de NF que produziria novo preço calculado de 130,00
- Para TAB2 → 130 não é maior que 150 → não atualiza
- Para TAB3 → 130 é maior que 100 → atualiza para 130,00
- 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.
| O que faz | Detalhe |
|---|
| Escopo | Igual ao M (margem preenchida + regra MFA006), porém sem a validação de preço maior |
| Cursor SQL | ATUALIZA_PRECOVENDA.sql:66-71 — mesma base do T, com COALESCE(I.PC_MARGEM, T.PC_MARGEM) IS NOT NULL |
| Validação MFA006 | ATUALIZA_PRECOVENDA.sql:88 — requer V_QT_TABPRECO > 0 |
| Validação preço maior | Nã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 autor | ATUALIZA_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
- MFA001 → Atualiza Tabela de Venda =
C
- Atualiza Quais Tabelas de Venda =
Com Margem e Tab Empresa (MFA006) (E)
- Salve (F6)
- MFA006: cadastre regras em
PARMTABPRECO para TAB2 e TAB3
- Produto: TAB2
VL_PRECO = 150,00, TAB3 VL_PRECO = 100,00, margens preenchidas
- Entrada de NF que produziria novo preço calculado de 130,00
- TAB2 → atualiza para 130,00 (mesmo sendo menor que 150)
- TAB3 → atualiza para 130,00
- 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.
Este parâmetro é diretamente dependente de ST_PRECOVENDA:
ST_PRECOVENDA | Estado do combo TP_ATUALIZACAOTABELAVENDA | Valor forçado |
|---|
T (Tabela de Venda Padrão) | Desabilitado | 'T' |
N (Não Atualiza) | Desabilitado | 'T' |
C, E, B, D, F, G | Habilitado (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ção | Escopo de tabelas atualizadas | Exige Margem? | Exige regra MFA006 (PARMTABPRECO)? | Exige preço novo > atual? | Habilitado quando |
|---|
| T | Todas as tabelas do item (exceto a padrão) | Só se houver alguma na cadeia | Não | Não | Sempre (forçado quando ST_PRECOVENDA ∈ T/N) |
| P | Apenas as informadas (I_CD_TABPRECOTFA006) / padrão | Sim | Não | Não | ST_PRECOVENDA ∉ T/N |
| M | Todas com margem E regra MFA006 | Sim | Sim | Sim | ST_PRECOVENDA ∉ T/N |
| E | Todas com margem E regra MFA006 | Sim | Sim | Não | ST_PRECOVENDA ∉ T/N |
Referências no Código Fonte
Delphi
| Arquivo | Linhas | Descrição |
|---|
source/MFA001/UMFA001.dfm | 6271-6284 | Label "Atualiza Quais Tabelas de Venda" (label Label54, FocusControl cmbTP_ATUALIZACAOTABELAVENDA) |
source/MFA001/UMFA001.dfm | 7139-7168 | ComboBox 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.pas | 399 | Declaração cmbTP_ATUALIZACAOTABELAVENDA: TwwDBComboBox |
source/MFA001/UMFA001.pas | 924-925 | Habilitação do combo na carga da tela (depende de ST_PRECOVENDA) |
source/MFA001/UdmMFA001.pas | 180 | Declaração do TField tabPARMFATURTP_ATUALIZACAOTABELAVENDA: TStringField |
source/MFA001/UdmMFA001.pas | 498 | Valor padrão 'T' no AfterInsert |
source/MFA001/UdmMFA001.pas | 1680-1691 | Handler tabPARMFATURST_PRECOVENDAValidate — força 'T' e desabilita combo quando ST_PRECOVENDA ∈ T/N |
source/MFA001/UdmMFA001.dfm | 189, 1377-1382, 2398, 2561, 2786, 3069 | Definição do TField, SELECTs/INSERT/UPDATE do dataset tabPARMFATUR |
SQL (Firebird)
| Arquivo | Linhas | Descrição |
|---|
Scripts/ATUALIZA_PRECOVENDA.sql | 41-46 | SELECT de PARMFATUR.TP_ATUALIZACAOTABELAVENDA para V_TP_ATUALIZACAO |
Scripts/ATUALIZA_PRECOVENDA.sql | 61 | IF (COALESCE(V_TP_ATUALIZACAO, 'T') IN ('T', 'M', 'E')) — ramo principal |
Scripts/ATUALIZA_PRECOVENDA.sql | 66-71 | Cursor base para T/M/E — inclui filtro adicional de margem quando V_TP_ATUALIZACAO IN ('M', 'E') |
Scripts/ATUALIZA_PRECOVENDA.sql | 78-88 | Validação V_QT_TABPRECO > 0 (regra MFA006) para M/E |
Scripts/ATUALIZA_PRECOVENDA.sql | 106 | Validação de preço maior: (V_VL_PRECOVENDA > V_VL_ITEMTABPRECO) OR (V_TP_ATUALIZACAO <> 'M') |
Scripts/ATUALIZA_PRECOVENDA.sql | 129-134 | Cursor do ramo ELSE (equivalente a P e outros valores) — filtra por I_CD_TABPRECOTFA006 e exige margem |
Scripts/ATUALIZA_PRECOVENDA.sql | 149, 198 | Reaplicação das validações MFA006 e preço-maior no ramo ELSE |