Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

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
 OU
DEFINE nome_da_variavel LIKE tabela.coluna 

 

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]
 OU
l_texto[2,5] 

 

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
        lista_de_variaveis
END 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
   {instrução DEFINE}
END 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
   SLEEP 2

 

   CALL mostra_varmod2() 
   DISPLAY "VARMOD1 após VARMOD2: ",g_inteiro
   SLEEP 2
 END END MAIN

 

  varmod2varmod2.4gl

 DEFINE DEFINE m_inteiro INTEGER

 

 FUNCTION FUNCTION mostra_varmod2()
  DISPLAY “inteiro VARMOD2: “,m_inteiro
  SLEEP 2

 

  LET m_inteiro = 3

 END FUNCTION

 RESULTADO

 RESULTADO

 inteiro inteiro VARMOD1:           1
 inteiro inteiro VARMOD2:           0
 VARMOD1 VARMOD1 após VARMOD2:           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}

 

 

Definição genérica da atribuição

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

 MAIN

   DEFINE x INTEGER,
          y CHAR(20),
          z DECIMAL(5,2),
          lr_livros RECORD LIKE livros.*,
          lr_livros2 RECORD LIKE livros.*

 

   LET x = 69
   LET y = "Uma string"
   LET z = 120.596

 

   DISPLAY "X tem ", x,", Y tem ", y,"e Z = ",z

 

   SELECT *
     INTO lr_livros.*
     FROM livros
    WHERE    WHERE numero = x

 

   LET lr_livros2.* = lr_livros.*
   DISPLAY lr_livros2.numero, lr_livros.nome
 END END MAIN

 

 RESULTADO:
 X X tem 69, Y tem Uma string e Z = 120.60
 69 69 nome do livro 69

 

 

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) 
   LET y = "Uma string" 
   IF y > "UMA STRING" THEN
      DISPLAY "Uma string maior que UMA STRING"
   END IF 

   IF y < "uma string" THEN
      DISPLAY "Uma string menor que UMA STRING"
   END IF

 

   IF y = "Uma string" THEN
      DISPLAY "Uma string igual a UMA STRING"
   END IF
 END END MAIN 

 RESULTADO:
 Uma string maior que UMA STRING
 Uma string menor que UMA STRING
 Uma string igual a UMA STRING 

 

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
   DEFINE x CHAR(20),
          y CHAR(50) 
   LET x = "String 1 "
   LET y = "Concatenou ",x CLIPPED," com outras duas strings" 
   DISPLAY y
 END END MAIN 

 RESULTADORESULTADO
 Concatenou Concatenou String 1 com outras duas strings

 

 

Exemplo de concatenação de strings

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])
  instrução
  ...
  [RETURN lista_expressões]
  ...
 END FUNCTION

 

 

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
   CALL funcao_ola()
 END END MAIN

 

 FUNCTION FUNCTION funcao_ola()
  DISPLAY "Olá mundo!"
 END END FUNCTION 

 RESULTADO:
 Olá mundo!

 

 

Uma função simples

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]

 

 

Definição genérica da instrução CALL

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
   DEFINE maxval INTEGER

 

   LET maxval = maximo(4,8,5)
   DISPLAY "O maior numero e: ",maxval
 END END MAIN

 

 FUNCTION FUNCTION maximo(n1,n2,n3)
  DEFINE n1 INTEGER,
         n2 INTEGER,
         n3 INTEGER 

  IF n1 > n2 THEN
           LET n2 = n1
  END IF
  IF n2 > n3 THEN
     RETURN n2
  END IF 

  RETURN n3

 END END FUNCTION

 

 RESULTADORESULTADO:
 O O maior numero e: 8 

 

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
   DEFINE x INTEGER
   LET x = FUNC()
   DISPLAY "X tem",x
 END END MAIN

 

 FUNCTION FUNCTION FUNC()
  RETURN 10
 END END FUNCTION

 

 RESULTADORESULTADO:
 X tem 10

 

 

Função que retorna um número inteiro

Se pretender devolver uma string poderá também o fazer:

 

 

 

  retfunc2retfunc2.4gl MAIN

MAIN
   DEFINE x CHAR(100) 
   LET x = FUNC() 
   DISPLAY x
 END END MAIN

 

 FUNCTION FUNCTION FUNC()
  RETURN "Esta string vai ser devolvida"
 END END FUNCTION

 

 RESULTADORESULTADO:
 Esta Esta string vai ser devolvida 

 

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
   DEFINE x INTEGER
          y CHAR(100) 

   CALL func() RETURNING x,y

 

   DISPLAY x
   DISPLAY y

 END END MAIN

 

 FUNCTION FUNCTION func()
  RETURN 100,"Esta string vai ser devolvida"
 END END FUNCTION

 

 RESTULTADO:
 100
 Esta string vai ser devolvida

 

 

Função com retorno de vários valores

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.

...