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 LISTA(1000) REAL
DECIMAL FLOAT(6),
VALORES(30) 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 IDENTIFICADOR (LI : LS) ATRIBUTOS;
Onde:
Ä
IDENTIFICADOR ð Será o nome da matriz
que está sendo declarada;
Ä
LI ð limite inferior, um
número inteiro qualquer que servirá para referenciar o primeiro elemento da
matriz;
Ä
LS ð limite superior, um
número inteiro maior que LI que servirá para referenciar o último elemento da
matriz;
Ä
ATRIBUTOS ð os atributos já
conhecidos para os elementos da matriz
Observe os exemplos:
DCL A(1:3) /* UMA MATRIZ DE 3
ELEMENTOS */
DCL A(-2:2,-1:1) /* UMA MATRIZ DE 5 X 3
ELEMENTOS */
DCL ANOS(1968:1976) /* 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 VALORES(100) DECIMAL(4),
LISTA(10,5) 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:
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
|
Maior
|
>=
|
GE
|
Maior
ou igual
|
=
|
=
|
Igual
|
¬=
|
NE
|
Diferente
|
<=
|
LE
|
Menor
ou igual
|
<
|
LT
|
Menor
|
¬>
|
NG
|
Não
maior que
|
¬<
|
NL
|
Não
menor que
|
Lógicos
|
¬
|
NOT
|
Não
|
|
|
OR
|
Ou
|
&
|
AND
|
E
|
String
|
||
|
CAT
|
Concatenação
|
6.2. Prioridade dos operadores
Prioridade
|
1ª
|
2ª
|
3ª
|
4ª
|
5ª
|
6ª
|
7ª
|
Operadores
|
**
|
/ *
|
+ -
|
||
|
=
>= <= >< ¬= ¬> ¬<
|
&
|
|
|
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 01 REGISTRO,
05 CODIGO DECIMAL(3) INIT(0),
05 NOME CHAR(30) INIT(‘ ’),
05 FONE CHAR(12) INIT(‘0’),
05 DATA-NASC,
10 DIA DECIMAL(2) INIT(0),
10 B1 CHAR(1) INIT(‘/’),
10 MES DECIMAL(2) INIT(0),
10 B1 CHAR(1) INIT(‘/’),
10 ANO DECIMAL(2) INIT(0),
05 CIDADE CHAR(25) 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
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 01 REGISTRO-AUX.
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:
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 A> B THEN
PUT
LIST (A);
ELSE
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 THEN
DO;
COMANDO
1;
COMANDO
2;
...
COMANDO
N;
END;
ELSE
DO;
COMANDO
1;
COMANDO
2;
...
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 THEN
ELSE
DO;
COMANDO
1;
COMANDO
2;
...
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 WHILE ()
COMANDO
1;
COMANDO
2;
...
COMANDO
N;
END;
Observe que 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 UNTIL ()
COMANDO
1;
COMANDO
2;
...
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 VAR = TO BY
COMANDO
1;
COMANDO
2;
...
COMANDO
N;
END;
Exemplo:
DO I = 2 TO 100 BY 2
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 (VARIÁVEL)
WHEN
(VALOR 1)
DO;
COMANDO
1;
COMANDO
2;
...
COMANDO
N;
END;
WHEN
(VALOR 2)
DO;
COMANDO
1;
COMANDO
2;
...
COMANDO
N;
END;
...
WHEN
(VALOR N)
DO;
COMANDO
1;
COMANDO
2;
...
COMANDO
N;
END;
OTHERWISE
DO;
COMANDO
1;
COMANDO 2;
...
COMANDO
N;
END;
END;
Testando mais de uma
variável
SELECT;
WHEN
(CONDIÇÃO 1)
DO;
COMANDO
1;
COMANDO
2;
...
COMANDO
N;
END;
WHEN
(CONDIÇÃO 2)
DO;
COMANDO
1;
COMANDO
2;
...
COMANDO
N;
END;
...
WHEN
(CONDIÇÃO N)
DO;
COMANDO
1;
COMANDO
2;
...
COMANDO
N;
END;
OTHERWISE
DO;
COMANDO
1;
COMANDO
2;
...
COMANDO
N;
END;
END;
Exemplo:
DCL FIXO FIXED (15) INIT (15),
CARAC CHAR (08) INIT (‘CHAR’);
/****************************************************************/
SELECT (FIXO);
WHEN
(1)
DO;
PUT
SKIP (‘VALOR 1’);
END;
WHEN
(2)
DO;
PUT
SKIP (‘VALOR 2’);
END;.
OTHERWISE
DO;
PUT
SKIP (‘NÃO VALE NEM 1 NEM 2’);
END;
END;
/****************************************************************/
SELECT;
WHEN
(FIXO = 1 & CARAC = ‘A’)
DO;
PUT
SKIP(‘CONDIÇÃO 1 SATISFEITA’);
END;
WHEN
(FIXO = 2 & CARAC = ‘B’)
DO;
PUT
SKIP(‘CONDIÇÃO 2 SATISFEITA’);
END;
OTERWISE
DO;
PUT
SKIP (‘NENHUMA CONDIÇÃO FOI SATISFEITA’);
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 de interrupção.
O comando On permitirá que o programa intercepte e trate
erros deste tipo. Sua sintaxe é:
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)
condições computacionais;
2)
condições de entrada e saída;
3)
condições de check;
4)
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 BEGIN
PUT
LIST(‘ERRO DESCONHECIDO NO PROGRAMA’);
GOTO
FIM;
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 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) 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
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)
GO TO FINALIZA;
|
IF
CAMPOX NOT NUMERIC
DISPLAY ‘CAMPOX NÃO NUMERICO’.
|
IF
VERIFY(CAMPOX,‘0123456789’) ¬= 0
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:
11.1. Atributos de arquivos
Alguns dos atributos utilizados na declaração dos arquivos:
a) STREAM
ð
os dados do arquivo encontram-se armazenados como uma corrente contínua de
caracteres.
b) RECORD
ð
os dados do arquivo encontram-se armazenados em blocos chamados registros.
c) INPUT
ð
indica um arquivo de entrada, somente permite leitura.
d) OUTPUT
ð
indica um arquivo de saída, somente permite gravação.
e) UPDATE
ð
indica um arquivo de E/S, permitindo tanto leitura quanto atualização dos
dados.
f) SEQUENTIAL
ð
os dados são armazenados e lidos sequencialmente.
g) DIRECT
ð
os dados podem ser armazenados ou lidos diretamente em sua posição. Corresponde
ao RANDOM do COBOL.
h) EXTERNAL/INTERNAL
ð
especifica se o arquivo deve ser reconhecido externamente ou internamente no
bloco em que foi declarado.
i)
KEYED ð utilizado em arquivos
RECORD que possuam chave em seus registros (por exemplo, arquivos VSAM).
j) ENVIRONMENT
ð
especifica o método de acesso utilizado arquivo e informações sobre o tipo do
registro (DCB 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 FILE INPUT STREAM;
DCL ARQUIVO FILE OUTPUT
RECORD SEQUENTIAL;
DCL A FILE INPUT 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:
Ä
Nome-interno
ð é o identificador
que fará referência ao arquivo dentro do programa PL/I.
Ä
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).
Ä
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 CLI FILE RECORD INPUT,
PROD
FILE RECORD OUTPUT ENV(F(80));
OPEN FILE (CLI) TITLE (‘CLIENTES’),
FILE
(PROD) 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 CLI FILE RECORD,
PROD
FILE RECORD ENV(F(80));
OPEN FILE (CLI) TITLE (‘CLIENTES’) INPUT,
FILE
(PROD) TITLE(‘PRODUTOS’) 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 FILE RECORD OUTPUT 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:
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 é:
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:
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:
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
|