COBOL - Comando PERFORM - www.cadcobol.com.br



Desenvolvido por DORNELLES Carlos Alberto - Analista de Sistemas - Brasília DF. - cad_cobol@hotmail.com

PERFORM

A instrução PERFORM transfere o controle explicitamente para um ou mais procedimentos e retorna implicitamente o controle para a próxima instrução executável após a conclusão da execução dos procedimentos especificados.

O comando PERFORM é:

Uma instrução PERFORM out-of-line
Quando procedure-name-1 é especificado.

Uma instrução PERFORM in-line
Quando o procedure-name-1 é omitido.
Um PERFORM in-line deve ser delimitado pela frase END-PERFORM.

Os formatos in-line e out-of-line não podem ser combinados.
Por exemplo, se procedure-name-1 for especificado, instruções imperativas e a frase END-PERFORM não deverão ser especificadas.

Os formatos de instrução PERFORM são:

PERFORM básico
PERFORM com TIMES
PERFORM com UNTIL
PERFORM com VARYING
O primeiro modo é usado para executar código em outra área do programa e é invocado mencionando um procedimento ou nome de parágrafo.
Neste modo, o código no outro paragrafo(s) é executado e o controle devolvido aos comandos que segue a declaração PERFORM.

O segundo modo é chamado um PERFORM in-line.
Os procedimentos mencionados na frase TIMES da instrução PERFORM são executados o número de vezes especificado pelo valor no identifier-1 ou número integer-1 , até um máximo de 999.999.999 vezes .
O controle passa para a próxima instrução executável após a instrução PERFORM.

No formato da frase UNTIL, os procedimentos mencionados são executados até que a condição especificada pela frase UNTIL seja verdadeira.
O controle é passado para a próxima instrução executável após a instrução PERFORM.

A frase VARYING aumenta ou diminui o valor de um ou mais identificadores ou nomes de índices, de acordo com certas regras.
A instrução PERFORM da frase VARYING no formato 4 pode pesquisar em série uma tabela de sete dimensões inteira (seven-dimensional table).

Abaixo a descrição de cada um dos quatro formatos:
  1. O primeiro formato é usado para executar o código referenciado uma vez.
  2. O segundo formato é usado para executar a rotina referenciada múltiplas vezes.
    número de vezes é indicado através do identifier-1 ou integer-1.
  3. O terceiro formato também é usado para executar a rotina referenciada múltiplas vezes.
    O número de vezes é dependente da condição-1. O código será executado repetidamente até que condição-1 for verdadeira.
    A condição será testada antes da execução do código a menos que a frase WITH TEST AFTER seja incluída.
  4. O quarto formato é usado para executar a rotina referenciada múltiplas vezes, sendo que o número vezes é dependente de uma condição como no terceiro formato.
A primeira diferença entre formato 3 e formata 4 é a frase VARYING que é usada para contar em uma variável as repetições a serem executadas.
A variável VARYING é setada de um valor antes que a rotina referenciada seja executada.
Antes de cada passagem subseqüente, a variável VARYING é incrementada pelo valor do identifier-4 ou literal-2 do BY.
A opção AFTER pode ser incluída para variar o valor de uma variável adicional.
Se esta opção for usada, a variável AFTER será incrementada por seu ciclo inteiro durante cada tempo que a variável VARYING é executada.


Primeiro formato - (Basic PERFORM)

Os procedimentos mencionados na instrução PERFORM básico são executados uma vez e o controle passa para a próxima instrução executável após a instrução PERFORM.

Nota:
Uma instrução PERFORM não deve causar a sua própria execução.
Uma instrução PERFORM recursiva pode causar resultados imprevisíveis.

procedure-name-1 , procedure-name-2
Deve nomear uma seção ou parágrafo na PROCEDURE DIVISION.
Quando o nome do procedure-name-1 e o procedure-name-2 forem especificados, se um for um procedure-name em um procedimento declarativo, ambos deverão ser nomes de parágrafos no mesmo procedimento declarativo.
Se o procedure-name-1 for especificado, imperative-statement-1 e a frase END-PERFORM não deverão ser especificadas.
Se o procedure-name-1 for omitido, a imperative-statement-1 e a frase END-PERFORM deverão ser especificadas.

