Árvore de páginas

Versões comparadas

Chave

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

...

 SMALLINT
Números inteiros pequenos, uma variável deste tipo pode receber números inteiros entre –32767 e 37767. 

INTEGER
Números inteiros entre -2,147,483,647 e +2,147,483,647. 

DECIMAL[(m,[,n])]
Números decimais com “m” algarismos, sendo que “n” algarismos são para formar o número de casas decimais. Por exemplo, para DECIMAL(14,2), possui 14 dígitos significativos, sendo 2 deles para formar o número de dígitos a direita da vírgula, ou seja, são 12 dígitos inteiros e 2 decimais.

...

Não é possível invocar uma outra instrução sobre o cursor que não esteja aberto. O cursor por estar fechado não deixa de ter uma instrução SELECT associada, que ao ser invocado pela instrução OPEN é executada novamente a instrução SELECT associado ao cursor.

 

 

CLOSE cq_livros 

 

Um cursor pode também ser fechado automaticamente através de uma instrução de fim de transação (COMMIT WORK ou ROLLBACK WORK), já que uma das ações destas instruções é fechar todos os cursores que se encontrarem abertos no momento. Mas isto somente ocorre se na instrução de definição do cursor (DECLARE) tiver sido omitido o atributo WITH HOLD.

...

Para tratar este tipo de tela o 4GL possui as instruções DISPLAY ARRAY e INPUT ARRAY, associadas a novas definições nas forms.

 

 

