Conheça os diversos tipos de variáveis COBOL
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.
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
Registros EBCDIC convertidos no Emulador para ASCII
O arquivo no formato EBCDIC:
Formato HEX
Usando comando de linha Hexadecimal o arquivo mostrará os registros no formato EBCDIC divididos em Alto e Baixo do octeto de bits.
Neste print exemplifico os registros de 15 até 19 no formato hexadecimal.
Conheça os diversos formatos
- Low-Values
- High-Values
- Initialize de X a 9
- Initialize de espaços e zero
Computacional de 1 a 5
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