PL/I - Parte II
Autor: Maurício Alves Cardeal | Publicado: 2012-06-08T22:27:00-03:00






5. ARRAYS









5.1. Definição

Também chamada de MATRIZ, TABELA, VETOR, LISTA, etc.,
consistem em um conjunto de dados homogêneos em relação aos seus atributos. Ou
seja todos os elementos de uma ARRAY em PL/I terão os mesmos atributos.

Para declarar a dimensão de uma ARRAY basta colocar o número
de elementos entre parênteses, não havendo um limite para tal número.

Exemplos:




DCL &nbsp;&nbsp; LISTA(1000) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REAL
DECIMAL FLOAT(6),

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALORES(30)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REAL DECIMAL(3);




O acesso a um elemento de uma matriz é feito através de seu
subscrito que pode estar na forma de uma constante, uma variável ou uma
expressão. Se a expressão resultar em valor não inteiro, este será truncado.






5.2. Limites inferiores e superiores
da array

PL/I também admite uma outra maneira de declarar uma matriz.
Na declaração tradicional que aprendemos, IDENTIFICADOR (N) a matriz
identificada começa no subscrito 1 (limite inferior) e vai até o subscrito N
(limite superior). No entanto, é possível estabelecer quem será o inferior e
quem será o superior, sem necessariamente seguir esta regra.

A sintaxe será:




DECLARE&nbsp;&nbsp;&nbsp;&nbsp; IDENTIFICADOR (LI : LS) ATRIBUTOS;




Onde:

Ä&nbsp;
IDENTIFICADOR ð Será o nome da matriz
que está sendo declarada;

Ä&nbsp;
LI ð limite inferior, um
número inteiro qualquer que servirá para referenciar o primeiro elemento da
matriz;

Ä&nbsp;
LS ð limite superior, um
número inteiro maior que LI que servirá para referenciar o último elemento da
matriz;

Ä&nbsp;
ATRIBUTOS ð os atributos já
conhecidos para os elementos da matriz



Observe os exemplos:




DCL A(1:3) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* UMA MATRIZ DE 3
ELEMENTOS */

