Lógica e Inicialização à Programação ADVPL
Variáveis
Variáveis são “espaços reservados na memória do computador para armazenar dados durante o processamento do programa”. Quando se declara, “cria-se” a variável, é necessário definir, quais serão os tipos de dados que a mesma manipulará.
Por exemplo: numérico, caractere (string, alfanumérico), lógico ou data.
Também e necessário informar, se a variável será: local, privada, pública, statica ou global.
O Contexto de Variáveis dentro de um Programa
As variáveis declaradas em um programa ou função, são visíveis de acordo com o escopo onde são definidas. Como também do escopo depende o tempo de existência das variáveis. A definição do escopo de uma variável é efetuada no momento de sua declaração. Local nNumero := 10 Esta linha de código declara uma variável chamada nNumero indicando que seu escopo é local.
Os identifcadores de escopo são:
• LOCAL
• STATIC
• PRIVATE
• PUBLIC
Variáveis Locais
Variáveis locais são pertencentes apenas ao escopo da função onde foram declaradas. Devem ser explicitamente declaradas com o identificador LOCAL, como no exemplo:
Function Pai()
Local nVar := 10, aMatriz := {0,1,2,3}
<comandos>
Filha()
<mais comandos>
Return(.T.)
Neste exemplo, a variável nVar foi declarada como local e atribuída com o valor 10. Quando a função Filha é executada, nVar ainda existe mas não pode ser acessada. Quando a execução da função Pai terminar, a variável nVar é destruída. Qualquer variável com o mesmo nome no programa que chamou a função Pai não é afetada.
Variáveis locais são criadas automaticamente cada vez que a função onde forem declaradas for ativada. Elas continuam a existir e mantêm seu valor até o fim da ativação da função (ou seja, até que a função retorne o controle para o código que a executou). Se uma função é chamada recursivamente (por exemplo, chama a si mesma), cada chamada em recursão cria um novo conjunto de variáveis locais.
A visibilidade de variáveis locais é idêntica ao escopo de sua declaração. Ou seja, a variável é visível em qualquer lugar do código fonte em que foi declarada. Se uma função é chamada recursivamente, apenas as variáveis locais criadas na mais recente ativação são visíveis.
Variáveis Estáticas
Variáveis estáticas funcionam basicamente como as variáveis locais, mas mantêm seu valor através da execução. Variáveis estáticas devem ser declaradas explicitamente no código com o identificador STATIC. O escopo das variáveis estáticas depende de onde são declaradas. Se forem declaradas dentro do corpo de uma função ou procedimento, seu escopo será limitado àquela rotina. Se forem declaradas fora do corpo de qualquer rotina, seu escopo é todo o arquivo de programa. Neste exemplo, a variável nVar é declarada como estática e inicializada com o valor 10:
Function Pai()
Static nVar := 10
<comandos>
Filha()
<mais comandos>
.Return(.T.)
Quando a função Filha é executada, nVar ainda existe mas não pode ser acessada. Diferente de variáveis declaradas como LOCAL ou PRIVATE, nVar continua a existir e mantém seu valor atual quando a execução da função Pai termina. Entretanto, somente pode ser acessada por execuções subseqüentes da função Pai.
Variáveis Privadas
A declaração é opcional para variáveis privadas. Mas podem ser declaradas explicitamente com o identificador PRIVATE. Uma vez criada, uma variável privada continua a existir e manchem seu valor até que o programa ou função onde foi criada termine (ou seja, até que a função onde foi criada retorne para o código que a executou). Neste momento, é automaticamente destruída. Em termos mais simples, uma variável privada é visível dentro da função de criação e todas as funções chamadas por esta, a menos que uma função chamada crie sua própria variável privada com o mesmo nome. Por exemplo:
Function Pai()
Private nVar := 10
<comandos>
Filha()
<mais comandos>
Return(.T.)
Neste exemplo, a variável nVar é criada como privada e inicializada com o valor 10. Quando a função Filha é executada, nVar ainda existe e, diferente de uma variável local, pode ser acessada pela função Filha.
Quando a função Pai terminar, nVar será destruída e qualquer declaração de nVar anterior se tornará acessível novamente.
Variáveis Públicas
Podem-se criar variáveis públicas dinamicamente no código com o identificador PUBLIC. As variáveis públicas continuam a existir e mantêm seu valor até o fim da execução.
É possível criar uma variável privada com o mesmo nome de uma variável pública existente. Entretanto, não é permitido criar uma variável pública com o mesmo nome de uma variável privada existente.
Uma vez criada, uma variável pública é visível em todo o programa onde foi declarada até que seja escondida por uma variável privada criada com o mesmo nome. A nova variável privada criada esconde a variável pública existente, e esta se tornará inacessível até que a nova variável privada seja destruída. Por exemplo:
Function Pai()
Public nVar := 10
<comandos>
Filha()
<mais comandos>
Return(.T.)
Neste exemplo, nVar é criada como pública e inicializada com o valor 10. Quando a função Filha é executada, nVar ainda existe e pode ser acessada. Diferente de variáveis locais ou privadas, nVar ainda existe após o término da à execução da função Pai.
• Diferentemente dos outros identificadores de escopo, quando uma variável é declarada como pública sem ser inicializada, o valor assumido é falso (.F.) e não nulo (nil).
Variáveis e nomes de campos
Muitas vezes uma variável pode ter o mesmo nome que um campo de um arquivo ou tabela aberto no momento. Neste caso, o AdvPl privilegiará o campo. Assim uma referência a um nome que identifique tanto uma variável como um campo, resultará no conteúdo do campo.
Para especificar qual deve ser o elemento referenciado, deve-se utilizar o operador de identificação de apelido (->) e um dos dois identificadores de referência,
MEMVAR ou FIELD. cRes := MEMVAR->NOME
Esta linha de comando identifica que o valor atribuído à variável cRes deve ser o valor da variável de memória chamada NOME.
cRes := FIELD->NOME
Neste caso, o valor atribuído à variável cRes será o valor do campo NOME existente no arquivo ou tabela
aberto na área atual.
Original e completo