QT_CASASDECIMAISPRECOVENDA - Quantidade de casas decimais para cálculo do preço de venda
Tela: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Faturamento → Opção 2 → combo Quantidade de Casas decimais para cálculo do preço de venda (label
Label88emUMFA001.dfm:3818-3832, componentecmbQT_CASASDECIMAISPRECOVENDAemUMFA001.dfm:4367-4395,Left=495, Top=154, dentro depagPARMAMETROS → pagAmbos (Faturamento) → pagFatOp2 (Opção 2) → GroupBox4 "Parâmetros Comum a Notas Fiscais / Pedido") Tabela:PARMFATUR.QT_CASASDECIMAISPRECOVENDATipo: Numérico (inteiro) —DOM_INTEGERno DDL (docs/schema/tables/PARMFATUR.sql:196);TIntegerFieldno client (UdmMFA001.pas:252). SemNOT NULL, semDEFAULTno banco → permiteNULL. Valor padrão:4— atribuído notabPARMFATURAfterInsertemUdmMFA001.pas:548(tabPARMFATURQT_CASASDECIMAISPRECOVENDA.AsInteger := 4;). Somente novos registros dePARMFATUR(inserção) recebem esse default; registros antigos podem estar comNULL, e por isso o código consumidor sempre usaCOALESCE(..., 4)ao ler. Valores permitidos no combo:0,2,3,4(itens fixos noTwwDBComboBox—UMFA001.dfm:4386-4390). O combo écsDropDownList(UMFA001.dfm:4373), portanto digitação livre é bloqueada; só os 4 valores doItems.Stringspodem ser salvos pela interface.
O que o parâmetro faz
QT_CASASDECIMAISPRECOVENDA define a precisão decimal aplicada a preços de venda sempre que o ERP:
- Formata colunas de preço em grids/campos (
DisplayFormatdosTFloatFielddeITEMTABPRECO). - Arredonda/trunca cálculos de preço em SQL via
CAST(... AS NUMERIC(15, N))ouround(valor, N), ondeN = QT_CASASDECIMAISPRECOVENDA.
O tipo físico dos campos de preço no banco continua NUMERIC(15,4); o parâmetro não altera a precisão armazenada, mas padroniza a quantidade de casas exibidas e o arredondamento aplicado em atualizações de tabela de preço e em reprocessamentos de venda. Valores maiores que 4 não são oferecidos — o teto prático é 4 casas.
Um valor 0 significa "arredondar para inteiro" em todos os cálculos SQL que usam o parâmetro (preço de venda em reais cheios).
Telas impactadas
| Módulo | Código | Papel |
|---|---|---|
| Parâmetros de Faturamento | MFA001 | Produtora — edita o valor no combo cmbQT_CASASDECIMAISPRECOVENDA (UMFA001.dfm:4367-4395) |
| Cadastro de Produtos | TPO001 | Consumidora — lê COALESCE(QT_CASASDECIMAISPRECOVENDA, 4) e define tabITEMTABPRECOVL_PRECO.DisplayFormat com #,0.00 (se ≤ 2) ou #,0.NNNN (UTPO001.pas:966-990) |
| Cadastro de Tabela de Preços | TFA006 | Consumidora — usa o parâmetro (a) para DisplayFormat de VL_PRECO/VL_PRECOMAXIMO/VL_PRECOMINIMO/DATAVL_PRECO (UTFA006.pas:468-477) e (b) para CAST(... AS NUMERIC(15, N)) em promoções e reajustes de tabela (UTFA006.pas:1832-1860 e 2172-2191) |
| Cadastro/Consulta Seção com Imagem | TOF007 | Consumidora — lê o valor em edtCD_SECAOExit via SELECT ... COALESCE(P.QT_CASASDECIMAISPRECOVENDA,4) FROM PARMFATUR (UTOF007.pas:202-207) |
| Manutenção de Nota Fiscal – Custo/Reposição | MNF001 | Consumidora — na rotina de atualização automática da tabela de preços por entrada de nota (quando ST_ATUALIZATABPRECO = 'S'), aplica CAST(... AS NUMERIC(15, N)) no UPDATE ITEMTABPRECO (UCUSTOREPOSICAONF.pas:215-230) |
| Lista Seção com Imagem | jPesquisa – UListaSecaoImagem.pas | Consumidora — lê o parâmetro para formatar preços exibidos no lookup de seção/produto com imagem (UListaSecaoImagem.pas:200-209) |
Procedures impactadas
| Procedure | Arquivo | Papel |
|---|---|---|
VERIFICA_BLOQUEIO | Scripts/VERIFICA_BLOQUEIO.sql | Lê QT_CASASDECIMAISPRECOVENDA junto com os parâmetros de bloqueio e, se V_QT_CASASDECIMAISPRECOVENDA > 0, arredonda o VL_MINIMO e o VL_MAXIMO do item (calculados a partir de VL_PRECO e dos percentuais de desconto/acréscimo máximo) antes de comparar com o VL_UNITARIO digitado (Scripts/VERIFICA_BLOQUEIO.sql:146-152, 1181-1185) |
RETORNA_PRECOITEM | Scripts/RETORNA_PRECOITEM.sql | Lê o parâmetro em V_qt_casasdecimais; ao final, se > 0, arredonda o_vl_preco e o_vl_tabela com round(..., N) antes de retornar ao chamador (Scripts/RETORNA_PRECOITEM.sql:86-90, 284-287) |
ATUALIZA_PRECOVENDA | Scripts/ATUALIZA_PRECOVENDA.sql | Lê o parâmetro em V_QT_CASADECIMAIS (com ortografia abreviada) e repassa para a procedure AJUSTA_PRECOVENDA ao atualizar o preço dos itens em cada tabela de preço impactada (Scripts/ATUALIZA_PRECOVENDA.sql:31, 42-46, 111, 203, 272) |
AJUSTA_PRECOVENDA | Scripts/AJUSTA_PRECOVENDA.sql | Função auxiliar chamada pelas demais. Recebe I_VL_PRECISAO, aplica COALESCE(..., 4) e retorna CAST(I_VL_PRECO AS NUMERIC(15, I_VL_PRECISAO)) via EXECUTE STATEMENT (Scripts/AJUSTA_PRECOVENDA.sql:1-23) |
Campos envolvidos
| Campo | Tabela | Papel |
|---|---|---|
QT_CASASDECIMAISPRECOVENDA | PARMFATUR | Quantidade de casas decimais a aplicar — este parâmetro |
VL_PRECO | ITEMTABPRECO | Preço de venda do item na tabela — alvo principal do arredondamento |
VL_PRECOMAXIMO / VL_PRECOMINIMO | ITEMTABPRECO | Faixa de preço do item — herdam o mesmo DisplayFormat no TFA006 |
PC_DESCONTOMAXIMOPRODUTO / PC_ACRESCIMOMAXIMOPRODUTO | tabelas de item/grupo | Entram no cálculo de V_VL_MINIMO / V_VL_MAXIMO arredondados em VERIFICA_BLOQUEIO |
VL_PROMOCAO | cálculo em memória (TFA006) | Preço promocional calculado com CAST(... AS NUMERIC(15, N)) no SQL de promoção |
ST_ATUALIZATABPRECO | PARMFATUR | Liga/desliga a atualização automática da tabela de preços (em MNF001); quando ligada, o UPDATE usa NUMERIC(15, N) |
TP_ATUALIZACAOTABELAVENDA / ST_ATUALIZATABVENDAPROD | PARMFATUR | Entram em ATUALIZA_PRECOVENDA junto com QT_CASASDECIMAISPRECOVENDA para arredondar preço ao propagar para outras tabelas de venda |
Comportamento
Valor = 0 (ou NULL)
| Aspecto | Comportamento |
|---|---|
NULL (default no banco) | Todo o código consumidor aplica COALESCE(QT_CASASDECIMAISPRECOVENDA, 4) — ou seja, NULL equivale a 4 na prática. Em TFA006, UTFA006.pas:468-469 ainda trata Values['QT_CASASDECIMAISPRECOVENDA'] = '' atribuindo '4'. |
= 0 (explicitamente salvo em MFA001) | Representa "sem casas decimais". Em TFA006 o DisplayFormat cai em '#,0.00' (ramo <= 2), exibindo duas casas na UI — mas os cálculos SQL usam CAST(... AS NUMERIC(15,0)), arredondando o preço para inteiro. Existe, portanto, divergência entre o que o usuário vê e o que foi efetivamente gravado. |
= 0 em VERIFICA_BLOQUEIO | A condição if (V_QT_CASASDECIMAISPRECOVENDA > 0) é falsa → V_VL_MINIMO e V_VL_MAXIMO não são arredondados, ficam com a precisão nativa (NUMERIC(15,4)). |
= 0 em RETORNA_PRECOITEM | A condição if (V_qt_casasdecimais > 0) é falsa → o_vl_preco e o_vl_tabela não são arredondados, mantêm a precisão original. |
= 0 em AJUSTA_PRECOVENDA (via ATUALIZA_PRECOVENDA) | COALESCE(I_VL_PRECISAO, 4) mantém 0 (COALESCE só substitui NULL). O CAST é feito com NUMERIC(15,0) → preço gravado sem decimais. |
Resultado esperado:
NULLe4são, do ponto de vista funcional, equivalentes em qualquer caminho do sistema (todos os consumidores usam fallback4).0tem semântica dupla e inconsistente: nas procedures do cliente que usamCAST NUMERIC(15, N)(TFA006 atualização de tabela, MNF001, AJUSTA_PRECOVENDA), o preço é efetivamente arredondado para inteiro. Nas procedures que usamif > 0 then round(...)(VERIFICA_BLOQUEIO, RETORNA_PRECOITEM), o bloco de arredondamento é pulado e a precisão original do cálculo é mantida.
:::warning Atenção ao valor 0
Como o combo aceita 0 como opção válida, escolher esse valor produz comportamento misto entre as rotinas: algumas truncam para inteiro, outras ignoram o arredondamento. Se a intenção for "não arredondar / manter 4 casas", grave NULL (não oferecido no combo da UI) ou grave 4 explicitamente. Se a intenção for "preço sempre cheio, sem centavos", ciente de que VERIFICA_BLOQUEIO e RETORNA_PRECOITEM deixam de arredondar os limites.
:::
Valor > 0 (ex.: 2, 3 ou 4)
| Aspecto | Comportamento |
|---|---|
| UI em grids de tabela de preço (TPO001, TFA006) | DisplayFormat dinâmico: se N <= 2 → '#,0.00'; se N > 2 → '#,0.' + N zeros (ex.: '#,0.0000' para 4). Aplicado a VL_PRECO, VL_PRECOMAXIMO, VL_PRECOMINIMO, DATAVL_PRECO |
| Reajuste/promoção de tabela (TFA006) | CAST(valor_calculado AS NUMERIC(15, N)) — preço armazenado com a precisão configurada |
| Atualização automática por entrada de nota (MNF001) | CAST(VL_ANTIGO AS NUMERIC(15, N)) ou CAST(VL_VENDA AS NUMERIC(15, N)) no UPDATE ITEMTABPRECO |
Validação de faixa de preço no pedido/NF (VERIFICA_BLOQUEIO) | V_VL_MINIMO e V_VL_MAXIMO passam por round(..., N) antes de comparar com o VL_UNITARIO digitado — evita falso bloqueio por frações |
Consulta de preço do item (RETORNA_PRECOITEM) | o_vl_preco e o_vl_tabela finais passam por round(..., N) antes de retornar |
Propagação entre tabelas de venda (ATUALIZA_PRECOVENDA) | Cada UPDATE ITEMTABPRECO é feito via AJUSTA_PRECOVENDA(:V_VL_PRECOVENDA, :V_QT_CASADECIMAIS) que aplica CAST(... AS NUMERIC(15, N)) |
Simulação passo a passo
Pré-requisitos do cenário:
PARMFATUR.QT_CASASDECIMAISPRECOVENDA = 2(usuário altera em MFA001, salva com F6).- Tabela de preço
CD_TABPRECO = 1, itemCD_ITEM = 10comVL_PRECO = 15.7834,PC_DESCONTOMAXIMOPRODUTO = 10%. PARMFATUR.ST_ATUALIZATABPRECO = 'S'.
- Em MFA001 → Parâmetros → Faturamento → Opção 2 → combo "Quantidade de Casas decimais para cálculo do preço de venda" escolha
2. Salve (F6). OUPDATE PARMFATURgravaQT_CASASDECIMAISPRECOVENDA = 2(visto emUdmMFA001.dfm:2846). - Abra TPO001. No
OnShow, o blocoUTPO001.pas:966-990lêCOALESCE(QT_CASASDECIMAISPRECOVENDA, 4) = 2→ como2 <= 2,tabITEMTABPRECOVL_PRECO.DisplayFormat := '#,0.00'. O usuário vê15,78na grid (e não15,7834). - Abra TFA006. Em
UTFA006.pas:468-477, o mesmo cálculo ocorre paraVL_PRECO,VL_PRECOMAXIMO,VL_PRECOMINIMO,DATAVL_PRECO— todos com duas casas. - Operador lança um pedido em MPD006 com
VL_UNITARIO = 14.20(valor informado manualmente, abaixo do preço de tabela). A procedureVERIFICA_BLOQUEIOé chamada:- Lê
V_QT_CASASDECIMAISPRECOVENDA = 2. - Calcula
V_VL_MINIMO = 15.7834 - (15.7834 * 10/100) = 14.20506. - Como
V_QT_CASASDECIMAISPRECOVENDA > 0→V_VL_MINIMO = round(14.20506, 2) = 14.21. - Compara:
14.20 < 14.21→ bloqueia. Sem o arredondamento,14.20 < 14.20506também bloquearia, mas a diferença é visível quando o preço mínimo bate na fronteira dos centavos.
- Lê
- O operador libera via MNF001 a entrada de nota de compra.
UCUSTOREPOSICAONF.pas:215-230monta:→UPDATE ITEMTABPRECOSET VL_PRECO = CAST(:VL_VENDA AS NUMERIC(15,2)),DT_REGISTRO = 'NOW'WHERE CD_TABPRECO = 1 AND CD_ITEM = 10VL_PRECOé gravado com 2 casas decimais (p.ex.16.50), mesmo que o campo físico sejaNUMERIC(15,4). - Na consulta de preço do item via
RETORNA_PRECOITEM(chamada pelo pedido), no final (Scripts/RETORNA_PRECOITEM.sql:284-287),o_vl_preco = round(o_vl_preco, 2)eo_vl_tabela = round(o_vl_tabela, 2)antes do retorno.
Resultado esperado: toda a operação de tabela de preço — exibição, reajuste, validação de faixa, atualização automática por entrada de nota, propagação entre tabelas e consulta de preço — passa a operar com exatamente 2 casas decimais. O campo físico continua NUMERIC(15,4), mas os valores gravados/retornados têm as duas últimas casas sempre zeradas.
Interações com outros parâmetros
ST_ATUALIZATABPRECO(PARMFATUR, MNF001) — controla se a entrada de nota propaga o custo paraITEMTABPRECO. Quando ligado, oUPDATEusaCAST(... AS NUMERIC(15, N))comN = QT_CASASDECIMAISPRECOVENDA.TP_ATUALIZACAOTABELAVENDAeST_ATUALIZATABVENDAPROD(PARMFATUR) — lidos juntos comQT_CASASDECIMAISPRECOVENDAemATUALIZA_PRECOVENDApara decidir quais tabelas receber a atualização e com que precisão.ST_CALCULAJUROPROM(PARMFATUR, RETORNA_PRECOITEM) — calcula juros promocional antes do arredondamento final que usaQT_CASASDECIMAISPRECOVENDA.PC_DESCONTOMAXIMOPRODUTO/PC_ACRESCIMOMAXIMOPRODUTO(item/grupo, VERIFICA_BLOQUEIO) — definem a faixa bruta;QT_CASASDECIMAISPRECOVENDAcontrola o arredondamento dessa faixa antes da comparação.
Referências no Código Fonte
Delphi — MFA001 (cadastro do parâmetro)
| Arquivo | Linhas | Papel |
|---|---|---|
source/MFA001/UMFA001.dfm | 3818-3832 | TLabel Label88 com Caption = 'Quantidade de Casas decimais para cálculo do preço de venda', FocusControl = cmbQT_CASASDECIMAISPRECOVENDA |
source/MFA001/UMFA001.dfm | 4367-4395 | TwwDBComboBox cmbQT_CASASDECIMAISPRECOVENDA com DataField = 'QT_CASASDECIMAISPRECOVENDA', DataSource = dmMFA001.dsPARMFATUR, Style = csDropDownList, MapList = True, itens 0/2/3/4, dentro de pagPARMAMETROS → pagAmbos (Faturamento) → pagFatOp2 (Opção 2) → GroupBox4 "Parâmetros Comum a Notas Fiscais / Pedido" |
source/MFA001/UMFA001.pas | 482 | Declaração cmbQT_CASASDECIMAISPRECOVENDA: TwwDBComboBox |
source/MFA001/UdmMFA001.pas | 252 | Declaração tabPARMFATURQT_CASASDECIMAISPRECOVENDA: TIntegerField |
source/MFA001/UdmMFA001.pas | 548 | tabPARMFATURAfterInsert: tabPARMFATURQT_CASASDECIMAISPRECOVENDA.AsInteger := 4; (default em novos registros) |
source/MFA001/UdmMFA001.dfm | 264, 1796-1799, 2846, 3144 | SELECT inicial, definição do TIntegerField com Alignment = taCenter, UPDATE de PARMFATUR e SELECT de releitura incluem o campo |
Delphi — telas consumidoras
| Arquivo | Linhas | Papel |
|---|---|---|
source/TPO001/UTPO001.pas | 966-990 | SELECT ... COALESCE(QT_CASASDECIMAISPRECOVENDA, 4) ... FROM PARMFATUR e definição de tabITEMTABPRECOVL_PRECO.DisplayFormat ('#,0.00' se ≤ 2, senão '#,0.' + N zeros) |
source/TFA006/UTFA006.pas | 463-477 | Leitura via parmFatur.Values['QT_CASASDECIMAISPRECOVENDA'] (com fallback '4') e aplicação do DisplayFormat a VL_PRECO, VL_PRECOMAXIMO, VL_PRECOMINIMO, DATAVL_PRECO |
source/TFA006/UTFA006.pas | 1832-1860 | CAST(... AS NUMERIC(15, N)) em SQL de cálculo e atualização de promoção/reajuste de tabela (VL_PROMOCAO, VL_PRECO) |
source/TFA006/UTFA006.pas | 2172-2191 | CAST(... AS NUMERIC(15, N)) em SQL de aplicação de percentual em ITEMTABPRECO |
source/TOF007/UTOF007.pas | 198-207 | SELECT P.ST_VALIDAITEMEMPRESA, COALESCE(P.QT_CASASDECIMAISPRECOVENDA,4) FROM PARMFATUR no edtCD_SECAOExit |
source/MNF001/UCUSTOREPOSICAONF.pas | 215-230 | UPDATE ITEMTABPRECO SET VL_PRECO = CAST(:VAL AS NUMERIC(15, N)), DT_REGISTRO = 'NOW' (ramos ST_ATUALIZATABPRECO = 'S' e 'N') |
source/jPesquisa/UListaSecaoImagem.pas | 200-209 | SELECT P.QT_CASASDECIMAISPRECOVENDA FROM PARMFATUR P WHERE P.CD_EMPRESA = ... no módulo de lookup de seção com imagem |
DDL
docs/schema/tables/PARMFATUR.sql:196—QT_CASASDECIMAISPRECOVENDA DOM_INTEGER,(semNOT NULL, semDEFAULT→ permiteNULL; default4só é aplicado pelo cliente em novos registros inseridos pela MFA001, eCOALESCE(..., 4)é o fallback em todas as leituras).
SQL — Procedures
| Arquivo | Linhas | Papel |
|---|---|---|
Scripts/VERIFICA_BLOQUEIO.sql | 104, 143-152, 1181-1185 | Declara V_QT_CASASDECIMAISPRECOVENDA, lê junto aos demais parâmetros de bloqueio e, se > 0, arredonda V_VL_MINIMO/V_VL_MAXIMO com round(..., N) antes da comparação com o VL_UNITARIO |
Scripts/RETORNA_PRECOITEM.sql | 86-90, 284-287 | Lê em V_qt_casasdecimais e, se > 0, aplica round(o_vl_preco, N) e round(o_vl_tabela, N) antes de retornar |
Scripts/ATUALIZA_PRECOVENDA.sql | 31, 42-46, 111, 203, 272 | Declara V_QT_CASADECIMAIS, lê junto com TP_ATUALIZACAOTABELAVENDA e ST_ATUALIZATABVENDAPROD, e repassa para AJUSTA_PRECOVENDA(:V_VL_PRECOVENDA, :V_QT_CASADECIMAIS) em cada ramo de atualização |
Scripts/AJUSTA_PRECOVENDA.sql | 1-23 | Procedure utilitária: I_VL_PRECISAO = COALESCE(I_VL_PRECISAO, 4) e CAST(I_VL_PRECO AS NUMERIC(15, I_VL_PRECISAO)) via EXECUTE STATEMENT dinâmico |
Java — ParmFaturSQL (espelhamento no WebAPI)
source/Server/JunsoftWebAPI/src/main/java/junsoft/erp/repository/queries/ParmFaturSQL.javaeJunsoftBuilder.java— incluemQT_CASASDECIMAISPRECOVENDAno SELECT da API de parâmetros, replicando no backend REST o mesmo valor editado pela MFA001 (sem lógica adicional).