DCL A(-2:2,-1:1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* UMA MATRIZ DE 5 X 3
ELEMENTOS */

DCL ANOS(1968:1976)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* UMA MATRIZ DE 9 ELEMENTOS */







5.3. Cross Sections

Um asterisco pode ser usado no lugar de um ou mais subscrito
de uma array. Observe:




DCL&nbsp;&nbsp;&nbsp; VALORES(100)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECIMAL(4),

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTA(10,5)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECIMAL(7);

. . .

VALORES(*) = 0;

LISTA(*,*) = 0;




A codificação acima substitui um contador do primeiro ao
último elemento da array para zerá-los individualmente. O asterisco representa
todos os elementos. Pode-se também especificar apenas uma das dimensões . Por
exemplo:




LISTA(1,*) = 0




Ira inicializar com o valor 0 todas as colunas da linha 1,
no vetor LISTA.






6. OPERADORES E EXPRESSÕES




6.1. Operadores do PL/I


 

  
TIPO

  
OPERADOR

  
DESCRIÇÃO

 

  
60 Caracteres

  
48 caracteres

 

  




Aritméticos

  
+

  
+

  
Adição

 

  
-

  
-

  
Subtração

 

  
*

  
*

  
Multiplicação

 

  
/

  
/

  
Divisão

 

  
**

  
**

  
Exponenciação

 

  






Relacionais

  
&gt;&nbsp;

  
GT

  
Maior

 

  
&gt;=

  
GE

  
Maior
  ou igual

 

  
=

  
=

  
Igual

 

  
¬=

  
NE

  
Diferente

 

  
&lt;=

  
LE

  
Menor
  ou igual

 

  
&lt;&nbsp;

  
LT

  
Menor

 

  
¬&gt;

  
NG

  
Não
  maior que

 

  
¬&lt;

  
NL

  
Não
  menor que

 

  


Lógicos

  
¬

  
NOT

  
Não

 

  
|

  
OR

  
Ou

 

  
&amp;

  
AND

  
E

 

  
String

  
||

  
CAT

  
Concatenação

 








6.2. Prioridade dos operadores

 

  
Prioridade

  
1ª

  
2ª

  
3ª

  
4ª

  
5ª

  
6ª

  
7ª

 

  
Operadores

  
**

  
/ *

  
+ -

  
||

  
=
  &gt;= &lt;= &gt;&lt; ¬= ¬&gt; ¬&lt;

  
&amp;

  
|

 







7. ESTRUTURAS




7.1. Definição

Em COBOL nossa variáveis eram obrigatoriamente divididas em itens de grupo, itens elementares e itens
independentes. Em PL/I, podemos criar estruturas nas quais poderemos tratar
nossas variáveis de maneira semelhante aos níveis do COBOL.

Sempre o nível 1será
sempre o de maior importância na estrutura. Os demais, subordinados a este
serão numerados em ordem crescente, não necessariamente consecutivos.







Por exemplo,




DCL&nbsp;&nbsp;&nbsp; 01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REGISTRO,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 05&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CODIGO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECIMAL(3)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INIT(0),

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 05&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHAR(30)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INIT(‘ ’),

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 05&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FONE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHAR(12)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INIT(‘0’),

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 05&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DATA-NASC,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DIA&nbsp;&nbsp;&nbsp; DECIMAL(2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INIT(0),

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHAR(1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INIT(‘/’),

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MES&nbsp;&nbsp;&nbsp; DECIMAL(2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INIT(0),

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHAR(1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INIT(‘/’),

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ANO&nbsp;&nbsp; DECIMAL(2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INIT(0),

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 05&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CIDADE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHAR(25)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INIT (‘ ’);




Observe que são utilizadas vírgulas (,) para separar uma
variável de outra dentro da estrutura e que o ponto-e-vírgula aparece apenas
quando da declaração da última variável.

Quando uma variável é criada sem que tenha nenhum nível de
estrutura, esta corresponderá ao nível 77 (independente) do COBOL.






7.2. Referência Qualificada

A linguagem PL/I oferece um recurso muito interessante que é
o da utilização de um mesmo nome para identificadores diferentes. Isso só será
permitido desde que as variáveis de&nbsp;
mesmo nome estejam em estruturas diferentes.

Observe agora as referências que foram feitas à variável ANO
que foi criada na estrutura anterior:




ANO = 98

DATA-NASC.ANO = 98

REGISTRO.DATA-NASC.ANO = 98




Na verdade, todas correspondem à mesma coisa, mas todas as
vezes em que for necessário acessar o conteúdo de uma variável que possui o
nome repetido no programa, poderemos utilizar o estilo de referência utilizado.
A sintaxe será




ESTRUTURA.SUB-ESTRUTURA.VARIÁVEL




Pode haver tantos níveis de estrutura / sub-estrutura quanto
forem necessários. Tal maneira é chamada de referência qualificada e permite ao
compilador identificar a qual estrutura pertence determinado identificador. Os
nomes sempre estarão dispostos em ordem de hierarquia, da maior para a menor,
separados por ponto (.).






7.3. Atributo Like

Suponha que seja necessário criar uma segunda estrutura para
auxiliar no processamento de REGISTRO, criada no item 5.1. Neste caso, já que
PL/I permite, poderemos simplesmente repetir todos os nomes de campos que foram
utilizados. Não haverá porém necessidade de redigitação de todos os campos nem
dos recursos do editor utilizado para copiar a região já codificada do programa.

Observe a declaração a seguir:




DCL&nbsp;&nbsp;&nbsp; 01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REGISTRO-AUX.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LIKE
REGISTRO.




Toda a estrutura de REGISTRO será repetida em REGISTRO-AUX.
Neste caso, a utilização de referências qualificadas se fará obrigatória no
decorrer do programa.






8. COMANDOS DE DECISÃO




8.1. Comando IF

Sintaxe:


IF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  THEN

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;

ELSE

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;




Analisa a expressão lógica. Se ela resultar em verdadeiro,
será executado o bloco de comandos 1, do contrário será executado o bloco de
comandos 2.



Exemplo


IF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A&gt; B THEN

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUT
LIST (A);

ELSE

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUT
LIST (B);




Quando houver mais de um comando a ser executado na condição
estabelecido por IF ou na negação (ELSE), deverá ser utilizada a estrutura de
bloco de comandos conforme segue:




IF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  THEN

DO;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
2;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
N;

END;

ELSE

DO;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
2;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
N;

END;




O comando IF em PL/I oferece uma maneira diferente de testar
a negação de uma condição, onde não será necessária a utilização da partícula
lógica NOT. Observe:








IF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  THEN

ELSE

DO;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
2;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
N;

END;







8.2. Estrutura do laço

O laço é uma das técnicas mais características da
programação estruturada. Consiste na execução de um determinado trecho do
programa diversas vezes, geralmente determinado por uma condição.






8.2.1. Comando DO (enquanto uma dada
condição for verdadeira)

Como já vimos o comando DO delimita o início de um bloco de
comandos, mas também pode ser utilizado para criar uma estrutura de laço
executando instruções enquanto ma
dada condição se mantiver verdadeira.







Sintaxe:


DO &nbsp;&nbsp;&nbsp;&nbsp; WHILE ()

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
2;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
N;

END;




Observe que&nbsp; condição
especificada após o WHILE deve estar entre parênteses.






8.2.2. Comando DO (até que uma dada
condição seja verdadeira)

Executa todos os comandos do laço até que a condição especificada seja verdadeira. Pode ser comparado
ao PERFORM UNTIL do COBOL.




Sintaxe:




DO &nbsp;&nbsp;&nbsp;&nbsp; UNTIL ()

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
2;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
N;

END;




Assim como no comando WHILE, a condição do UNTIL deve ser
codificada entre parênteses.






8.2.3. Comando DO (laço do contador)

Permite a criação do chamado contador, onde sabemos (ou
temos como determinar) o número de vezes que um determinado bloco de instruções
será executado.

Sintaxe:




DO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VAR = &nbsp;&nbsp; TO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; BY 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
2;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
N;

END;




Exemplo:




DO I = 2 TO 100 BY 2

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUT LIST (I);

END;




Se não for especificado nenhum incremento, este é
automaticamente assumido como 1 (um).




8.3. Testes múltiplos (SELECT)

Permite que uma variável ou mais variáveis tenham seus
valores testados de modo a condicionar a execução de blocos de comandos do
programa a este(s) valor(es).







Testando uma variável


SELECT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (VARIÁVEL)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN
(VALOR 1)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DO;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
2;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
N;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN
(VALOR 2)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DO;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
2;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
N;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN
(VALOR N)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DO;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
2;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
N;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OTHERWISE

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DO;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO 2;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
N;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END;

END;








Testando mais de uma
variável


SELECT;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN
(CONDIÇÃO 1)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DO;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
2;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
N;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN
(CONDIÇÃO 2)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DO;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
2;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
N;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN
(CONDIÇÃO N)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DO;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
2;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
N;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OTHERWISE

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DO;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
2;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMANDO
N;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END;

END;








Exemplo:




DCL&nbsp;&nbsp;&nbsp; FIXO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FIXED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (15)&nbsp;&nbsp;&nbsp;&nbsp; INIT&nbsp;&nbsp;&nbsp; (15),

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CARAC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHAR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (08)&nbsp;&nbsp;&nbsp;&nbsp; INIT&nbsp;&nbsp;&nbsp; (‘CHAR’);



/****************************************************************/



SELECT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (FIXO);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN
(1)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DO;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUT
SKIP (‘VALOR 1’);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN
(2)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DO;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUT
SKIP (‘VALOR 2’);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END;.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OTHERWISE

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DO;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUT
SKIP (‘NÃO VALE NEM 1 NEM 2’);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END;

END;



/****************************************************************/



SELECT;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN
(FIXO = 1 &amp;&nbsp; CARAC = ‘A’)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DO;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUT
SKIP(‘CONDIÇÃO 1 SATISFEITA’);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN
(FIXO = 2 &amp;&nbsp; CARAC = ‘B’)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DO;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUT
SKIP(‘CONDIÇÃO 2 SATISFEITA’);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OTERWISE

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DO;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUT
SKIP (‘NENHUMA CONDIÇÃO FOI SATISFEITA’);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END;

END;







8.4. Tratamento de Exceções

Várias situações que podem ocorrer em um programa PL/I são
automaticamente tratadas pelo sistema operacional, seja via hardware, seja via
software. No entanto, pode ser necessário fazer um tratamento mais apurado de
tais condições, chamadas condições de
exceção ou &nbsp;de interrupção.

O comando On permitirá que o programa intercepte e trate
erros deste tipo. Sua sintaxe é:




ON  




Onde a condição é a causa do erro e ação é o comando ou
conjunto de comandos que serão executados quando tal condição acontecer.

Quando mais de um comando for executado, o bloco de
instruções deverá estar delimitado por BEGIN e END;

As condições se dividem nos seguintes tipos:

1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
condições computacionais;

2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
condições de entrada e saída;

3)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
condições de check;

4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
condição padrão do sistema (ERROR);






8.4.1. Condições Computacionais

São aquelas que podem ocorrer durante um cálculo de uma
expressão, como, por exemplo, divisão por zero, conversão de constantes
numéricas, estouro da capacidade de armazenamento de um campo, etc.



 

  
Condição

  
Descrição

 

  
CONVERSION

(CONV)

  
Caracter ilegal para conversão de
  constantes numéricas

 

  
FIXEDOVERFLOW

(FOFL)

  
Valor exercendo a capacidade
  máxima permitida em um campo

 

  
OVERFLOW

(2OFL)

  
Valor exercendo a capacidade
  máxima permitida em um campo

 

  
UNDERFLOW

(UFL)

  
Valor abaixo da capacidade mínima
  do campo

 

  
ZERODIVIDE

(ZDIV)

  
Tentativa de divisão por zero

 

  
SIZE

  
Atribuição de valores a campo não
  suficientemente grande

 







8.4.2. Condições de Entrada e Saída

Podem ocorrer durante uma operação de E/S, ou seja, durante
a transmissão dos dados.



 

  
Condição

  
Descrição

 

  
ENDFILE(arquivo)

  
Atingido o fim do arquivo
  especificado

 

  
ENDPAGE(arquivo)

  
Fim da página. Para arquivos de
  impressão

 

  
NAME(arquivo)

  
Ao ser detectado um nome de
  arquivo inválido.

 







8.4.3. Condições de check

Podem ocorrer por ocasião de erros em strings, em
dimensionamento de arrays e em caso de depuração de programas.

 

  
Condição

  
Descrição

 

  
CHECK(lista)

  
Toda vez que houver uma
  modificação no valor de alguma variável da lista especificada, ou alguma
  referência a ela.

 

  
SUBSCRIPTRANGE

(SUBRG)

  
Subscrito fora dos limites
  definidos para a array.

 

  
STRINGRANGE

(STRG)

  
Comprimento errado do argumento
  string em SUBSTR.

 




Em todos os casos o tratamento da exceção é feito na forma
de desvio. Ou seja, não importa em qual ponto do programa está o fluxo de
execução. Assim que ocorre a exceção é “executado um comando GOTO para o local
do comando ON” e a execução passa a ser a partir daí.

Por exemplo:




ON ERROR&nbsp;&nbsp; BEGIN

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUT
LIST(‘ERRO DESCONHECIDO NO PROGRAMA’);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GOTO
FIM;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END;







9. BUILT-IN FUNCTIONS (FUNÇÕES
INTERNAS)

São procedimentos prontos da linguagem que tem como
finalidade diminuir o esforço de programação em determinadas ocasiões. PL/I é
uma linguagem rica em funções deste tipo, possuindo um grande número de procedimentos
prontos. A seguir, veremos apenas uma breve descrição dos mais utilizados.



 

  
Função

  
Descrição

 

  
DATE()

  
Retorna uma striing no formato
  ‘AAMMDD’

 

  
TIME()

  
Retorna uma string no formato
  ‘HHMMSSCCC’

 

  
DATETIME()

  
Retorna uma string de data e hora
  no formato ‘AAAAMMDDHHMMSSCC’

 

  
HIGH(n)

  
Move HIGH VALUES (x‘FF’) para uma
  variável CHAR de tamanho n.

 

  
LOW(n)

  
Move LOW VALUES (x‘00’) para uma
  variável CHAR de tamanho n.

 

  
VERIFY(st1,st2)

  
Retorna zero se todos os
  caracteres da string 1 existirem na string 2. Se um caracter da string 1 não
  existir na 2, retorna sua posição na 1.

 

  
STRING(arg.)

  
Recebe como argumento uma array,
  uma estrutura ou mesmo uma variável simples, retornando uma string de
  caracteres resultante da concatenação dos elementos do argumento recebido.

 

  
REPEAT(str,n)

  
Gera uma string que é a repetição
  de n a string str.

 

  
MOD(V1,V2)

  
Retorna o resto da divisão de V1 por V2.

 

  
SUM(array)

  
Retorna a soma de todos os
  elementos da array especificada

 

  
PROD(array)

  
Retorna o produto de todos os
  elementos da array especificada

 







10. CORRESPONDÊNCIAS ENTRE COBOL E
PL/I

A seguir alguns comandos do COBOL com os correspondentes em
PL/I. Esta tabela pode ser utilizada como referência para o esclarecimentos de
algumas dúvidas.



 

  
COBOL

  
PL/I

 

  
SELECT
  ARQUIVO ASSIGN TO EEEEEE.

  
DCL
  FILE RECORD ARQUIVO;

 

  
SELECT&nbsp;&nbsp;&nbsp;&nbsp; ARQUIVO1 ASSIGN TO AAAAA

ORGANIZATION IS RANDOM

ACCESS MODE IS DYNAMIC

RECORD KEY IS WS-CHAVE

FILE STATUS IS WS-EST.

  
DCL
  FILE RECORD ARQUIVO1

INPUT KEYED ENV(VSAM GENKEY);

 

  
SELECT
  ARQUIVO2 ASSIGN TO IMPRESSORA

  
DCL
  FILE RECORD ARQUIVO2

OUTPUT ENV(FB RECSIZE (133) CTLASA);

 

  
SELECT
  ARQUIVO3 ASSIGN TO CCCCCC.

  
DCL
  FILE RECORD ARQUIVO3

OUPUT ENV(FB RECSIZE (200));

 

  
SELECT
  ARQUIVO ASSIGN TO EEEEEE.

FD
  ARQUIVO

LABEL RECORD IS STANDARD

RECORD CONTAINS 150 RECORDS

BLOCK CONTAINS 0 RECORDS

RECORDING F.

  
DCL
  FILE RECORD ARQUIVO

INPUT ENV(FB RECSIZE (150));

 

  
01
  CAMPO PIC 9(05) COMP-3.

  
DCL
  01 CAMPO FIXED (05);

 

  
01
  CAMPO PIC 9(05)&nbsp; COMP.

  
DCL
  01 CAMPO BIN FIXED(05);

 

  
01
  CAMPO PIC 9(07)V9(02) COMP-3

  
DCL
  01 CAMPO FIXED (11,2);

 

  
01
  CAMPO PIC X(15)

  
DCL
  01 CAMPO CHAR (15);

 

  
01
  TAB.

02 A OCCURS 5 TIMES.

03 CAMPO CAMPO1 PIC 9(05) COMP-3.

  
DCL
  01 TAB,

02 A(5),

03 CAMPO1 FIXED(5);

 

  
MOVE
  ZEROS TO CAMPO1(1) CAMPO1(2) 

CAMPO1(3) CAMPO1(4) 

CAMPO1(5).

  
CAMPO1(*)
  = 0;

 

  
01
  WS-DATA.

02 WS-ANO PIC 9(02).

02 WS-MES PIC 9(02).

01
  WS-DATA-R REDEFINES WS-DATA PIC 9(04).

  
DCL
  01 WS-DATA,

02 WS-ANO PIC ‘99’,

02 WS-MES PIC ‘99’;

DCL
  01 WS-DATA-R DEF WS-DATA PIC ‘9(04)’;

 

  
01
  CAMPOX PIC X(01).

01
  CAMPO1 PIX 9(05).

01CAMPO2
  PIC 9(05).

IF
  CAMPOX EQUAL ‘A’

MOVE 10 TO CAMPO1

MOVE 20 TO CAMPO2

ELSE

MOVE 15 TO CAMPO1

MOVE 25 TO CAMPO2.

  
DCL
  01 CAMPO X CHAR (01),

01 CAMPO1 PIC ‘9(05)’,

01 CAMPO2 PIC ‘9(05)’;

IF
  CAMPOX = ‘A’ THEN

DO

CAMPO1 = 10;

CAMPO2 = 20

END

ELSE

DO

CAMPO1 = 15;

CAMPO2 = 25;

END;

 

  
OPEN
  INPUT ARQUIVO

  
OPEN
  FILE(ARQUIVO) TITLE(‘EEEEEE’)

 

  
READ
  ARQUIVO INTO WS-AREA

AT END GO TO FINALIZA

  
READ
  FILE(ARQUIVO) INTO (WS-AREA);

ON
  ENDFILE(ARQUIVO)

BEGIN

GOTO FINALIZA

END;

 

  
DISPLAY
  ‘** TOTAIS DE CONTROLE **’

  
PUT
  SKIP LIST ‘** TOTAIS DE CONTROLE **’

 

  
DISPLAY
  ‘LIDOS = ’ AC-LIDOS

  
PUT
  SKIP LIST (‘LIDOS = ’, AC-LIDOS);

 

  
01
  WS-CHAVE PIC 9(05).

01
  WS-FST PIC 9(02) .

READ
  ARQUIVO1.

IF
  WS-FST EQUAL 10

&nbsp;&nbsp;&nbsp; GO TO FINALIZA

  
DCL
  01 WS-CHAVE PIC ‘9(05)’;

DCL
  01 WS-FST PIC ‘9(02)’;

READ
  ARQUIVO1 KEY(WS-CHAVE)

ON
  ENDFILE(ARQUVO1)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GO TO FINALIZA;

 

  
IF
  CAMPOX NOT NUMERIC

&nbsp;&nbsp;&nbsp;&nbsp; DISPLAY ‘CAMPOX NÃO NUMERICO’.

  
IF
  VERIFY(CAMPOX,‘0123456789’) ¬= 0

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUT SKIP LIST(‘CAMPOX NÃO NUMERICO’);

 

  
WRITE
  ARQUIVO3.

  
WRITE
  FILE (ARQUIVO3);

 

  
01
  DET1.

02 FILLER PIC X(01) VALUE ‘0’.

02 DET1-DAIDA PIC X(132) VALUE SPACES.

WRITE
  ARQUIVO2 FROM DET1 AFTER 1 LINE.

  
DCL
  01 DET1,

02 F CHAR(01) INIT ‘-’,

02 DET1-SAIDA CHAR(132) INIT ‘ ’;

WRITE
  FILE(ARQUIVO2) FROM (DET1);

 







11. ARQUIVOS

Os nomes de arquivos conterão no máximo 7 caracteres e sua
declaração seguirá a regra:




DECLARE  FILE
;







11.1. Atributos de arquivos

Alguns dos atributos utilizados na declaração dos arquivos:

a)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; STREAM
ð
os dados do arquivo encontram-se armazenados como uma corrente contínua de
caracteres.

b)&nbsp;&nbsp;&nbsp;&nbsp; RECORD
ð
os dados do arquivo encontram-se armazenados em blocos chamados registros.

c)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INPUT
ð
indica um arquivo de entrada, somente permite leitura.

d)&nbsp;&nbsp;&nbsp;&nbsp; OUTPUT
ð
indica um arquivo de saída, somente permite gravação.

e)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UPDATE
ð
indica um arquivo de E/S, permitindo tanto leitura quanto atualização dos
dados.

