Translate

quinta-feira, 7 de agosto de 2025

Conheça os diversos tipos de variáveis COBOL

 

Conheça os diversos tipos de variáveis COBOL

4,424 followers

Salve jovem padawan, no artigo de hoje, apresento um programa COBOL explorando os diversos tipos de variáveis, gerando como saída, um arquivo de 143 bytes ilustrando como é o armazenamento e o formato dos dados.

Aproveito e apresento alguns comandos COBOL com diversas parametrizações, onde poderemos explorar e entender na prática seu funcionamento.

O programa foi dividido em Sections e Parágrafos, ajudando a conhecer técnicas de laço e salto de parágrafo.

PROGRAMA COBOL117

 *****************************************************************
      * DATA     : 29/08/2024
      * AUTOR    : VAGNER RENATO BELLACOSA
      * OBJETIVO : PROGRAMA EXEMPLO ARQUIVO QSAM LOOP
      * CPD      : INEFE
      *****************************************************************
       IDENTIFICATION DIVISION.
      *************************
       PROGRAM-ID. COBOL117.
       AUTHOR. VAGNER BELLACOSA.
       DATE-WRITTEN. 29/08/24 @ 21:18:00.
       DATE-COMPILED. 2024-08-29.

      **********************
       ENVIRONMENT DIVISION.
      **********************
      *
       CONFIGURATION SECTION.
      *
       SOURCE-COMPUTER. IBM-I.
       OBJECT-COMPUTER. IBM-I.
       SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
      *
       INPUT-OUTPUT SECTION.
      *
       FILE-CONTROL.
           SELECT OUTPTFL    ASSIGN TO OUTPTFL
           ORGANIZATION IS SEQUENTIAL
           ACCESS MODE IS SEQUENTIAL
           FILE STATUS IS FS-STATUS.

      ***************
       DATA DIVISION.
      ***************
      *
       FILE SECTION.
      *
       FD OUTPTFL
           RECORD CONTAINS 145 CHARACTERS
           LABEL RECORDS ARE STANDARD
           RECORDING MODE IS F
           DATA RECORD IS REG-DADOS.
      *
       COPY COPY117A.
      *
      *
       WORKING-STORAGE SECTION.
      *
      *
       01  WSS-VARIAVEL-AUX.
          05  WSS-EOF            PIC A(01).
          05  FS-STATUS          PIC 99.
      *
       77 WSS-RANDOM-NUMBER1   PIC 999 VALUE ZEROES.
       77 WSS-RANDOM-NUMBER2   PIC 999 VALUE ZEROES.
       77 WSS-REG-GRAVADOS     PIC 999 VALUE ZEROES.
       77 WSS-CICLO            PIC 99  VALUE 15.
       77 WSS-DATA-COMPIL      PIC X(16).
      *
      ****************************************************************
      **  DECLARATIONS FOR THE LOCAL DATE/TIME FOR DISPLAY
      ****************************************************************
       01  WSS-CAMPOS-AUXILIARES.
           05 WSS-YYYYMMDD          PIC  9(008).
           05 WSS-YYMMDD            PIC  9(006).
           05 WSS-HHMMSS            PIC  9(006).
           05 WSS-HHMMSSCC          PIC  9(008).
           05 WSS-DIA-SEMANA        PIC  9(001).
           05 WSS-ANO-DIA           PIC  9(005).
           05 WSS-DAY-YYYYDDD       PIC  9(007).
           05 WSS-DAY-001           PIC  S9(009).
           05 WSS-INTEGER-FORM      PIC  S9(9) SIGN LEADING SEPARATE.
           05 WSS-INT-DATE          PIC  9(8) VALUE ZERO.
           05 WSS-DATE-TODAY        PIC  9(7) VALUE ZERO.
           05 WSS-DUE-DATE          PIC  9(7) VALUE ZERO.

      ********************
       PROCEDURE DIVISION.
      ********************

       001-INICIALIZAR          SECTION.

           PERFORM ROT-LISTA-INFO
              THRU ROT-LISTA-INFO-EXIT.

           PERFORM ROT-OPEN-FILE
              THRU ROT-OPEN-FILE-EXIT.

           PERFORM ROT-INITIALIZE-VAR
              THRU ROT-INITIALIZE-VAR-EXIT.

       002-WORKFILE             SECTION.

           PERFORM ROT-FORMATA-OUTPUT
              THRU ROT-FORMATA-OUTPUT-EXIT WSS-CICLO TIMES.

       003-PROCEDIMENTOS-FINAIS SECTION.

           PERFORM ROT-CLOSE-FILE
              THRU ROT-CLOSE-FILE-EXIT.

           PERFORM ROT-ESTATISTICA
              THRU ROT-ESTATISTICA-EXIT.

           STOP RUN.

      * SEçãO DE CODIGOS AUXILIARES
       004-PARAGRAFOS            SECTION.

      * INICIALIZA VARIAVEIS
       ROT-INITIALIZE-VAR.

      **** MOVE ZEROES TO REG-DADOS

           INITIALIZE REG-DADOS
              REPLACING ALPHANUMERIC BY   SPACES
                        NUMERIC      BY   ZEROES.

       ROT-INITIALIZE-VAR-EXIT.
           EXIT.

      * LISTA CABECALHO DO PROGRAMA
       ROT-LISTA-INFO.

           DISPLAY ' '.
           DISPLAY '*****************************************'.
           DISPLAY '*            COBOL117                   *'.
           DISPLAY '*****************************************'.
           DISPLAY '*                                       *'.
           DISPLAY '* EXEMPLO DE OPEN WRITE CLOSE QSAM FILE *'.
           DISPLAY '*  USO DE COPY BOOK PARA LAYOUT ARQUIVO *'.
           DISPLAY '*  GRAVACAO ALFABETICA ALFANUMERICA     *'.
           DISPLAY '*  COMP1 COMP2 COMP3 COMP4 COMP5        *'.
           DISPLAY '*  USO DE FUNçãO INTRINSECA             *'.
           DISPLAY '*  INITIALIZE 3 MODOS                   *'.
           DISPLAY '*  SECTIONS E PARAGRAFOS                *'.
           DISPLAY '*  TAMANHO DO REGISTRO '
                               LENGTH OF REG-DADOS ' BYTES  *'.
           DISPLAY '*  WSS-CICLO = ' WSS-CICLO
                   '      LOOP DE GRAVACAO *'
           DISPLAY '*****************************************'.
           DISPLAY ' '.

           PERFORM ROT-GET-DATA
              THRU ROT-GET-DATA-EXIT.

           DISPLAY '* WSS-DATA-COMPIL = ' WSS-DATA-COMPIL
                          '          *'.
           DISPLAY ' '.

       ROT-LISTA-INFO-EXIT.
           EXIT.

      * FUNCOES INTRINSECAS OBTEM DADOS DO SISTEMA
       ROT-GET-DATA.

      * OBTEM A DATA DA COMPILACAO
           MOVE FUNCTION WHEN-COMPILED  TO WSS-DATA-COMPIL

      * BUSCA DATA VIA CURRENT-DATE

           MOVE FUNCTION CURRENT-DATE(1:8) TO WSS-YYYYMMDD

           DISPLAY ' WSS-YYYYMMDD    = ' WSS-YYYYMMDD

      * CALCULA DIA VIA INTEGER-OF-DATE

           COMPUTE WSS-YYYYMMDD    = FUNCTION INTEGER-OF-DATE
                                     (WSS-YYYYMMDD)
                                     + 15.
           DISPLAY ' WSS-YYYYMMDD    = ' WSS-YYYYMMDD
           DISPLAY 'NOVA DATA: ' WSS-DAY-YYYYDDD

      * ACCEPT

           ACCEPT WSS-DAY-YYYYDDD FROM DAY YYYYDDD.
           ACCEPT WSS-YYYYMMDD    FROM DATE YYYYMMDD.
           ACCEPT WSS-YYMMDD      FROM DATE.
           ACCEPT WSS-HHMMSS      FROM TIME.
           ACCEPT WSS-HHMMSSCC    FROM TIME.
           ACCEPT WSS-DIA-SEMANA  FROM DAY-OF-WEEK.
           ACCEPT WSS-ANO-DIA     FROM DAY.

       ROT-GET-DATA-EXIT.
           EXIT.

      * ABERTURA DE ARQUIVO QSAM
       ROT-OPEN-FILE.

           DISPLAY 'ROT-OPEN-FILE'.

           OPEN OUTPUT OUTPTFL.

           IF FS-STATUS > 0
              DISPLAY 'ERRO NA ABERTURA DO ARQUIVO OUTPTFL '
              DISPLAY 'FS-STATUS : ' FS-STATUS
              MOVE FS-STATUS    TO  RETURN-CODE
              PERFORM ROT-ABEND
           END-IF.

       ROT-OPEN-FILE-EXIT.
           EXIT.

      * FORMATA REGISTRO DE SAIDA
       ROT-FORMATA-OUTPUT.

           DISPLAY 'ROT-FORMATA-OUTPUT'.

           PERFORM ROT-INITIALIZE-VAR
              THRU ROT-INITIALIZE-VAR-EXIT.

           MOVE  'WILSON LUPINO'   TO   REG-NOME.
           MOVE  '2014-05-11'      TO   REG-DATA-NASC.
           MOVE  WSS-REG-GRAVADOS  TO   REG-ORDEM.
           MOVE  'RUA A NO 15'     TO   REG-ENDERECO
           MOVE  'TAUBATE'         TO   REG-CIDADE
           MOVE  'SP'              TO   REG-ESTADO
           MOVE  '18000-100'       TO   REG-CEP
           MOVE   123              TO   REG-COMP1-4
           MOVE   123456           TO   REG-COMP2-8
           MOVE  -123456           TO   REG-COMP3-5
           MOVE   199998           TO   REG-COMP3-5A
           MOVE  -789012           TO   REG-COMP3-6
           MOVE  1000              TO   REG-COMP4-2
           MOVE  2000000           TO   REG-COMP4-4
           MOVE  3000000000        TO   REG-COMP4-8
           MOVE  -1000             TO   REG-COMP5-2
           MOVE  -2000000          TO   REG-COMP5-4
           MOVE  -3000000000       TO   REG-COMP5-8
           MOVE  'FIM'             TO   REG-TEXTO5C

           PERFORM ROT-ALEATORIA
              THRU ROT-ALEATORIA-EXIT.

           MOVE WSS-RANDOM-NUMBER1 TO   REG-ANO-DIA.
           MOVE WSS-RANDOM-NUMBER2 TO   REG-ANO-MES.

           DISPLAY ' REG-DADOS     : ' REG-DADOS ' '
                     LENGTH OF REG-DADOS ' BYTES '.
           DISPLAY ' REG-NOME      : ' REG-NOME.
           DISPLAY ' REG-DATA-NASC : ' REG-DATA-NASC.
           DISPLAY ' WSS-CICLO     : ' WSS-CICLO.

           PERFORM ROT-WRITE-FILE
              THRU ROT-WRITE-FILE-EXIT

      ***** 4 LINHAS ADICIONAIS

           IF WSS-REG-GRAVADOS = 15
      * GRAVA LOW-VALUES NO ARQUIVO
             MOVE LOW-VALUES       TO REG-DADOS
             PERFORM ROT-WRITE-FILE
                THRU ROT-WRITE-FILE-EXIT
      * GRAVA HIGH-VALUES NO ARQUIVO
             MOVE HIGH-VALUES      TO REG-DADOS
             PERFORM ROT-WRITE-FILE
                THRU ROT-WRITE-FILE-EXIT
      * INICIALIZA ESTRUTURA DO ARQUIVO COM 9 E X
             INITIALIZE REG-DADOS
                REPLACING ALPHANUMERIC DATA BY 'X'
                          NUMERIC      DATA BY 9
             PERFORM ROT-WRITE-FILE
                THRU ROT-WRITE-FILE-EXIT
      * INICIALIZA ESTRUTURA
             INITIALIZE REG-DADOS
             PERFORM ROT-WRITE-FILE
                THRU ROT-WRITE-FILE-EXIT
           END-IF.

       ROT-FORMATA-OUTPUT-EXIT.
           EXIT.

      * GRAVA REGISTRO DE SAIDA
       ROT-WRITE-FILE.

           WRITE REG-DADOS
           END-WRITE.

           IF FS-STATUS > 0
              DISPLAY 'ERRO NA GRAVACAO DO ARQUIVO OUTPTFL '
              DISPLAY 'FS-STATUS : ' FS-STATUS
              MOVE FS-STATUS    TO  RETURN-CODE
              PERFORM ROT-ABEND
           END-IF.

           ADD  01                 TO   WSS-REG-GRAVADOS.

       ROT-WRITE-FILE-EXIT.
           EXIT.

      * FECHA ARQUIVO QSAM
       ROT-CLOSE-FILE.

           DISPLAY 'ROT-CLOSE-FILE'.

           CLOSE OUTPTFL.

           IF FS-STATUS > 0
              DISPLAY 'ERRO NO FECHAMENTO DO ARQUIVO OUTPTFL '
              DISPLAY 'FS-STATUS : ' FS-STATUS
              MOVE FS-STATUS    TO  RETURN-CODE
              PERFORM ROT-ABEND
           END-IF.

       ROT-CLOSE-FILE-EXIT.
           EXIT.

      * LISTA AS ESTATISTICAS DO PROCESSAMENTO
       ROT-ESTATISTICA.

           ACCEPT WSS-HHMMSSCC    FROM TIME.

           DISPLAY ' '.
           DISPLAY '*******************************************'.
           DISPLAY '*** PROGRAMA COBOL117                   ***'.
           DISPLAY '*******************************************'.
           DISPLAY '*** DATA DO PROCESSAMENTO : '
                    WSS-YYYYMMDD  '   ***'.
           DISPLAY '*** HORA DO PROCESSAMENTO : '
                    WSS-HHMMSSCC  '   ***'.
           DISPLAY '*******************************************'.
           DISPLAY '*                                         *'.
           DISPLAY '* TERMINO DE PROCESSAMENTO OK             *'.
           DISPLAY '*                                         *'.
           DISPLAY '* REGISTRO GRAVADOS : ' WSS-REG-GRAVADOS
                   '                *'.
           DISPLAY '*                                         *'.
           DISPLAY '*******************************************'.

       ROT-ESTATISTICA-EXIT.
           EXIT.

      * SAIDA CONTROLADA - ABEND NO PROCESSAMENTO
       ROT-ABEND.

           ACCEPT WSS-HHMMSSCC    FROM TIME.

           DISPLAY '*******************************************'.
           DISPLAY '*** PROGRAMA COBOL117                   ***'.
           DISPLAY '*******************************************'.
           DISPLAY '*** DATA DO PROCESSAMENTO : '
                    WSS-YYYYMMDD  '  ***'.
           DISPLAY '*** HORA DO PROCESSAMENTO : '
                    WSS-HHMMSSCC  '  **'.
           DISPLAY '*******************************************'.
           DISPLAY ' ABEND PROGRAMADO '.
           DISPLAY ' ERRO ENCONTRADO : '  RETURN-CODE.
           DISPLAY ' FAVOR AVISAR O ANALISTA RESPONSAVEL'.
           DISPLAY '*******************************************'.
      **** CALL ABEND.
           STOP RUN.

       ROT-ABEND-EXIT.
           EXIT.

      * GERADOR DE NUMERO ALEATORIO
       ROT-ALEATORIA.

           COMPUTE WSS-RANDOM-NUMBER1 = FUNCTION RANDOM * 31.
           COMPUTE WSS-RANDOM-NUMBER2 = FUNCTION RANDOM * 12.
           DISPLAY ' '.
           DISPLAY ' 1 --> ' WSS-RANDOM-NUMBER1
                   ' 2 --> ' WSS-RANDOM-NUMBER2
           DISPLAY ' '.

       ROT-ALEATORIA-EXIT.
           EXIT.

       END PROGRAM COBOL117.
      ********************** FIM PROGRAMA   **************************** 

