Histórico da Página
Índice |
---|
...
1 Linguagem 4GL
O TotvsTec 4GL surgiu com base nas linguagens nativas 4GL do banco de dados Informix e também com base na linguagem 4JS da IBM.
...
Quando compilados, todos os arquivos de código fonte tornam-se unidades de inteligência básicas, chamadas de RPO´s (Repository Protheus Objects). Esses RPO´s são mantidos em um repositório e carregados dinamicamente pelo servidor de aplicação (Application Server) para a execução. No entanto, não existe link ou união física do código compilado a um determinado ambiente ou aplicação, o que permite executar funções criadas em 4GL em qualquer ponto do ambiente ERP.
...
2 Estrutura de um programa
Um programa é constituído por funções e declarações. A primeira função a ser executada é a função "MAIN", e, tem de existir em todos os programas.
...
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.
...
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 |
...
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:
...
O escopo de referência de uma variável é determinado pelo lugar em que a cláusula DEFINE aparece no fonte .4gl. Os identificadores de variáveis podem ser locais, modulares, ou (em alguns casos) globais em seu escopo:
2.3.1 Variáveis locais
DEFINE nome_da_variável tipo [, ...] |
...
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.
2.3.2 Variáveis globais
GLOBALS "fonte.4gl" OU GLOBALS |
Definição genérica de uma declaração global
...
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.
2.3.3 Variáveis modulares
DEFINE nome_da_variável tipo [, ...] |
...
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.
2.3.4 Atribuições, comparações e inicializações
Uma das operações básicas a realizar sobre variáveis é a atribuição.
...
A instrução INITIALIZE inicializa as variáveis com valor NULL.
2.3.5 Operadores
Os operadores de comparação no Informix 4GL 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 |
2.3.6 Concatenação de variáveis tipo CHAR
No 4GL é muito simples concatenar strings, basta separá-las por uma virgula (o operador de concatenação de strings é a virgula).
...
É 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 CALL func() RETURNING x,y DISPLAY x END MAIN FUNCTION func() RESTULTADO: |
...
Em português esta instrução poderia ser explicada por:
Se esta expressão é verdadeira |
...
Esta instrução de repetição pode ser explicada por:
...
Enquanto esta_expressão_for_verdadeira faz_isto |
...
Em 4GL, uma das formas do programa se comunicar com o usuário, é por intermédio da instrução PROMPT. Esta instrução envia uma mensagem para o aplicativo e recebe um caracter ou seqüência de caracteres que foram digitados pelo usuário no seu terminal.
A definição genérica de uma instrução PROMPT é a seguinte:
PROMPT mensagem FOR [CHAR] variável |
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.
...
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.
display.4gl MAIN $ fglpc display.4gl 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
...
Através de um editor de texto define-se um arquivo com a definição da form no seguinte formato:
DATABASE [FORMONLY | <nome banco dados>] [TABLES] ATTRIBUTES [INSTRUCTIONS] |
Exemplo de definição de form
...
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 = livros.data_entrada, AUTONEXT; |
Exemplo atributo AUTONEXT
...
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 = livros.volumes, INCLUDE = (1 to 100); |
Exemplo atributo INCLUDE
...
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.
...
form4gl -d f_livros livros autores livros |
Cria e compila a form f_livros com as tabelas LIVROS e AUTORES do banco de dados LIVROS.
...
form4gl -v f_livros |
No comando acima é realizada apenas a compilação da form f_livros.
...
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
...
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_janela |
Definição genérica da instrução CURRENT WINDOW
...
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 | |
Definição genérica da instrução OPTIONS
...
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 SCREEN TABLES ATTRIBUTES |
...
Na form livros iremos usá-lo nas datas.
f011 = livros.data_entrada, AUTONEXT; |
...
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 = livros.data_entrada, AUTONEXT, |
...
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 = livros.data_entrada, AUTONEXT, DEFAULT = TODAY; |
FORMAT
...
O programa 4GL ainda não sabe como fazer a validação do código de editor. Para conseguir realizar esta função, utiliza-se a cláusula AFTER FIELD, faz-se uma consulta na tabela de editores e apresenta-se o nome do editor encontrado na tela.
DEFINE l_nome_editora LIKE editoras.nome; AFTER FIELD editora |
Alteração das instruções INPUT para efetuar as validações
...
Os acessos são feitos com o auxilio da instrução FETCH que avança a linha corrente para a linha seguinte e armazena os dados retornados desta linha nas variáveis definidas na cláusula INTO. Se o cursor estiver posicionado na ultima linha, a variável sqlca.sqlcode será atualizada com o valor NOTFOUND (ou código 100).
WHILE 1 |
...
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 |
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 END END 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 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 livros
DATABASE livros DECLARE cq_livro CURSOR FOR DISPLAY "Inicio do REPORT; espere um momento " AT 15,1 1 START REPORT r_livro livro FOREACH cq_livro INTO lr_livro.* FINISH REPORT r_livro DISPLAY "Terminou o report. Encontra-se no arquivo livros.out "AT 15,11 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_report report |
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_colunas colunas |
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 |
Formato do bloco ON LAST ROW
O INFORMIX-4GL executa este bloco depois dos blocos ON EVERY ROW e AFTER GROUP OF.
...
Este bloco especifica a informação que vai aparecer no cabeçalho de cada página do relatório.
...
PAGE HEADER |
Formato do bloco PAGE HEADER
A instrução TOP MARGIN da seção OUTPUT influencia na linha em que vai ser escrito este cabeçalho.
...
Este bloco inclui as instruções que se devem executar para definir o rodapé de cada página.
PAGE TRAILER |
Formato do bloco PAGE TRAILER
Não se pode incluir a instrução SKIP TO TOP OF PAGE neste bloco.
...
A instrução FOR define um ciclo (loop), executando consecutivamente uma instrução simples ou composta, incrementando o índice e controlando a condição de saída. Quando esta instrução se finaliza, passa o controle do programa para a instrução seguinte ao fim do ciclo.
...
.
FOR FOR i=1 TO 10 STEP 2 END FOR
|
END FOR |
Exemplo da instrução FOR
NOTA:Não se pode usar incrementos negativos .
...
Esta instrução executa um teste de uma condição e processa, alternativamente, 2 instruções (simples ou compostas) conforme a condição verdadeira ou não.
IF IF paid_date IS NULL THEN |
Exemplo da instrução IF-THEN-ELSE
NOTA: Pode-se usar até no máximo 20 IF-THEN-ELSE aninhados.
...
A instrução LET atribui um valor a uma variável.
LET LET pg1 = paid_date - ship_date |
...
Exemplo da instrução LET
NEED
Esta instrução faz com que a próxima linha seja impressa na página seguinte, se não estiver disponível na página corrente, o número mínimo de linhas especificado na instrução NEED
BEFORE BEFORE GROUP OF num _ livro |
Exemplo da instrução NEED
PAUSE
Esta instrução faz com que um relatório com destino de emissão para o vídeo possa ter pausas para permitir sua visualização na tela. Pressionando <ENTER> pode-se avançar pelo relatório.
PAGE PAGE TRAILER |
Exemplo da instrução PAUSE
NOTA: Esta instrução não tem nenhum efeito se o relatório for dirigido para uma impressora, arquivo ou uma outra aplicação (pipe).
...
Esta instrução imprime informação no vídeo, impressora ou num arquivo, conforme estiver especificado na seção OUTPUT.
PRINT PRINT COLUMN 10, "Encomenda:", |
Exemplo da instrução PRINT
NOTAS:
- Cada instrução PRINT imprime informações numa linha. Pode-se com um vários PRINT escrever uma única linha, finalizando cada instrução PRINT com ";" (ponto e vírgula);
...
Esta instrução salta um número de linhas em branco especificadas após o SKIP.
SKIP 2 LINES LINES |
Exemplo da instrução SKIP
SKIP TO TOP OF PAGE
Esta instrução faz com que a próxima linha seja escrita no início da próxima página, forçando o salto de página.
...
A instrução WHILE define um ciclo, executando consecutivamente uma instrução simples ou composta, enquanto for verdadeira a condição que segue a palavra WHILE. Quando esta se verifica passa, o controlo do programa para a instrução seguinte ao fim do ciclo.
WHILE WHILE PAGENO = 1 END WHILE END WHILE |
Exemplo da instrução WHILE
FUNÇÕES AGREGADAS
As funções agregadas possibilitam a execução de operações sobre colunas das linhas de todo resultado de um SELECT, podendo-se ainda escolher entre estas as que satisfaçam determinado critério.
...
A estrutura da instrução para definir uma função agregada é a seguinte:
...
[GROUP] <função agregada>
|
Formato da instrução para definir funções agregadas
NOTAS:
- GROUP e WHERE são opcionais;
...
COUNT | Conta o número total de linhas do resultado ou do grupo e que satisfaçam a cláusula WHERE, se existir. |
PERCENT | Executa um função de contagem semelhante a função COUNT, mas dá o resultado em percentagem em relação ao número total de linhas selecionadas. |
TOTAL | Acumula o valor da coluna especificada para todas as linhas do resultado ou do grupo e que satisfaçam a cláusula WHERE, se existir. |
AVERAGE ou AVG | Calcula o valor médio da coluna especificada para todas as linhas do resultado ou do grupo e que satisfaçam a cláusula WHERE, se existir. |
MIN | Calcula o valor mínimo da coluna especificada para todas as linhas do resultado ou do grupo e que satisfaçam a cláusula WHERE, se existir. |
MAX | Calcula o valor máximo da coluna especificada para todas as linhas do resultado ou do grupo e que satisfaçam a cláusula WHERE, se existir. |
AFTER AFTER GROUP OF cust PRINT COLUMN 01, "TOTAL CLIENTE:", PRINT GROUP TOTAL OF total_price |
Exemplos de utilização de funções agregadas
CLIPPED
Esta instrução suprime os espaços em branco a direita do último caracter diferente de espaço em branco dos campos tipo alfanuméricos.
BEFORE BEFORE GROUP OF cust
PRINT COLUMN 01, "CLIENTE:", |
Exemplo da instrução CLIPPED
COLUMN
Esta instrução permite imprimir o campo que se segue a partir da coluna especificada.
BEFORE BEFORE GROUP OF cust |
Exemplo da instrução COLUMN
LINENO
Esta expressão contém o número da linha corrente que o REPORT está para imprimir.
IF IF LINENO = 24 THEN END IF
|
END IF |
Exemplo da instrução LINENO
NOTA: Não utilize LINENO em blocos PAGE HEADER ou TRAILER porque não funcionará corretamente.
...
Esta expressão contém o número da página que o REPORT está imprimindo no momento.
PAGE PAGE HEADER |
Exemplo da instrução PAGENO
TIME
Esta instrução devolve uma frase com o valor da hora corrente que tem o formato "hh:mm:ss", onde hh é horas, mm é minutos e ss é segundos.
...
Esta expressão permite definir o formato de impressão dos campos do tipo numérico e data, a que está associada.
PRINT PRINT "RESUMO DAS ENCOMENDAS POR CLIENTE DE ", inic, " A ", fim,
|
CLIPPED |
Exemplos da instrução USING
NOTAS:
- O conjunto de caracteres que definem o formato precisa estar entre " " (aspas);
...
dd | Imprime o dia do mês como um número (01 a 31). |
ddd | Imprime o dia da semana usando uma abreviatura com 3 letras. |
mm | Imprime o mês como um número (01 a 12). |
mmm | Imprime o mês usando uma abreviatura com 3 letras. |
yy | Imprime o ano como um número de 2 digitos (01 a 99). |
yyyy | Imprime o ano como um número de 4 digitos (0001 a 9999). |
...
14 Depurador de programa
...
- A tela de DEBUG, que é constituída por duas janelas: a janela do código fonte e a janela de comandos. Na janela do fonte é visualizado o código do programa utilizado. Na janela de comandos, comanda-se toda a execução e parametrização do DEBUGGER.
15 Base de dados de exemplo deste manual
...
NOME | TIPO | DESCRIÇÃO |
*numero | integer | Número do livro |
nome | char(60) | Nome do livro |
traducao | char(60) | Nome do tradutor |
volumes | smallint | Número de volumes |
paginas | smallint | Número de páginas |
editora | char(5) | Número da edição |
ano | smallint | Ano de edição |
data_entrada | date | Data da compra |
sala | char(5) | Sala onde está arrumado |
estante | char(5) | Estante onde está arrumado |
prateleira | char(5) | Prateleira onde está arrumado |
observacoes | char(50) | Observações sobre o livro |
Estrutura da tabela livros
A tabela autores relaciona o nome de cada autor com um código reduzido. Não é permitida a repetição nem do código, nem do livro. A sua estrutura é a seguinte:
...
NOME | TIPO | DESCRIÇÃO |
*numero | serial | Número seqüencial do autor |
nome | char(70) | Nome do autor |
Estrutura da tabela autores
A tabela temas identifica determinado tema por um código. Não é permitida a repetição de nomes e de códigos. A sua estrutura é a seguinte:
...
NOME | TIPO | DESCRIÇÃO |
*numero | char(5) | Código de identificação do tema |
nome | char(50) | Nome do tema |
Estrutura da tabela tabela temas
A tabela editoras identifica uma editora por um código de editora. Tal como nas tabelas anteriores não há repetições do código e nome de editora. A sua estrutura é a seguinte:
...
NOME | TIPO | DESCRIÇÃO |
*codigo | char(5) | Código de identificação da editora |
nome | char(50) | Nome da editora |
Estrutura da tabela editoras
A tabela livro_autores relaciona determinados livros com determinados autores, permitindo que um livro possua mais de um autor, não permitindo linhas com os mesmos códigos de livro e autor. A sua estrutura é a seguinte:
...
NOME | TIPO | DESCRIÇÃO |
*livro | integer | Número do livro |
*autor | integer | Número do autor |
Estrutura Estrutura da tabela livro_autores
A tabela livro_temas funciona da mesma forma que a tabela livro_autores, fornecendo a informação sobre os temas focados por livro. A sua estrutura é a seguinte:
...
NOME | TIPO | DESCRIÇÃO |
*livro | integer | Número do livro |
*tema | char(5) | Código de identificação do tema |
Estrutura da tabela livro_temas
A tabela requisicoes tem informação acerca de quem e quais os livros que estão requisitados por determinada entidade. A sua estrutura é a seguinte:
...