f)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SEQUENTIAL
ð
os dados são armazenados e lidos sequencialmente.

g)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DIRECT
ð
os dados podem ser armazenados ou lidos diretamente em sua posição. Corresponde
ao RANDOM do COBOL.

h)&nbsp;&nbsp;&nbsp;&nbsp; EXTERNAL/INTERNAL
ð
especifica se o arquivo deve ser reconhecido externamente ou internamente no
bloco em que foi declarado.

i)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
KEYED ð utilizado em arquivos
RECORD que possuam chave em seus registros (por exemplo, arquivos VSAM).

j)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENVIRONMENT
ð
especifica o método de acesso utilizado arquivo e informações sobre o tipo do
registro (DCB&nbsp; do arquivo)



O atributo ENVIRONMENT pode ser abreviado para ENV.



Observe agora os atributos que são incompatíveis entre si:


STREAM/RECORD

INPUT/OUTPUT/UPDATE;

PRINT/RECORD

SEQUENTIAL/DIRECT/TRANSIENT/STREAM

ENVIRONMENT/‘DCB’ do
arquivo

EXTERNAL/INTERNAL

KEYED/STREAM




Exemplos:




DCL ARQ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE &nbsp; INPUT &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; STREAM;

DCL ARQUIVO &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE &nbsp; OUTPUT
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RECORD SEQUENTIAL;

