Árvore de páginas

Versões comparadas

Chave

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

...

O desenvolvimento e compilação das aplicações desenvolvidas em 4GL são realizadas via ferramenta de desenvolvimento Totvs Developer Studio disponivel disponível para download na central de download da página de suporte da TOTVS.

...

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:

 

 la_dados[10]

 

Neste caso representa o 10º elemento do ARRAY la_dados.

Para acessar um elemento de uma variável do tipo ARRAY do tipo RECORD utiliza-se o “.” (ponto) após a determinação da posição desejada do ARRAY, assim:

 

 la_dados[5].codigo

 

Neste caso, representa o valor da variável “codigo” pertencente ao 5º elemento do ARRAY la_dados.

Para acessar um conjunto de caracteres de uma variável do tipo CHAR, sendo esta um componente de um ARRAY do tipo RECORD, utiliza-se o ponto após a determinação da posição desejada do ARRAY e o operador “[]” (colchetes) para determinar o conjunto de caracteres desejados da variável tipo CHAR, assim:

 

 la_dados[3].descricao[5,10]

 

Neste caso está se obtendo o conjunto de caracteres da posição 5 até a 10 da variável descrição pertencente ao 3º elemento da variável la_dados (ARRAY do tipo RECORD).

As variáveis podem ser locais a uma função, globais a um módulo (modulares) ou programa (globais).

...

 

 varlocal.4gl

MAIN
   DEFINE l_inteiro INTEGER   
   LET l_inteiro = 1
   CALL mostra_local()
   CALL mostra_local_agora(l_inteiro)
END MAIN

FUNCTION mostra_local()
  DEFINE l_inteiro INTEGER
  DISPLAY “INTEIRO: “, l_inteiro
  SLEEP 2
END FUNCTION

FUNCTION mostra_local_agora(l_inteiro)
DEFINE l_inteiro INTEGER
DISPLAY “INTEIRO AGORA: “,l_inteiro
  SLEEP 2
END FUNCTION

RESULTADO:
INTEIRO:           0
INTEIRO AGORA: 1

 Exemplo com variáveis locais

Se declarar duas variáveis com o mesmo nome em duas funções distintas, cada variável somente será reconhecida na função de declaração. Concluindo, as variáveis com o mesmo nome localizadas em funções diferentes são variáveis diferentes.

...

 

GLOBALS "fonte.4gl"

 OU 

GLOBALS
   {instrução DEFINE}
END GLOBALS}

 

Definição genérica de uma declaração global

Como se pode ver acima, a instrução GLOBALS tem duas formas possíveis. Na primeira indica-se o nome de um fonte que contém um conjunto de instruções DEFINE e uma instrução DATABASE. A vantagem deste sistema é o conhecimento das variáveis globais em todos os módulos sem necessidade de declará-las em cada um deles.

...

 

 varglob1.4gl

GLOBALS
   DEFINE g_inteiro INTEGER
END GLOBALS

MAIN
   LET g_inteiro = 5
  DISPLAY "inteiro VARGLOB1: ",g_inteiro
   SLEEP 2
   CALL mostra_varglob2()
   DISPLAY "VARGLOB1 após VARGLOB2: ",g_inteiro
   SLEEP 2
END MAIN

 

varglob2.4gl

GLOBALS
   DEFINE g_inteiro INTEGER
END GLOBALS

FUNCTION mostra_varglob2()
   DISPLAY "inteiro VARGLOB2: ",g_inteiro
   SLEEP 2
   LET g_inteiro = 10
END FUNCTION

RESULTADO:
 inteiro VARGLOB1:           5
 inteiro VARGLOB2:           5
 VARGLOB1 após VARGLOB2: 10

 

Exemplo com variáveis globais

No programa dado como exemplo não havia grande necessidade de declarar as variáveis como globais. Á medida que for programando pode-se sentir a necessidade de utilizar este tipo de variável.

...

 

varmod1.4gl

DEFINE m_inteiro INTEGER

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 MAIN

varmod2.4gl

