Pragiva — Tecnologia na prática

Campo numérico: tamanho, decimais e a máscara

Campo numérico no Protheus: o tamanho já inclui ponto e decimais. Como criar no Configurador, escrever a máscara certa e barrar negativo com Positivo().

Protheus Tutorial 5 min de leitura

Assista o vídeo

Nesta página6 seções

Antes de começar

  • Tabela customizada criada no dicionário (no exemplo, a ZA1 — Cadastro de motoristas)
  • Acesso ao Configurador com permissão de alterar o dicionário de dados

No campo numérico do Protheus, o tamanho (X3_TAMANHO) é o número total de posições, contando o ponto e as casas decimais. A documentação da TOTVS dá o exemplo: um campo de tamanho 12 com duas decimais tem 9 inteiros, 1 ponto e 2 decimais. Um campo de tamanho 6 com 2 decimais guarda até 999,99, não 999999,99.

É a pergunta que mais aparece na hora de criar valor, quantidade ou percentual. E o erro, quando aparece, só aparece em produção, no primeiro valor que não cabe.

Os limites

Pela mesma documentação, um campo numérico tem no máximo 16 posições e no máximo 8 casas decimais. Os exemplos oficiais de cada extremo:

ConfiguraçãoMaior valor
Tamanho 16, sem decimais9.999.999.999.999.999
Tamanho 16, 1 decimal99.999.999.999.999,9
Tamanho 16, 8 decimais9.999.999,99999999

Tamanho e decimais, com exemplos do padrão

Os campos numéricos do item do pedido de venda mostram a regra:

CampoTam./Dec.X3_PICTURE
6 / 2@E 999.99
5 / 2@E 99.99
12 / 2@E 999,999,999.99
14 / 2@E 99,999,999,999.99

Conte os noves de cada máscara: dá o tamanho menos um. A posição que sobra é a do ponto decimal. No dicionário padrão, a grande maioria dos campos numéricos com decimais segue esse desenho, com algumas exceções.

Com decimal zero, quase sempre não há ponto e o número de noves é o tamanho: , tamanho 3, máscara 999. Também aqui o padrão tem exceções, então confira o campo que você for copiar.

A conta para acertar de primeira:

Você querTamanhoDecimais
Inteiro de até 3 dígitos (idade)30
Percentual até 99,9952
Valor até 999.999,9992
Quantidade até 99.999,9999104

Com decimais, tamanho = dígitos inteiros + 1 (o ponto) + decimais. Sem decimais, o tamanho é só o número de dígitos.

A máscara que combina com o campo

O @E faz a tela mostrar o número no formato brasileiro, com ponto de milhar e vírgula decimal: 1.234,54. No dicionário padrão, a máscara é escrita com vírgula de milhar e ponto decimal, como nos campos do SC6 acima. Siga esse desenho ao criar a sua.

As vírgulas de milhar da máscara não contam no tamanho. @E 999,999,999.99 tem 12 posições de dado (nove dígitos, o ponto e duas decimais), igual ao X3_TAMANHO do C6_QTDVEN.

A ficha do ZA1_IDADE

  1. No Configurador, abra Base de Dados > Dicionário > Arquivos.
  2. Posicione na tabela ZA1, clique em Editar, abra a pasta Campos e clique em Incluir.
  3. Informe nome, tipo numérico, tamanho, decimais e formato conforme a ficha abaixo.
  4. Na pasta Informações, o título (até 12 caracteres) e a descrição (até 25).
  5. Na pasta Validações, a expressão de validação.
  6. Na pasta Uso, marque Browse se a idade deve aparecer na lista.
  7. Confirme.
Propriedade (coluna da SX3)Valor
Tipo (X3_TIPO)N
Tamanho (X3_TAMANHO)3
Decimais (X3_DECIMAL)0
Título (X3_TITULO)Idade
Formato (X3_PICTURE)999
Validação (X3_VALID)Positivo() .And. NaoVazio()
Alterar/Visualizar (X3_VISUAL)A
Modo de edição (X3_WHEN)vazio
Obrigatório (pasta Uso)desmarcado
Browse (X3_BROWSE)S
Contexto (X3_CONTEXT)R
Proprietário (X3_PROPRI)U

Idade é número porque entra em conta e comparação. Três dígitos cobrem qualquer idade, e idade não tem fração. A máscara 999 é o mesmo desenho do AA2_NIVEL, que também tem Positivo() como validação.

A idade é preenchida por um gatilho a partir do nascimento (ZA1_NASC, explicado em Campo data). O gatilho em si fica em Gatilhos no Protheus.

Por que validar um campo que o gatilho preenche

Se o campo continua editável, o usuário pode apagar o que o gatilho calculou e digitar outra coisa. A validação é o que segura o valor digitado.

Positivo() recusa valor negativo. Sobre o zero, a documentação não fecha a questão: a página da pasta Validações do Configurador diz que a função verifica se o valor é “maior que 0”, mas a página da própria função diz só que ela verifica se o conteúdo “é positivo”. Para recusar o zero com certeza, combine com NaoVazio(): Positivo() .And. NaoVazio(). Para a idade de um motorista, é o que se quer. O detalhe está em Validação de campo.

Quando zero é um valor legítimo, o padrão combina com Vazio(), que permite zero em campo numérico. É assim nos campos de comissão do item do pedido ( a ):

TEXT
positivo() .or. vazio()

As funções de validação, e como escrever uma sua, estão em Validação de campo.

No banco

O dicionário é quem guarda tamanho e decimais. Na base SQL Server de demonstração que conferimos, a coluna de um campo numérico é float, e os registros sem valor estavam com zero, não com NULL. Confira no seu banco:

Confira no seu ambienteSQL
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_NAME  = 'ZA1010'
   AND COLUMN_NAME = 'ZA1_IDADE'

O 010 do nome da tabela é o sufixo da empresa e muda de ambiente para ambiente. Troque pelo seu.

Se o seu banco confirmar o mesmo comportamento, “idade não informada” é ZA1_IDADE = 0:

Confira no seu ambienteSQL
SELECT ZA1_COD, ZA1_NOME, ZA1_NASC, ZA1_IDADE
  FROM ZA1010
 WHERE ZA1_IDADE = 0
   AND D_E_L_E_T_ = ' '

Para conferir tamanho, decimais e máscara de todos os numéricos da tabela:

Confira no seu ambienteSQL
SELECT X3_CAMPO, X3_TAMANHO, X3_DECIMAL, X3_PICTURE, X3_VALID
  FROM SX3010
 WHERE X3_ARQUIVO = 'ZA1'
   AND X3_TIPO    = 'N'
   AND D_E_L_E_T_ = ' '

Referências

  1. TDNtdn.totvs.com

    TDN — Tipos de dados (Dicionário de Dados)
  2. TDNtdn.totvs.com

    TDN — Campos (CFGX034 - SIGACFG)
  3. TDNtdn.totvs.com

    TDN — Pasta Validações (CFGX034 - SIGACFG)
  4. TDNtdn.totvs.com

    TDN — TRANSFORM()

Continue por aqui