DCL A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE&nbsp;&nbsp; INPUT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RECORD ENV(F(80));




No primeiro exemplo ARQ é um arquivo de entrada a ser
utilizado na modalidade STREAM. Vale ressaltar que os atributos STREAM e RECORD
especificam o tipo de transmissão de dados do arquivo.

No segundo exemplo ARQUIVO é o nome de um arquivo de saída
que será acessado na modalidade de registros seqüenciais.

No terceiro exemplo A é um arquivo de entrada cujos
registros terão comprimento fixo (F = Fixed) igual a 80 bytes.






11.2. Comando OPEN

Como se sabe, todo arquivo para ser utilizado precisa
primeiramente ser aberto, o que significa dar permissão de uso a ele.

A sintaxe do comando open é:




OPEN FILE (NOME-INTERNO1) TITLE
(‘NOME-JCL1’) ATRIBUTOS,

FILE
(NOME-INTERNO2) TITLE (‘NOME-JCL2’) ATRIBUTOS,

...

FILE
(NOME-INTERNON) TITLE (‘NOME-JCLN’) ATRIBUTOS;




Onde:

Ä&nbsp;
Nome-interno
ð é o identificador
que fará referência ao arquivo dentro do programa PL/I.

Ä&nbsp;
Nome-JCL ð é o DDNAME
especificado na JCL para o arquivo. O DDNAME aponta para o nome físico do
arquivo no dispositivo de armazenamento (DSNAME).