DEFINE m_inteiro INTEGER
FUNCTION mostra_varmod2()
DISPLAY “inteiro VARMOD2: “,m_inteiro
SLEEP 2
LET m_inteiro = 3

 END FUNCTION

RESULTADO
inteiro VARMOD1:           1
inteiro VARMOD2:           0 
VARMOD1 após VARMOD2:           1

            Exemplo com variáveis modulares

  

...

Uma expressão booleana usada no WHILE é idêntica a usada no IF e a qualquer outra que se utilize num programa. 

 

WHILE esta <> "bebado"
    CALL bebe_mais_cerveja()
 END WHILE 

Ciclo WHILE

...

A função UPSHIFT pode ser usada numa expressão ou para atribuição a uma variável com o valor devolvido pela função. 

 

LET l_str = UPSHIFT(l_str)
 DISPLAY l_str 

 Exemplo de utilização da função UPSHIFT

...

PROMPT mensagem FOR [CHAR] variável
        [HELP numero_do_help]
        [ON KEY (tecla)
   instrução
   ...
   ...
END PROMPT

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

As mensagens assinaladas são um conjunto de uma ou mais variáveis, ou string(s) constantes, separados por vírgula.

...

Se pretender enviar pequenas mensagens ao usuário utiliza-se no 4GL a instrução DISPLAY AT.

 

DISPLAY lista_de_variaveis
        [AT linha_do_tela,coluna_da_tela]
        [ATTRIBUTE (lista_de_atributos)] 

 Definição da instrução DISPLAY AT

...

Os atributos possiveis são:

 

...

 

WHITE
YELLOW
MAGENTA
RED
CYAN
GREEN
BLUE
BLACK

 

 

REVERSE
BLINK
UNDERLINE
NORMAL
BOLD
DIM
INVISIBLE

 

Atributos de tela possíveis

A instrução DISPLAY é complexa e no capítulo sobre gestão de telas será novamente abordada.

Esta instrução envia para a tela uma mensagem constituída por um conjunto de variáveis e strings definidas na instrução. Em alguns dos exemplos anteriores, esta instrução já foi usada na sua forma mais simples.

 

 

 

  displaydisplay.4gl MAIN

MAIN
   DISPLAY "Isto vai aparecer na tela na linha 10 coluna 3"
           AT 10,3 ATTRIBUTE(BOLD)
 END END MAIN

 

 $ $ fglpc display.4gl
 $ $ fglgo display.4go

 

 

 

 

 

 

 

 

 

   Isto vai aparecer na tela na linha 10 coluna 3

 

 

Programa utilizando DISPLAY AT com ATTRIBUTES

 

5.4      Exercício – Instrução PROMPT e MENU

...

No 4GL existe a instrução WHENEVER que permite alterar a forma como o programa se comporta ao ser confrontado com uma situação de erro ou aviso (warning).

 

...

 

 WHENEVER {ERROR | WARNING}
          {GOTO label | CALL nome_de_função | CONTINUE | STOP

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

A primeira opção na cláusula (ERROR/WARNING) informa sobre a situação de erro ou aviso para a qual se vai tomar determinada ação, se ocorrer. Numa situação de erro (ERROR), pede-se ao programa que efetue determinada tarefa que ele não pode efetuar dessa forma e nesse contexto, a instrução WHENEVER é utilizada com a cláusula ERROR. Numa situação de aviso (WARNING), a tarefa pode ser cumprida ainda que não seja uma situação usual e então a instrução WHENEVER é invocada com a cláusula WARNING.

...

Quando for encontrada esta situação, o programa deve continuar a partir da instrução assinalada por uma label. Um label é assinalado colocando-se um nome de label qualquer seguido do caracter ":" (dois pontos).

 

 

 

 FUNCTION FUNCTION exp()
    WHENEVER ERROR GOTO erro
  SELECT *
    INTO pr_livros.*
    FROM livroslivros 

    RETURNRETURN 

    LABEL erro:
     DISPLAY "ERRO"
 END END FUNCTION

 

 

WHENEVER com GOTO

 

CALL nome_de_função

Quando for encontrada uma situação de erro, é executada a função nome_de_função.

 

 

 

 FUNCTION FUNCTION exp()
     WHENEVER ERROR GOTO CALL erro()
  SELECT *
    INTO pr_livros.*
    FROM livroslivros 

  RETURN
  RETURNEND FUNCTION 

 END FUNCTION

 

 FUNCTION erro()
    DISPLAY "ERRO"

 END FUNCTION

 END FUNCTION 

 Exemplo de WHENEVER com CALL

STOP

Quando é utilizada a cláusula STOP, o programa ao ser confrontado com uma situação de erro ou aviso cujo código de erro seja negativo (sqlca.sqlcode < 0 ou status < 0), o programa é abortado e enviada para a tela uma pequena explicação do erro ocorrido.

...

As vezes a variável STATUS não chega a identificar o erro ou aviso que ocorreu. Neste caso existe um RECORD global chamado SQLCA, que identifica os tipos de erros e avisos. Geralmente usa-se a estrutura SQLCA como adicional ao STATUS que identifica a existência de erro.

...

 

 SQLCA RECORD
       SQLCODE INTEGER,
       SQLERRM CHAR[71],
       SQLERRP CHAR(8);
       SQLERRD ARRAY[6] OF INTEGER,
       SQLAWARN CHAR(8)
 END END RECORD

 

 

RECORD SQLCA

O significado de cada uma das variáveis é:

 SQLCODE: Indica o resultado de uma instrução de SQL.Toma os valores:

...

O fluxo de informação de uma tela para a base de dados poderia ser descrito pelo seguinte esquema:

 

 

 

+-------+           +---------------------------------+
| Tela  |<--------->| Variáveis internas ao programa  |<-+
+-------+     |     +---------------------------------+  |
              |                                          |
forms e instruções de input/output                       |
                                           SQL___________|
    +----------------+       +---------+                 |
    | Banco de dados |<----->| SQLEXEC |<----------------+
    +----------------+       +---------+ 

 

Comunicação das telas com o banco de dados

7.1      FORM

As forms servem para desenhar e processar entrada de dados.

...

Uma form é um programa que se compila com o comando "form4gl" e gera um executável com a extensão .frm. A execução do .frm é feita pelo programa 4GL que, durante a execução abre e manipula a form por intermédio de instruções próprias.

 

 

 

 

 

+----------+|

form.per
|

+----------+
     |
     |____form4gl
     |
+----------+|

form.frm
|

+----------+ 

 Compilação de uma form

7.2      Definição de uma form

Através de um editor de texto define-se um arquivo com a definição da form no seguinte formato:

 

 

 

 DATABASE DATABASE [FORMONLY | <nome banco dados>]
   SCREEN
  {
 numero   numero [f000 ]
 nome     nome   [f001                   ]
                 [f002                   ]
 }
 END 

 [TABLES]
 <tabela1>,
 <tabela2>,
 ...,

 <tabelaN>

  <tabelaN> 

 ATTRIBUTES
 f000 = <tabela>.<coluna>;
 f001 = formonly.<nome campo>;
 f002 = formonly.<nome campo TYPE LIKE <tabela.coluna>;
 END 

 [INSTRUCTIONS]
     [DELIMITERS]
   [SCREEN RECORD...]
 [END] 

 

Exemplo de definição de form

Estas seções são o esqueleto de qualquer form. Manipulando e inserindo instruções nestas seções consegue-se criar e explorar as capacidades das forms.

...

Quando é utilizada a cláusula DATABASE FORMONLY esta seção não é definida.

 

...

 

TABLES
<tabela1>,
<tabela2>,
...,

<tabelaN>

 <tabelaN> 

 Definição da seção TABLES

7.2.4       Seção ATTRIBUTES

...

Este atributo faz com que o cursor, durante uma instrução de INPUT, salte para o campo seguinte quando o campo atual estiver totalmente preenchido.

 

 

 

 f011 f011 = livros.data_entrada, AUTONEXT

 Exemplo atributo AUTONEXT

7.2.4.2   COMMENTS

Este atributo associa uma mensagem a um campo. Esta mensagem aparecerá na linha correspondente da tela sempre que o cursor estiver posicionado sobre o respectivo campo.

...