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ção | Maior valor |
|---|---|
| Tamanho 16, sem decimais | 9.999.999.999.999.999 |
| Tamanho 16, 1 decimal | 99.999.999.999.999,9 |
| Tamanho 16, 8 decimais | 9.999.999,99999999 |
Tamanho e decimais, com exemplos do padrão
Os campos numéricos do item do pedido de venda mostram a regra:
| Campo | Tam./Dec. | X3_PICTURE |
|---|---|---|
C6_POTENCI | 6 / 2 | @E 999.99 |
C6_DESCONT | 5 / 2 | @E 99.99 |
C6_QTDVEN | 12 / 2 | @E 999,999,999.99 |
C6_PRCVEN | 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: AA2_NIVEL, 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ê quer | Tamanho | Decimais |
|---|---|---|
| Inteiro de até 3 dígitos (idade) | 3 | 0 |
| Percentual até 99,99 | 5 | 2 |
| Valor até 999.999,99 | 9 | 2 |
| Quantidade até 99.999,9999 | 10 | 4 |
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
- No Configurador, abra Base de Dados > Dicionário > Arquivos.
- Posicione na tabela
ZA1, clique em Editar, abra a pasta Campos e clique em Incluir. - Informe nome, tipo numérico, tamanho, decimais e formato conforme a ficha abaixo.
- Na pasta Informações, o título (até 12 caracteres) e a descrição (até 25).
- Na pasta Validações, a expressão de validação.
- Na pasta Uso, marque Browse se a idade deve aparecer na lista.
- 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
(C6_COMIS1 a C6_COMIS5):
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:
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:
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:
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
TDNtdn.totvs.com
TDN — Tipos de dados (Dicionário de Dados)TDNtdn.totvs.com
TDN — Campos (CFGX034 - SIGACFG)TDNtdn.totvs.com
TDN — Pasta Validações (CFGX034 - SIGACFG)TDNtdn.totvs.com
TDN — TRANSFORM()
Continue por aqui
- Vídeo
ProtheusTutorial
Campo caractere: código sequencial, máscara e validação
Campo caractere no Configurador: código sequencial sem GetSXENum direto no inicializador, nome em maiúsculas com @! e validação de código repetido.