Ä&nbsp;
Atributos
ð são os mesmos
vistos anteriormente para o comando DECLARE.



Observe a relação existente entre o programa PL/I e o
arquivo gravado.




Observe que múltiplos arquivos podem ser abertos com um
único comando OPEN.

Exemplos:




DCL&nbsp;&nbsp;&nbsp; CLI&nbsp;&nbsp;&nbsp;&nbsp; FILE&nbsp;&nbsp; RECORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INPUT,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PROD
FILE&nbsp;&nbsp; RECORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OUTPUT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENV(F(80));



OPEN FILE (CLI)&nbsp;&nbsp;&nbsp;&nbsp; TITLE (‘CLIENTES’),

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE
(PROD)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TITLE(‘PRODUTOS’);




A declaração de atributo no comando OPEN é opcional. Uma vez
que um atributo já foi informado no comando DECLARE, não há necessidade de uma
redeclaração. O interessante é que em alguns casos pode ser necessário fazer
uma declaração parcial do arquivo e declarar os atributos omitidos no momento
de sua abertura. Observe:








DCL&nbsp;&nbsp;&nbsp; CLI&nbsp;&nbsp;&nbsp;&nbsp; FILE&nbsp;&nbsp; RECORD,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PROD
FILE&nbsp;&nbsp; RECORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENV(F(80));



