Histórico da Página
...
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.* |
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
|
Seção SCREEN da form de zoom editoras
Como em qualquer form, cada label precisa estar declarado na seção ATTRIBUTES.
ATTRIBUTES |
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 |
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
|
...
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"
|
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.*, |
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 = 1 1 DECLARE cq_editoras CURSOR FOR FOREACH cq_editoras INTO la_editoras[numero_editoras].* IF numero_editoras >= 40 THEN
LET numero_editoras = numero_editoras + 1
LET numero_editoras = numero_editoras - 1
|
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] [{BEFORE {ROW | INSERT | DELETE |AFTER ROW | INSERT | DELETE |ON KEY(lista_teclas) [NEXT FIELD nome_campo]
|
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 END END TABLES ATTRIBUTES
INSTRUCTIONS
|
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." |
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) |
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
INITIALIZE la_temas TO NULL
FOREACH cq_temas INTO la_temas[l_idx_arr].* LET l_idx_arr = l_idx_arr - 11 |
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 |
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 |
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
|
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 FOR pr_idx = 1 TO arr_count() |
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
LET l_erro = FALSE 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 DECLARE cq_livro CURSOR FOR DISPLAY "Inicio do REPORT; espere um momento " AT 15,1 1 START REPORT r_livrolivro FOREACH cq_livro INTO lr_livro.* FINISH REPORT r_livro DISPLAY "Terminou o report. Encontra-se no arquivo livros.out "AT 15,1 1 SLEEP 3 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) DEFINE lr_relat RECORD LIKE livros.* OUTPUT REPORT TO "livros.out" LEFT MARGIN 0 FORMAT
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)
|
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 |
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 |
...
Exemplo da seção FORMAT mais simples
O outro tipo, mais complexo, da seção FORMAT pode ser formado da seguinte forma:
FORMAT |
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) |
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
|
c |
Um exemplo da instrução ORDER BY
Então na seção FORMAT poderíamos ter:
...
BEFORE GROUP OF a |
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 |
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 |
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 |
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 |
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 |
Formato do bloco ON LAST ROW
O INFORMIX-4GL executa este bloco depois dos blocos ON EVERY ROW e AFTER GROUP OF.
...