Resposta rápida
- Os cinco tipos
Ccaractere,Nnumérico,Ddata,Llógico,Mmemo — é o que vai emX3_TIPO.- Código é caractere
A1_COD,B1_CODeC5_NUMsãoC, nãoN.- Data no banco (SQL Server)
- texto de 8 posições,
AAAAMMDD; data vazia são 8 espaços. - Lógico no banco (SQL Server)
- uma letra,
TouF. - Armadilha
- memo gravado como binário não se lê com um
SELECTsimples.
Consulta rápida7 seções
O tipo do campo decide duas coisas: como ele se comporta na tela e em AdvPL, e
o que fica gravado na tabela. A segunda é a que surpreende quem vai ao banco
pela primeira vez — a data que aparece como 26/09/2026 na tela está gravada
como 20260926.
O que cada tipo grava
| Tipo | No SQL Server observado | Exemplos do padrão |
|---|---|---|
C Caractere | varchar do tamanho do campo, completado com espaços à direita | A1_NOME, B1_COD, C5_NUM |
N Numérico | float; tamanho e decimais ficam no dicionário | C6_QTDVEN, C6_PRCVEN |
D Data | varchar(8), formato AAAAMMDD | C5_EMISSAO, A1_DTCAD |
L Lógico | varchar(1), T ou F | AO4_CTRLTT, BM_CORP |
M Memo | na maioria varbinary(max); alguns varchar(max) | A1O_HELP, DT6_OBSDES |
Os tipos físicos da tabela são o que conferimos numa base Protheus 12 de
demonstração em SQL Server, cruzando a SX3 com o catálogo do banco. Em outro
banco de dados os nomes dos tipos mudam. Para ver os do seu:
SELECT X3.X3_CAMPO, X3.X3_TIPO, X3.X3_TAMANHO, X3.X3_DECIMAL,
C.DATA_TYPE, C.CHARACTER_MAXIMUM_LENGTH
FROM SX3010 X3
JOIN INFORMATION_SCHEMA.COLUMNS C
ON C.TABLE_NAME = 'SC5010'
AND C.COLUMN_NAME = RTRIM(X3.X3_CAMPO)
WHERE X3.X3_ARQUIVO = 'SC5'
AND X3.D_E_L_E_T_ = ' '
ORDER BY X3.X3_ORDEMO sufixo 010 é o da empresa; no seu ambiente pode ser outro. Um campo
virtual
(X3_CONTEXT = V) não aparece no resultado, porque não existe na tabela
física.
Caractere
Serve para texto e para códigos. É o tipo da maioria dos campos: código de cliente, de produto e número de pedido são caractere no dicionário padrão, mesmo quando só recebem dígitos.
No banco, o campo ocupa sempre o tamanho inteiro: um campo de 60 posições com
“TESTE” grava “TESTE” e mais 55 espaços. Em SQL Server, a comparação com =
ignora espaços à direita, então WHERE B1_COD = 'PA001' encontra o produto
mesmo com o B1_COD tendo 15 posições; já concatenar ou medir o tamanho pede
RTRIM. Máscara, código sequencial e validação estão em
Campo caractere.
Numérico
Serve para quantidades, preços e valores. Quantos dígitos e quantas casas
decimais é o dicionário que diz (X3_TAMANHO e X3_DECIMAL), junto com a
máscara de exibição (X3_PICTURE). O C6_PRCVEN, por exemplo, tem tamanho
14, 2 decimais e máscara @E 99,999,999,999.99.
No SQL Server que conferimos, a coluna física é float para todos os
numéricos. float é um tipo aproximado: o limite de casas decimais é
controlado pelo Protheus, não pela coluna, e uma conta feita no banco pode
sair com resíduo que a tela nunca mostra. Na base de demonstração, a soma de
60 itens de pedido saiu 8746.690000000001 — e não 8746.69:
SELECT STR(SUM(C6_VALOR), 30, 12) AS SOMA_BRUTA,
ROUND(SUM(C6_VALOR), 2) AS SOMA_ARREDONDADA,
CAST(SUM(C6_VALOR) AS DECIMAL(18, 2)) AS SOMA_DECIMAL
FROM SC6010
WHERE D_E_L_E_T_ = ' 'Na prática: arredonde (ROUND) ou converta para DECIMAL com as casas do
dicionário antes de comparar com o que a tela mostra, e evite filtro por
igualdade exata em valor calculado. Máscara automática e decimais estão em
Campo numérico.
Data
Na tela e em AdvPL, é data. No banco, é texto de 8 posições no formato
AAAAMMDD: C5_EMISSAO gravado como 20251222. Data vazia são 8 espaços,
não NULL.
O dicionário padrão confirma o formato em dois lugares:
- os índices usam
DTOS()para pôr data na chave —C5_FILIAL+DTOS(C5_EMISSAO)+C5_NUM; - o parâmetro
MV_ULMES, do tipo data, guarda19970101como conteúdo.
SELECT X6_VAR, X6_TIPO, X6_DESCRIC, X6_CONTEUD
FROM SX6010
WHERE X6_VAR = 'MV_ULMES'
AND D_E_L_E_T_ = ' 'Como AAAAMMDD ordena igual à data, filtro de período se escreve como texto,
e “data preenchida” é <> ' ', não IS NOT NULL:
SELECT C5_NUM, C5_EMISSAO
FROM SC5010
WHERE C5_EMISSAO BETWEEN '20260901' AND '20260930'
AND D_E_L_E_T_ = ' 'A diferença entre o que a tela mostra e o que o banco grava está detalhada em Campo data.
Lógico
Serve para sim ou não. Em AdvPL, vale .T. ou .F.. No banco, no ambiente
que conferimos, uma letra: T ou F. No dicionário padrão, todo campo lógico
tem tamanho 1.
SELECT BM_GRUPO, BM_CORP
FROM SBM010
WHERE BM_CORP = 'T'
AND D_E_L_E_T_ = ' 'Como o campo lógico se comporta na tela está em Campo lógico.
Memo
Serve para texto longo, com quebra de linha: observação, descrição detalhada,
conteúdo de integração. No ambiente SQL Server que conferimos, a maioria dos
memos reais está em coluna varbinary(max) — binária. Um SELECT nela não
devolve o texto como se lê na tela; é preciso converter. É a conversão que as
próprias rotinas do padrão usam em queries para SQL Server:
SELECT DT6_FILIAL, DT6_DOC,
ISNULL(CONVERT(VARCHAR(2047), CONVERT(VARBINARY(2047), DT6_OBSDES)), '') AS OBS
FROM DT6010
WHERE D_E_L_E_T_ = ' 'O número entre parênteses é o limite da leitura: texto maior vem cortado.
Quando a coluna for varchar(max) (a consulta ao INFORMATION_SCHEMA acima
diz), o SELECT direto já mostra o texto.
Há também memos virtuais no padrão: o B1_OBS não existe na tabela. O
inicializador dele é If(!inclui,MSMM(SB1->B1_CODOBS,60),"") — fora da
inclusão, a função MSMM busca o texto a partir de um código gravado em
B1_CODOBS. Quem procura “a observação do produto” na SB1 não acha a
coluna. Os dois casos, com a consulta de cada um, estão em
Campo memo.
E o combo?
Combo não é um sexto tipo. É um campo de um dos tipos acima com a lista de
opções em X3_CBOX — o B1_MSBLQL, por exemplo, é caractere de uma posição
com 1=Sim;2=Não. O banco grava só o valor (1), não a descrição; o formato
da lista está em
Campo combo.
Os campos que já vêm prontos, como log e bloqueio, são campos reservados, e o mapa completo do dicionário está em Dicionário de dados do Protheus.
Continue por aqui
- Vídeo
ProtheusTutorial
Tabela customizada no Protheus: as faixas SZ e Z e o modo de acesso
Tabela customizada no Protheus: qual alias usar (SZ1 a SZZ ou Z11 a ZZZ), como decidir compartilhado ou exclusivo e como conferir na SX2 o que foi gravado.