imperative-statement-1
As instruções a serem executadas para um PERFORM em linha (in-line).

Uma instrução PERFORM in-line funciona de acordo com as mesmas regras gerais que uma instrução PERFORM out-of-line idêntica, exceto que as instruções contidas no PERFORM in-line são executadas no lugar das instruções contidas no intervalo do procedure-name-1 (através do procedure-name-2 , se especificado).
A menos que seja especificamente qualificado pela palavra in-line ou out-of-line , todas as regras que se aplicam à instrução PERFORM out-of-line também se aplicam ao PERFORM in-line.

Sempre que uma instrução PERFORM out-of-line é executada, o controle é transferido para a primeira instrução do procedimento chamado procedure-name-1 .
O controle sempre é retornado à instrução após a instrução PERFORM.
O ponto a partir do qual esse controle é retornado é determinado da seguinte maneira:

  • Se procedure-name-1 for um nome de parágrafo e procedure-name-2 não for especificado, o retorno será feito após a execução da última instrução do parágrafo procedure-name-1 .
  • Se procedure-name-1 for um nome de seção e procedure-name-2 não for especificado, o retorno será feito após a execução da última instrução do último parágrafo na seção procedure-name-1 .
  • Se procedure-name-2 for especificado e for um nome de parágrafo, o retorno será feito após a execução da última instrução do procedure-name-2 paragraph.
  • Se procedure-name-2 for especificado e for um nome de seção, o retorno será feito após a execução da última instrução do último parágrafo na seção procedure-name-2 .

O único relacionamento necessário entre procedure-name-1 e procedure-name-2 é que uma sequência consecutiva de operações seja executada, iniciando no procedimento nomeado por procedure-name-1 e terminando com a execução do procedimento nomeado por procedure-name -2 .

Instruções PERFORM podem ser especificadas dentro do procedimento executado.
Se houver dois ou mais caminhos lógicos para o ponto de retorno, o procedure-name-2 poderá nomear um parágrafo que consiste apenas em uma instrução EXIT; todos os caminhos para o ponto de retorno devem levar a este parágrafo.

Quando os procedimentos executados incluem outra instrução PERFORM, a sequência de procedimentos associados à instrução PERFORM incorporada deve ser totalmente incluída ou totalmente excluída dos procedimentos executados na primeira instrução PERFORM.
Ou seja, uma instrução PERFORM ativa cujo ponto de execução começa dentro do intervalo de procedimentos executados de outra instrução PERFORM ativa não deve permitir que o controle passe pelo ponto de saída da outra instrução PERFORM ativa.
No entanto, duas ou mais instruções PERFORM ativas podem ter uma saída comum.

END-PERFORM
Delimita o escopo da instrução PERFORM in-line.
A execução de um PERFORM em linha é concluída após a execução da última instrução contida nele.


Segundo formato - (PERFORM with TIMES)

Os procedimentos mencionados na frase TIMES da instrução PERFORM são executados o número de vezes especificado pelo valor no identifier-1 ou número integer-1 , até um máximo de 999.999.999 vezes .
O controle passa para a próxima instrução executável após a instrução PERFORM.

Se procedure-name-1 for especificado, imperative-statement-1 e a frase END-PERFORM não deverão ser especificadas.

identifier-1
Deve nomear um item inteiro.
O identifier-1 não pode ser um campo de data em janela (windowed).
Se o identifier-1 for zero ou um número negativo no momento em que a instrução PERFORM for iniciada, o controle passará para a instrução após a instrução PERFORM.
Depois que a instrução PERFORM foi iniciada, qualquer alteração no identifier-1 não tem efeito na variação do número de vezes que os procedimentos são iniciados.

integer-1
Pode ser um número inteiro positivo com sinal.


Terceiro formato - (PERFORM with UNTIL)

No formato da frase UNTIL, os procedimentos mencionados são executados até que a condição especificada pela frase UNTIL seja verdadeira.
O controle é passado para a próxima instrução executável após a instrução PERFORM.

Se procedure-name-1 for especificado, imperative-statement-1 e a frase END-PERFORM não deverão ser especificadas.

