Tempo de leitura: 8 minutos
Entender os Tipos de Dados ADVPL é o primeiro passo para escrever códigos robustos e eficientes no Protheus. A linguagem ADVPL é conhecida por sua tipagem dinâmica, o que significa que uma variável não precisa ter seu tipo declarado rigidamente e pode mudar de conteúdo durante a execução. No entanto, para realizar cálculos, manipulações de texto ou controle de datas, você precisa dominar como o sistema trata cada informação.
Neste guia prático, vamos explorar os tipos de dados primários do Protheus, com exemplos reais e as melhores práticas de Programação ADVPL.
Os 6 Tipos de Dados Primários no Protheus
Diferente de linguagens como Java ou C#, o ADVPL simplifica a declaração, mas mantém categorias claras para o processamento de dados. Os principais tipos são:
- Numérico: Para valores inteiros e reais.
- Lógico: Para validações verdadeiro/falso.
- Caracter: Para textos e strings.
- Data: Para manipulação de calendários.
- Array: Para coleções de dados (matrizes).
- Bloco de Código: Para armazenar instruções executáveis.
1. Tipo de Dado Numérico
O ADVPL por padrão não diferencia variáveis com valores numéricos(inteiros) de valores com ponto flutuante(reais), assim essas variáveis poderão receber qualquer valor que esteja no intervalo permitido.
Observação:Uma variável do tipo de dado numérico pode conter um número de 18(dezoito) dígitos incluindo o ponto flutuante, no intervalo de 2.2250738585072014 E-308 até 1.7976931348623158 E+308.
Exemplos de variáveis de tipo de dado numérico em ADVPL:
#include 'protheus.ch'
/*
Blog/Site ProtheusAdvpl - www.protheusadvpl.com.br
--------------------------------------------------------------------------------
Canal ProtheusAdvpl - www.youtube.com/protheusadvpl
--------------------------------------------------------------------------------
Portal ProtheusAdvpl - http://protheusadvpl.com.br/sobre-o-portal-protheus-advpl
*/
/*/{Protheus.doc} Numerico
//TODO Descrição auto-gerada.
@author Adilio Costa
@since 10/08/2019
@version 1.0
@return ${return}, ${return_description}
@type function
/*/
User Function Numerico()
//Definição de variáveis numéricas
Local nNum := 10
Local nNum2 := 21.45
Local nNum3 := 0.000043
Local nNum4 := 1900000000
Local cMsg := "Variáveis Numéricas ADVPL:"+CHR(13)+"nNum:"+cValToChar(nNum)
cMsg += CHR(13)+"nNum2:"+cValToChar(nNum2)+CHR(13)+"nNum3:"+cValToChar(nNum3)
cMsg += CHR(13)+"nNum4:"+cValToChar(nNum4)
msgAlert(cMsg)
Return

Tipo de Dado Lógico
Tipos de dados lógicos em ADVPL são representado pelos valor .T. ou .Y. para indicar que o conteúdo da variável é TRUE(verdadeiro) ou .F. ou .N. para indicar que é FALSE(falso).
Exemplos de variáveis de tipo de dado lógico em ADVPL:
Tipos de dados lógicos em ADVPL são representado pelos valor .T. ou .Y. para indicar que o conteúdo da variável é TRUE(verdadeiro) ou .F. ou .N. para indicar que é FALSE(falso).
Exemplos de variáveis de tipo de dado lógico em ADVPL:
#include 'protheus.ch'
/*
Blog/Site ProtheusAdvpl - www.protheusadvpl.com.br
--------------------------------------------------------------------------------
Canal ProtheusAdvpl - www.youtube.com/protheusadvpl
--------------------------------------------------------------------------------
Portal ProtheusAdvpl - http://protheusadvpl.com.br/sobre-o-portal-protheus-advpl
*/
/*/{Protheus.doc} Logico
//TODO Descrição auto-gerada.
@author Adilio Costa
@since 10/08/2019
@version 1.0
@return ${return}, ${return_description}
@type function
/*/
User Function Logico()
//Definição de variáveis lógicas
Local lVar := .T.
Local lVar2 := .F.
Local cMsg := "Variáveis Lógicas ADVPL:"+CHR(13)+"lVar:"+cValToChar(lVar)
cMsg += CHR(13)+"lVar2:"+cValToChar(lVar2)
msgAlert(cMsg)
Return

