Árvore de páginas

Versões comparadas

Chave

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

...

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

...

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.

 

 

 

 f011 f011 = livros.data_entrada, AUTONEXT,
        COMMENTS = "Informe a data em que o livro entrou na biblioteca"; 

 Exemplo atributo COMMENTS

7.2.4.3   DEFAULT

Este atributo permite definir um valor inicial no campo da tela a que está associado, quando é invocada a instrução INPUT.

 

 

 

 f011 f011 = livros.data_entrada, AUTONEXT, DEFAULT = TODAY

 Exemplo atributo DEFAULT

7.2.4.4   FORMAT

Permite controlar o formato de display dos campos a que está associado, desde que tenham tipo de dados numéricos ou do tipo data.

...

As datas podem ter os separadores "-" ou "/" à escolha.

 

 

 

 f011 f011 = livros.data_entrada, AUTONEXT, DEFAULT = TODAY, 
                             FORMAT = "dd/mm/yyyy "; 

 Exemplo atributo FORMAT

Se a variável de ambiente DBDATE já estiver no formato “dmy4/” que indica o formato “dd/mm/yyyy”, não será necessário indicar o formato acima, pois o 4GL já assumirá automaticamente este formato.

...

Pode-se especificar uma série de valores separados por virgulas ou um valor mínimo e um valor máximo separados pela palavra "TO".

 

 

 

 f007 f007 = livros.volumes, INCLUDE = (1 to 100); 

 Exemplo atributo INCLUDE

7.2.4.6   NOENTRY

Evita a inclusão de dados quando executa uma instrução INPUT, ou seja, o cursor nunca será posicionado no campo definido como NOENTRY através da instrução INPUT.

...

Este atributo mostra os campos, a que está associado, com caracteres em vídeo reverso.

 

 

 

 f000 f000 = livros.numero, REVERSE

 Exemplo atributo REVERSE

7.2.4.8   PICTURE

Permite definir o formato de entrada de um campo da tela, para campos do tipo alfanumérico.

...

X Representa qualquer caracter.

 

 

 

 f001 f001 = formonly.num_matricula CHAR(08), AUTONEXT, PICTURE = "##.###-#"; 

 Exemplo de utilização do atributo PICTURE

7.2.4.9   VERIFY

Este atributo usa-se quando se pretende introduzir, num determinado campo, o mesmo valor duas vezes para reduzir a probabilidade de erro na entrada dos dados.

...

Com o comando DELIMITERS pode-se alterar os caracteres delimitadores do campo da tela, quando este é visualizado na execução do programa. Os caracteres default do 4GL são os colchetes "[...]". 

 

 

 DELIMITERS "{}" 

 

 

Neste exemplo o símbolo "{" é o caracter de abertura e "}" é o caracter de fechamento.

7.3      O comando FORM4GL

Após a definição, deve-se compilar o arquivo de definição da form utilizando o programa form4gl. Se existirem erros, estes são colocados num arquivo de mesmo nome, com extensão .err, contendo a identificação dos erros, que após corrigidos no arquivo de definição original, deve-se compilá-lo novamente. Estes procedimentos podem ser executados repetidamente até obter uma compilação da form sem erros.

 

 

 

form4gl <arquivo.per>

 

per> 

 Exemplo de compilação de form

O comando form4gl tem a estrutura de um comando LINUX, com três opções disponíveis.

...

Esta opção cria uma form default. Pode especificar o nome da form, o banco de dados e as tabelas que compõem a form escrevendo-as nesta ordem e a seguir à opção -d do comando. No entanto se escrever apenas o comando seguido da opção -d e pressionar <ENTER> o comando irá solicitar ao usuário que introduza esses elementos uma a um, pressionando <ENTER> após informar cada elemento. Para indicar que não pretende especificar mais tabelas pressione <ENTER> duas vezes.

 

 

 

 form4gl form4gl -d f_livros livros autores livroslivros 

 

 

 

Cria e compila a form f_livros com as tabelas LIVROS e AUTORES do banco de dados LIVROS.

 

 

 

 

 form4gl form4gl -v f_livros

 

 

 

livros 

No comando acima é realizada apenas a compilação da form f_livros.

8       Gestão de janelas – parte 1

...

A abertura de uma form através da instrução OPEN FORM é feita da seguinte forma: 

 

 

  OPEN FORM nome_da_form FROM "arquivo_form" 

 Definição genérica da instrução OPEN FORM

O nome da form é dado pelo programador e é com esse nome que se passa a referenciar a entrada de dados dentro do programa. "arquivo_form" é o arquivo em que se encontra a form (arquivo .per) compilada retirando a extensão ".frm". 