condition-1
Pode ser qualquer condição descrita em Expressões condicionais.
Se a condição for verdadeira no momento em que a instrução PERFORM for iniciada, os procedimentos especificados não serão executados.
Qualquer assinatura associada aos operandos especificados na condition-1 é avaliada cada vez que a condição é testada.

Se a frase TEST BEFORE for especificada ou assumida, a condição será testada antes de qualquer instrução ser executada (corresponde a DO WHILE).

Se a frase TEST AFTER for especificada, as instruções a serem executadas serão executadas pelo menos uma vez antes de a condição ser testada (corresponde a DO UNTIL).

Nos dois casos, se a condição for verdadeira, o controle é transferido para a próxima instrução executável após o final da instrução PERFORM.
Se nem a frase TEST BEFORE nem TEST AFTER for especificada, será assumida a frase TEST BEFORE.



Quarto formato - (PERFORM with VARYING)

A frase VARYING aumenta ou diminui o valor de um ou mais identificadores ou nomes de índices, de acordo com certas regras.

A instrução PERFORM da frase VARYING no formato 4 pode pesquisar em série uma tabela com sete dimensional (seven-dimensional table).

Se procedure-name-1 for especificado, imperative-statement-1 e a frase END-PERFORM não deverão ser especificadas.
Se o procedure-name-1 for omitido, a frase AFTER não deverá ser especificada.

identifier-2 a identifier-7
Deve nomear um item elementar numérico.
Esses identificadores não podem ser campos de data em janela.

literal-1 a literal-4
Deve representar um literal numérico.

condition-1, condition-2
Pode ser qualquer condição descrita em Expressões condicionais .
Se a condição for verdadeira no momento em que a instrução PERFORM for iniciada, os procedimentos especificados não serão executados.
Após as condições especificadas na frase UNTIL, o controle é passado para a próxima instrução executável após a instrução PERFORM.

Se qualquer um dos operandos especificados na condition-1 ou condition-2 for inscrito, modificado por referência ou for um identificador de função, o subscrito, modificador de referência ou função será avaliado cada vez que a condição for testada.

Itens de dados e literais de ponto flutuante podem ser usados ??em qualquer lugar em que um item de dados ou literal numérico possa ser especificado.

Quando TEST BEFORE é indicado, todas as condições especificadas são testadas antes da primeira execução e as instruções a serem executadas são executadas, se houver, apenas quando todos os testes especificados falham.
Quando TEST AFTER é indicado, as instruções a serem executadas são executadas pelo menos uma vez, antes de qualquer condição ser testada.

Se nem a frase TEST BEFORE nem TEST AFTER for especificada, será assumida a frase TEST BEFORE.



Identificadores variados (Varying identifiers)

A maneira como os operandos são aumentados ou diminuídos depende do número de variáveis especificadas.
Na discussão a seguir, toda referência ao identifier-n se refere igualmente ao index-name-n (exceto quando identifier-n é o objeto da frase BY).

Se o identifier-2 ou identifier-5 estiver inscrito, os subscritos serão avaliados sempre que o conteúdo do item de dados referenciado pelo identificador for definido ou aumentado.
Se o identifier-3 , o identifier-4 , o identifier-6 ou o identifier-7 estiverem inscritos, os subscritos serão avaliados sempre que o conteúdo do item de dados referenciado pelo identificador for usado em uma operação de configuração ou de aumento.

A figura a seguir ilustra a lógica da instrução PERFORM quando um identificador é variado com TEST BEFORE.

A figura a seguir ilustra a lógica da instrução PERFORM quando um identificador é variado com TEST AFTER.