Código Comentado por Section

Este programa foi dividido em 4 seções, o código usou da Logica Estruturado preparado para receber novos parágrafos e funcionalidades com o menor impacto no código legado.

001-INICIALIZAR SECTION.

Nesta seção o programa lista a info da abertura do programa, abre arquivo output e inicializa as variaveis.

002-WORKFILE SECTION.

Nesta seção trataremos da formatação das variáveis e procedimento de gravação dos registros.

003-PROCEDIMENTOS-FINAIS SECTION.

Nesta seção trataremos dos procedimentos finais, fechando arquivo e listando a estatistica do processamento

004-PARAGRAFOS SECTION.

Seção auxiliar que armazena as diversas sub-rotinas do programa. Objetivando facilitar a manutenção das mesmas.


COPY

É um arquivo de definição das variáveis publico, destinado a compartilhar entre diversos programas a mesma estrutura. Em um COPY book inclui o Grupo de Dados estruturado e separados por níveis de 1 até 10.

Exemplificamos os três tipos de variável COBOL. Alfabética, Alfanumérica e Numérico, expandindo para os tipos Computacional de 1 a 5.

************************************************************************************
*******  ESTE COPY BOOK CONTEM COMANDOS DA DATA DIVISION                       ***
*******                                    WORKING-STORAGE SECTION.                                    ***
*******  EM TEMPO DE COMPILACAO ESTE BLOCO DE CODIGO SERA INSERIDO NO***
*******  PROGRAMA, PODENDO SER REUTILIZADO POR N PROGRAMAS, DEVENDO**  ***
*******  ESTAR NA LIBRARY DEFINIDA PARA OS COPIES.                   ***
************************************************************************
      *
      * DATA GROUP ITEM
       01 REG-DADOS.
      *
      *  VARIABLE NUMERIC       -> PIC 9
         05 REG-ORDEM                  PIC 999.
      *  VARIABLE ALPHABETIC   -> PIC A
         05 REG-NOME                    PIC A(20).
      *  VARIABLE ALPHANUMERIC -> PIC X
         05 REG-DATA-NASC            PIC X(10).
      *  REDEFINES ITEM
         05 FILLER       REDEFINES  REG-DATA-NASC.
           10 REG-ANO-NASC           PIC 9(04).
           10 FILLER                            PIC X.
           10 REG-ANO-MES              PIC 9(02).
           10 FILLER                            PIC X.
           10 REG-ANO-DIA               PIC 9(02).
         05 REG-ENDERECO              PIC X(20).
         05 REG-CIDADE                   PIC X(10).
         05 REG-ESTADO                  PIC XX.
         05 REG-CEP                         PIC X(09).
         05 FILLER       REDEFINES  REG-CEP.
           10 REG-CEP-INT                PIC 9(05).
           10 FILLER                           PIC X.
           10 REG-CEP-COMP           PIC 9(03).
      * COMPUTACIONAL  1
         05 REG-COMP1-4            USAGE IS COMP-1.
         05 REG-TEXTO1                  PIC X(01).
      * COMPUTACIONAL  2
         05 REG-COMP2-8            USAGE IS COMP-2.
         05 REG-TEXTO2                  PIC X(01).
      * COMPUTACIONAL  3
         05 REG-COMP3-5               PIC S9(10) COMP-3.
         05 REG-TEXTO3A                PIC X(01).
         05 REG-COMP3-5A             PIC  9(10) COMP-3.
         05 REG-TEXTO3B                PIC X(01).
         05 REG-COMP3-6               PIC S9(11) COMP-3.
         05 REG-TEXTO3C                PIC X(01).
      * COMPUTACIONAL  4
         05 REG-COMP4-2               PIC S9(4)  COMP-4.
         05 REG-TEXTO4A                PIC X(01).
         05 REG-COMP4-4               PIC S9(9)  COMP-4.
         05 REG-TEXTO4B                PIC X(01).
         05 REG-COMP4-8               PIC S9(18) COMP-4.
         05 REG-TEXTO4C                PIC X(01).
      * COMPUTACIONAL  5
         05 REG-COMP5-2               PIC S9(4)  COMP-5.
         05 REG-TEXTO5A                PIC X(01).
         05 REG-COMP5-4               PIC S9(9)  COMP-5.
         05 REG-TEXTO5B                PIC X(01).
         05 REG-COMP5-8               PIC S9(18) COMP-5.
      *
         05 REG-TEXTO5C                PIC X(03).
