segunda-feira, 18 de junho de 2012

Resolvendo um 0C7


1) Verificar o OFFSET

                         
Display  Filter  View  Print  Options  Help                                 
-------------------------------------------------------------------------------
SDSF OUTPUT DISPLAY YC99OCHG JOB14323  DSID     2 LINE  CHARS 'AHC87I' FOUND  
COMMAND INPUT ===>                                            SCROLL ===> CSR
HG An abend (code 0C7/AKEA) has occurred at offset X'000013A8' in program AHC87I
HG                                                                             
) CICS symptom string for message DFHSR0001 is                                  
LVLS/620 MS/DFHSR0001 RIDS/DFHSRP PTFS/UQ83467                                 
EA RIDS/AHC87I ADRS/000013A8                                                   
HG  A SYSTEM DUMP FOR DUMPCODE: SR0001  , WAS SUPPRESSED BY THE DUMP TABLE OPTIO
E                                                                              
HG An abend (code 0C7/AKEA) has occurred at offset X'000013A8' in program AHC87I
HG                                                                             
) CICS symptom string for message DFHSR0001 is                                 
LVLS/620 MS/DFHSR0001 RIDS/DFHSRP PTFS/UQ83467                                 
EA RIDS/AHC87I ADRS/000013A8                                                   
HG  A SYSTEM DUMP FOR DUMPCODE: SR0001  , WAS SUPPRESSED BY THE DUMP TABLE OPTIO
E                                                                              
HG An abend (code ---/TAMC) has occurred in exit program YCPCREQD at exit point
HG Transaction MR13 has been attached with unknown tranclass TCLAMR13.         
3782 ) GROUP(DD02    ) NAME(ANDRESSA R. MOREIRA )                              
IATION - INVALID PASSWORD ENTERED AT TERMINAL C52545                           
 F1=HELP      F2=SPLIT     F3=END       F4=RETURN    F5=IFIND     F6=BOOK     
  F7=UP        F8=DOWN      F9=SWAP     F10=LEFT     F11=RIGHT    F12=RETRIEVE 

2)  Verificar o deslocamento do programa

TSO / D1 /  BUILD / LISTING


PACKAGE ID             ===> AH00000543                                        
APPLICATION            ===> AH00         (Required if PACKAGE ID not supplied;
                                          Non-blank: staging/baseline listings;
                                          Blank: staging listings only)       
COMPONENT NAME         ===> AHC87I       (Blank or pattern for list)          
LIBRARY TYPE           ===> LST          (Blank for list)                     
FROM DATE              ===>              (YYYYMMDD)                           
  TO DATE              ===>              (YYYYMMDD)                           
                                                                              
  


-------------------------- BROWSE COMPRESSED LISTINGS -------- Row 1 to 2 of 2
                                                                               
Press END command to exit.                                                    
                                                                              
      PACKAGE ID: AH00000543      STATUS: FRZ      INSTALL DATE: 20041231     
                                                                              
    NAME    LEVEL   VV.MM  CREATED       CHANGED       SIZE  INIT   ID        
_ AHC87I   BASE-00  01.07 2002/12/10 2003/06/06 10:42  5960  3645 CHD1STC     
S AHC87I   STAGING  01.00 2004/11/09 2004/11/09 14:31  6310  6310 CHD1STC     
******************************* Bottom of data ********************************
                                                                               

Menu  Utilities  Compilers  Help                                            
-------------------------------------------------------------------------------
BROWSE    CMN.SPC1.X003853.D314BC18.T6583D48.OUTLIST Line 00000000 Col 001 080
********************************* Top of Data **********************************
                                                                               
 ******************************************************************************
 *       DDNAME: SERCOPY.SYSPRINT                                             *
 ******************************************************************************
                                         IEBCOPY MESSAGES AND CONTROL STATEMENTS
IEB1135I IEBCOPY  FMID HDZ11F0  SERVICE LEVEL UA01138  DATED 20030224 DFSMS 02.1
IEB1035I AH005GAX  SERCOPY  14:31:47 TUE 09 NOV 2004 PARM='LIST=NO'            
 COPY   OUTDD=SYSUT2,INDD=((SYS00002,R)),LIST=NO  * Copy                       
 SELECT MEMBER=(AHC87I)                                                         
