Árvore de páginas

Você está vendo a versão antiga da página. Ver a versão atual.

Comparar com o atual Ver Histórico da Página

« Anterior Versão 3 Próxima »

Tipagem de Dados


Abrangência:

 

Versão 12

 



1. Introdução

 

Este documento mostra a utilização da tipagem de dados na linguagem ADVPL.
2. Requisitos

 

Para a utilização dos recursos de tipagem de dados são necessários os requisitos:
  • TOTVS Appserver 2.0, binário a partir de dezembro/2014;
  • Pré-processador, dezembro 2014, atualizado no TDS;

3. Tipos de Dados

 

Os tipos de dados disponíveis são: numeric, character, date, codeblock, logical, array e object.
Uma letra é utilizada para indicar cada tipo de dado, essa letra será mostrada nas mensagens de erro.

Tipo

Descrição

Indicador

numeric

Utilizado para valores numéricos inteiros ou decimais, positivos ou negativos.

N

char / character

Utilizado para valores do tipo caracter

C

date

Utilizado para armenar datas

D

block / codeblock

Armazena um bloco de código para macro execução

B

logical

Armazena valores lógicos, verdadeiro (.T.) ou falso (.F.)

L

array

Utilizado para armazenar uma matriz de valores

A

object

Armazena objetos de interface ou classes

O

 

4. Funções

 

A criação de funções com o uso de tipagem de dados deve seguir a seguinte sintaxe:

Function <Nome da Funcao>([<parametro1> as <Tipo1>, <paramentroN as <TipoN>]) [as <Tipo>]

...

Return

 

O <Nome da Funcao> deve seguir os mesmo critérios usados em uma função sem tipagem de dados.
Cada parâmetro deve ser especificado com o tipo de dado desejado.O retorno da função também pode ter um tipo de dado indicado.
5. Classe

 

A uso de tipo de dados em classes deve usar a seguinte sintaxe:

Class <Nome da Classe>

 

      // Declaração de propriedades

      Data <nPropriedad1> [as <tipo>]

      Data <nPropriedad2> [as <tipo>]

     

      // Declaração de métodos

  Method New()       // Construtor, retorna Self

  Method <Nome do Método>([<Param1>, <Param2>,...,<ParamN>]) [as <tipo>]

 

EndClass

 

// Construtor da Classe

Method New() Class <Nome da Classe>

 

Return Self

 

// Definição de métodos

Method <Nome do Método>(nParam1) Class <Nome da Classe> [as <tipo>]

Local n1 as numeric

 

Parameter <Param1> [as <tipo>]

 

ConOut("Classe:MethodA")

 

Return n1

 

Em classes, podemos utilizar a tipagem de dados em propriedades e métodos.
Na construção de métodos os parâmetros e seus respectivos tipos devem ser especificados após a declaração das variáveis locais.
6. Compilação

 

No processo de compilação de código fonte, que utilize os recursos de tipagem de dados, serão avaliados conforme as definições, as variáveis, parâmetros e retorno de dados.
Caso alguma inconsistência na definição dos tipos seja encontrada será emitida uma mensagem de warning mostrando em qual linha está à divergência na declaração dos dados.

Por exemplo, na compilação do código fonte abaixo:

#include  "protheus.ch"

 

Function xTipagem()

Local c1 as character

Local n1 as numeric

 

n1 := "ABCDE"

c1 := 10

 

Return

 

Temos o seguinte resultado na compilação:

TIPAGEM.PRW(7) warning W0015 Incompatible Types : cannot convert from 'C' to 'N'

TIPAGEM.PRW(8) warning W0015 Incompatible Types : cannot convert from 'N' to 'C'

 

7. Execução

 

Durante a execução de uma função e/ou classe que utilize o recurso de tipagem de dados existe uma verificação do tipo da variável que é utilizada na passagem de parâmetro com o que foi definido no protótipo da função.
Caso os tipos de dados sejam diferentes será exibido uma mensagem no console do TOTVS AppServer e o valor NIL será atribuído a variável que foi passada como parâmetro, causando um comportamento diferente do esperado ou erro de tipo de dado.
Para exemplificar este comportamento temos o seguinte exemplo:

User Function xTMain()

Local c1 as character

Local l1 as logical

 

c1 := "ABCDE"

l1 := .T.

 

ConOut("Chamada 1 - xTLog")

ConOut(U_xTLog(l1))

 

ConOut("Chamada 2 - xTLog")

ConOut(U_xTLog(c1)) //Invalid parameter

Return

 

User Function xTLog(l1 as logical)

 If l1 = .T.

ConOut("Logical .T.")

Else

ConOut("Logical .F.")

EndIf

 

Return l1

 

Neste exemplo temos duas funções sendo que a primeira (xTMain) faz duas chamadas da função xTLog, sendo que a primeira chamada utiliza um parâmetro lógico, como esperado no protótipo da função e a segunda utiliza um parâmetro do tipo character, incorreto para a função.
Após a execução temos os seguintes resultados:
Chamada 1 – xTLog
Logical .T.
.T.
 
Chamada 2 - xTLog
*** Warning - Mismatched parameters type calling U_XTLOG at parameter 1 - expected L -> C
Logical .F.
NIL

 

Na chamada 1 a execução ocorre conforme o esperado pois o parâmetro utilizado é do mesmo tipo indicado no protótipo da função.
Na chamada 2 é passado um parâmetro do tipo character, diferente do logical indicado no protótipo da função, sendo assim quando a função xTLog é executada o valor da variável l1 é NIL, diferente de true (.T.) atribuído a ela antes da chamada da função, sendo assim o resultado é diferente da primeira chamada.
  • Sem rótulos