Usina BRAdvPL Guia
Entrar
← Todos os tópicos
FUNDAMENTOPublicado

Tipos de variáveis AdvPL

Local <variável> := <valor> · ValType(<variável>)

Entenda como criar, nomear, inicializar e atribuir valores às variáveis AdvPL e como o tipo acompanha o conteúdo armazenado.

VariáveisTipos de dadosAtribuiçãoNILValTypeFundamentos
01 · VISÃO GERAL

Visão geral

Uma variável é uma referência nomeada para um valor mantido em memória durante a execução. No AdvPL tradicional, o tipo é dinâmico: ele é determinado pelo valor atribuído e pode mudar durante a vida da variável. Isso é diferente do escopo, que controla visibilidade e duração, e da tipagem explícita com As <tipo>, que documenta e restringe o contrato esperado.

02 · SINTAXE

Sintaxe

Local <variável> := <valor> · ValType(<variável>)

Parâmetros

Character
COpcional

Texto delimitado por aspas simples ou duplas.

Numeric
NOpcional

Número inteiro ou decimal armazenado em ponto flutuante.

Date
DOpcional

Data criada por funções como Date(), CToD() ou SToD().

Logical
LOpcional

Valor verdadeiro (.T.) ou falso (.F.).

Array
AOpcional

Coleção indexada, iniciada na posição 1, que pode reunir valores de tipos diferentes.

CodeBlock
BOpcional

Bloco de expressões executável posteriormente com funções como Eval().

Object
OOpcional

Instância de uma classe.

NIL
UOpcional

Ausência de valor; é o estado inicial usual de uma variável declarada sem inicialização.

03 · EXEMPLO PRÁTICO

Declaração e inicialização

User Function ExVariaveis()
    Local cProduto    := "Teclado"
    Local nQuantidade := 2
    Local nPreco      := 150.50
    Local lDisponivel := .T.
    Local dCadastro   := Date()

    If lDisponivel
        MsgInfo(cProduto + " - total: " + ;
            CValToChar(nQuantidade * nPreco))
    EndIf
Return
Resultado esperado

Cada variável recebe um valor inicial compatível com a intenção indicada pelo prefixo.

04 · EXEMPLO PRÁTICO

NIL antes da inicialização

User Function ExNil()
    Local nPercentual
    Local nResultado

    If ValType(nPercentual) == "U"
        nPercentual := 10
    EndIf

    nResultado := 250 * (1 + nPercentual / 100)
    MsgInfo("Resultado: " + CValToChar(nResultado))
Return
Resultado esperado

ValType() retorna U enquanto a variável está sem valor. A inicialização evita utilizar NIL no cálculo.

05 · EXEMPLO PRÁTICO

Mudança dinâmica de tipo

User Function ExTipoDinamico()
    Local xValor := "Pedido aberto"

    ConOut("Tipo atual: " + ValType(xValor)) // C
    xValor := 22
    ConOut("Tipo atual: " + ValType(xValor)) // N
    xValor := .T.
    ConOut("Tipo atual: " + ValType(xValor)) // L
    xValor := Date()
    ConOut("Tipo atual: " + ValType(xValor)) // D
Return
Resultado esperado

A mesma variável assume tipos diferentes. A flexibilidade existe, mas deve ser usada com intenção explícita.

06 · EXEMPLO PRÁTICO

Conversão antes da concatenação

User Function ExConversao()
    Local nQuantidade := 3
    Local dHoje       := Date()
    Local lAtivo      := .T.

    ConOut("Quantidade: " + CValToChar(nQuantidade))
    ConOut("Data: " + DToC(dHoje))
    ConOut("Ativo: " + IIf(lAtivo, "sim", "não"))
Return
Resultado esperado

Cada conteúdo é convertido para caractere antes de ser unido ao texto.

07 · EXEMPLO PRÁTICO

Atribuição implícita que deve ser evitada

User Function ExErroDigitacao()
    Local nQuantidade := 10

    nQuantidad := 20 // nome incorreto: pode criar uma Private

    MsgInfo("Quantidade: " + CValToChar(nQuantidade))
Return
Resultado esperado

A ausência da letra e pode criar outro identificador em vez de atualizar nQuantidade. A declaração explícita reduz esse risco.

BOAS PRÁTICAS
  • Declare e inicialize a variável na mesma instrução sempre que houver um valor inicial claro: Local nPercentual := 10.
  • Prefira o operador := para atribuição. Ele diferencia visualmente a atribuição das comparações feitas com = ou ==.
  • ValType(xValor) retorna uma letra que identifica o tipo atual. Como a tipagem é dinâmica, a resposta pode mudar depois de uma nova atribuição.
  • Use prefixos coerentes como c, n, d, l, a, b, o e x para comunicar a intenção. O prefixo x é apropriado somente quando diferentes tipos fazem parte do desenho.
  • A documentação consultada registra que somente os dez primeiros caracteres identificariam variáveis de memória. Trate essa regra como compatibilidade histórica e valide o comportamento na versão de AppServer utilizada antes de basear um projeto nela.
  • Separe os conceitos: tipo descreve o valor; escopo define onde a variável é visível; tempo de vida define até quando ela existe.
ARMADILHAS COMUNS
  • Declarar sem inicializar produz NIL. Usar NIL diretamente em cálculo ou concatenação pode provocar type mismatch.
  • Atribuir um valor a um nome ainda não declarado pode criar implicitamente uma variável Private. Um erro de digitação pode, portanto, alterar a lógica sem o erro esperado.
  • Mudar livremente o tipo de uma variável reduz a previsibilidade. Faça isso somente quando for intencional e valide com ValType() antes de operar.
  • Não concatene números, datas, lógicos ou NIL diretamente com texto. Converta conscientemente com CValToChar(), DToC() ou outra função adequada.
  • Não utilize palavra reservada, espaço ou caractere especial em identificadores. Comece o nome por letra ou sublinhado e utilize letras, números e sublinhado no restante.
  • Store é mantido por compatibilidade histórica. Para código novo, prefira declaração explícita e atribuição com :=.

Conteúdos relacionados

REFERÊNCIAS
  1. TOTVS. Criação e Atribuição de Variáveis. TDN.
  2. TOTVS. Tipos de Dados. TDN.
  3. TOTVS. O Contexto de Variáveis dentro de um Programa. TDN.
  4. MASTERSIGA CONSULTORIA. Criação e Atribuição de Variáveis. Atualizado em 18 maio 2023.
  5. SILVA, Waterloo Ferreira da. A Bíblia do AdvPL. 2004, p. 22-24.
Situação
Publicado
Página criada em
Última revisão em
Idioma original
Português
Revisão
Usina.BR