Antes de qualquer ação sobre a entrada de dados, deve-se mostrar esta form na tela sem qualquer dado. Para efetuar esta ação usa-se a instrução DISPLAY FORM.

 

...

 

 DISPLAY FORM nome_da_form ATTRIBUTE(lista_de atributos) 

 Definição genérica da instrução DISPLAY FORM

8.2      WINDOW

É comum, em num programa a utilização de pequenas partes da tela para efetuar algumas tarefas, a que se costuma chamar de janelas (Windows).

 

8.2.1       OPEN WINDOW

As cláusulas desta instrução definem o tamanho e o posicionamento da janela na tela, podendo associar uma form a janela e definir um ou mais atributos para a janela.

Assim que é executada a instrução OPEN WINDOW, a janela aparece na tela.

 

 

 

 OPEN WINDOW nome_da_janela AT linha,coluna
      WITH {numero_de_linhas ROWS numero_de_colunas COLUMNS
           |FORM "ficheiro_da_form"}
     [ATTRIBUTE (lista_de atributos)] 

 Definição genérica da instrução OPEN WINDOW

Utilizando este comando não é preciso efetuar o comando DISPLAY FORM como é feito para a instrução OPEN FORM para apresentar a form na tela.

Na cláusula AT diz-se quais as coordenadas do canto superior esquerdo da janela. A cláusula WITH serve para dizer qual o tamanho da janela e pode ser feita de duas maneiras: dizendo o numero de linhas e de colunas que se pretende para a janela ou associando uma form. No caso de se associar a janela a uma form, o 4GL atribui como tamanho da janela o tamanho da form. Se escolher esta opção não é necessário chamar a instrução OPEN FORM. A cláusula ATTRIBUTE é opcional e associa um ou mais atributos à janela. Os atributos podem ser utilizados para fazer o seguinte: 

-          Apresentar borda para a janela (BORDER);

...

  • COMMENT LINE <posição> - default é 1 ou FIRST;
  • FORM LINE <posição> - default é 3 ou (FIRST + 2);
  • MENU LINE <posição> - default é 1 ou FIRST;
  • MESSAGE LINE <posição> - default é 2 ou (FIRST + 1);
  • PROMPT LINE <posição> - default é 1 ou (FIRST)

...

A “posição” pode ser identificada com os seguintes valores:

  • FIRST (indica a primeira linha da janela);
  • LAST (indica a última linha da janela);
  • Número fixo da linha desejada, respeitando o número de linhas definidas para a janela.

...

 

 

 OPEN WINDOW wcust AT 3, 6 WITH 10 ROWS, 50 COLUMNS
      ATTRIBUTE (BORDER, MESSAGE LINE LAST,
                 PROMPT LINE LAST-2) 

 Definição genérica da instrução OPEN WINDOW

8.2.2       CLOSE WINDOW

Para retirar a janela da tela utiliza-se a instrução CLOSE WINDOW. Assim que esta instrução é executada, a janela desaparece da tela. Se a janela estiver associada a uma form, quando se fechar a janela, a form é fechada automaticamente. 

 

 

 CLOSE WINDOW nome_da_janela

 

 

janela 

Definição genérica da instrução CLOSE WINDOW

8.2.3       CURRENT WINDOW

Durante alguns processamentos, você pode pretender mudar de janela de trabalho (ou janela corrente). A instrução CURRENT WINDOW transforma em janela corrente o nome da janela desejado, que é passado como parâmetro.

 

 

 

 CURRENT WINDOW IS nome_da_janelajanela 

 

 

Definição genérica da instrução CURRENT WINDOW

A janela para qual se dá o nome precisa estar aberta para utilizar a instrução CURRENT WINDOW. Se a janela especificada estiver associada uma form, essa form passará a ser a form corrente.

...

Um programa de 4GL assume valores por default para o funcionamento de diversas instruções. Para alterar esses valores usa-se a instrução OPTIONS.

 

 

 

 OPTIONS {MESSAGE LINE linha |
          PROMPT  LINE linha |
          COMMENT LINE linha |
          ERROR   LINE linha |
          FORM LINE linha |
          INPUT {WRAP | NO WRAP} |
          INSERT KEY tecla |
          DELETE KEY tecla |
                    NEXT KEY tecla |
          PREVIOUS KEY tecla |
          ACCEPT KEY tecla |
          HELP FILE "ficheiro" |
          HELP KEY tecla }

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

8.4      Instrução INPUT

A instrução INPUT é utilizada para editar uma form (para receber dados por intermédio de uma form).