IEB1013I COPYING FROM PDSE  INDD=SYS00002 VOL=DESLBE DSN=SYSDE.CHGMAN.ATD.AH00.#
IEB1014I           TO PDSE OUTDD=SYSUT2   VOL=WC1012 DSN=SYS04314.T143124.RA000.
IGW01550I 1 OF 1 SPECIFIED  MEMBERS WERE COPIED                                 
IEB147I END OF JOB - 0 WAS HIGHEST SEVERITY CODE                               
                                                                               
 ******************************************************************************
 *       DDNAME: WRITE.SYSPRINT                                               *
 ******************************************************************************

Command ===> F MAIN_EP                                        Scroll ===> CSR

 F1=Help    F2=Split   F3=Exit    F5=Rfind   F7=Up      F8=Down    F9=Swap    
 F10=Left   F11=Right  F12=Cancel                                              
                                                                               
                                                                                


NAME:            ENTRY TYPE AMODE C_OFFSET CLASS NAME        STATUS           
                                                                              
AHC87I            MAIN_EP      31 00000020 B_TEXT                             
                                                                              
                        ***** E N D  O F  R E P O R T *****          





3)  Subtrair 20 (MAIN_EP      31 00000020 ) do OFFSET 13A8 = 1388


         
4) Ir para o inicio da listagem, e fazer  Subtrair 20 (MAIN_EP      31 00000020 ) do OFFSET 13A8

sexta-feira, 8 de junho de 2012

MAPA BMS - CICS



LayOut Mapa BMS (Basic Mapping Support)





 Mapa Físico do Exemplo acima

PRINT NOGEN
*-----------------------------------------------------------*
* MAPA FISICO DO MENU MANUTENCAO AGENCIAS HABILITADAS       *
*-----------------------------------------------------------*
*   PSWD : TEF5                                             *
*-----------------------------------------------------------*
TCEF5MS DFHMSD TYPE=MAP,                                    X
               TIOAPFX=YES,                                 X
               STORAGE=AUTO,                                X
               CTRL=(FRSET,FREEKB),                         X
               LANG=COBOL,                                  X
               MODE=INOUT
TCEF5M1 DFHMDI DATA=FIELD,                                  X
               SIZE=(024,080)
***** LINHA 1
        DFHMDF POS=(01,001),                                X
               LENGTH=014,                                  X
               ATTRB=(ASKIP,FSET),                          X
               INITIAL='BANCOEXE'
        DFHMDF POS=(01,028),                                X
               LENGTH=025,                                  X
               ATTRB=(ASKIP,FSET,BRT),                      X
               INITIAL='C A P I T A L I Z A C A O'
T1DATA  DFHMDF POS=(01,071),                                X
                LENGTH=008,                                 X
                ATTRB=(ASKIP,FSET)
 ***** LINHA 2
        DFHMDF POS=(02,001),                                X
               LENGTH=007,                                  X
               ATTRB=(ASKIP,FSET),                          X
               INITIAL='TCEF5MS'
        DFHMDF POS=(02,025),                                X
               LENGTH=031,                                  X
               ATTRB=(ASKIP,FSET,BRT),                      X
               INITIAL='CADASTRO RASPINVEST DE AGENCIAS'
T1HORA  DFHMDF POS=(02,071),                                X
               LENGTH=008,                                  X
               ATTRB=(ASKIP,FSET)
***** LINHA 7
        DFHMDF POS=(07,016),                                X
               LENGTH=017,                                  X
               ATTRB=(ASKIP,FSET),                          X
               INITIAL='1 - CADASTRAMENTO'

***** LINHA 9
        DFHMDF POS=(09,016),                                X
               LENGTH=033,                                  X
               ATTRB=(ASKIP,FSET),                          X
               INITIAL='2 - ALTERACAO DE DADOS CADASTRAIS'
***** LINHA 11
        DFHMDF POS=(11,016),                                X
               LENGTH=024,                                  X
               ATTRB=(ASKIP,FSET),                          X
               INITIAL='3 - CONSULTA DO CADASTRO'
