Histórico da Página
...
A declaração de variáveis é sempre efetuada depois da palavra chave "DEFINE". Uma variável declara-se da seguinte forma:
DEFINE nome_da_variavel TIPO |
No segundo caso cria-se uma nova variável cuja estrutura condiz com a estrutura de uma coluna de uma tabela do banco de dados. Sempre que uma variável for declarada usando a instrução LIKE, deve existir no início do módulo (fonte .4gl) uma instrução DATABASE que indica o banco de dados a ser usado para obter informações de definição das colunas utilizadas na declaração de variáveis.
Um caracter ou uma faixa de caracteres (substring) pertencentes a uma variável do tipo CHAR pode ser acessado utilizando o operador “[]” (colchetes), assim:
l_texto[1] |
No primeiro caso está se obtendo o primeiro caracter da variável l_texto. Já no segundo caso, está se obtendo 4 caracteres da variável l_texto, referente a posição inicial 2 até a posição 5.
...
nome_do_datetime DATETIME qualificador_inicial TO qualidificador_final |
Para uma variável DATETIME que tem o formato que vai do ano até 5 dígitos de fração de segundo, deve-se definir assim:
l_datahora DATETIME YEAR TO FRACTION(5) |
Se a variável for um RECORD deve-se apenas declarar da seguinte forma:
nome_do_record RECORD OU nome_do_record RECORD LIKE tabela.* |
No segundo caso é criada uma estrutura com elementos idênticos a todas as colunas de uma tabela do banco de dados corrente.
...
lr_dados.codigo OU lr_dados.* |
Este representa o elemento “codigo” do RECORD “lr_dados”. A notação ".*" pode ser usada em alguns contextos para indicar todos os elementos de um RECORD.
Se a variável elementos das variáveis tipo ARRAY podem ser acessadas através do operador [] (colchetes) e dá indicação do número do elemento a que se quer ter acesso, assim:
la_dados[10] |
Neste caso representa o 10º elemento do ARRAY la_dados.
Se a variável for um array deve ser declarada da seguinte forma:
nome_da_variavel ARRAY[m,n,...] OF tipo |
Os elementos das variáveis tipo ARRAY podem ser acessadas através do operador [] (colchetes) e dá indicação do número do elemento a que se quer ter acesso, assim:
...
2.3.1 Variáveis locais
DEFINE nome_da_variável tipo [, ...] |
As variáveis locais precisam ser declaradas no início de cada função e somente são reconhecidas dentro do escopo da função em que foram declaradas.
...
2.3.2 Variáveis globais
GLOBALS "fonte.4gl" OU GLOBALS |
Definição genérica de uma declaração global
...
2.3.3 Variáveis modulares
...
DEFINE nome_da_variável tipo [, ...] |
...
As variáveis modulares tem que ser declaradas no inicio do fonte, fora do escopo de definição de variáveis globais (GLOBALS..END GLOBALS) e fora do escopo de qualquer função (MAIN, FUNCTION, REPORT). Variáveis modulares somente são reconhecidas dentro do escopo do fonte (módulo) em que foram declaradas.
varmod1varmod1.4gl DEFINE DEFINE m_inteiro INTEGER MAIN MAIN LET m_inteiro = 1
DISPLAY “inteiro VARMOD1: “,m_inteiro
CALL mostra_varmod2()
varmod2varmod2.4gl DEFINE DEFINE m_inteiro INTEGER
FUNCTION FUNCTION mostra_varmod2()
LET m_inteiro = 3 END FUNCTION RESULTADO RESULTADO inteiro inteiro VARMOD1: 1
|
Exemplo com variáveis modulares |
Se declarar duas variáveis modulares com o mesmo nome em dois fontes (módulos) distintos, cada variável só vai ser reconhecida no fonte onde foi declarado. Efetivamente as variáveis com o mesmo nome localizadas em fontes diferentes são variáveis diferentes.
...
No 4GL para atribuir a uma variável um valor constante, expressão ou conteúdo de outra variável, utiliza-se o seguinte formato:
LET LET variável = {expressão | variável | constante}
|
No 4GL pode-se inicializar uma variável de qualquer tipo básico. As variáveis compostas só podem ser inicializadas através dos seus elementos constituintes.
...
afecta.4gl DATABASE DATABASE livros MAIN DEFINE x INTEGER,
LET x = 69
DISPLAY "X tem ", x,", Y tem ", y,"e Z = ",z
SELECT *
LET lr_livros2.* = lr_livros.*
RESULTADO:
|
Inicializações de variáveis
Conforme se viu, inicializou-se variáveis de diversos tipos elementares e compostos. Nos tipos compostos, o número e tamanho das variáveis elementares que dele fazem parte tem de ser iguais.
...
Quando se inicializa uma variável com uma expressão, esta é automaticamente convertida para o tipo da variável, se a conversão resultar em erro, o programa notifica com erro de execução. Por exemplo, na instrução LET i ="10" se a variável i for um inteiro, a expressão "10" é automaticamente convertida em inteiro.
|
compara.4gl
MAIN MAIN DEFINE y CHAR(20) IF y < "uma string" THEN
IF y = "Uma string" THEN RESULTADO: |
Vários exemplos de comparações
Em qualquer programa, muitas vezes é necessário proceder as inicializações de variáveis.
Uma das formas de o fazer é inicializando a variável com o valor pretendido, na área do programa em que se pretende fazer. Outra forma é utilizando a instrução INITIALIZE.
INITIALIZE INITIALIZE lista_de_variáveis TO NULL
|
Definição genérica da instrução INITIALIZE
A instrução INITIALIZE inicializa as variáveis com valor NULL.
...
Os operadores de comparação no Informix 4GL são:
Operador | Descrição | Exemplo |
> | maior que | var1 > var2 |
< | menor que | var1 < var2 |
>= | maior ou igual que | var1 >= var2 |
<= | menor ou igual que | var1 <= var2 |
= ou == | igual a | var1 = var2 |
!= ou <> | diferente de | var1 <> var2 |
NOT | negação | NOT <expressão> |
AND | e | <expressão1> AND <expressão2> |
OR | ou | <expressão1> OR <expressão2> |
MATCHES | comparação usando metacarateres (*, ?, []) | var1 MATCHES “*z?” |
LIKE | comparação usando metacaracteres (-, %) | var1 LIKE “%z_%” |
BETWEEN | intervalo de valores | BETWEEN 1 AND 100 |
IN | conjunto de valores | NOT IN (“A”,”B”,”C”) |
IS NULL | teste de valor nulo | var1 IS NULL / var2 IS NOT NULL |
...
Os operadores para cálculos matemáticos, no 4GL são:
Operador | Descrição | Exemplo |
+ | adição | var1 + var2 |
- | subtração | var1 - var2 |
** | exponenciação | var1 ** var2 |
MOD | módulo (divisão inteira c/ retorno do resto da divisão) | var1 MOD var2 |
* | multiplicação | var1 * var2 |
/ | divisão | var1 / var2 |
...
Os demais operadores existentes são:
Operador | Descrição | Exemplo |
. | Para referenciar um membro de uma variável do tipo RECORD. | lr_dados.código |
[] | Para referenciar um elemento de uma variável do tipo ARRAY ou um conjunto de caracteres de uma variável do tipo CHAR. | la_dados[10] |
() | Para chamada de funções. | CALL entrada_dados() |
UNITS | Para referenciar a unidade de qualificador. | LET data = data + 5 UNITS DAY |
|| ou , | Concatenação | “abc” || “def” ou “abc”,”def” |
ASCII | Retorna o caracter ASCII correspondente. | LET letra = ASCII(65) |
ORD | Retorna o código ASCII correspondente. | LET cod_ascii = ORD(“A”) |
CLIPPED | Elimina espaços em branco do final de um string. | LET l_texto = l_texto CLIPPED, “x” |
COLUMN | Para posicionar a coluna de impressão de dados. | PRINT COLUMN 10, “Texto”. |
SPACES | Para inserir espaços em branco. | DISPLAY 5 SPACES |
USING | Para formatar um conteúdo atribuído a um string. | LET texto = TODAY USING “dd/mm/yy” |
WORDWRAP | Impressão de um texto com quebra automática de linhas. | PRINT texto WORDWRAP |
...
No 4GL é muito simples concatenar strings, basta separá-las por uma virgula (o operador de concatenação de strings é a virgula).
concatconcat.4gl MAIN MAIN RESULTADORESULTADO
|
2.4 Funções
Uma função é um conjunto de instruções que são executadas conjuntamente e que pode receber um conjunto de parâmetros e devolver valores.
O 4GL apesar de ser uma linguagem de 4ª geração possui esta capacidade das linguagens estruturadas.
FUNCTION nome_da_funcao([arg1,arg2,...,argn])
|
Definição genérica de uma função
Uma função é identificada por um nome, começa com a palavra chave FUNCTION e termina com as palavras chave END FUNCTION, exceto a função MAIN que não tem nome e é delimitada por MAIN...END MAIN.
olafuncaoolafuncao.4gl MAIN MAIN
FUNCTION FUNCTION funcao_ola() RESULTADO:
|
Numa função, além de poder ter variáveis locais, pode ainda ter variáveis de entrada (parâmetros), e, ter associação valores a serem retornados á função que a invocou (valores de retorno). Tanto os parâmetros como os valores de retorno podem ser de qualquer tipo permitido pelo 4gl. A chamada da função faz-se com a instrução CALL e para definir em que variáveis são atribuídos os valores devolvidos usa-se a cláusula RETURNING com uma lista de variáveis a retornar.
CALL CALL função([argumentos]) [RETURNING lista_de_variáveis]
|
Se uma função devolver apenas um valor pode-se chamar com a instrução LET.
LET LET variavel = função([argumentos])
|
Chamar uma função com instrução LET
Os parâmetros de uma função são sempre declarados. Esta declaração faz com que a linguagem verifique todas as chamadas ás funções e no caso destas não serem executadas com o mesmo número de parâmetros que a declaração da função resulta em um erro de compilação do programa.
max.4gl MAIN MAIN
LET maxval = maximo(4,8,5)
FUNCTION FUNCTION maximo(n1,n2,n3) IF n1 > n2 THEN RETURN n3 END END FUNCTION
RESULTADORESULTADO: |
Função com vários tipos de parâmetros de entrada
Para retornar determinado valor a partir de uma função usa-se a palavra chave RETURN.
Ao contrário de algumas linguagens de terceira geração (por exemplo o C), uma função de 4GL não necessita ser declarada como um determinado tipo, ou seja, se pretender que a função devolva o número inteiro 10, só terá que retornar um valor de tal tipo:
retfunc1.4gl MAIN MAIN
FUNCTION FUNCTION FUNC()
RESULTADORESULTADO:
|
Se pretender devolver uma string poderá também o fazer:
retfunc2retfunc2.4gl MAIN MAIN
FUNCTION FUNCTION FUNC()
RESULTADORESULTADO: |
Função que retorna uma string
É preciso ter cuidado para que a variável em que se atribui o retorno da função seja do mesmo tipo do valor (ou variável) retornado dentro da função.
retfunc3.4gl MAIN MAIN CALL func() RETURNING x,y
DISPLAY x END END MAIN
FUNCTION FUNCTION func()
RESTULTADO:
|
Uma função (FUNCTION ou REPORT) não pode ter como parâmetro ou retorno uma variável do tipo ARRAY. O mesmo também se restringe a variáveis do tipo RECORD que possui componente definido como tipo ARRAY.
...