OPEN FILE (CLI)&nbsp;&nbsp;&nbsp;&nbsp; TITLE (‘CLIENTES’)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INPUT,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILE
(PROD)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TITLE(‘PRODUTOS’)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OUTPUT;




Isso permitirá que um arquivo seja aberto de maneiras
diferentes em um mesmo programa.






11.3. Comando CLOSE

Todo arquivo uma vez aberto (com permissão de uso) precisa
ser fechado. O comando CLOSE é responsável por essa tarefa.

Sintaxe:




CLOSE FILE (ARQUIVO1),

FILE
(ARQUIVO2),

...

FILE
(ARQUIVON);







11.4. Arquivos PRINT

São arquivos OUTPUT utilizados para formatação de saídas na
impressora ou layouts em arquivos em discos ou fitas magnéticas.



Permitem o uso dos atributos constantes na tabela a seguir:

 

  
Opções

  
Comandos

  
Função

 

  
LINESIZE(n)

  
OPEN

  
Nº máximo de caracteres por linha

 

  
PAGESIZE(n)

  
OPEN

  
Nº máximo de linhas por página

 

  
PAGE

  
PUT

  
Mudar de página antes da impressão

 

  
LINE(n)

  
PUT

  
Mudar para a linha n antes da impressão

 

  
SKIP(n)

  
PUT

  
Pular n-1 linhas antes da impressão

 

  
COL(n)

  
PUT

  
Mudar para a coluna n antes da impressão

 

  
X(n)

  
PUT

  
Salta n espaços antes da impessão

 