Tipo de Dado Caracter
O tipo de dado caracter é definido em ADVPL com valores que contenham aspas duplas(” “) ou aspas simples(‘ ‘).
Exemplos de variáveis de tipo de dado caracter em ADVPL:
#include 'protheus.ch'
/*
Blog/Site ProtheusAdvpl - www.protheusadvpl.com.br
--------------------------------------------------------------------------------
Canal ProtheusAdvpl - www.youtube.com/protheusadvpl
--------------------------------------------------------------------------------
Portal ProtheusAdvpl - http://protheusadvpl.com.br/sobre-o-portal-protheus-advpl
*/
/*/{Protheus.doc} Caracter
//TODO Descrição auto-gerada.
@author Adilio Costa
@since 10/08/2019
@version 1.0
@return ${return}, ${return_description}
@type function
/*/
User Function Caracter()
//Definição de variáveis caracteres
Local cVar := 'Protheus'
Local cVar2 := "ADVPL"
Local cMsg := "Variáveis Caracteres ADVPL:"+CHR(13)+"lVar:"+cVar
cMsg += CHR(13)+"lVar2:"+cVar2
msgAlert(cMsg)
Return

ADVPL não possui caractere de “escape”(caractere especiais que representam aspas), assim caso queiramos declarar um tipo caractere que contenha ao mesmo tempo aspas duplas(“”) ou aspas simples devemos concatená-las conforme o exemplo abaixo:
#include 'protheus.ch'
/*
Blog/Site ProtheusAdvpl - www.protheusadvpl.com.br
--------------------------------------------------------------------------------
Canal ProtheusAdvpl - www.youtube.com/protheusadvpl
--------------------------------------------------------------------------------
Portal ProtheusAdvpl - http://protheusadvpl.com.br/sobre-o-portal-protheus-advpl
*/
/*/{Protheus.doc} Caracter
//TODO Descrição auto-gerada.
@author Adilio Costa
@since 10/08/2019
@version 1.0
@return ${return}, ${return_description}
@type function
/*/
User Function Caracter()
//Definição de variáveis caracteres
Local cVar := 'Protheus'
Local cVar2 := "ADVPL"
Local cMsg := "Variáveis Caracteres ADVPL:"+CHR(13)+"lVar:'"+cVar+"'"
cMsg += CHR(13)+"lVar2:'"+cVar2+"'"
msgAlert(cMsg)
Return

Tipo de Dado Data
A linguagem ADVPL possui o tipo de dado data, diferentemente dos outros tipos de dados, o tipo data não pode ser declarado diretamente e sim através de funções específicas pra isso que a linguagem disponibiliza, como a função CTOD(cCaractere) que converte variáveis do tipo caracter(no formato “DD/MM/AA”) para data:
Exemplo:
CTOD(“10/08/19”) -> 10/08/19
Exemplos de variáveis de tipo de dado data em ADVPL:
#include 'protheus.ch'
/*
Blog/Site ProtheusAdvpl - www.protheusadvpl.com.br
--------------------------------------------------------------------------------
Canal ProtheusAdvpl - www.youtube.com/protheusadvpl
--------------------------------------------------------------------------------
Portal ProtheusAdvpl - http://protheusadvpl.com.br/sobre-o-portal-protheus-advpl
*/
/*/{Protheus.doc} FData
//TODO Descrição auto-gerada.
@author Adilio Costa
@since 10/08/2019
@version 1.0
@return ${return}, ${return_description}
@type function
/*/
User Function FData()
//Definição de variáveis datas
Local dVar := CTOD("10/08/19")
Local dVar2 := dVar+1
Local cMsg := "Variáveis Datas ADVPL:"+CHR(13)+"dVar:"+DTOC(dVar)
cMsg += CHR(13)+"dVar2:"+DTOC(dVar2)
msgAlert(cMsg)
Return