DISPLAY ARRAY array_de_records TO array_da_tela.*
         [ATTRIBUTE(lista_de atributos)]
 {ON KEY (lista_de_teclas)
     instrução
     ...
     [EXIT DISPLAY]
 ...
 END DISPLAY 

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

...

Para a utilização das instruções acima definidas é preciso construir uma form que tenha estas capacidades. Assim, na seção SCREEN define-se o número de linhas que se pretende editar de cada vez, cada coluna de cada linha declarada deve ter o mesmo nome de label. 

 

 

 SCREEN
 {
 Código  Nome
 ------- ----------------------------------------------------
 [f000 ] [f001                                              ]
 [f000 ] [f001                                              ]
 [f000 ] [f001                                              ]
 [f000 ] [f001                                              ]
 [f000 ] [f001                                              ]
 [f000 ] [f001                                              ]
 [f000 ] [f001                                              ]
 [f000 ] [f001                                              ]
 }
 END

 

 

Seção SCREEN da form de zoom editoras

Como em qualquer form, cada label precisa estar declarado na seção ATTRIBUTES.

 

 

 

 ATTRIBUTES
 f000 = editoras.codigo;
 f001 = editoras.nome;
 END 

 

Seção attributes da form de zoom de editoras

Os campos com o mesmo label, tem que corresponder a um SCREEN RECORD. Um SCREEN RECORD declara-se na seção INSTRUCTIONS e associa-se ao array as colunas que se pretende editar.

 

 

 

 INSTRUCTIONS
 DELIMITERS " "
 SCREEN RECORD sr_editoras[8] (editoras.codigo,editores.nome) 

 Seção INSTRUCTION

Colocou-se a cláusula DELIMITERS com espaços para dar a noção ao usuário como se fosse navegação em opções de um menu.

...

A zona do programa em que se faz o INPUT ARRAY deverá ser alterado de forma que se for informado um código inválido, receba um código válido da função utilizada pra visualizar a lista de editores cadastrados.

 

 

AFTER FIELD edição

 

 AFTER FIELD edicao
    CALL consiste_editora()
    IF status = NOTFOUND THEN
       LET mr_livros.editora = zoom_editora()
       CALL consiste_editora()
    END IF
    DISPLAY BY NAME mr_livros.editora, <variável nome_editora>

 

 

...

editora> 

  

A função consiste_editora verifica se foi informado um código de editora válido e apresenta o nome da editora, caso encontre. Se não encontrar a editora ou esta não tiver sido informada será  acionada a função zoom_editora que fará a abertura de uma janela com a form descrita anteriormente onde serão visualizados os códigos existentes de editoras. A função zoom_editora sempre irá retorna um código de editora válido e neste caso pode-se apresentar o código e nome da editora sempre pois estará garantida a validade das informações.

 

 

 

 OPEN OPEN WINDOW w_editoras AT 5, 5 WITH FORM "editoras"
      ATTRIBUTE(BORDER)

 

 

 

Para invocar a instrução DISPLAY ARRAY, é necessário declarar um record no programa para fazer display.

 

 

 

 

 DEFINE DEFINE la_editoras ARRAY[40] OF RECORD LIKE editoras.*,
        numero_editoras INTEGER,
        linha_corrente INTEGERINTEGER 

 

 

 

O array de records serve para colocar os elementos no cursor. A variável numero_editores serve para verificar o numero de editores obtidos. A variável linha_corrente serve para determinar o elemento do array que foi escolhido.

Para visualizar os dados é preciso agora armazená-los no array de records.

 

 

 

 LET LET numero_editoras =

 DECLARE cq_editoras CURSOR FOR
  SELECT *
    FROM editores editores 

 FOREACH cq_editoras INTO la_editoras[numero_editoras].*
    IF status != 0 THEN
       EXIT FOREACH
    END IF IF 

    IF numero_editoras >= 40 THEN
       ERROR "Editoras a mais"
       EXIT FOREACH
    END IFIF 

 

    LET numero_editoras = numero_editoras + 1
 END FOREACH
 FREE cq_editoraseditoras 

 

 LET numero_editoras = numero_editoras - 1

 

 

 

Nesta versão são apenas visualizados as primeiras quarenta editoras.

 

 

 

 CALL CALL set_count(numero_editoras) 

 DISPLAY ARRAY la_editoras TO sr_editoras.* 

 LET linha_corrente = arr_curr() 

 CLOSE WINDOW w_editoraseditoras 

 

 

 

Para que a instrução DISPLAY ARRAY funcione corretamente tem de ser informada de quantas linhas se deve visualizar, tarefa que é executada pela função set_count.

...

A função ARR_CURR() é acionada para que se saiba qual o elemento do arrray que o usuário escolheu, para devolver o código selecionado para a tela anterior.

 

 

 

 RETURN RETURN la_editoras[linha_corrente].codigo

 

 

codigo 

12.6   INSTRUÇÃO INPUT ARRAY

A instrução INPUT ARRAY, tal como a instrução DISPLAY ARRAY serve para manipular forms com arrays de tela.

Esta instrução permite a manipulação de dados através da form para dentro de um array de records.

 

...

 

 INPUT ARRAY array_de_records [WHITHOUT DEFAULTS]
       FROM array_tela.* [HELP numero_help] 

 [{BEFORE {ROW | INSERT | DELETE
                              | FIELD lista_de_campos | INPUT}[,...] 

  |AFTER ROW | INSERT | DELETE
             | FIELD lista_de_campos | INPUT}[,...] 

  |ON KEY(lista_teclas)
      instruçãoinstrução 

  [NEXT FIELD nome_campo]
 ...
 [EXIT INPUT]
 ...
 END INPUT]

 

 

Definição genérica da instrução INPUT ARRAY

As cláusulas WHITHOUT DEFAULTS, AFTER e BEFORE: INSERT, FIELD e INPUT funcionam da mesma forma que na instrução INPUT, assim como as cláusulas ON KEY, NEXT FIELD, EXIT INPUT.

As cláusulas AFTER ROW e BEFORE ROW permitem executar instruções antes ou depois da edição de uma linha da tela. 

12.6.1.1Exercício – Cadastro de temas

...

Uma form para ser manipulada pela instrução INPUT ARRAY é idêntica a uma form utilizando DISPLAY ARRAY.

 

 

DATABASE livros

 

 DATABASE livros

 
 SCREEN
 {
  codigo | tema
 --------+-----------------------------------------------------
 [f000 ] | [f001                                              ]
 [f000 ] | [f001                                              ]
 [f000 ] | [f001                                              ] 
 [f000 ] | [f001                                              ]
 [f000 ] | [f001                                              ]
 [f000 ] | [f001                                              ]
 }

 END

  END 

 TABLES
 temas 

 ATTRIBUTES
 f000 = temas.codigo;
 f001 = temas.nome, NOENTRY;
 END END 

 

 INSTRUCTIONS
   SCREEN RECORD sr_temas[6] (temas.codigo, temas.nome)

 

 

Form de temas

O campo nome foi definido como NOENTRY pois vai servir apenas para informar os respectivos nomes de editoras para cada código informado.

...

No menu do programa de entrada de dados de livros será adicionada uma nova opção de menu denominada “Temas”.

 

 

 

 COMMAND COMMAND "Temas" "Introdução de temas focados neste livro."
    IF mr_livros.numero IS NULL THEN
       ERROR "Nao há nenhum livro para informar temas."
    ELSE
       CALL temas(mr_livros.numero)
    END IF IF 

 

Menu da entrada de dados para livros

Faz-se um teste para verificar se existe algum livro corrente, caso contrário não faz sentido a inclusão de temas de um livro.

A função “temas” vai conter os processamentos necessários ao correto cadastro dos temas com visualização dos temas já cadastrados.

 

 

 

 FUNCTION FUNCTION temas(l_livro)
  DEFINE l_livro   LIKE livros.numero,
         l_idx_arr INTEGER,
         l_idx_scr INTEGER,
         la_temas ARRAY[15] OF RECORD LIKE temas.* 

 Declaração das variáveis da função temas

O parâmetro livro é repassado na chamada da função com o numero do livro para o qual serão alterados os temas. As variáveis l_idx_arr e l_idx_scr servem como índices de acesso aos arrays respectivamente do programa e da tela. A variável la_temas é o array de registros onde vão ser armazenados os dados relativos a cada tema.

É possível que já existam alguns temas cadastrados para o livro em questão. Neste caso convém consultar os temas já existentes para uma eventual alteração. Se preenchermos o array de registros com os temas existentes, estes irão ser colocados na form quando se chamar a instrução INPUT ARRAY.

 

 

 

 DECLARE DECLARE cq_temas CURSOR FOR
  SELECT livro_temas.tema, temas.nome
    FROM livro_temas, temas
   WHERE livro_temas.livro  = l_livro
     AND temas.codigo = livro_temas.tematema 

 

 INITIALIZE la_temas TO NULL
 LET l_idx_arr = 1

 

 FOREACH cq_temas INTO la_temas[l_idx_arr].*
    LET l_idx_arr = l_idx_arr + 1
    IF l_idx_arr > 15 THEN
       ERROR "Temas a mais."
       EXIT FOREACH
    END IF
 END FOREACH
 FREE cq_temas temas 

 LET l_idx_arr = l_idx_arr - 1

 

 

Preenchimento do array de records com as editoras já existentes

A forma como é preenchido o record é idêntica a utilizada quando se falou na instrução DISPLAY ARRAY.

A abertura da janela com a form é feita com a instrução OPEN WINDOW.

 

 

 

 OPEN OPEN WINDOW w_temas AT 5,7
      WITH FORM "temas" ATTRIBUTE(BORDER) 

 Abertura da janela da form

Tal como no DISPLAY ARRAY é necessário informar a instrução de quantas linhas do array se encontram preenchidas. Neste caso utiliza-se a função SET_COUNT().

 

 

 

 CALL CALL set_count(l_idx_arr)

 

 LET int_flag = 0
 INPUT ARRAY la_temas WITHOUT DEFAULTS FROM sr_temas.* 

 Início da instrução INPUT ARRAY

Na instrução diz-se que será feita a entrada de dados no array la_temas utilizando o array de tela sr_temas. A cláusula WITHOUT DEFAULTS é utilizada para que apareçam na tela os temas já existentes no array de records carregados a partir da leitura utilizando o cursor.

 

 

AFTER FIELD código

 

 AFTER FIELD codigo
    LET l_idx_arr = arr_curr()
    LET l_idx_scr = scr_line()
    LET la_temas[l_idx_arr].nome = get_temas(la_temas[l_idx_arr].codigo)
    IF la_temas[l_idx_arr].nome IS NULL THEN
       ERROR "TEMA “,la_temas[l_icx_arr].código,” INVÁLIDO."
    ELSE    ELSE
       DISPLAY la_temas[l_idx_arr].nome TO sr_temas[l_idx_scr].nome
    END IFIF 

 

 

Cláusula AFTER FIELD do INPUT ARRAY

Esta cláusula aparece para que depois de informar um código, seja verificada a existência deste código na tabela de temas e se apresente o nome do tema ao lado do código.

...

Quando o usuário termina de informar os temas, pressionando ESC (accept key), é feita a exclusão de todos os temas atuais referentes ao livro corrente e depois substituídos por aqueles que se encontram no array de programa, ou seja, os temas que já existiam e os que foram incluídos agora.

 

 

 

 AFTER AFTER INPUT
    IF     IF int_flag = 0 THEN
       DELETE FROM livro_temas WHERE livro_temas.livro = livro livro 

       FOR pr_idx = 1 TO arr_count()
          INSERT INTO livro _ temas
          VALUES (l_livro, la_temas[l_idx_arr].codigo)
          IF sqlca.sqlcode <> 0 THEN
             ERROR              ERROR "Erro na inclusão"
          END IF
       END FORFOR 

 

 

Atualização da base de dados com os novos temas por livro

Para detectar o fim de inclusão utiliza-se a cláusula AFTER INPUT. A função arr_count() é utilizada para nos informar o número de linhas preenchidas no array da tela.

Neste caso são realizadas 2 instruções SQL para garantir a total atualização das informações no banco de dados. Considerando o conceito de transação de banco de dados, neste caso deveria ser feito o uso de uma transação única para garantir que as 2 instruções fossem executadas com sucesso, caso contrário o processo de atualização dos temas deveria ser desfeito de forma total, retornando a situação anterior a modificação. Esta transação é realizada utilizando-se as instruções BEGIN WORK, COMMIT WORK e ROLLBACK WORK, conforme citado no manual sobre SQL.

 

 

 

 AFTER AFTER INPUT
    #Se usuário confirmou a alteração, pressionando <ESC>
    IF int_flag = 0 THEN
       WHENEVER ERROR CONTINUE
       BEGIN WORK
       DELETE FROM temas WHERE temas.livro = l_livro
       WHENEVER ERROR STOP
       IF sqlca.sqlcode = 0 THEN

 

          LET l_erro = FALSE
          FOR l_idx_arr = 1 TO arr_count()
             WHENEVER ERROR CONTINUE
             INSERT INTO temas
             VALUES (l_livro, la_temas[l_idx_arr].codigo)
             WHENEVER ERROR STOP
             IF sqlca.sqlcode <> 0 THEN
                ERROR "Erro na inclusão."
                LET l_erro = TRUE
                EXIT FOR
             END IF
          END FOR
          IF l_erro THEN
             WHENEVER ERROR CONTINUE
             ROLLBACK WORK         
             WHENEVER ERROR STOP
          ELSE
             WHENEVER ERROR CONTINUE
             COMMIT WORK
             WHENEVER ERROR STOP
             IF sqlca.sqlcode <> 0 THEN
                ERROR “Erro na efetivação.”
             END IF            
          END IF
       ELSE
          ERROR “Erro na exclusão.”
          WHENEVER ERROR CONTINUE
          ROLLBACK WORK
          WHENEVER ERROR STOP
       END IF

    END IF

 

 

 

...

    END IF 


13    RELATÓRIOS (REPORT) EM INFORMIX-4GL

A função do INFORMIX-4GL que permite gerar um relatório (ou uma listagem) é o REPORT. Vamos ver quais as vantagens e a características do gerador de relatórios (REPORT) do INFORMIX-4GL, para extrair informações do banco de dados.

...

Vamos considerar como exemplo a geração de um report com a informação da tabela de livros:

 

 

 

 DATABASE DATABASE livros
  {REPORT com a informação da TABELA DE LIVROS}
 FUNCTION lista_livros()
  DEFINE lr_livro RECORD LIKE livros.* 

  DECLARE cq_livro CURSOR FOR
   SELECT *
     FROM livros
    ORDER BY numero

    DISPLAY "Inicio do REPORT; espere um momento " AT 15,

  START REPORT r_livrolivro 

    FOREACH cq_livro INTO lr_livro.*
     OUTPUT TO REPORT r_liv(lr_livro.*)
  END FOREACH
  FREE cq_livro

    FINISH REPORT r_livro

    DISPLAY "Terminou o report. Encontra-se no arquivo livros.out "AT 15,

  SLEEP 3
  DISPLAY "" AT 15,1

 END FUNCTION

 

 

END FUNCTION 

Exemplo da interação do REPORT com INFORMIX-4GL

 

Prosseguindo com o programa temos as instruções seguintes:

 

START REPORT

Instrução que permite iniciar o report.

...

Executa um ciclo de forma a processar a leitura de todas as linhas resultantes da instrução SELECT, executando a instrução que se segue.

 

OUTPUT TO REPORT

É a instrução que chama o report, propriamente dito, e que lhe passa linha a linha, as linhas resultantes da instrução SELECT (percorre um cursor), sob a forma de argumentos.

 

END FOREACH

Termina o ciclo do cursor.

 

FREE

Libera a memória alocada para a declaração do cursor. 

FINISH REPORT

Encerra o report. 

Em seguida o programa dá ao usuário uma mensagem que terminou o report e informa o arquivo onde este foi gerado. Com exceção das instruções FOREACH e END FOREACH que já foram apresentadas anteriormente, iremos aprofundar um pouco o restante das instruções.

...

Esta instrução é usada em geral como a primeira para iniciar um ciclo que processa um report com a instrução OUTPUT TO REPORT.

 

...

 

 START REPORT nome_report [TO {arquivo | PRINTER | PIPE programa} 

 Sintaxe da instrução START REPORT

Se usar a cláusula TO, o INFORMIX-4GL ignora a instrução REPORT TO na seção OUTPUT do report.

...

Esta instrução serve para passar ao report um linha de dados.

 

 

 

 OUTPUT TO REPORT nome_report(linha_dados) 

 Sintaxe da instrução OUTPUT TO REPORT

Em geral a instrução "OUTPUT TO REPORT" é utilizada dentro de um ciclo que passa dados para o report. A linha_dados pode ser uma ou mais colunas e/ou uma ou mais expressões, separadas por vírgula.

...

Esta instrução indica ao INFORMIX-4GL que o report terminou.

 

 

 

 FINISH FINISH REPORT nome_reportreport 

 

 

Sintaxe da instrução FINISH REPORT

É necessário usar esta instrução para que o INFORMIX-4GL saiba que terminou o processamento do report.

...

Começando pela estrutura do REPORT utilizado no exemplo anterior:

 

 

 

 DATABASE livros

 DATABASE livros 

 REPORT r_livro(lr_relat)
  {r_livro é o report que escreve a informacão da tabela de
   livros e este report é enviado para o arquivo livros.out
  } 

  DEFINE lr_relat RECORD LIKE livros.* 

  OUTPUT REPORT TO "livros.out" 

  LEFT MARGIN 0
  TOP MARGIN 0
  BOTTOM MARGIN 0
  PAGE LENGH 8

    FORMAT
  ON EVERY ROW
     PRINT lr_relat.numero, 1 SPACE, lr_relat.nome CLIPPED
     PRINT lr_relat.autor,  1 SPACE, lr_relat.editora

 

 END REPORTREPORT 

 

 

Exemplo de um REPORT

A primeira instrução do report é a declaração da base de dados. É necessário definir a base de dados para poder entender a cláusula LIKE da instrução DEFINE.

...

O report é composto por seções que são formadas por blocos e/ou instruções. As seções são as seguintes e devem de ser escritas segundo a ordem apresentada:

 

 

 

 REPORT REPORT nome_report (ListaArgumentos)
  [DEFINE seção]
  [OUTPUT seção]
  [ORDER BY seção]
  FORMAT seção
 END REPORT

 

 

REPORT 

Seções que constituem um REPORT

As seções DEFINE, OUTPUT e ORDER BY são opcionais; a seção FORMAT é obrigatória.

...

A seção OUTPUT é formada pela palavra OUTPUT seguida de uma ou mais instruções: 

 

 

 OUTPUT
 [REPORT TO instrução]
 [LEFT MARGIN valor]
 [RIGHT MARGIN valor]
 [TOP MARGIN valor]
 [BOTTOM MARGIN valor]
 [PAGE LENGHT valor]
 [REPORT TO {"arquivo" | PIPE programa | PRINTER}] 

 Formato da seção OUTPUT

Se a instrução START REPORT tiver a cláusula TO indicando o destino do resultado do report, o INFORMIX-4GL ignora a instrução REPORT TO na seção OUTPUT.

...

Se quiser enviar o resultado do report para outra impressora que não seja a padrão do sistema, pode-se usar a instrução REPORT TO <arquivo>, que escreve num arquivo podendo depois ser impresso. Pode também usar-se a instrução REPORT TO PIPE para enviar diretamente o resultado para um programa que manda para a impressora correta.

 

 

OUTPUT 

 OUTPUT

 REPORT TO PIPE "more" 

 Exemplo da instrução REPORT TO da seção OUTPUT

Este exemplo envia o resultado do report para o utilitário "more". Se omitir a instrução REPORT TO na rotina REPORT e se a instrução START REPORT não tiver cláusula TO, o resultado do report vai para o vídeo.

...

A seção ORDER BY tem o seguinte formato:

 

 

 

 ORDER [EXTERNAL] BY lista_colunascolunas 

 

 

Formato da secção ORDER BY

13.5.4    SEÇÃO FORMAT

Esta seção é obrigatória. É a seção FORMAT que vai determinar a aparência do relatório.

...

Existem dois tipo de seção FORMAT. O primeiro e o mais simples contém unicamente a subseção EVERY ROW e não pode conter qualquer outra subseção ou bloco de controle da seção FORMAT. 

 

 

 FORMAT EVERY ROW
 END REPORT 

 

...

 Exemplo da seção FORMAT mais simples

O outro tipo, mais complexo, da seção FORMAT pode ser formado da seguinte forma:

 

 

 

 FORMAT
 [PAGE HEADER bloco_de_controle]
 [PAGE TRAILER bloco_de_controle]
 [FIRST PAGE HEADER bloco_de_controle]
 [ON EVERY ROW bloco_de_controle]
 [ON LAST ROW bloco_de_controle]
 [BEFORE GROUP OF N blocos_de_controle]
 [AFTER GROUP OF N blocos_controle]
 END REPORT 

 

Exemplo da secção FORMAT

A ordem de escrita dos blocos de controle é arbitrária. O número de blocos BEFORE GROUP OF ou AFTER GROUP OF que podem ser utilizados é igual ao número de colunas existentes na seção ORDER BY. Vejamos as subseções que constituem a seção FORMAT:

...

Ao usar esta instrução não pode-se usar qualquer bloco de controle.

 

...

 

 REPORT minimo(lr_livros)
  DEFINE lr_livros RECORD LIKE livros.*
    FORMAT
    EVERYROW 
 END REPORT 

 

Exemplo de um REPORT muito simples, usando a instrução EVERY ROW

Cada bloco de controle é opcional mas, se não usar EVERY ROW, é necessário incluir pelos menos um bloco de controle na rotina REPORT. Cada bloco de controle inclui pelo menos uma instrução.

...

Suponhamos que fosse definida a seguinte ordenação:

 

 

 

 ORDER ORDER BY a, b, c

 

 

Um exemplo da instrução ORDER BY

Então na seção FORMAT poderíamos ter:

 

...

 

 BEFORE GROUP OF a
 BEFORE GROUP OF b
 BEFORE GROUP OF c
 ON EVERY ROW
 AFTER GROUP OF c
 AFTER GROUP OF b
 AFTER GROUP OF

 Um exemplo da ordem de execução dos blocos de controle

AFTER GROUP OF

Este bloco de controle define as ações (ou instruções) que devem ser executadas depois de ser processado um determinado grupo de linhas. Um grupo de linhas define-se como um conjunto de linhas que têm o mesmo valor para uma determinada coluna que apareça na seção ORDER BY da rotina REPORT ou na cláusula ORDER BY da instrução SELECT.

 

 

 

 AFTER GROUP OF variável
    instruções

 

 

instruções 

Formato do bloco de controlo AFTER GROUP OF

O INFORMIX-4GL processa as instruções do bloco AFTER GROUP OF cada vez que a variável mudar de valor.

...

Este bloco de controle define as ações (ou instruções) que devem ser executadas antes de ser processado um determinado grupo de linhas.

 

...

 

 BEFORE GROUP OF variável
    Instruções Instruções 

 

Formato do bloco de controlo BEFORE GROUP OF

O INFORMIX-4GL processa as instruções do bloco BEFORE GROUP OF cada vez que a variável mudar de valor.

...

Este bloco de controle inclui as ações (ou instruções) que devem ser executadas para definir o cabeçalho da primeira página do relatório.

 

 

 

 FIRST PAGE HEADER
    Instruções Instruções 

 Formato do bloco FIRST PAGE HEADER

A instrução TOP MARGIN da seção OUTPUT influencia na linha onde é escrito este cabeçalho.

...

Este bloco define as instruções que o INFORMIX-4GL passa para cada linha de dados como argumento à rotina REPORT, ou seja, os dados impressos no relatório são os dados passados como argumentos na função REPORT.

 

 

...

  

 ON EVERY ROW
    InstruçõesInstruções 

 

 

Formato do bloco ON EVERY ROW

Se houver blocos BEFORE GROUP OF na rotina REPORT, estes serão processados antes do bloco ON EVERY ROW.

...

Este bloco de controle define as instruções que devem ser executadas depois de processada a última linha passada à rotina REPORT.

 

 

 

 ON LAST ROW
    Instruções

 

 

...

Instruções 

 Formato do bloco ON LAST ROW

O INFORMIX-4GL executa este bloco depois dos blocos ON EVERY ROW e AFTER GROUP OF.

...