Os arquivos PRINT exigem que seja acrescido 1 ao tamanho da
linha a ser impressa. O primeiro caracter nunca é impresso, servindo apenas
para o controle da impressão por parte do sistema operacional (caracter
CTLASA). Sendo assim, um arquivo de impressão preparado para formulário de 132
colunas sempre será declarado como 133 bytes em LINESIZE.

O exemplo a seguir define um arquivo PRINT para impressão:




DCL REL01&nbsp;&nbsp;&nbsp; FILE RECORD OUTPUT&nbsp; ENV(FB RECSIZE(133) CTLASA),

SYSPRINT
OUTPUT;




O nome do arquivo será REL01, será blocado em registros
fixos de 133 bytes, no qual o primeiro é caracter de controle. O atributo
CTLASA deve ser informado para fazer tal associação. Ao final da declaração são
colocadas as palavras SYSPRINT OUTPUT, que indicam a impressora padrão do
sistema operacional como saída.






11.5. Área de trabalho para o registro

Consiste em uma estrutura (variável de nível 01) na qual
estarão definidos em variáveis de nível inferior (02 para frente) variáveis
correspondentes a todos os campos do arquivo a ser tratado.

Diferente do COBOL, tais variáveis não terão uma ligação
direta com o arquivo. Durante os comandos de E/S a estrutura será utilizada
para receber ou para enviar dados lidos ou gravados através das opções INTO
(recebe) ou FROM (envia).