Esta instrução tem como parâmetros um conjunto de nomes de campos (que correspondem aos campos que se pretende editar) que foram previamente identificados na seção ATTRIBUTES da form e um conjunto de variáveis que também podem ser definidas de várias formas. É também possível executar instruções e controlar o movimento do cursor condicionalmente à posição atual do cursor. 

 

 

INPUT [BY NAME lista_de_variaveis
       [WHITHOUT DEFAULTS]
       |lista_de_variaveis [WITHOUT DEFAULTS]
  FROM {lista_campos|screen_record[[n]].*}[,...}}
       [HELP numero_do_help]

 

 

[{BEFORE INPUT
 |AFTER INPUT
 |BEFORE FIELD sublista_de_campos
 |AFTER {FIELD sublista_de_campos|INPUT}
 |ON KEY(lista_de_teclas)}
    instrução
    ...

    

    [NEXT FIELD nome_do_campo]
    ...
    [EXIT INPUT]
    ...
    ...

 

END INPUT

 

Definição genérica de uma instrução INPUT

Se a cláusula WITHOUT DEFAULTS for omitida, faz com que a instrução INPUT, quando chamada, apresente nos campos os defaults definidos na form. Se a cláusula existir, os valores apresentados nos campos durante o INPUT são os valores que estavam atribuídos as variáveis no momento anterior ao acionamento do INPUT.

 

9       Exercício - Sistema proposto

...

Como ponto de partida vamos gerar a form de dados de livros para a tabela LIVROS, obtendo-se o esqueleto do programa com o comprimento e o vínculo das colunas às tabelas já definidas.

 

 

 

 DATABASE livros

 DATABASE livros 

 SCREEN
 {       número: [f000 ]
         nome: [f001          f001]
     tradução         tradução: [f003          f003]
               volumes: [f005]
         páginas: [f006]
         edição: [f007]
          ano         ano: [f008]
 data          data entrada: [f009      f009]
         sala: [f010]
               estante: [f011]
            prateleira: [f012]
           observações: [f013                                       f013] }
 END 

 TABLES

 livros

        livros 

 ATTRIBUTES
      
 f000 = livros.numero;
 f001         f001 = livros.nome;
        f003 = livros.traducao;
        f005 = livros.volumes;
        f006 = livros.paginas;
        f007 = livros.edicao;
        f008 = livros.ano;
 f009         f009 = livros.data_entrada;
        f010 = livros.sala;
        f011 = livros.estante;
        f012 = livros.prateleira;
        f013 = livros.observacoes;
 ENDEND 

  

 

 

A seguir vamos trabalhar sobre a seção SCREEN para obter o desenho da entrada de dados pretendida, considerando que todos os campos devem estar presentes numa única entrada de dados.

Uma solução para a entrada de dados pretendida pode ser conforme a seção SCREEN seguinte: 

 

 

 DATABASE DATABASE livros 

 SCREEN
 { Número do livro: [f000]
       Nome do livro: [f001                          f001]
            Tradução: [f004                          f004]
              Volumes: [f007]         
     Páginas: [f008]
              Editora: [f009]
             Ano     Ano: [f010]  
     Data de entrada: [f011      f011]
                Local:            Sala: [f012]
                          Estante: [f013]
                       Prateleira: [f014]
     Observações: [f015                                         f015]  

 }

 }

 Seção SCREEN da form livros

A seção TABLES fica da mesma forma como foi apresentado inicialmente:

 

...

 

 TABLES
  
 livros 

 Seção TABLES da form livros

Na seção ATTRIBUTES pode-se além de definir o nome e o tipo dos campos da form, definir alguns atributos que serão descritos a seguir. Na form livros serão utilizados os de uso mais comum.

...

Na form livros iremos usá-lo nas datas.

 

 

 

 f011 f011 = livros.data_entrada, AUTONEXT;

 

 

 

COMMENTS

Na form livros iremos aplicá-lo ao campo data_entrada com a seguinte mensagem: "Introduza a data em que o livro entrou na biblioteca"

 

 

 

 f011 f011 = livros.data_entrada, AUTONEXT,
        COMMENTS = "Informe a data em que o livro entrou na biblioteca"; 

 

 

DEFAULT

Na form livros será aplicado aos campos volumes, sala e data da entrada. Neste último campo (data da entrada do livro) irá assumir o valor inicial como a data atual, escrevendo "today" como valor inicial.

 

 

 

 f011 f011 = livros.data_entrada, AUTONEXT, DEFAULT = TODAY

 

...

  FORMAT

FORMAT

