PC_MARGEMSEGURANCA - Percentual de Margem de Segurança (markup sobre custo de compra)
Tela: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Notas Fiscais → Parâmetros de Notas → campo
% Margem SegurançaTabela:PARMFATUR.PC_MARGEMSEGURANCATipo: Numérico (percentual %) -DOM_NUMERIC3_2Valor padrão:NULL(vazio - oAfterInsertde MFA001 não atribui default) Validação: inexistente em MFA001. Na TFA010 (margem por item/tabela de compra) o valor é validado para não ultrapassar 100 (W-0141).
O que o parâmetro faz
PC_MARGEMSEGURANCA é a margem de segurança percentual que o ERP aplica como markup sobre o custo de compra (valor unitário líquido da NF de entrada) para gerar o preço de compra gravado em ITEMTABCOMPRA.VL_PRECO.
Ao contrário de PC_MARGEMVENDA (que calcula preço de venda sobre o custo), a PC_MARGEMSEGURANCA trabalha em cima do preço de compra para dar uma folga sobre oscilações futuras do fornecedor. Ela é aplicada sempre por cima (markup direto), nunca como divisor.
Fórmula canônica (vista em MNF001/UFRETENF.pas, CANCELA_NOTAFISCAL, GERA_NOTAFISCAL, RECALCULA_PRECOCOMPRA):
VL_PRECO(ITEMTABCOMPRA) = VL_CUSTO + (VL_CUSTO * PC_MARGEMSEGURANCA / 100)
Cadeia de precedência (do mais específico ao mais genérico):
ITEMTABCOMPRA.PC_MARGEMSEGURANCA (margem de segurança por item e tabela de compra - TFA010/TPO001)
> PARMFATUR.PC_MARGEMSEGURANCA (este parâmetro - default da empresa)
O padrão aplicado em todo o código é COALESCE(T.PC_MARGEMSEGURANCA, :I_PC_MARGEMSEGURANCA) - primeiro tenta a margem do item+tabela de compra e, em último caso, cai no parâmetro da empresa.
Telas impactadas
| Módulo | Código | Como usa PC_MARGEMSEGURANCA |
|---|---|---|
| Parâmetros Faturamento | MFA001 | Cadastro do próprio valor - TDBEdit edtPC_MARGEMSEGURANCA em Opção 1 (UMFA001.dfm:6927-6943), label % Margem Segurança (UMFA001.dfm:6157-6171) |
| NF Entrada - Frete | MNF001 | UFRETENF.pas:248-258 lê PC_MARGEMSEGURANCA do PARMFATUR em iPcMargemSeguranca; UFRETENF.pas:749-758 usa fallback ITEMTABCOMPRA.PC_MARGEMSEGURANCA > PARMFATUR.PC_MARGEMSEGURANCA para recalcular VL_PRECO de compra ao ratear frete |
| NF Entrada - Custo Reposição | MNF001 | UMNF001.pas:2566-2571, 2610-2615 monta coluna VL_CUSTO do grid de custo de reposição com CASE WHEN P.PC_MARGEMSEGURANCA IS NOT NULL ... WHEN PF.PC_MARGEMSEGURANCA IS NOT NULL ... ELSE 0 END (onde P é ITEMTABCOMPRA e PF é PARMFATUR) |
| NF Complementar (ESNotaComplementar) | jFaturamento / chamado por MNF001 | jFaturamento.NotaOrigem.pas:365-429 lê COALESCE(PC_MARGEMSEGURANCA, 0) de PARMFATUR, sobrescreve pelo valor do item+tabela se > 0, e aplica iVL_CUSTO = iVL_PRECO + ((iVL_PRECO * PC_MARGEMSEGURANCA) / 100) para atualizar ITEMTABCOMPRA.VL_PRECO |
| Cadastro Produto | TPO001 | Grid ITEMTABCOMPRA exibe coluna % Margem Seg. editável (UTPO001.dfm:5111-5114); valor entra em ITEMTABCOMPRA.PC_MARGEMSEGURANCA e passa a ter precedência sobre o parâmetro da empresa |
| Tabela de Compra | TFA010 | Edição direta da PC_MARGEMSEGURANCA do item+tabela de compra (edtPC_MARGEMSEGURANCA em UTFA010.dfm:580-597); UdmTFA010.pas:402-410 valida > 100 → W-0141 |
| Verificação de Bloqueio | Usada por MNF001, MPD002, OS e pneus | Scripts/VERIFICA_BLOQUEIO.sql lê PARMFATUR.PC_MARGEMSEGURANCA e compara contra ITEMTABCOMPRA.PC_MARGEMSEGURANCA para decidir se o preço unitário do pedido/NF está abaixo da margem mínima exigida |
| Análise Estoque Parado | REQ012 | UREQ012.pas:1600, 1659 usa COALESCE(ITC.PC_MARGEMSEGURANCA, PF.PC_MARGEMSEGURANCA) como PC_MARGEMSEG no relatório |
| Configuração Tributária | CNF017 | Grid/update inclui PC_MARGEMSEGURANCA no SELECT/UPDATE de PARMFATUR (UdmCNF017.dfm:493, 597) |
| Configuração Pedido | CPD009 | Update de PARMFATUR inclui PC_MARGEMSEGURANCA (UdmCPD009.dfm:3242, 3346) |
| Relatório Análise | RCA006 | SQL do relatório repete o mesmo CASE WHEN P.PC_MARGEMSEGURANCA ... WHEN PF.PC_MARGEMSEGURANCA ... do custo de reposição (UdmRCA006.dfm:525-538, 803-814, 927-938) |
Procedures impactadas
| Procedure | Arquivo | Uso |
|---|---|---|
GERA_NOTAFISCAL | Scripts/GERA_NOTAFISCAL.sql | Linhas 131, 259, 266 lêem P.PC_MARGEMSEGURANCA em I_PC_MARGEMSEGURANCA; linhas 1027, 1034 aplicam VL_PRECO = VL_UNITARIO + ((VL_UNITARIO * COALESCE(COALESCE(T.PC_MARGEMSEGURANCA, I_PC_MARGEMSEGURANCA), 0)) / 100) no UPDATE/INSERT de ITEMTABCOMPRA na geração da NF de entrada |
CANCELA_NOTAFISCAL | Scripts/CANCELA_NOTAFISCAL.sql | Linhas 49, 1124, 1137, 1169 lêem PF.PC_MARGEMSEGURANCA junto com CD_TABCOMPRA; ao cancelar NF de entrada (TP_NOTA = 'E'), reverte ITEMTABCOMPRA.VL_PRECO para o custo anterior re-aplicando VL_PRECO = I_VL_CUSTOANTERIOR_TAB + ((I_VL_CUSTOANTERIOR_TAB * COALESCE(COALESCE(T.PC_MARGEMSEGURANCA, I_PC_MARGEMSEGURANCA), 0)) / 100) |
RECALCULA_PRECOCOMPRA | Scripts/RECALCULA_PRECOCOMPRA.sql | Linhas 20, 50-53 lêem P.PC_MARGEMSEGURANCA da PARMFATUR em I_PC_MARGEMSEGURANCA; linhas 113, 115 recalculam VL_PRECO = V_VL_CUSTO + ((V_VL_CUSTO * COALESCE(COALESCE(T.PC_MARGEMSEGURANCA, I_PC_MARGEMSEGURANCA), 0)) / 100) para todos os itens da tabela de compra informada |
VERIFICA_BLOQUEIO | Scripts/VERIFICA_BLOQUEIO.sql | Linhas 67, 144, 150 lêem PC_MARGEMSEGURANCA da PARMFATUR em V_PC_MARGEMSEGURANCA; SQLs dinâmicos (linhas 243, 331, 425, 448, 517) leem TC.PC_MARGEMSEGURANCA (da ITEMTABCOMPRA TC) por item. Esses dois valores são comparados contra o preço unitário do pedido para decidir se o bloqueio de margem deve ser acionado |
Campos envolvidos
| Campo | Tabela | Descrição |
|---|---|---|
PC_MARGEMSEGURANCA | PARMFATUR | Margem de segurança padrão da empresa (este parâmetro) |
PC_MARGEMSEGURANCA | ITEMTABCOMPRA | Margem de segurança específica do par CD_ITEM + CD_TABCOMPRA (prioridade máxima). Editada em TFA010 e TPO001 |
VL_PRECO | ITEMTABCOMPRA | Preço de compra calculado como custo + custo*margem/100 |
CD_TABCOMPRA | PARMFATUR | Tabela de compra padrão - alvo dos updates de margem |
ST_CUSTOREPOSICAO | PARMFATUR | Liga/desliga recálculo automático de ITEMTABCOMPRA.VL_PRECO ao lançar NF de entrada; quando 'N', PC_MARGEMSEGURANCA é ignorado no fluxo do GERA_NOTAFISCAL/CANCELA_NOTAFISCAL |
VL_LIQUIDO, QT_ITEMNOTA, PS_ITEMNOTA | ITEMNOTA | Base do custo unitário sobre o qual a margem incide |
Comportamento / Fórmula de aplicação
Valor NULL ou não configurado
Quando PARMFATUR.PC_MARGEMSEGURANCA está vazio e o par ITEMTABCOMPRA(CD_ITEM, CD_TABCOMPRA) também não tem margem própria, o COALESCE(...0) presente em todas as procedures neutraliza o cálculo:
VL_PRECO = VL_CUSTO + (VL_CUSTO * 0 / 100) = VL_CUSTO
Ou seja: o preço de compra é gravado exatamente igual ao custo unitário líquido da NF de entrada, sem acréscimo de segurança. Mesmo comportamento ao cancelar NF e ao rodar RECALCULA_PRECOCOMPRA.
Simulação passo a passo
- Em MFA001 → Opção 1 →
% Margem Segurança= vazio. - Certifique-se de que, em TPO001 ou TFA010, o par item+tabela de compra alvo também não tem
PC_MARGEMSEGURANCA(grid% Margem Seg.em branco). - Certifique-se de que
PARMFATUR.ST_CUSTOREPOSICAO ≠ 'N'(caso contrário o fluxo nem roda). - Lance uma NF de entrada em MNF001 de um item com custo unitário R$ 100,00.
- Resultado esperado:
ITEMTABCOMPRA.VL_PRECO = R$ 100,00(igual ao custo). OGERA_NOTAFISCALexecutaUPDATE ITEMTABCOMPRA SET VL_PRECO = 100 + ((100 * COALESCE(COALESCE(NULL, NULL), 0)) / 100) = 100.
Valor > 0 (ex.: PC_MARGEMSEGURANCA = 5,00)
Com margem configurada, toda NF de entrada (e todo RECALCULA_PRECOCOMPRA) acrescenta a folga sobre o custo:
VL_PRECO = VL_CUSTO * (1 + PC_MARGEMSEGURANCA/100)
Exemplos numéricos concretos
Cenário 1: Fallback de empresa aplicado (item sem margem própria)
- Custo unitário líquido da NF: R$ 100,00
PARMFATUR.PC_MARGEMSEGURANCA = 5,00;ITEMTABCOMPRA.PC_MARGEMSEGURANCA = NULLVL_PRECO = 100 + (100 * 5 / 100) = R$ 105,00- Frete adicional não altera a fórmula: a base já incorpora
VL_FRETE_RATEIOnoUFRETENF.pas:758.
Cenário 2: Margem específica do item+tabela tem precedência
- Custo unitário: R$ 100,00
PARMFATUR.PC_MARGEMSEGURANCA = 5,00ITEMTABCOMPRA.PC_MARGEMSEGURANCA = 8,00(cadastrada via TFA010)- O
COALESCE(T.PC_MARGEMSEGURANCA, I_PC_MARGEMSEGURANCA)retorna8,00- o valor da empresa é ignorado. VL_PRECO = 100 + (100 * 8 / 100) = R$ 108,00
Cenário 3: Borda do domínio (DOM_NUMERIC3_2 = NUMERIC(3,2))
- Valor máximo persistível em
PARMFATUR.PC_MARGEMSEGURANCA: 9,99 - Nota: a validação de
> 100(W-0141) existe apenas emTFA010/UdmTFA010.pas:407para o campo deITEMTABCOMPRA(que também éDOM_NUMERIC3_2). Na MFA001 não há validação; o próprio domínio impede valores ≥ 10. - Para margens maiores, a única alternativa é editar item a item em TFA010/TPO001, mas o limite do domínio também é 9,99 - valores entre 10 e 100 ficam inatingíveis nesta versão do schema.
Cenário 4: Geração de preço em item novo na tabela
- Em
GERA_NOTAFISCAL.sql:1032-1037, quando oUPDATE ITEMTABCOMPRAnão encontra registro (item ainda não está na tabela de compra), é feitoINSERTcomVL_PRECO = VL_UNITARIO + ((VL_UNITARIO * COALESCE(I_PC_MARGEMSEGURANCA, 0)) / 100). - Aqui não existe
T.PC_MARGEMSEGURANCApara usar (o registro não existe ainda); o valor daPARMFATURé o único que entra. - Exemplo: Custo R$ 100,00;
PARMFATUR.PC_MARGEMSEGURANCA = 3,00→ item é criado emITEMTABCOMPRAcomVL_PRECO = 103,00ePC_MARGEMSEGURANCA = NULL(o campo não é preenchido noINSERT).
Simulação passo a passo
- Em MFA001 → Opção 1 →
% Margem Segurança=5,00. Certifique-se queST_CUSTOREPOSICAOpermite o recálculo. - Deixe o par item+tabela alvo sem margem própria em TFA010/TPO001.
- Lance NF de entrada em MNF001 com custo unitário R$ 100,00.
- Na confirmação, o
GERA_NOTAFISCALexecuta:UPDATE ITEMTABCOMPRA TSET T.VL_PRECO = 100 + ((100 * COALESCE(COALESCE(T.PC_MARGEMSEGURANCA, 5.00), 0)) / 100),T.DT_REGISTRO = 'NOW'WHERE T.CD_TABCOMPRA = :I_CD_TABCOMPRA AND T.CD_ITEM = :I_CD_ITEM; - Resultado esperado:
ITEMTABCOMPRA.VL_PRECO = R$ 105,00eDT_REGISTROatualizado. - Ao cancelar essa NF (botão de cancelamento em MNF001), o
CANCELA_NOTAFISCALbusca o custo anterior viaRETORNA_SALDOESTOQUEe reaplica a mesma margem sobre o custo antigo para restaurar oVL_PRECOhistórico.
Interação com outros parâmetros
| Parâmetro | Interação |
|---|---|
st_custoreposicao (PARMFATUR.ST_CUSTOREPOSICAO) | Quando 'N', o CANCELA_NOTAFISCAL não entra no bloco de reversão de ITEMTABCOMPRA (linha 1135: AND PF.ST_CUSTOREPOSICAO <> 'N') - a PC_MARGEMSEGURANCA fica inerte no cancelamento. No GERA_NOTAFISCAL o recálculo depende do caminho que chama o UPDATE ITEMTABCOMPRA, tipicamente também condicionado a ST_CUSTOREPOSICAO. |
pc_margemvenda | Não se confundem. PC_MARGEMVENDA gera preço de venda aplicando margem sobre o custo de estoque (procedure ATUALIZA_PRECOVENDA). PC_MARGEMSEGURANCA gera preço de compra aplicando margem sobre o custo unitário líquido da NF de entrada. As duas rodam no mesmo GERA_NOTAFISCAL, em etapas diferentes, e podem ser combinadas (o preço de venda pode ser recalculado depois a partir do ITEMTABCOMPRA.VL_PRECO já acrescido da margem de segurança, dependendo de ST_PRECOVENDA). |
CD_TABCOMPRA (PARMFATUR) | A margem só incide nas linhas de ITEMTABCOMPRA com CD_TABCOMPRA = PARMFATUR.CD_TABCOMPRA. Tabelas alternativas não são afetadas pelo GERA_NOTAFISCAL. O RECALCULA_PRECOCOMPRA recebe a tabela como parâmetro (I_CD_TABELA). |
PC_DESCONTOMAX, VL_MINIMOPEDIDO, ST_BLOQUEIOPED | Em VERIFICA_BLOQUEIO.sql todos são lidos no mesmo SELECT (linhas 143-146). A margem de segurança entra como piso de preço: se o preço unitário do pedido cair abaixo de VL_CUSTO * (1 + PC_MARGEMSEGURANCA/100), o bloqueio pode ser acionado dependendo de TP_MODELOBLOQUEIO. |
Referências no Código Fonte
Delphi - MFA001 (cadastro do parâmetro)
source/MFA001/UMFA001.dfm:6927-6943-edtPC_MARGEMSEGURANCA: TDBEditcomDataField = 'PC_MARGEMSEGURANCA', ligado admMFA001.dsPARMFATUR.source/MFA001/UMFA001.dfm:6157-6171-Label8: TLabelcomCaption = '% Margem Segurança'eFocusControl = edtPC_MARGEMSEGURANCA.source/MFA001/UMFA001.pas:390- declaraçãoedtPC_MARGEMSEGURANCA: TDBEdit.source/MFA001/UdmMFA001.pas:135-tabPARMFATURPC_MARGEMSEGURANCA: TBCDField.source/MFA001/UdmMFA001.dfm:1129-1132- definição doTBCDField(Origin = "PARMFATUR"."PC_MARGEMSEGURANCA", semOnValidate).source/MFA001/UdmMFA001.dfm:139, 2377, 2749, 3019- referências do campo no SELECT, UPDATE e tabelaupdPARMFATUR.source/MFA001/UdmMFA001.pas:434-...-tabPARMFATURAfterInsertNÃO atribui valor aPC_MARGEMSEGURANCA(nasceNULL).
Delphi - uso em MNF001 (NF de entrada)
source/MNF001/UFRETENF.pas:116, 248-258, 749-758- busca o parâmetro na PARMFATUR, aplicaCOALESCE(tabCUSTO.PC_MARGEMSEGURANCA, iPcMargemSeguranca):
if (tabCUSTO.FieldByName('PC_MARGEMSEGURANCA').AsFloat > 0) then
iPcMargemSeg := tabCUSTO.FieldByName('PC_MARGEMSEGURANCA').AsString
else
if (Trim(iPcMargemSeguranca) <> '') then
iPcMargemSeg := iPcMargemSeguranca;
if (Trim(iPcMargemSeg) = '') then
iPcMargemSeg := '0';
iVlCusto := (tabCUSTO.FieldByName('VL_PRECO').AsFloat + iVlFrete)
+ (((tabCUSTO.FieldByName('VL_PRECO').AsFloat + iVlFrete) * StrToFloat(iPcMargemSeg)) / 100);
source/MNF001/UMNF001.pas:2558-2620- SQL detabCUSTO(tela de Custo de Reposição) monta a colunaVL_CUSTOcomCASE WHEN P.PC_MARGEMSEGURANCA IS NOT NULL ... WHEN PF.PC_MARGEMSEGURANCA IS NOT NULL ... ELSE 0 ENDondeP=ITEMTABCOMPRAePF=PARMFATUR.source/MNF001/UCUSTOREPOSICAONF.dfm- referenciada pela tela de custo de reposição (TBCDFieldPC_MARGEMSEGURANCA).
Delphi - uso em jFaturamento (NF Complementar)
source/jFaturamento/NotaOrigem/jFaturamento.NotaOrigem.pas:315, 365-402, 429- classeTESNotaComplementar:
Consulta :=
'SELECT ' + #10 +
' COALESCE(CD_TABCOMPRA, 1), ' + #10 +
' COALESCE(PC_MARGEMSEGURANCA, 0) ' + #10 +
'FROM PARMFATUR ' + #10 +
'WHERE CD_EMPRESA = ' + Nulo(queryNotaOrigemCD_EMPRESA.AsString, 'I');
...
iPC_MARGEMSEGURANCA := Resultado[1];
...
if (StrToFloat(Resultado[2]) > 0) then
iPC_MARGEMSEGURANCA := Resultado[2]; { precedência da margem do item+tabela }
...
iVL_CUSTO := iVL_PRECO + ((iVL_PRECO * StrToFloat(iPC_MARGEMSEGURANCA)) / 100);
source/jCommon/jValidate.pas:737, 4431, 4440, 4454-4455, 4476, 4487-4488- classeTItemTabCompracarrega/validaPc_MargemSegurancaao resolver o registro deITEMTABCOMPRAvia REST/integrações.
Delphi - TPO001 e TFA010 (margem por item+tabela)
source/TPO001/UdmTPO001.pas:254, 3081, 3083-tabITEMTABCOMPRAPC_MARGEMSEGURANCA: TBCDField(marcadoReadOnlyquando há restrição de edição via TFA010).source/TPO001/UdmTPO001.dfm:3416, 3462-3468, 3488, 3499- SELECT/UPDATE/Fetch doITEMTABCOMPRAincluindoPC_MARGEMSEGURANCA(grid do cadastro de produto).source/TPO001/UTPO001.dfm:5109-5114- coluna% Margem Seg.no gridITEMTABCOMPRA.source/TFA010/UdmTFA010.pas:61, 83, 402-410-tabITEMTABCOMPRAPC_MARGEMSEGURANCA+OnValidate:
procedure TdmTFA010.tabITEMTABCOMPRAPC_MARGEMSEGURANCAValidate(Sender: TField);
begin
if (sender.AsString <> '') then
begin
if (sender.AsFloat > 100) then
raise JException.Create('W-0141');
end;
end;
source/TFA010/UdmTFA010.dfm:156, 220-227, 248, 262- SELECT/UPDATE/Fetch deITEMTABCOMPRAcomPC_MARGEMSEGURANCA+OnValidate = tabITEMTABCOMPRAPC_MARGEMSEGURANCAValidate.source/TFA010/UTFA010.dfm:360-364, 441-442, 580-597/UTFA010.pas:86- coluna do grid% Margem Seg.eedtPC_MARGEMSEGURANCA: TDBEdit.
Delphi - demais consumidores
source/REQ012/UREQ012.pas:1600, 1659- relatório de análise de estoque parado usaCOALESCE(ITC.PC_MARGEMSEGURANCA, PF.PC_MARGEMSEGURANCA) PC_MARGEMSEG.source/CNF017/UdmCNF017.dfm:493, 597- grid/update de PARMFATUR incluiPC_MARGEMSEGURANCA.source/CPD009/UdmCPD009.dfm:3242, 3346- update de PARMFATUR incluiPC_MARGEMSEGURANCA.source/RCA006/UdmRCA006.dfm:525-538, 803-814, 927-938- SQL do relatório replica oCASE WHEN ... IS NOT NULLentreITEMTABCOMPRA.PC_MARGEMSEGURANCAePARMFATUR.PC_MARGEMSEGURANCA.
SQL - Procedures
Scripts/GERA_NOTAFISCAL.sql:131-declare variable I_PC_MARGEMSEGURANCA numeric(5,2);(note que a procedure declaraNUMERIC(5,2)embora o campo emPARMFATURsejaDOM_NUMERIC3_2).Scripts/GERA_NOTAFISCAL.sql:259, 266- leitura deP.PC_MARGEMSEGURANCAdaPARMFATUR PemI_PC_MARGEMSEGURANCA.Scripts/GERA_NOTAFISCAL.sql:1027- UPDATE deITEMTABCOMPRAaplicandoVL_PRECO = :I_VL_UNITARIO + ((:I_VL_UNITARIO * COALESCE(COALESCE(T.PC_MARGEMSEGURANCA, :I_PC_MARGEMSEGURANCA), 0)) / 100).Scripts/GERA_NOTAFISCAL.sql:1034-1037- INSERT quando não existe registro na tabela de compra (usa apenasI_PC_MARGEMSEGURANCA).Scripts/CANCELA_NOTAFISCAL.sql:49-declare variable I_PC_MARGEMSEGURANCA DOM_NUMERIC3_2;.Scripts/CANCELA_NOTAFISCAL.sql:1124, 1137- SELECTPF.PC_MARGEMSEGURANCApara reversão.Scripts/CANCELA_NOTAFISCAL.sql:1169- UPDATEITEMTABCOMPRA.VL_PRECO = :I_VL_CUSTOANTERIOR_TAB + ((:I_VL_CUSTOANTERIOR_TAB * COALESCE(COALESCE(T.PC_MARGEMSEGURANCA, :I_PC_MARGEMSEGURANCA), 0)) / 100).Scripts/RECALCULA_PRECOCOMPRA.sql:20, 50-53, 113, 115- mesmo padrão deCOALESCE(COALESCE(T.PC_MARGEMSEGURANCA, I_PC_MARGEMSEGURANCA), 0)para recalcular preço de compra em lote.Scripts/VERIFICA_BLOQUEIO.sql:67, 69, 144, 150- leitura daPARMFATUR.PC_MARGEMSEGURANCAemV_PC_MARGEMSEGURANCA; variável separadaV_PC_MARGEMSEGITEMrecebe a margem por item.Scripts/VERIFICA_BLOQUEIO.sql:243, 331, 425, 448, 517- SQLs dinâmicos de pedido, pneu, OS e NF leemTC.PC_MARGEMSEGURANCA(deITEMTABCOMPRA TC) para comparar comV_PC_MARGEMSEGURANCA.
DDL
docs/schema/tables/PARMFATUR.sql:95- definição:
PC_MARGEMSEGURANCA DOM_NUMERIC3_2,
DOM_NUMERIC3_2 = NUMERIC(3,2) → valor máximo 9,99. Divergência digna de nota: GERA_NOTAFISCAL declara sua variável como NUMERIC(5,2) (suportaria até 999,99) e o OnValidate de TFA010 bloqueia apenas > 100 - mas o domínio persiste no máximo 9,99 em qualquer das duas colunas (PARMFATUR.PC_MARGEMSEGURANCA e ITEMTABCOMPRA.PC_MARGEMSEGURANCA). Margens de segurança acima de 9,99% não são persistíveis neste schema.