11.6. Comando Write

Insere um novo registro gravando nele as informações
constantes de uma área de trabalho.

Sintaxe:


WRITE
FILE() FROM ()







11.7. Comando Read

Lê um registro do arquivo, carregando suas informações para
uma área de memória. A leitura pode ser feita de maneira seqüencial ou
aleatória.

Par leitura seqüencial a sintaxe é:




READ
FILE() INTO ()




Para leitura aleatória é necessário que o arquivo possua uma
chave de acesso e que seja informado o valor pelo qual se deseja fazer a
pesquisa. A sintaxe será:




READ
FILE() KEY () INTO ()




Para a leitura seqüencial a condição ON ENDFILE será
estabelecida quando for atingido o final do arquivo. No caso da leitura
aleatória a condição será estabelecida quando não for encontrado nenhum
registro cuja chave satisfaça o valor pedido.






11.8. Comando Rewrite

Regrava o registro atual do arquivo com as informações
constantes de uma área de memória.

Sintaxe:


REWRITE
FILE() FROM ()







11.9. Comando Delete

Exclui um registro do arquivo indexado através de sua chave
de índice. Não haverá deleção em arquivos seqüenciais.

Sintaxe:




DELETE
FILE() KEY ()




Deve ter sido movido um valor para a chave antes da execução
do comando. É importante ressaltar que o comando DELETE somente está presente
nas últimas versões do PL/I.






11.10. CTLASA

Como vimos, todos os arquivos PRINT devem sempre ter a linha
de impressão declarada com um byte a mais que o tamanho necessário. O primeiro
byte da linha conterá o chamado caracter de controle de carro.

A tabela a seguir mostra alguns dos caracteres CTLASA mais
utilizados com suas respectivas funções.





















 

  
Valor

  
Função

 

  


  
Passar para a linha seguinte

 

  
0

  
Pular uma linha

 

  
–

  
Pular duas linhas

 

  
+

  
Não mudar de linha

 

  
1

  
Mudar de página