Pragiva — Tecnologia na prática

Os cinco tipos de campo do Protheus e o que cada um grava no banco

Os cinco tipos de campo do Protheus: caractere, numérico, data, lógico e memo. O que a SQL devolve de cada um e as armadilhas de data, lógico e memo.

Protheus Referência técnica 4 min de leitura

Assista o vídeo

Resposta rápida

Os cinco tipos
C caractere, N numérico, D data, L lógico, M memo — é o que vai em X3_TIPO.
Código é caractere
A1_COD, B1_COD e C5_NUM são C, não N.
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, T ou F.
Armadilha
memo gravado como binário não se lê com um SELECT simples.
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

TipoNo SQL Server observadoExemplos do padrão
C Caracterevarchar do tamanho do campo, completado com espaços à direita, ,
N Numéricofloat; tamanho e decimais ficam no dicionário,
D Datavarchar(8), formato AAAAMMDD,
L Lógicovarchar(1), T ou F,
M Memona maioria varbinary(max); alguns varchar(max),

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:

Confira no seu ambienteSQL
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_ORDEM

O 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:

Confira no seu ambienteSQL
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 , do tipo data, guarda 19970101 como conteúdo.
Confira no seu ambienteSQL
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:

Confira no seu ambienteSQL
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.

Confira no seu ambienteSQL
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:

Confira no seu ambienteSQL
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 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 . Quem procura “a observação do produto” na 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 , 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