Na form livros iremos usar o atributo "format" apenas nas datas e com o formato "dd/mm/yyyy".

 

 

 

 f011 f011 = livros.data_entrada, AUTONEXT, DEFAULT = TODAY, 
                             FORMAT = "dd/mm/yyyy "; 

 

 

INCLUDE

Na form livros vamos usar o atributo INCLUDE nos campo “volumes”, admitindo que um livro não pode ter mais de 100 volumes (1 a 100).

 

 

 

 f007 f007 = livros.volumes, INCLUDE = (1 to 100); 

 

...

  

REVERSE

Na form livros vamos usar em vídeo reverso o campo número.

 

 

 

 f000 f000 = livros.numero, REVERSE

 

...

 9.2      Programa de cadastro de livros

 

 DATABASE

DATABASE livros

 MAIN

MAIN
    CALL menu()

 END MAIN

 

 FUNCTION

END MAIN 

FUNCTION menu()
   OPEN WINDOW w_livros AT 2,2 WITH FORM "livros"

 END FUNCTION

END FUNCTION 

 

Abertura da form livros

A abertura da tela será feita utilizando a instrução OPEN WINDOW.

...

O programa deve ter variáveis para todas as colunas que desejar fazer entrada de dados na tela. Neste caso podemos declarar facilmente um RECORD que contenha todas as colunas da tabela LIVROS.

 

 

 DATABASE livros

DATABASE livros 

 

 DEFINE mr_livros LIKE livros.*

 MAIN

MAIN
    CALL menu()

 END MAIN

 

 FUNCTION

END MAIN 

FUNCTION menu()
   OPEN WINDOW w_livros AT 2,2 WITH FORM "livros"

 END FUNCTION

 

END FUNCTION 

Declaração do RECORD mr_livros

Este programa terá um menu que permitirá as seguintes opções sobre a tabela de LIVROS:

...

Para criar menus utiliza-se a instrução MENU já vista anteriormente.

 

...

 

 MENU "LIVROS"
 COMMAND COMMAND "Incluir" "Incluir um novo livro."
    CALL incluir() 

 COMMAND COMMAND "Consultar" "Consultar um livro pelo numero."
    CALL consultar() 

 COMMAND COMMAND "Modificar" "Permite modificar o livro corrente."
    CALL modificar() 

 COMMAND COMMAND "Excluir" "Remove o livro corrente."
    CALL excluir() 

 COMMAND COMMAND "Fim" "Sai do programa."
    EXIT MENU
 END END MENU 

 

Menu da entrada de dados para livros

Este menu é implementado após a abertura da form principal de cadastro de livros.

...

Nesta função vamos utilizar a instrução INPUT na sua forma mais simples.

 

 

 

 FUNCTION FUNCTION incluir()
  INPUT BY NAME mr_livros.* 

  WHENEVER ERROR CONTINUE
  INSERT INTO livros VALUES (mr_livros.*)
  WHENEVER ERROR STOP STOP 

  IF sqlca.sqlcode = 0 THEN
     ERROR "Livro incluído"
  ELSE
     ERROR "Erro na inclusão do livro ",status
  END IF

 END FUNCTION

 

 

END FUNCTION 

Inclusão de novo livro

A lista de campos da cláusula FROM da instrução INPUT, neste caso está implícita no caracter '*' do RECORD. Isto quer dizer que vão ser editados todos os campos que existem na variável composta mr_livros. Como a variável foi declarada LIKE livros.*, vão ser editadas todas as colunas da tabela LIVROS onde os nomes dos componentes forem correspondentes aos nomes dos campos da tela, definidos no arquivo da form, na seção ATTRIBUTES.

...

A função consultar, recebe o número do livro que se pretende procurar, procura-o no banco de dados, e mostra na entrada de dados todos os dados correspondentes. Note que o número do livro é introduzido na form.

 

 

 

 FUNCTION FUNCTION consultar()
  CLEAR FORM FORM 

  INPUT BY NAME mr_livros.numero numero 

  SELECT *
    INTO mr_livros.*
    FROM livros
       WHERE numero = mr_livros.numero numero 

  IF status != 0 THEN
     ERROR "Livro não cadastrado"
  ELSE
     DISPLAY BY NAME mr_livros.*
  END IF

 END FUNCTION

 

 

END FUNCTION 

Função que procura um livro com determinado número

A instrução CLEAR FORM serve para limpar todos os campos existentes na form corrente. No exemplo acima, se a busca for bem sucedida é feito um display de todas as colunas da tabela.

...

                           Estrutura  Estrutura da tabela requisições

A tabela entidades tem os dados gerais de cada entidade. A sua estrutura é a seguinte:

...