Variando dois identificadores

   PERFORM PROCEDURE-NAME-1 THROUGH PROCEDURE-NAME-2
           VARYING IDENTIFIER-2 FROM IDENTIFIER-3
                BY IDENTIFIER-4 UNTIL CONDITION-1
             AFTER IDENTIFIER-5 FROM IDENTIFIER-6
                BY IDENTIFIER-7 UNTIL CONDITION-2

  1. identifier-2 e identifier-5 são definidos com seus valores iniciais, identifier-3 e identifier-6 , respectivamente.
  2. A condition-1 é avaliada da seguinte forma:
    1. Se for falso, as etapas 3 a 7 são executadas.
    2. Se for verdade, o controle passa diretamente para a instrução após a instrução PERFORM.
  3. A condition-2 é avaliada da seguinte forma:
    1. Se for falso, as etapas 4 a 6 são executadas.
    2. Se for verdade, o identifier-2 é aumentado pelo identifier-4 , o identifier-5 é definido como o valor atual do identifier-6 e a etapa 2 é repetida.
  4. procedure-name-1 e procedure-name-2 são executados uma vez (se especificado).
  5. o identifier-5 é aumentado pelo identifier-7 .
  6. As etapas 3 a 5 são repetidas até que a condição 2 seja verdadeira.
  7. As etapas 2 a 6 são repetidas até que a condição 1 seja verdadeira.

No final da execução da instrução PERFORM:

  • identifier-5 contém o valor atual do identifier-6 .
  • identifier-2 possui um valor que excede a última configuração usada pelo valor de incremento ou decremento (a menos que a condition-1 seja verdadeira no início da execução da instrução PERFORM, nesse caso, o identifier-2 contém o valor atual do identifier-3 ) .

A figura a seguir ilustra a lógica da instrução PERFORM quando dois identificadores são variados com o TEST BEFORE.

A figura a seguir ilustra a lógica da instrução PERFORM quando dois identificadores são variados com o TEST AFTER.

Variando três identificadores (Varying three identifiers)

   PERFORM PROCEDURE-NAME-1 THROUGH PROCEDURE-NAME-2
           VARYING IDENTIFIER-2 FROM IDENTIFIER-3
                BY IDENTIFIER-4 UNTIL CONDITION-1
             AFTER IDENTIFIER-5 FROM IDENTIFIER-6
                BY IDENTIFIER-7 UNTIL CONDITION-2
             AFTER IDENTIFIER-8 FROM IDENTIFIER-9
                BY IDENTIFIER-10 UNTIL CONDITION-3

As ações são iguais às de dois identificadores, exceto que o identifier-8 passa pelo ciclo completo cada vez que o identifier-5 é aumentado pelo identifier-7 , que, por sua vez, passa por um ciclo completo cada vez que o identifier-2 é variado.

No final da execução da instrução PERFORM:

  • identifier-5 e identifier-8 contêm os valores atuais de identifier-6 e identifier-9 , respectivamente.
  • O identifier-2 possui um valor que excede sua última configuração usada em um valor de incremento / decremento (a menos que a condition-1 seja verdadeira no início da execução da instrução PERFORM, nesse caso, o identifier-2 contém o valor atual do identifier-3 ).

Variando mais de três identificadores (Varying more than three identifiers)

Você pode produzir ações análogas da instrução PERFORM para o exemplo acima com a adição de até quatro frases AFTER.

Regras de frase variadas (Varying phrase rules)

Não importa quantas variáveis sejam especificadas, as seguintes regras se aplicam:

  • Nas frases VARYING ou AFTER, quando um nome de índice é especificado:
    • O nome do índice é inicializado e incrementado ou decrementado de acordo com as regras da frase INDEX.
      (Veja também a instrução SET.)
    • Na frase FROM associada, um identificador deve ser descrito como um número inteiro e ter um valor positivo; um literal deve ser um número inteiro positivo.
    • Na frase BY associada, um identificador deve ser descrito como um número inteiro; um literal deve ser um número inteiro diferente de zero.
  • Na frase FROM, quando um nome de índice é especificado:
    • Na frase VARYING ou AFTER associada, um identificador deve ser descrito como um número inteiro.
      É inicializado conforme descrito na instrução SET.
    • Na frase BY associada, um identificador deve ser descrito como um número inteiro e ter um valor diferente de zero; um literal deve ser um número inteiro diferente de zero.
  • Na frase BY, identificadores e literais devem ter valores diferentes de zero.
  • Alterar os valores dos identificadores ou nomes de índices nas frases VARYING, FROM e BY durante a execução altera o número de vezes que os procedimentos são executados.