Tipo de Dado Array(matriz)
A linguagem ADVPL possui o tipo de dado Array(matriz), que é um tipo de dado especial em que os elementos desse array ficam dispostos em linhas e colunas, e são acessados através de seus índices numéricos iniciado por 1.
No ADVPL podemos ter array unidimensionais, arrays que são representados por uma dimensão conforme apresentado no exemplo abaixo:
Nomes[“Rodrigo”,”Carla”,”Adilio”]
Nesse caso é como se cada elemento do array Nomes ficassem dispostos conforme o exemplo:
Índice Valor
1 [“Rodrigo”]
2 [“Carla”]
3 [“Adilio”]
O array multidimensional em ADVPL é representado por 2 ou mais dimensões conforme o exemplo abaixo:
Nomes[[“Adilio”,”Masculino”,31],[“Danilo”,”Masculino”,32],[“Carla”,”Feminino”,26]]
Linha Coluna Valor
1 1 “Adilio”
1 2 “Masculino”
1 3 31
2 1 “Danilo”
2 2 “Masculino”
2 3 32
3 1 “Carla”
3 2 “Feminino”
3 3 26
Linha Coluna 1 2 3
1 [“Adilio”,”Masculino”,31]
2 [“Danilo”,”Masculino”,32]
3 [“Carla”,”Feminino”,26]
Exemplos de variáveis de tipo de dado Array em ADVPL:
#include 'protheus.ch'
/*
Blog/Site ProtheusAdvpl - www.protheusadvpl.com.br
--------------------------------------------------------------------------------
Canal ProtheusAdvpl - www.youtube.com/protheusadvpl
--------------------------------------------------------------------------------
Portal ProtheusAdvpl - http://protheusadvpl.com.br/sobre-o-portal-protheus-advpl
*/
/*/{Protheus.doc} FArray
//TODO Descrição auto-gerada.
@author Adilio Costa
@since 10/08/2019
@version 1.0
@return ${return}, ${return_description}
@type function
/*/
User Function FArray()
//Definição de variáveis array
Local aNomes := {"Rodrigo","Carla","Adilio"}
Local cMsg := ""
for i := 1 TO len(aNomes)
cMsg +="Nome "+cValToChar(i)+":"+aNomes[i]+CHR(13)
Next i
msgAlert(cMsg)
Return

Tipo de Dado Bloco de Código
Bloco de código é um tipo de dado especial em ADVPL que armazena instruções ADVPL para serem executadas posteriormente.
Exemplos de variáveis de tipo de dado Bloco de Código em ADVPL:
#include 'protheus.ch'
/* Blog/Site ProtheusAdvpl - www.protheusadvpl.com.br
--------------------------------------------------------------------------------
Canal ProtheusAdvpl - www.youtube.com/protheusadvpl
--------------------------------------------------------------------------------
Portal ProtheusAdvpl - http://protheusadvpl.com.br/sobre-o-portal-protheus-advpl */
/*/{Protheus.doc} BCodigo
//TODO Descrição auto-gerada.
@author Adilio Costa
@since 10/08/2019
@version 1.0
@return ${return}, ${return_description}
@type function /*/
User Function BCodigo()
//Definição de variáveis Bloco de Código
Local bSoma5 := {|x| x+5}
Local nNum := 10
msgAlert(cValToChar(eval(bSoma5,nNum)))
Return

No exemplo do tipo de dado Bloco de Código em ADVPL acima o bloco de código bSoma5 recebe uma lista de expressões({|x| x+5}), é como se bSoma5 referenciasse uma função, essa função recebe como parâmetro a variável x e depois somamos o valor x a 5 e através da função eval executamos o bloco de código, o valor retornado é 15, pois passamos o valor 10(nNum:=10) e o mesmo foi somado com 5.
Domine a Programação ADVPL do Zero ao Profissional
Para dominar este conceito em cenários complexos, com aulas em vídeo e suporte especializado, conheça o Portal ProtheusAdvpl. Lá, exploramos a fundo a arquitetura por trás de cada tipo de dado e como evitar erros de “Type Mismatch” em grandes projetos.
Cursos Recomendados:
Conclusão
Dominar os Tipos de Dados ADVPL é a base para qualquer customização de sucesso no Protheus. Saber quando usar um Array ou como converter uma String para Data com a Val ou CToD evita bugs críticos e melhora a performance do seu código.
Se você gostou deste guia, confira também nosso artigo sobre Como Criar Tabelas e Campos via SIGACFG.
Links de referência(s):
Conteúdos relacionados