***** LINHA 17
        DFHMDF POS=(17,009),                                X
               LENGTH=006,                                  X
               ATTRB=(ASKIP,FSET),                          X
               INITIAL='OPCAO:'
T1OPCAO DFHMDF POS=(17,016),                                X
               LENGTH=001,                                  X
               ATTRB=(UNPROT,NUM,FSET,IC),                  X
               INITIAL='_'
        DFHMDF POS=(17,018),                                X
               LENGTH=001,                                  X
               ATTRB=ASKIP
***** LINHA 22
T1MENS  DFHMDF POS=(22,001),                                X
               LENGTH=078,                                  X
               ATTRB=(ASKIP,FSET,BRT)
***** LINHA 23
        DFHMDF POS=(23,001),                                X
               LENGTH=005,                                  X
               ATTRB=(ASKIP,FSET),                          X
               INITIAL='ENTER'
        DFHMDF POS=(23,017),                                X
               LENGTH=003,                                  X
               ATTRB=(ASKIP,FSET),                          X
               INITIAL='PF1'
        DFHMDF POS=(23,029),                                X
               LENGTH=003,                                  X
               ATTRB=(ASKIP,FSET),                          X
               INITIAL='PF2'
        DFHMDF POS=(23,041),                                X
               LENGTH=003,                                  X
               ATTRB=(ASKIP,FSET),                          X
               INITIAL='PF3'
        DFHMDF POS=(23,054),                                X
               LENGTH=004,                                  X
               ATTRB=(ASKIP,FSET),                          X
               INITIAL='PF12'
***** LINHA 24
        DFHMDF POS=(24,001),                                X
               LENGTH=008,                                  X
               ATTRB=(ASKIP,FSET),                          X
               INITIAL='PROCESSA'
        DFHMDF POS=(24,017),                                X
               LENGTH=004,                                  X
               ATTRB=(ASKIP,FSET),                          X
               INITIAL='HELP'
        DFHMDF POS=(24,029),                                X
               LENGTH=004,                                  X
               ATTRB=(ASKIP,FSET),                          X
               INITIAL='MENU'
        DFHMDF POS=(24,041),                                X
               LENGTH=005,                                  X
               ATTRB=(ASKIP,FSET),                          X
               INITIAL='VOLTA'
        DFHMDF POS=(24,054),                                X
               LENGTH=003,                                  X
               ATTRB=(ASKIP,FSET),                          X
               INITIAL='FIM'
TCEF5MS DFHMSD TYPE=FINAL
               END 


Mapa Simbólico ou Lógico 

01     TCEF5M1I.
  02   FILLER      PIC X(12).
  02   T1DATAL     COMP  PIC  S9(4).
  02   T1DATAF     PICTURE X.
  02   FILLER      REDEFINES T1DATAF.
    03 T1DATAA     PICTURE X.
  02   T1DATAI     PIC X(8).
  02   T1HORAL     COMP  PIC  S9(4).
  02   T1HORAF     PICTURE X.
  02   FILLER      REDEFINES T1HORAF.
    03 T1HORAA     PICTURE X.
  02   T1HORAI     PIC X(8).
  02   T1OPCAOL    COMP  PIC  S9(4).
  02   T1OPCAOF    PICTURE X.
  02   FILLER      REDEFINES T1OPCAOF.
    03 T1OPCAOA    PICTURE X.
  02   T1OPCAOI    PIC X(1).
  02   T1MENSL     COMP  PIC  S9(4).
  02   T1MENSF     PICTURE X.
  02   FILLER      REDEFINES T1MENSF.
    03 T1MENSA     PICTURE X.
  02   T1MENSI     PIC X(78).
01     TCEF5M1O    REDEFINES TCEF5M1I.
  02   FILLER      PIC X(12).
  02   FILLER      PICTURE X(3).
  02   T1DATAO     PIC X(8).
  02   FILLER      PICTURE X(3).
  02   T1HORAO     PIC X(8).
  02   FILLER      PICTURE X(3).
  02   T1OPCAOO    PIC X(1).
  02   FILLER      PICTURE X(3).
  02   T1MENSO     PIC X(78).



PL/I - Parte II


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:

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
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
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:
IF        THEN
            ;
ELSE
            ;

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 é:

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)      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:

DECLARE FILE ;

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:
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