**************************** FIM DO COPYBOOK *************************** 

JCL - JOB CONTROL LANGUAGE

Para o teste, após compilarmos o programa num compilador igual ou maior que a versão 4, o ideal é a versão 6.3. Segue o JCL em dois steps.

//EXECPGM1   JOB ('00'),TSO.&SYSUID,                           
//          REGION=0M,NOTIFY=&SYSUID,LINES=(17000,CANCEL),
//          MSGCLASS=T,MSGLEVEL=1,CLASS=A
//**********************************************************************
//*            TESTE PARA CRIACãO DE ARQUIVO
//*            GERAR UM ARQUIVO COM 143 BYTES
//**********************************************************************
//JOBLIB  DD DSN=KC02745.LIB.CBLPDSE,DISP=SHR
//**********************************************************************
//* STEP TO DELETE A DATASET
//**********************************************************************
//STEP001  EXEC PGM=IEFBR14
//DD1      DD DSN=KC02745.OUTPTFL.EXEWRITE.D0117,
//         DISP=(OLD,DELETE,DELETE)
//**********************************************************************
//* PROGRAMA QUE GERA ARQUIVO DE SAIDA COM EXEMPLO DE COMPUTACIONAL
//**********************************************************************
//STEP002  EXEC PGM=COBOL117
//*    ARQUIVO DE SAIDA                                                   *\\
//OUTPTFL DD DSN=KC02745.OUTPTFL.EXEWRITE.D0117,
//             DISP=(NEW,CATLG,DELETE),
//             SPACE=(TRK,(1,1),RLSE),UNIT=SYSDA,
//             DCB=(LRECL=145,RECFM=FB,BLKSIZE=0)
//SYSTSPRT DD  SYSOUT=*
//SYSPRINT DD  SYSOUT=*
//CEEDUMP  DD  SYSOUT=*
//SYSUDUMP DD  SYSOUT=*
//SYSOUT   DD  SYSOUT=*
//REPORT   DD  SYSOUT=*
//SYSABOUT DD  SYSOUT=*
//SYSDBOUT DD  SYSOUT=*
/*
//****************************** FIM DO JCL **************************** 

//STEP001 EXEC PGM=IEFBR14

Este aplicativo da IBM permite apagar o Dataset.

//STEP002 EXEC PGM=COBOL117

Executa o programa e grava arquivo de saída com 145 bytes.

Output

Resultado com as estatísticas de execução.

SDSF

Exobe a Sysout do processamento, lembrando que um JOB é enviado ao JES2. onde passa por 3 filas de workflow, senda a primeira de validação , a segunda de execução e a terceira de impressão.

Article content
Article content

O Resultado será do processamento irá criar um Dataset QSAM Fixo Blocado com 145 bytes de cumprimento por registro e ao final será gravado 19 linhas.

Info do DATASET

Article content

Registros EBCDIC convertidos no Emulador para ASCII

O arquivo no formato EBCDIC:


Article content
Article content

Formato HEX

Usando comando de linha Hexadecimal o arquivo mostrará os registros no formato EBCDIC divididos em Alto e Baixo do octeto de bits.


Article content

Neste print exemplifico os registros de 15 até 19 no formato hexadecimal.

Conheça os diversos formatos


  1. Low-Values
  2. High-Values
  3. Initialize de X a 9
  4. Initialize de espaços e zero


Computacional de 1 a 5


Article content

Exemplo de uso das variáveis computacional e seu uso em bytes na geração de arquivo.


Espero ter ajudado e qualquer duvida entre em contato.




Sem comentários:

Enviar um comentário