Escolar Documentos
Profissional Documentos
Cultura Documentos
,
Cientista da Computacão pelo IMES-SCS,
,
Especialista em Telecomunicacões pela
FAAP-SP, mestrando em ciência da
,
computacão pela UFAbc-sp.
1
Preparation
Presentation
História Conheca
, a xpto !!
Você é o mais novo estagiário da XPTO e, portanto passará por esse programa
de treinamento em COBOL, junto com o TSO e a linguagem JCL, utilizados na
plataforma mainframe. Todo o conhecimento de lógica de programação que você
possui será usado neste treinamento.
Consultoria
em
Desenvolvimento
de
Software
Teoria
Introdu ão à ç 1
linguagem cobol
Origens
Burroughs Corporation
IBM
Minneapolis-Honeywell (Honeywell Labs)
RCA
Sperry Rand
Sylvania Electric Products
Força Aérea dos Estados Unidos
David Taylor Model Basin
Agência Nacional de Padrões (National Bureau of Standards ou NBS).
Este comitê foi presidido por um membro do NBS. Um comitê de Médio Prazo e
outro de Longo Prazo foram também propostos na reunião do Pentágono. Entretanto,
embora tenha sido formado, o Comitê de Médio Prazo nunca chegou a funcionar; e o
Comitê de Longo Prazo nem chegou a ser formado. Por fim, um subcomitê do Comitê
de Curto Prazo desenvolveu as especificações da linguagem COBOL. Este subcomitê
era formado por seis pessoas:
FLOW-MATIC
1
dados eram definidas preenchendo formulários pré-impressos.
CONTRAM
COBOL II
O COBOL II foi liberado pela IBM no inicio dos anos 90 e é a atual versão
utilizada pelas empresas usuárias de computadores de Grande Porte. É uma
linguagem poderosa e flexível para as aplicações comerciais atuais e permite a
codificação de programas especificados pelas metodologias: Programação
Estruturada, TOP-DOWN e MODULAR.
algoritmo batch
execute rotina-inicializar
execute rotina-processar até fim dos arquivos de entrada
execute rotina-termino
fim-algoritmo
Macro-Fluxo
SYSIN
EEXXNN01
SYSOUT
Observação
Além disso, também deve ser exibido o número de salários que foram
calculados e a soma de todos os salários.
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//GPXXNNE1 JOB 'SEUNOME',MSGCLASS=X,CLASS=C,NOTIFY=GPXXNN,TIME=(0,20)
//*******************************************************************
//JOBLIB DD DSN=GP.GERAL.LOADLIB,DISP=SHR
//STEP1 EXEC PGM=EEXXNN01
//SYSIN DD *
0150
0085
0180 Sentinela.
0025
0090
0125
0070 e
0000
//*
Programa COBOL
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*--------------------------------------------------------------*
* EXEMPLO 01 - COBOL LEVEL 1 *
*--------------------------------------------------------------*
* OBJETIVO : CALCULAR O VALOR A RECEBER DE VARIOS FUNCIONARIOS *
* COM BASE NA QUANTIDADE DE HORAS TRABALHADAS, COM *
* SALARIO FIXO DE R$ 25,00 POR HORA. *
*--------------------------------------------------------------*
IDENTIFICATION DIVISION.
*--------------------------------------------------------------*
PROGRAM-ID. EEXXNN01.
AUTHOR. GRACE.
*--------------------------------------------------------------*
ENVIRONMENT DIVISION.
*--------------------------------------------------------------*
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
*--------------------------------------------------------------*
DATA DIVISION.
*--------------------------------------------------------------*
FILE SECTION.
WORKING-STORAGE SECTION.
77 QTDHRSTRAB PIC 9(04).
77 CONTFUNC PIC 9(05).
77 SOMASAL PIC 9(12)V99.
77 SALARIO PIC 9(06)V99.
1
*--------------------------------------------------------------*
PROCEDURE DIVISION.
*--------------------------------------------------------------*
0000-EEXXNN01.
PERFORM 1000-INICIALIZAR
PERFORM 2000-PROCESSAR
UNTIL QTDHRSTRAB = 0
PERFORM 3000-TERMINO
STOP RUN
.
1000-INICIALIZAR.
MOVE 0 TO CONTFUNC
MOVE 0 TO SOMASAL
PERFORM 1500-LER-SYSIN
.
1500-LER-SYSIN.
ACCEPT QTDHRSTRAB FROM SYSIN
IF QTDHRSTRAB NOT = 0
COMPUTE CONTFUNC = CONTFUNC + 1
END-IF
.
2000-PROCESSAR.
COMPUTE SALARIO = QTDHRSTRAB * 25
COMPUTE SOMASAL = SOMASAL + SALARIO
DISPLAY "*********************************"
DISPLAY "FUNCIONARIO........: " CONTFUNC
DISPLAY "QTDE. HORAS TRAB...: " QTDHRSTRAB
DISPLAY "SALARIO............: " SALARIO
DISPLAY "*********************************"
PERFORM 1500-LER-SYSIN
.
3000-TERMINO.
DISPLAY "*-------------------------------------------------*"
DISPLAY " TOTAL DE FUNCIONARIOS LIDOS.: " CONTFUNC
DISPLAY "*-------------------------------------------------*"
DISPLAY " SOMA DOS SALARIOS A PAGAR...: " SOMASAL
DISPLAY "*-------------------------------------------------*"
DISPLAY "* TERMINO NORMAL DO EEXXNN01 *"
DISPLAY "*-------------------------------------------------*"
.
ACCEPT da SYSIN
12345678911234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//GPXXNNE1 JOB ‘SEUNOME’,MSGCLASS=X,CLASS=C,NOTIFY=GPXXNN,TIME=(0,20)
//*********************’*********************************************
//JOBLIB DD DSN=GP.GERAL.LOADLIB,DISP=SHR
//STEP1 EXEC PGM=EEXXNN01
//SYSIN DD *
0150
0085
0180
0025
0090
0125
0070
0000
//*
Cada vez que o programa passa pela instrução ACCEPT, uma linha da SYSIN
do JCL é carregada na variável QTDHRSTRAB.
DISPLAY
COMPUTE
Observe o compute com o número 0,5 escrito com vírgula para separar a parte
decimal. Isso só é possível se no parágrafo SPECIAL-NAMES for utilizado a
declaração DECIMAL-POINT IS COMMA como será visto mais adiante.
𝐵
𝑥 =𝐴+
𝐷
𝐶+𝐸+𝐹
convertida para o formato linear fica
X = A + (B /(C + (D / (E + F))))
WS-NOME
G R A C E H O P P E R
Alinhamento Numérico
Os dados são acomodados na variável receptora alinhando-se da direita para a
esquerda. Se a variável emissora for maior que a receptora os dígitos mais a esquerda
da variável emissora serão truncados. Quando a variável receptora for maior que a
emissora ou o valor numérico menor que o tamanho da variável, ocorre preenchimento
com zeros à esquerda. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
MOVE 7010,50 TO WS-VALOR
WS-VALOR
0 0 0 0 0 0 7 0 1 0 5 0
Quando há vírgula na variável emissora e receptora, separando a parte inteira
da decimal, as vírgulas são alinhadas e depois o move é realizado. O que não couber
na parte inteira (à esquerda) ou decimal (à direita) é truncado.
Exemplos de MOVE:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
MOVE 0 TO WS-CTLIDO
WS-CTGRAVA
WS-CTDESP
MOVE 3.14159 TO WS-PI
MOVE ZEROS TO WS-ACUMULADOR
MOVE SPACES TO WS-MENSAGEM
MOVE ALL “-” TO WS-LINHA
MOVE “N” TO WS-FIM
MOVE HIGH-VALUES TO WS-CODCLI
MOVE LOW-VALUES TO WS-CHAVE
1
ser movidas para variáveis alfanuméricas. A opção ALL move uma constante repetida
vezes até preencher a variável receptora.
A tabela abaixo mostra quais tipos de variáveis podem ter seu conteúdo
movido para outros tipos de variáveis.
LOW-VALUES
LOW-VALUES e HIGH-VALUES
são respectivamente o menor e o maior
valor que se pode armazenar em uma
variável. Na tabela EBCDIC, que é a
tabela de caracteres aceitos pelo
...
mainframe correspondem ao primeiro e
último valor respectivamente, como mostra
a tabela ao lado: .
HIGH-VALUES
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
* VE – VARIAVEL EMISSORA
77 VE-ALFANUMERICO PIC X(10).
77 VE-NUMERICO-INTEIRO PIC 9(10).
77 VE-NUMERICO-NAO-INTEIRO PIC 9(08)V99.
77 VE-NUMERICO-EDITADO PIC $ZZ.ZZZ.ZZ9,99+.
77 VE-ALFANUMERICO-EDITADO PIC XXBXXBXXBXXBXX.
77 VE-ALFABETICO PIC A(10).
* VR – VARIAVEL RECEPTORA
77 VR-ALFANUMERICO PIC X(10).
77 VR-NUMERICO-INTEIRO PIC 9(10).
77 VR-NUMERICO-NAO-INTEIRO PIC 9(08)V99.
77 VR-NUMERICO-EDITADO PIC $ZZ.ZZZ.ZZ9,99+.
77 VR-ALFANUMERICO-EDITADO PIC XXBXXBXXBXXBXX.
77 VR-ALFABETICO PIC A(10).
*----------------------------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------------------------*
MOVE '1A2B3C4D5E' TO VE-ALFANUMERICO
MOVE 123 TO VE-NUMERICO-INTEIRO
MOVE 123,45 TO VE-NUMERICO-NAO-INTEIRO
MOVE 678,90 TO VE-NUMERICO-EDITADO
MOVE '1A2B3C4D5E' TO VE-ALFANUMERICO-EDITADO
MOVE 'QWERTYUIOP' TO VE-ALFABETICO
DISPLAY '*----------------------------------------------*'
DISPLAY 'CONTEUDO VARIAVEL EMISSORA'
DISPLAY '*----------------------------------------------*'
DISPLAY 'VE-ALFANUMERICO ' VE-ALFANUMERICO
DISPLAY 'VE-NUMERICO-INTEIRO ' VE-NUMERICO-INTEIRO
DISPLAY 'VE-NUMERICO-NAO-INTEIRO ' VE-NUMERICO-NAO-INTEIRO
DISPLAY 'VE-NUMERICO-EDITADO ' VE-NUMERICO-EDITADO
DISPLAY 'VE-ALFANUMERICO-EDITADO ' VE-ALFANUMERICO-EDITADO
DISPLAY 'VE-ALFABETICO ' VE-ALFABETICO
*----------------------------------------------------------------*
*----------------------------------------------*
CONTEUDO VARIAVEL EMISSORA
*----------------------------------------------*
VE-ALFANUMERICO 1A2B3C4D5E
VE-NUMERICO-INTEIRO 0000000123
VE-NUMERICO-NAO-INTEIRO 0000012345
VE-NUMERICO-EDITADO $ 678,90+
VE-ALFANUMERICO-EDITADO 1A 2B 3C 4D 5E
VE-ALFABETICO QWERTYUIOP
Foram feitos vários MOVEs de variáveis de um tipo para todos os outros tipo,
1
as que dão erros na compilação estão escritos em vermelho, já as que produzem
valores errados estão em azul.
*----------------------------------------------------------------*
MOVE VE-ALFANUMERICO TO VR-ALFANUMERICO
MOVE VE-ALFANUMERICO TO VR-NUMERICO-INTEIRO
MOVE VE-ALFANUMERICO TO VR-NUMERICO-NAO-INTEIRO
MOVE VE-ALFANUMERICO TO VR-NUMERICO-EDITADO
MOVE VE-ALFANUMERICO TO VR-ALFANUMERICO-EDITADO
MOVE VE-ALFANUMERICO TO VR-ALFABETICO
*----------------------------------------------------------------*
MOVE VE-NUMERICO-INTEIRO TO VR-ALFANUMERICO
MOVE VE-NUMERICO-INTEIRO TO VR-NUMERICO-INTEIRO
MOVE VE-NUMERICO-INTEIRO TO VR-NUMERICO-NAO-INTEIRO
MOVE VE-NUMERICO-INTEIRO TO VR-NUMERICO-EDITADO
MOVE VE-NUMERICO-INTEIRO TO VR-ALFANUMERICO-EDITADO
MOVE VE-NUMERICO-INTEIRO TO VR-ALFABETICO
*----------------------------------------------------------------*
MOVE VE-NUMERICO-NAO-INTEIRO TO VR-ALFANUMERICO
MOVE VE-NUMERICO-NAO-INTEIRO TO VR-NUMERICO-INTEIRO
MOVE VE-NUMERICO-NAO-INTEIRO TO VR-NUMERICO-NAO-INTEIRO
MOVE VE-NUMERICO-NAO-INTEIRO TO VR-NUMERICO-EDITADO
MOVE VE-NUMERICO-NAO-INTEIRO TO VR-ALFANUMERICO-EDITADO
MOVE VE-NUMERICO-NAO-INTEIRO TO VR-ALFABETICO
*----------------------------------------------------------------*
MOVE VE-NUMERICO-EDITADO TO VR-ALFANUMERICO
MOVE VE-NUMERICO-EDITADO TO VR-NUMERICO-INTEIRO
MOVE VE-NUMERICO-EDITADO TO VR-NUMERICO-NAO-INTEIRO
MOVE VE-NUMERICO-EDITADO TO VR-NUMERICO-EDITADO
MOVE VE-NUMERICO-EDITADO TO VR-ALFANUMERICO-EDITADO
MOVE VE-NUMERICO-EDITADO TO VR-ALFABETICO
*----------------------------------------------------------------*
MOVE VE-ALFANUMERICO-EDITADO TO VR-ALFANUMERICO
MOVE VE-ALFANUMERICO-EDITADO TO VR-NUMERICO-INTEIRO
MOVE VE-ALFANUMERICO-EDITADO TO VR-NUMERICO-NAO-INTEIRO
MOVE VE-ALFANUMERICO-EDITADO TO VR-NUMERICO-EDITADO
MOVE VE-ALFANUMERICO-EDITADO TO VR-ALFANUMERICO-EDITADO
MOVE VE-ALFANUMERICO-EDITADO TO VR-ALFABETICO
*----------------------------------------------------------------*
MOVE VE-ALFABETICO TO VR-ALFANUMERICO
MOVE VE-ALFABETICO TO VR-NUMERICO-INTEIRO
MOVE VE-ALFABETICO TO VR-NUMERICO-NAO-INTEIRO
MOVE VE-ALFABETICO TO VR-NUMERICO-EDITADO
MOVE VE-ALFABETICO TO VR-ALFANUMERICO-EDITADO
MOVE VE-ALFABETICO TO VR-ALFABETICO
*----------------------------------------------------------------*
*----------------------------------------------*
RESULTADO DO MOVE DE ALFANUMERICO PARA OUTRAS
*----------------------------------------------*
VR-ALFANUMERICO 1A2B3C4D5E
VR-NUMERICO-INTEIRO 1A2B3C4D55
VR-NUMERICO-NAO-INTEIRO 2B3C4D5500
VR-NUMERICO-EDITADO $22.334.455,00+
VR-ALFANUMERICO-EDITADO 1A 2B 3C 4D 5E
VR-ALFABETICO 1A2B3C4D5E
Mother of God!
IF ELSE END-IF
Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXIF WS-QTDEST < WS-QTDMIN THEN
XXXXXX*-------INSTRUCOES SE CONDICAO FOR VERDADEIRA
XXXXXXXXXXX COMPUTE WS-QTDREP = WS-QTDMAX – WS-QTDMIN
XXXXXXXXXXX DISPLAY “QUANTIDADE PARA REPOR NO ESTOQUE = “ WS-QTDREP
XXXXXXXXXXXELSE
XXXXXX*-------INSTRUCOES SE CONDICAO FOR FALSA
XXXXXXXXXXX MOVE 0 TO WS-QTDREP
XXXXXXXXXXX DISPLAY “NAO HA NADA PARA REPOR NO ESTOQUE”
XXXXXXXXXXXEND-IF
OPERADORES RELACIONAIS
Símbolo Palavra em Significado
COBOL
= EQUAL igual
NOT = NOT EQUAL diferente
< LESS Menor
>= NOT LESS maior ou igual
NOT < NOT LESS maior ou igual
> GREATER maior
<= NOT GREATER menor ou igual
NOT > NOT GREATER menor ou igual
OPERADORES LÓGICOS
Operador Significado Prioridade
( ) parênteses 0
NOT NÃO 1
AND E 2
OR OU 3
OPERADORES DE CATEGORIAS
IS POSITIVE
Teste de
IS NEGATIVE
Sinal
IS ZERO
Teste de IS NUMERIC
Classe IS ALPHABETIC
XXXXXX*--------------------IF ENCADEADO--------------------*
XXXXXXX IF A > B
XXXXXXXXXXX IF A > C
XXXXXXXXXXX IF B > C
XXXXXXXXXXXXXXXXX DISPLAY C “ – ” B “ – ” A
XXXXXXXXXXX ELSE
XXXXXXXXXXXXXXXXX DISPLAY B “ – ” C “ – ” A
XXXXXXXXXXX END-IF
XXXXXXXXXXX ELSE
XXXXXXXXXXXXXX DISPLAY B “ – ” A “ – ” C
XXXXXXXXXXX END-IF
XXXXXXXXXXXELSE
XXXXXXXXXXX IF A > C
XXXXXXXXXXXXXX DISPLAY C “ – ” A “ – ” B
XXXXXXXXXXX ELSE
XXXXXXXXXXX IF B > C
XXXXXXXXXXXXXXXXX DISPLAY A “ – ” C “ – ” B
XXXXXXXXXXX ELSE
XXXXXXXXXXXXXXXXX DISPLAY A “ – ” B “ – ” C
XXXXXXXXXXX END-IF
XXXXXXXXXXX END-IF
XXXXXXXXXXXEND-IF
XXXXXX*---------------------IF COMPLEXO--------------------*
XXXXXXXXXXXIF R4 = 0 AND R100 NOT = 0 OR R400 = 0 AND R3600 NOT = 0
XXXXXXXXXXX DISPLAY “EH BISSEXTO”
XXXXXXXXXXXELSE
XXXXXXXXXXX DISPLAY “NAO EH BISSEXTO”
XXXXXXXXXXXEND-IF
XXXXXX*------------------IF DE CATEGORIAS------------------*
XXXXXXXXXXXIF WS-SALARIO IS NUMERIC AND
XXXXXXXXXXXXXXWS-NOME IS ALPHABETIC AND
XXXXXXXXXXXXXXWS-TAXA IS POSITIVE
XXXXXXXXXXX PERFORM 150-CALCULA-VALOR
XXXXXXXXXXXELSE
XXXXXXXXXXX DISPLAY “REGISTRO INVALIDO”
XXXXXXXXXXXEND-IF
PERFORM Básico
Exemplos:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*
* POR DEFAULT, SERA VERIFICADO A CONDICAO PRIMEIRO E SE
* FOR VERDADEIRA, A ROTINA SERA EXECUTADA
*
PERFORM 030-PROCESSAR
UNTIL FS-VCADPRD = ‘10’
*
* COM A OPCAO WITH TEST BEFORE (DEFAULT)
* O PERFORM FUNCIONA COMO O LACO DE REPETICAO
* WHILE (ENQUANTO)
*
PERFORM 055-IMPRIME-TABUADA
WITH TEST BEFORE
UNTIL WS-CONTADOR > 10
*
* COM A OPCAO WITH TEST AFTER (NAO DEFAULT)
* O PERFORM FUNCIONA COMO O LACO DE REPETICAO
* DO/WHILE (FACA/ENQUANTO), EXECUTANDO A ROTINA
* PRIMEIRO E DEPOIS VERIFICANDO SE PODE EXECUTAR NOVAMENTE
*
PERFORM 080-CALCULA-JUROS
WITH TEST AFTER
UNTIL WS-MES > 12
Teoria MACRO-FLUXO
Símbolo Significado
Programa
1
os de saída (OUTPUT) ficam abaixo. Um macro-fluxo dá uma primeira idéia do esforço
necessário para desenvolver o algoritmo. Quanto maior a quantidade de arquivos que
o programa deve manipular, maior deve ser sua complexidade.
GeraComi
Arquivo de saída
Comissao (gravação) OUPUT
Practice
A. ( ) – O COBOL foi criado em 1959 pelo CODASYL, mas a primeira versão só saiu
em 1960 com o nome COBOL 60.
2) Coloque entre parênteses qual parte do processamento BATCH essas tarefas são
1
executadas:
f. ( ) COMPUTE WS-SALARIO=WS-HORASTRAB*WS-SALARIOHORA
h. ( ) MOVE WS-SALARIO TO 25
Parágrafo 0000-EEXXNN02
Executar o parágrafo 1000-INICIALIZAR
Executar o parágrafo 2000-PROCESSAR
até que a variável WS-FIM seja igual a “S”
Executar o parágrafo 3000-termino
Parar o programa
Parágrafo 1000-inicializar
Mover zero para as variáveis WS-CONT, WS-CTLIDO
Mover “N” para a variável WS-FIM
Executar o parágrafo 1500-LER-SYSIN
Parágrafo 1500-LER-SYSIN
Receber dado da SYSIN e armazenar na variável WS-TAB
Se a variável WS-TAB for igual a zero
Mover “S” para a variável WS-FIM
Senão
Incrementar de um a variável WS-CTLIDO
Fim-se
Parágrafo 2000-PROCESSAR
Executar o parágrafo 2500-IMPRIME-TABUADA
até que a variável WS-CONT seja igual a dez
Mover zero para a variável WS-CONT
Executar o parágrafo 1500-LER-SYSIN
Parágrafo 2500-IMPRIME-TABUADA
Incrementar de um a variável WS-CONT
Multiplicar as variáveis WS-CONT e WS-TAB dando WS-PROD
Exibir WS-TAB “ X “ WS-CONT “ = “ WS-PROD
Parágrafo 3000-TERMINO
Exibir “Quantidade de números lidos = ” WS-CTLIDO
Exibir “TERMINO NORMAL DO EEXXNN02”
1
0000-EEXXNN02.
PERFORM 1000-INICIALIZAR
PERFORM 2000-PROCESSAR UNTIL WS-FIM = "S"
PERFORM 3000-TERMINO
STOP RUN
.
1000-INICIALIZAR.
.
1500-LER-SYSIN.
.
2000-PROCESSAR.
.
2500-IMPRIME-TABUADA.
.
3000-TERMINO.
0000-EEXXNN03.
PERFORM 1000-INICIALIZAR
PERFORM 2000-PROCESSAR UNTIL WS-FIM = "S"
PERFORM 3000-TERMINO
STOP RUN
.
1000-INICIALIZAR.
MOVE "N" TO WS-FIM
MOVE 0 TO WS-CTLIDO
PERFORM 1500-LER-SYSIN
.
1500-LER-SYSIN.
ACCEPT WS-NUM FROM SYSIN
IF WS-NUM = 0
MOVE "S" TO WS-FIM
ELSE
COMPUTE WS-CTLIDO = WS-CTLIDO + 1
END-IF
.
2000-PROCESSAR.
MOVE 1 TO WS-CONT
MOVE 0 TO WS-SOMA
PERFORM 2500-CALCULA UNTIL WS-CONT > WS-NUM
DISPLAY “A SOMA DOS NATURAIS ATE “ WS-NUM " = " WS-SOMA
PERFORM 1500-LER-SYSIN
.
2500-CALCULA.
COMPUTE WS-SOMA = WS-SOMA + WS-CONT
COMPUTE WS-CONT = WS-CONT + 1
.
3000-TERMINO.
DISPLAY "TOTAL DE NUMEROS LIDOS = " WS-CTLIDO
DISPLAY "TERMINO NORMAL DO EEXXNN03"
.
Parágrafo 0000-EEXXNN03.
Executar o parágrafo 1000-inicializar
Executar o parágrafo 2000-processar até que WS-FIM seja “S”
1
Executar o parágrafo 3000-termino
Parar o programa
Parágrafo 1000-INICIALIZAR.
Parágrafo 1500-LER-SYSIN.
Parágrafo 2000-PROCESSAR.
Parágrafo 2500-calcula.
Parágrafo 3000-TERMINO.
Performance
Objetivo do Programa
Os dados dos diversos empréstimos serão fornecidos via SYSIN e lidos pelo
programa GPXXNN01, que deverá calcular o valor da parcela de cada empréstimo a
partir da fórmula abaixo, onde vp é o valor da parcela, ve é o valor do empréstimo, j é
o juros e n é a quantidade de parcelas.
𝑗
𝑣𝑒 × 100
𝑣𝑝 =
1
1−
𝑗 𝑛
(1 + )
100
Macro-Fluxo
SYSIN
GPXXNN01
SYSOUT
Layout da SYSIN
Layout da SYSOUT
11234567892123456789312345678941234567895
12345678901234567890123456789012345678901234567890
**************************************************
TOTAL DE SIMULACOES LIDAS........: 9999
TOTAL DE SIMULACOES PROCESSADAS..: 9999
**************************************************
11234567892123456789312345678941234567895
12345678901234567890123456789012345678901234567890
**************************************************
* TERMINO NORMAL DE PROCESSAMENTO DO GPXXNN01 *
**************************************************
Observação
0000-PRINCIPAL
1500-LER-SYSIN 1500-LER-SYSIN
JOB de Execução
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//GPXXNN01 JOB 'SEUNOME',MSGCLASS=X,CLASS=C,NOTIFY=GPXXNN,TIME=(0,20)
//*******************************************************************
//STEP1 EXEC PGM=GPXXNN01
//STEPLIB DD DSN=GP.GERAL.LOADLIB,DISP=SHR
//SYSIN DD *
000100100000100010
000200400000080015
000308000000150050
000410000000040060
000000000000000000
//*
AC
CE
PT
0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0
WS-REG-SYSIN
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
Parte 1 37
Parágrafo 1000-INICIALIZAR
Mover zero para os contadores
contador de simulações lidas
contador de simulações processadas
Executar o parágrafo 1500-LER-SYSIN
Parágrafo 1500-LER-SYSIN
Ler um registro na SYSIN (ACCEPT)
Se o registro não for tudo zero
Somar 1 ao contador de Simulações lidas
Parágrafo 2000-PROCESSAR
Calcular o valor da parcela do empréstimo
Calcular o valor da soma das parcelas
Exibir os dados na SYSOUT
Somar 1 ao contador de simulações processadas
Executar o parágrafo 1500-LER-SYSIN
Estou fera!
Fiz Certo!
O que é um Mainframe?
Preparation 2
Presentation
Você poderá ter esse ambiente em sua casa. Todo estagiário da XPTO tem um
mainframe virtual chamado Hercules, que poderá inclusive ser instalado em seu
notebook ou netpc.
Teoria finalidade
2
O TSO (Time Sharing Option) é um ambiente interativo que compartilha o
tempo do Mainframe com seus usuários, mas o usuário tem a impressão que é o único
a utilizar o Mainframe.
O nome Time Sharing Option deriva do fato que quando surgiu nos anos de
1960, “tempo compartilhado” (time-sharing) era considerada uma característica
opcional, comparado com o padrão de processamento em lotes (Batch) da época.
Então o TSO era oferecido como uma característica opcional do Sistema Operacional
OS/MVT. Ele se tornou padrão como parte do Sistema Operacional MVS em 1974.
TSO/E (E=extentions) é uma série de extensões ao TSO original e é a mais usada
hoje em dia. Todos as versões atuais do Sistema Operacional, a família Z/OS, tem o
TSO e TSO/E instalados e é comum chamá-los apenas de TSO.
No campo Session Name você pode colocar o seu nome, pois ele apenas
identifica a sessão do Telnet. No campo Host Name coloca-se o número IP do
servidor. No campo Telnet Port coloca-se o número da porta habilitada no servidor
para a conexão remota. No campo Terminal Time deixar 3279, que é o tipo de
terminal que estamos usando. Finalmente pressione o botão connect para se conectar
ao servidor.
IP
SOCKET
PORT
Basta pressionar a tecla Esc para ter acesso ao menu de serviços do Sistema
Operacional. Digite então TSO e pressione ENTER para entrar na tela de Login do
TSO.
L GPAZ99
USERID
ç
Navega ão por
Teoria menus e painéis
2
O uso do TSO se dá através de Menus, Painéis ou Comandos. A Navegação
por menus é a mais usual. Um Menu é sempre composto de opções onde você deverá
escolher uma, e somente uma, opção. Um Menu pode levar a outro Menu ou a um
Painel. O Painel é o último estágio da navegação dentro do TSO. No painel você
deverá digitar os dados solicitados e pressionar ENTER, para que ação seja
executada.
PF7
Ctrl esquerdo Ctrl direito
PF10 PF11
Modificando as
Teoria configura ões ç
2
A partir do Menu principal do TSO, digitamos P para ir ao menu PDF e depois 0
para ir ao painel ISPF Setting. Também podemos abreviar a navegação e digitarmos
as duas opções de uma única vez, separando-as por ponto (P.0) ou ponto-e-vírgula
(P;0).
Aloca ão de ç
Teoria data set (arquivo)
No ambiente de Grande Porte (Mainframe) os arquivos são chamados de
DATA SET (Conjunto de Dados). O nome de um arquivo deve seguir as seguintes
regras:
de 1 a 8 caracteres
Qualificador_1
Qualificador_2
Qualificador_3
Qualificador_n
máximo de 44 caracteres
Exemplos:
CADCLI
BACKLOG.ACTIVIT
GP.GPAZ99.COBLIB
XPTO.RHSP.FERIAS.2010
2
Um particionado é um arquivo subdividido em
um pequeno e limitado número de arquivos virtuais
chamados membros. Para nossos propósitos, você
pode considerar um membro como um arquivo,
cujos registros possuem um tamanho fixo,
usualmente de 80 caracteres. Os particionados
também são chamados de bibliotecas (Library), pois
lembram uma estante cheia de livros, que no caso
são os membros.
BUFFER
FIFO
PROGRAMA
STRO
STRO
IRG
STRO
STRO
STRO
R EGI
R EGI
R EGI
STRO
R EGI
STRO
IRG
R EGI
STRO
STRO
STRO
R EGI
R EGI
R EGI
STRO
R EGI
STRO
IRG
R EGI
STRO
STRO
STRO
R EGI
R EGI
R EGI
R EGI
IRG
R EGI
STRO
IRG
STRO
IRG
R EGI
STRO
IRG
R EGI
STRO
IRG
R EGI
STRO
IRG
R EGI
STRO
IRG
R EGI
STRO
IRG
R EGI
IRG
R EGI
2
Data Set Information.
Visualiza ão dos ç
Teoria arquivos alocados
A partir do menu principal, digitamos P.3.4, que nos levará ao painel Data Set
List Utility, que permitirá a visualização dos arquivos criados, bem como dos membros
dos arquivos particionados. No campo Dsname Level, que significa Data Set Name
Level, colocamos o nome do arquivo completo ou o começo do nome do arquivo.
Exemplo:
GP.GPAZ99
GP.GPAZ99.C*
GP.GPAZ*
GP.*.COBLIB
Quando paramos logo antes do ponto, que separa o nome do arquivo, não
usamos o asterisco, que neste caso faz o papel de coringa. No segundo exemplo
GP.GPAZ99.C*, desejo exibir todos os arquivos que comecem com GP.GPAZ99.C, o
coringa permite que qualquer outro caractere apareça após o último C.
INITIAL VIEW 1
2
INITIAL VIEW 2
INITIAL VIEW 3
INITIAL VIEW 4
manipula ão dos ç
Teoria arquivos alocados
2
Após exibir os arquivos pelo painel Data Set List Utility, podemos executar
diversas operações, tais como renomear, excluir, editar, compactar, etc. Basta colocar
o cursor pelo menos a 1 caractere de distância do lado esquerdo do nome do arquivo
e digitar um dos comandos:
Observe que ele está com 100% de uso. Isso ocorre porque sempre que se
editar membros será preciso salvar as alterações. O TSO salva o membro alterado em
outro lugar dentro do particionado, deixando o anterior indisponível. Isso faz com que o
arquivo particionado fique logo cheio, mesmo que tenha apenas um membro. Neste
caso é necessário comprimir (Z = Compress) o particionado, liberando os membros
não usados. O ABEND SE37 é o indício de que o arquivo está 100% usado e precisa
ser comprimido, ele acontece ao salvar um membro, ou sair da edição do membro
com PF3.
Teoria ç
Edi ão de membros
2
SAVE salva o membro
RES restore – apaga as mensagens exibidas pelo TSO
HI ON ativa as cores de acordo com o que está sendo digitado
HI ON COBOL ativa as cores para a linguagem COBOL
HI ON JCL ativa as cores para a linguagem JCL
HI ON ASM ativa as cores para a linguagem Assembly
HEX ON exibe o arquivo em hexadecimal
HEX OFF desliga a exibição do arquivo em hexadecimal
NUM ON enumera as linhas de 100 em 100 (o mesmo que RENUM)
NUM OFF enumera as linhas de 1 em 1
CAPS ON transforma tudo o que foi digitado em maiúsculo
CAPS OFF desativa CAPS ON
RECOVERY ON apenas uma vez, habilita o UNDO (desfazer)
UNDO desfaz a última modificação no texto
F xxxx find – localiza a string xxxx no texto – PF5 posiciona na próxima
C xxx yyy change – troca a primeira ocorrência de xxx por yyy
C xxx yyy ALL change – troca todas as ocorrências de xxx por yyy
L 44 locate – posiciona o cursor na linha 44
M + PF8 move – Letra M e tecla PF8 – Avança para o fim do texto
M + PF7 move – Letra M e tecla PF7 – Avança para o início do texto
EXC aaa ocultar a linha com a string aaa.
EXC aaa ALL ocultar todas as linhas com a string aaa.
PFSHOW OFF não exibe o rodapé, com as teclas de função
PFSHOW ON exibe o rodapé, com as teclas de função
PROF exibe o perfil do usuário (PROFILE) do usuário
BOTTOM avança para o fim do texto
TOP avança para o início do texto
START Abre uma nova janela
LIST Exibe um menu com as janelas abertas
Toda linha que começa com '''''' não foi usada e quando se pressiona
ENTER elas são apagadas. Para inserir linhas, basta colocar o cursor nos asteriscos
da lateral esquerda da linha Top of Data e digitar I seguido da tecla ENTER. Para
inserir 5 linhas, digitar I5. Toda vez que for pressionado ENTER após a digitação de
uma linha, uma nova linha com '''''' será exibida. Se for pressionado ENTER
novamente, ela desaparece e será necessário digitar I em qualquer linha da lateral
esquerda da tela.
I insere uma linha. I5 insere 5 linhas (ou outro número que desejar).
D Exclui uma linha. D5 Exclui 5 linhas.
R repete uma linha. R5 repete a linha 5 vezes.
M move a linha para um destino (usar A = after ou B=before) na linha de destino
C copia a linha para um destino (usar A = after ou B=before) na linha de destino
LC (Lower Case) converte os caracteres da linha para minúsculo
UC (Upper Case) converte os caracteres da linha para maiúsculo
X oculta uma linha. X5 oculta 5 linhas.
S exibe linha ocultada. S5 exibe 5 linhas ocultadas.
TS (Text Split) divide a linha na posição atual do cursor
COLS insere uma régua na linha, o que ajuda na identificação das colunas
) descola linha para a direita. )5 desloca 5 colunas para a direita.
( descola linha para a esquerda. (5 desloca 5 colunas para a esquerda.
No campo option digitamos C para copiar. Abaixo da frase Specify "From" Data
Set below, then press ENTER key, digitamos nos campos Project, Group, Type e
Member o nome do particionado e do membro que desejamos copiar e pressionamos
ENTER.
Abaixo da frase Specify "To" Data Set Below, digitamos nos campos Project,
Group, Type o nome do particionado de destino do membro copiado. Se não
preenchermos o campo member, ele será copiado com o mesmo nome, ou damos um
novo nome para o membro e pressionamos ENTER.
Uma mensagem aparece no canto superior direito indicando que a cópia foi
realizada com sucesso, como mostra as telas abaixo.
B) Mova o membro DICAS da COBLIB de seu instrutor para seu PDS COBLIB.
Anote o procedimento abaixo. O que ocorreu?
Programa Fonte
COBOL
GP.GPXXNN.COBLIB
(GPXXNN04)
p
GP.GPXXNN.JOBLIB
1º. Passo
(COMPCOB)
BOOKs PRE-COMPILE
GP.GPXXNN.BOOKLIB d
(CLISP)
Programa Fonte
COBOL
+
s BOOKs
2º. Passo
COMPILE
SPOOL
PROGRAMA
OBJETO
SD.ST
? JOBID
S SYSPRINT
3º. Passo
LIBRARY LINKAGE EDITOR
LOAD A
MODULE GP.GERAL.LOADLIB
(GPXXNN04)
2
instrução COPY. Isso é feito antes de passar o programa fonte pela compilação.
Uma relação de JOB aparece. Identifique o Job Id que você havia obtido.
Coloque uma interrogação (?) à esquerda e pressione ENTER. Os arquivos que
compõem o JOB aparecem.
Na coluna LineID está a linha do programa fonte que está com erro. Na coluna
Message Code os erros terminam com S (Severe), E (Error) ou W (Warning),
dependendo da severidade do erro. Com as teclas PF11 e PF10 é possível deslocar a
tela para a esquerda e direita, assim é possível ler toda a mensagem de erro.
Dica 2) Para abrir uma nova janela, digite START na linha de comando. É
possível abrir mais de 2 janelas simultaneamente. Mas a tecla PF9 só faz a troca entre
2 janelas. Para ver as demais janelas, digitar KEYS na linha de comando e na opção
PF9 colocar SWAP LIST. Ao pressionar PF9 aparece uma lista de janelas. A janela
ativa aparece com *. Para dar nome às janelas, digite SCRNAME nome_da_janela na
linha de comando.
Na próxima página estão as telas onde essas dicas são mostradas na prática.
Practice 2
O A C I D E K N I L
A N A V O T N K R S
C I L O C N O Z I E
A U O N E O B X D M
L Q R E B F P L I A
I A T S O E E Y O N
P M C O B O L B M T
M J O B L I B S A I
O C A R G A L L A C
C S I N T A T I C A
SD.ST
P.2
Menu / Painel
Performance
Instalação do Hercules
É importante ter o Hercules instalado em seu computador para que você possa
praticar e ganhar vivência nesse ambiente. Refaça todos os projetos de programas
feitos na Grande Porte em sua casa.
2
executado em vários sistemas operacionais, incluindo Linux, Windows, FreeBSD,
Solaris e Mac OS X e é liberado sob a licença open source software QPL.
Roger Bowler
Jay Maynard
Estou fera!
Fiz Certo!
Alan Turing
1912 – 1954
Versão 2.3.5
Parte 3 3
Preparation
3
Trocando Ideias É agora que você fala !!
Presentation
Formato do programa
Teoria fonte cobol
3
A linguagem COBOL possui algumas regras a serem seguidas quanto a
formatação do programa fonte. Uma linha de programa COBOL pode ter até 80
caracteres, conforme o formato abaixo:
12345678911234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
NNNNNNCAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBNNNNNNNN
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
(-) Hífen – Indica que existe uma constante alfanumérica entre aspas ou
apóstrofe, que foi iniciada na linha anterior. Uma constante alfanumérica que não cabe
em uma linha, para que seja continuada, precisa ter na próxima linha a indicação da
continuação (hífen na coluna 7) e, em qualquer coluna a partir da 12 (margem B), um
apóstrofe (ou aspas) indicando o início da continuação. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXDISPLAYX“AXLINGUAGEMXDEXPROGRAMACAOXCOBOLXEHXMUITOXUTILIZADA
XXXXXX-XXXXXXXXXXXX“EMXEMPRESASXDEXGRANDEXPORTEXDEVIDOXAXSUAXGRANDEXCAPA
XXXXXX-XXXXXXXXXXXX“CIDADEXDEXPROCESSAMENTOXEXCONFIABILIDADE”
(*) Asterisco – Indica, para o compilador COBOL, que a linha inteira deve ser
tratada como uma linha de comentário. Linhas de comentário não são compiladas e,
portanto não interferem na execução do programa. Porém são importantes para
documentar o programa e esclarecer a lógica desenvolvida pelo programador.
Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
......*----------------------------------------------------------------*
......* EMPRESA : METALURGICA FERRO FORTE LTDA.
......* SISTEMA : CONTABILIDADE
......* PROGRAMA : CONT0231
......*----------------------------------------------------------------*
.......IDENTIFICATION................ ..DIVISION.
......*----------------------------------------------------------------*
.......PROGRAM-ID...................... CONT0231.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
/
......*----------------------------------------------------------------*
.......PROCEDURE ................ ..DIVISION.
......*----------------------------------------------------------------*
Margem A – Colunas de 8 a 11
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
......*----------------------------------------------------------------*
.......DATA............................ DIVISION.
......*----------------------------------------------------------------*
.......FILE....... ....... ....... .... SECTION.
.......WORKING-STORAGE....... ......... SECTION.
Margem B – Colunas de 12 a 72
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
......*--------------------------------------------------------------* x
.......PROCEDURE DIVISION. x
......*--------------------------------------------------------------* x
.......000-GPAZ9901. x
...........PERFORM 010-INICIALIZAR x
...........PERFORM 030-PROCESSAR x
UNTIL WS-FIM = "S" x
...........PERFORM 050-TERMINO x
...........STOP RUN x
............ x
EJECT – igual a / (barra), indica, para a impressora que deve fazer um salto de
página. Pode estar na margem A ou B.
Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
EJECT
......*----------------------------------------------------------------*
.......PROCEDURE ................ ..DIVISION.
......*----------------------------------------------------------------*
EJECT
Teoria As 4 divisões
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
.......IDENTIFICATION DIVISION.
.......ENVIRONMENT DIVISION.
.......DATA DIVISION.
.......PROCEDURE DIVISION.
IDENTIFICATION DIVISION.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*--------------------------------------------------------------*
IDENTIFICATION DIVISION.
*--------------------------------------------------------------*
PROGRAM-ID. GPNENN01.
AUTHOR. COMENTARIO.
DATE-WRITTEN. COMENTARIO.
DATE-COMPILED. SE PRESENTE, O COMPILADOR PREENCHE.
SECURITY. COMENTARIO.
ENVIRONMENT DIVISION.
3
*----------------------------------------------------------------*
CONFIGURATION SECTION.
*----------------------------------------------------------------*
SOURCE-COMPUTER. COMENTARIO.
OBJECT-COMPUTER. COMENTARIO.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
*----------------------------------------------------------------*
INPUT-OUTPUT SECTION.
*----------------------------------------------------------------*
FILE-CONTROL.
SELECT CADALUNO ASSIGN TO UT-S-CADALUNO
FILE STATUS IS FS-CADALUNO.
CONFIGURATION SECTION.
INPUT-OUTPUT SECTION.
FILE SECTION.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
FILE SECTION.
*----------------------------------------------------------------*
FD CADALUN
LABEL RECORD STANDARD
BLOCK CONTAINS 0 RECORDS
RECORDING MODE IS F
RECORD CONTAINS 97 CHARACTERS
DATA RECORD IS REG-CADALUN
.
01 REG-CADALUN.
05 CLASSE-E PIC X(03).
05 NUM-E PIC X(03).
05 NOME-E PIC X(40).
05 ENDE-E PIC X(40).
05 NOTA1-E PIC 99V99 COMP-3.
05 NOTA2-E PIC 99V99 COMP-3.
05 NOTA3-E PIC 99V99 COMP-3.
05 IDADE-E PIC 9(02).
FD RELATO
LABEL RECORD OMITTED
RECORDING MODE IS F
RECORD CONTAINS 80 CHARACTERS
DATA RECORD IS REG-RELATO
.
01 REG-RELATO PIC X(80).
WORKING-STORAGE SECTION.
3
um nível 77 no meio de uma hierarquia. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.1
*----------------------------------------------------------------*
* EXEMPLO DE VARIAVEIS INDEPENDENTES
*----------------------------------------------------------------*
77 WS-CONTADOR PIC 9(05) VALUE 0.
77 WS-MSG PIC X(60) VALUE SPACE.
77 WS-NOME PIC A(40).
*----------------------------------------------------------------*
* EXEMPLO DE VARIAVEIS DE GRUPO
*----------------------------------------------------------------*
01 WS-DATA-SISTEMA.
05 WS-ANO PIC 9(02).
05 WS-MES PIC 9(02).
05 WS-DIA PIC 9(02).
01 WS-DATA-FORMATADA.
05 WS-DIA PIC 9(02).
05 FILLER PIC X(01) VALUE “/”.
05 WS-MES PIC 9(02).
05 FILLER PIC X(03) VALUE “/20”.
05 WS-ANO PIC 9(02).
*----------------------------------------------------------------*
* EXEMPLO DE VARIAVEIS DE GRUPO COM VARIOS NIVEIS
*----------------------------------------------------------------*
01 WS-CLIENTE.
05 WS-CODCLI PIC X(04).
05 WS-NOMECLI.
10 WS-PRIMEIRO-NOME PIC X(15).
10 WS-SOBRENOME PIC X(30).
05 WS-ENDERECO.
10 WS-LOGRADOURO.
15 WS-TIPO-LOGRADOURO PIC X(10).
15 WS-NOME-LOGRADOURO PIC X(30).
10 WS-NUMERO PIC 9(05).
10 WS-COMPLEMENTO PIC X(15).
10 WS-BAIRRO PIC X(25).
10 WS-CIDADE PIC X(25).
10 WS-UF PIC X(02).
05 WS-TELEFONECLI.
10 WS-COD-PAIS PIC 9(03).
10 WS-COD-REGIAO PIC 9(02).
10 WS-NUM-TELEFONE PIC 9(08).
01
05 05 05
10 10 10 10 10 10
15 15 15 15 15 15 15 15
Usamos FILLER para definir constantes dentro de uma variável ou para não
nomear partes da variável que não será tratada pelo programa COBOL. A palavra
FILLER é opcional.
WS-DATA-SISTEMA WS-DATA-SISTEMA
WS-ANO
WS-MES
WS-DIA WS-ANO WS-MES WS-DIA
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXX01 WS-FIM-ARQUIVO PIC X(01).
XXXXXXXXXXX88 SIM VALUE “S”.
XXXXXXXXXXX88 NAO VALUE “N”.
NOME DA VARIÁVEL
FORMATO DA VARIÁVEL
O formato das variáveis em COBOL é especificado pela palavra reservada
PICTURE, ou pela sua abreviação PIC. Os formatos são descritos usando uma das 3
letras seguintes:
3
9 A variável é numérica (números)
X A variável é alfanumérica (letras, números e outros caracteres)
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
01 WS-DATA-SISTEMA.
05 WS-ANO PIC 9(02).
05 WS-MES PIC 9(02).
05 WS-DIA PIC 9(02).
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
77 WS-IDADE-MINIMA PIC 9(02)
VALUE 18.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
77 WS-NOME-ALUNO PIC A(30)
VALUE
‘GRACE MURRAY HOPPER’.
LINKAGE SECTION.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
3
*----------------------------------------------------------------*
* RECEBENDO DADOS VIA PARM DO JCL
*----------------------------------------------------------------*
LINKAGE SECTION.
*----------------------------------------------------------------*
01 LS-PARAMETRO-RECEBIDO.
05 LS-TAMANHO-DO-PARAMETRO PIC S9(4) COMP.
05 LS-DADOS-RECEBIDOS.
10 LS-DATA-RELATORIO PIC X(08).
*----------------------------------------------------------------*
PROCEDURE DIVISION USING LS-PARAMETRO-RECEBIDO.
*----------------------------------------------------------------*
ou
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
* RECEBENDO DADOS DO PROGRAMA PRINCIPAL
*----------------------------------------------------------------*
LINKAGE SECTION.
*----------------------------------------------------------------*
01 LS-DADOS-RECEBIDOS.
XXXX 05 LS-NUMERO-CPF PIC X(11).
XXXX 05 LS-RESULTADO PIC X(03).
*----------------------------------------------------------------*
PROCEDURE DIVISION USING LS-DADOS-RECEBIDOS.
*----------------------------------------------------------------*
PROGRAMA PRINCIPAL
SUB-PROGRAMA
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*--------------------------------------------------------------*
PROCEDURE DIVISION.
*--------------------------------------------------------------*
0000-GPXXNN02.
PERFORM 1000-INICIALIZAR
PERFORM 2000-PROCESSAR
UNTIL WS-FIM = "S"
PERFORM 3000-TERMINO
STOP RUN
.
1000-INICIALIZAR.
MOVE 0 TO WS-CONT
MOVE 0 TO WS-CTLIDO
MOVE "N" TO WS-FIM
PERFORM 1500-LER-SYSIN
.
1500-LER-SYSIN.
ACCEPT WS-TAB FROM SYSIN
IF WS-TAB = 0
MOVE "S" TO WS-FIM
ELSE
ADD 1 TO WS-CTLIDO
END-IF
.
2000-PROCESSAR.
PERFORM 2500-IMPRIME-TABUADA
UNTIL WS-CONT = 10
MOVE 0 TO WS-CONT
PERFORM 1500-LER-SYSIN
.
2500-IMPRIME-TABUADA.
ADD 1 TO WS-CONT
COMPUTE WS-PROD = WS-CONT * WS-TAB
DISPLAY WS-TAB " X " WS-CONT " = " WS-PROD
.
3000-TERMINO.
DISPLAY "TOTAL DE REGISTROS LIDOS = " WS-CTLIDO
DISPLAY "TERMINO NORMAL DO GPXXNN02"
.
Boas práticas
Teoria de programa ão ç
INDENTAÇÃO
IF condicao
bloco para condição satisfeita
ELSE
bloco para condição não satisfeita
END-IF
Deslocar os blocos algumas posições à direita (três posições), para que fiquem
destacados facilita a sua visualização. O ELSE e o END-IF ficam alinhados com o IF,
facilitando a análise do código fonte.
IF condicao
COMPUTE A = (B * C ) ** 4
COMPUTE C = A / 0.005
ELSE
COMPUTE A = (B * C ) ** 5
COMPUTE C = A / 0.015
END-IF
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
IF A > B
IF B > C
COMPUTE A = (B * C ) ** 4
COMPUTE C = A / 0.005
ELSE
COMPUTE A = (B * C ) ** 8
COMPUTE C =7 A / 0.055
END-IF
ELSE
IF A > C
COMPUTE A = (B * C ) ** 5
COMPUTE C = A / 0.007
ELSE
COMPUTE A = (B * C ) ** 9
COMPUTE C = A / 0.007
END-IF
END-IF
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
IF A > B
IF B > C
COMPUTE A = (B * C ) ** 4
COMPUTE C = A / 0.005
ELSE
COMPUTE A = (B * C ) ** 8
COMPUTE C = A / 0.055
END-IF
ELSE
IF A > C
COMPUTE A = (B * C ) ** 5
COMPUTE C = A / 0.007
ELSE
COMPUTE A = (B * C ) ** 9
COMPUTE C = A / 0.007
END-IF
END-IF
Colunas 44 e 52
3
Na COLUNA 44 escrevemos DIVISION, SECTION, PIC, TO do MOVE
Na COLUNA 52 escrevemos VALUE
Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
DATA DIVISION.
WORKING-STORAGE SECTION.
77 WS-PRECO PIC 9(06)V99
VALUE ZERO.
77 WS-TEXTO PIC X(30)
VALUE
“CONTATE O ANALISTA RESPONSAVEL”.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
WORKING-STORAGE SECTION.
77 WS-MSG01 PIC X(30)
VALUE
“ERRO ABERTURA ARQUIVO CADCLI”.
77 WS-MSG02 PIC X(30)
VALUE
“CONTATE O ANALISTA RESPONSAVEL”.
*----------------------------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------------------------*
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
COMPUTE WS-AREA = 3.14159 * WS-RAIO ** 2
*----------------------------------------------------------------*
* NAO HAVIA HARD CODE PARA RESOLVER 1 E 100 NUNCA MUDARAO
*----------------------------------------------------------------*
COMPUTE WS-LUCRO = ((WS-P-VENDA / WS-P-COMPRA) – 1) * 100
3
Muitas vezes criamos variáveis que são usadas durante o processamento do
programa, mas que não são usadas para exibir resultados. Isso acontece porque
existem variáveis que ocupam menos espaço na memória, mas não são apropriadas
para exibir dados, e vice-versa. Então, as variáveis são criadas de acordo com a
necessidade visando melhor desempenho e usabilidade do sistema.
7 6 5 4 3 2 1 0
BIT NIBBLE
BYTE
3
“NOOOOOOSSA!!!”
B 1000
B 1000
1024 1024
1024
KiB 1024 1000
kB 1000
1024
MiB 1024 1000
MB 1000
1024
GiB 1024 1000
GB 1000
1024
TiB 1024 1000
TB 1000
PiB 1000
PB 1000
1024 1024
1024
EiB 1024 1000
EB 1000
ZiB ZB
1024 1024 1000 1000
YiB YB
Decimal
Utiliza 10 símbolos: 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9.
Exemplo:
7 4 1 8
100 . 8 = 1 . 8 = 8
101 . 1 = 10 . 1 = 10
Binário 7418
Utiliza 2 símbolos: 0 e 1.
23 22 21 20
Exemplo:
1 0 1 1
20 . 1 = 1 . 1 = 1
21 . 1 = 2 . 1 = 2
+
22 . 0 = 4 . 0 = 0
23 . 1 = 8 . 1 = 8
11
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
Parte 3 25
Hexadecimal
Utiliza 16 símbolos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E e F.
3
É um sistema posicional onde a posição à esquerda vale 16 vezes o valor da
posição à direita.
Exemplo:
B 1 F E
160 . E = 1 . 14 = 14
161 . F = 16 . 15 = 240
Representacão
, de
Teoria números no cobol
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
77 WS-CTLIDO PIC 9(03)
USAGE DISPLAY.
77 WS-PRECO-VENDA PIC 9(06)V99.
F 7 F 4 F 1 F 8
F 7 F 4 F 1 C 8
F 7 F 4 F 1 D 8
Observe que:
Quando utilizamos números sinalizados como, por exemplo, PIC S9(03), o sinal
é representado por um símbolo colocado no lugar do dígito menos significativo (mais a
direita) do número. Há símbolos para os números positivos e negativos, como mostra
a tabela abaixo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
77 WS-CTLIDO PIC 9(03)
USAGE COMPUTATIONAL.
77 WS-CTGRAV PIC 9(03)
USAGE COMP.
77 WS-CTIMP PIC 9(03)
COMP.
Exemplo 1: para armazenar o número 245 binário, PIC 9(4) COMP, fazemos:
00 F5(16)
00F5 3
DISPLAY WRITE
F0F2F4F5 00F5
0245 b 5
Exemplo 2: para armazenar o número +245 em binário, PIC S9(4) COMP, fazemos:
bit do sinal
bit do sinal
00 F5(16)
00F5
DISPLAY WRITE
F0F2F4C5 00F5
024E b 5
Exemplo 3: para armazenar o número -245 em binário, PIC S9(4) COMP, fazemos:
bit do sinal
bit do sinal
3
bit do sinal
bit do sinal
FF 0B(16)
FF0B
DISPLAY WRITE
F0F2F4D5 FF0B
024N b b E o COMP-4 ?
É o formato das variáveis BCD (Binary Coded Decimal). São econômicas, pois
cada dígito ocupa um nibble mais um nibble (o da direita) para o sinal. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
77 WS-CTLIDO PIC 9(03)
USAGE COMPUTATIONAL-3.
77 WS-CTGRAV PIC 9(03)
USAGE COMP-3.
77 WS-CTIMP PIC 9(03)
COMP-3.
Comprimento Ímpar – uma PIC 9(5) tem comprimento ímpar, ela precisa de 5
nibbles mais o nibble de sinal. Temos então 5 + 1 = 6 nibbles ou seja, 3 Bytes.
Comprimento Par – uma PIC 9(4) tem comprimento par, ela precisa de 4
nibble mais o nibble se sinal, temos então 4 + 1 = 5 nibbles ou seja, 2,5 Bytes. Mas só
podemos usar Bytes inteiros, temos então 3 Bytes.
Para simplificar :
Dividir a quantidade de
dígitos por 2, ignorar as casas
decimais e somar 1 no final.
0 2 0 1 2 F
02 01 2F(16)
02012F
DISPLAY WRITE
F2F0F1F2 02012F
2012 b b b
a) PIC 9(4) possui comprimento par, então ocupará 4+1 = 5 nibbles, ou 3 bytes.
0 2 0 1 2 C
02012C
DISPLAY WRITE
F2F0F1C2 02012C
201B b b b
a) PIC 9(4) possui comprimento par, então ocupará 4+1 = 5 nibbles, ou 3 bytes.
0 2 0 1 2 D
02012D
DISPLAY WRITE
F2F0F1D2 02012D
201K b b b
Por Exemplo, a variável WS-CTLIDO com PIC 9(5) e valor 8, quando for
exibida com o comando DISPLAY WS-CTLIDO, será exibido o valor 00008.
Os símbolos usados
para fazer qualquer
Som na caixa máscara são:
cara de pau !
+ - * mais, menos, vezes
9 0 B nove, zero, bê
Z $ .
CR DB ,
zê, cifrão, pontinho
CR e DB,
junto com a vírgula
devemos aprender
A tabela a seguir explica cada um desses símbolos e como eles são usados
para montar máscaras.
3
0000 ZZ99 XX00
É usado na posição mais à esquerda do PIC e insere esse sinal à esquerda do valor numérico.
$
Mais de um símbolo $ desloca o símbolo para o lado esquerdo do dígito mais significativo.
2345 $ZZ99 $2345
0032 $ZZ99 $XX32
0054 $$99 $54
0054 $$$$ZZ9 $X54
Pode ser colocado à direita ou à esquerda do valor absoluto do número. O sinal acompanha o
- sinal interno do valor numérico, só aparecendo no resultado se o valor interno da memória
concordar com o sinal indicado pela edição. Caso contrário aparecerá o sinal interno do valor do
+ número ou espaço se o valor for positivo. Mais de um símbolo + ou - desloca o símbolo para o
lado esquerdo do dígito mais significativo.
+5435 +9(4) +5435
+5435 9(4) 5435
-3212 9(4)- 3212-
-3212 +9(4) -3212
+3212 -9(4) 3212
-5432 ----99 -5432
-0054 ----99 -54
+0054 ----99 54
-0023 +++99 -23
, Insere uma vírgula na posição indicada. A vírgula que precede zeros à esquerda não é exibida.
5499 $99,99 $54,99
0078 Z,ZZZ X X78
033V55 $ZZ9,99 $X33,55
Nas posições dos zeros à esquerda do número é possível inserir asteriscos que servem para
*
proteção de valores em cheques.
543275 $**9999,99 $**5432,75
5432 **99 5432
0032 **99 **32
0000 **** espaço em branco
0000 **99 **00
1234v56 $*****9,99 $**1234,56
0 Insere um algarismo zero ou espaço em branco na posição indicada pelo símbolo 0 ou B
B
5432 99BB99 54XX32
5432 990099 540032
12JUN08 XXBXXXBXX 12XJUNX08
Insere um ponto real ou explícito na posição correspondente ao ponto decimal implícito do
. valor numérico ou insere um ponto na posição indicada em conteúdo alfanumérico ou
alfabético.
5432 $9999. $5432.
0009 $ZZ.ZZ $X9.00
87V65 ZZ9.99 X87.65
CR Representam Crédito ou Débito e devem ser usados na posição mais à direita do PICTURE. Se o
DB valor do item for negativo, o sinal usado será impresso. Se for positivo, nada aparecerá.
-5432 $99,99CR $54,32CR
-5432 $99,99DB $54,32DB
+5432 $99,99CR $54,32
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
ACCEPT WS-DATA-SISTEMA FROM DATE
ACCEPT WS-DATA-JULIANA FROM DAY
ACCEPT WS-DIA-SEMANA FROM DAY-OF-WEEK
ACCEPT WS-HORA-COMPLETA FROM TIME
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
01 WS-DATA-SISTEMA.
05 WS-ANO-G PIC 9(02).
05 WS-MES-G PIC 9(02).
05 WS-DIA-G PIC 9(02).
DAY – A variável receptora deve ser PIC 9(05). O formato da data é YYDDD
(data Juliana). 11/07/2008 será expresso como 08193. No exemplo acima, a variável
WS-DATA-JULIANA deve ter o seguinte LAYOUT.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
01 WS-DATA-JULIANA.
05 WS-ANO-J PIC 9(02).
05 WS-DIA-J PIC 9(03).
1 = segunda-feira
2 = terça-feira
3 = quarta–feira
4 = quinta-feira
5 = sexta-feira
6 = sábado
7 = domingo
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
77 WS-DIA-SEMANA PIC 9.
TIME – A variável deve ser PIC 9(08). O formato da hora é HHMMSSCC (hora,
minuto, segundo, centésimos). 11:20:13 da manhã será expresso como 11201300. No
exemplo acima, a variável WS-HORA-COMPLETA deve ter o seguinte LAYOUT.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
01 WS-HORA-COMPLETA.
05 WS-HORA PIC 9(02).
3
05 WS-MINUTO PIC 9(02).
05 WS-SEGUNDO PIC 9(02).
05 WS-CENTESIMO PIC 9(02).
WS-DATA-SISTEMA
WS-DATA-FORMATADA
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
DISPLAY WS-MES OF WS-DATA-SISTEMA
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
WORKING-STORAGE SECTION.
77 A PIC X(10) VALUE "1234567890".
77 B PIC X(02).
77 C PIC X(10).
*----------------------------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------------------------*
000-GPAZ9900.
MOVE A(3:2) TO B
MOVE A(6:5) TO C(1:5)
MOVE A(1:5) TO C(6:5) ( : )
variável posição inicial comprimento
DISPLAY "*----------------------*"
DISPLAY "A = " A
DISPLAY "B = " B
DISPLAY "C = " C
DISPLAY "*----------------------*"
Observação: variáveis alfanuméricas
STOP RUN possuem cadeias de caracteres, também
. conhecidas como STRINGs. Quando
movemos pedaços de uma STRING,
dizemos que movemos uma SUBSTRING.
Na SYSOUT, será exibido o seguinte texto:
*----------------------*
A = 1234567890
B = 34
C = 6789012345
*----------------------*
Practice
3
Atividade Revisão aos pares
a) 28 MiB
b) 67 GiB
a) 71.940.702.208 B
b) 7.146.825.580.544 B
a) 80 GB
b) 1 TB
3
d) PIC 9(4) COMP VALUE 810 ( ) 00230F
e) PIC S9(4) COMP VALUE +38 ( ) F8C4
f) PIC S9(4) COMP VALUE -129 ( ) FF7F
g) PIC 9(4) COMP-3 VALUE 230 ( ) F0F1F2F3
h) PIC S9(3) COMP-3 VALUE +432 ( ) 0026
i) PIC S9(4) COMP-3 VALUE -432 ( ) 032A
e) ZZZZ9,99 _____________________________________
f) $ZZ.ZZ9,99 _____________________________________
g) $$$.$$9,99 _____________________________________
h) ---.--9,99 _____________________________________
i) +++.++9,99 _____________________________________
j) $**.**9,99 _____________________________________
k) 990099,0099 _____________________________________
l) 99BB99,BB99 _____________________________________
m) $ZZ.ZZ9,99CR _____________________________________
n) $ZZ.ZZ9,99DB _____________________________________
a)
SYSIN
3
PGM0001
PRDSEQM
FILE-CONTROL.
b)
PRDSEQV
PGM0002
PRDSEQM
FILE-CONTROL.
PGM0003
RELOCOR
NEWCLI
FILE-CONTROL.
1 2 3 4 5
12345678901234567890123456789012345678901234567890
**************************************************
* DATA GREGORIANA 1 - 99/99/2099 *
* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *
* DATA JULIANA – 999 DE 2099 *
* DIA DA SEMANA – XXXXXXXXXXXXX *
**************************************************
E o calendário
ASTECA!?
3
Todos Juntos PROJETO 2
Layout da SYSOUT
1 2 3 4 5
12345678901234567890123456789012345678901234567890
*********************************************
* SIMULACAO DE EMPRESTIMO *
*********************************************
NUMERO DA SIMULACAO.......: 9999
VALOR DO EMPRESTIMO.......: R$ ZZZ.ZZ9,99
JUROS.....................: Z9,99% A.M.
QTDE. DE PARCELAS.........: Z9
VALOR DA PARCELA..........: R$ ZZZ.ZZ9,99
VALOR TOTAL...............: R$ Z.ZZZ.ZZ9,99
*********************************************
1 2 3 4 5
12345678901234567890123456789012345678901234567890
==================================================
TOTAL DE SIMULACOES LIDAS............: ZZZ9
TOTAL DE SIMULACOES PROCESSADAS......: ZZZ9
TEMPO TOTAL DE PROCESSAMENTO.........: HH:MM:SS:CC
==================================================
== TERMINO NORMAL DO GPXXNN02 ==
==================================================
Observação
3
05 FILLER PIC X(01)
VALUE “:”.
05 WS-CENT-PF PIC 99.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
COMPUTE WS-HORA-P = WS-DIFERENCA / 360000
COMPUTE WS-DIFERENCA = WS-DIFERENCA – WS-HORA-P * 360000
COMPUTE WS-MIN-P = WS-DIFERENCA / 6000
COMPUTE WS-DIFERENCA = WS-DIFERENCA – WS-MIN-P * 6000
COMPUTE WS-SEG-P = WS-DIFERENCA / 100
COMPUTE WS-DIFERENCA = WS-DIFERENCA – WS-SEG-P * 100
COMPUTE WS-CENT-P = WS-DIFERENCA
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
MOVE WS-HORA-P TO WS-HORA-PF
MOVE WS-MIN-P TO WS-MIN-PF
MOVE WS-SEG-P TO WS-SEG-PF
MOVE WS-CENT-P TO WS-CENT-PF
Estou fera!
Fiz Certo!
Preparation
Presentation
É fundamental dominar
a manipulação de arquivos em
COBOL, já que todos os dados
estão armazenados nesses
objetos.
Tipos de arquivos:
Teoria Sequencial e indexado
4
quando o computador é desligado. São utilizados como memória de massa, pois
podem armazenar grandes quantidades de dados. Quando necessário, os dados dos
arquivos são carregados para a memória principal do computador para processamento.
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
ARQUIVO
CAMPO REGISTRO
Tratamento de
Teoria arquivo sequencial
Especificação do Arquivo
Detalhamento do Arquivo
Manipulação do Arquivo
Teoria ç
Especifica ão do arquivo
4
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
ENVIRONMENT DIVISION.
*----------------------------------------------------------------*
CONFIGURATION SECTION.
*----------------------------------------------------------------*
SPECIAL-NAMES
DECIMAL-POINT IS COMMA.
*----------------------------------------------------------------*
INPUT-OUTPUT SECTION.
*----------------------------------------------------------------*
FILE-CONTROL.
SELECT ESTOQUE-PRODUTO ASSIGN TO UT-S-ESTOQUE
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS FS-ESTOQUE-PRODUTO.
numero-do-sistema–tipo-de-arquivo–numero-do-dispositivo–modo-de-acesso–nome-externo-ddname
modo-de-acesso: S = Sequencial
I = Indexado
R = Relativo
D = Dinâmico
4
CONTROL pela cláusula SELECT, deve ser detalhado na FILE SECTION. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXDATAXXXXXXXXXXXXXXXXXXX DIVISION.
XXXXXXXFILEXXXXXXXXXXXXXXXXXX SECTION.
0,XXXXXFDxxESTOQUE-PRODUTO
XXXXXXXXXXXLABEL RECORD STANDARD
XXXXXXXXXXXBLOCK CONTAINS 0 RECORDS
XXXXXXXXXXXRECORDING MODE IS F
XXXXXXXXXXXRECORD CONTAINS 44 CHARACTERS
XXXXXXXXXXXDATA RECORD IS REG-ESTOQUE-PRODUTO
XXXXXXXXXXX.
XXXXXXX01XXREG-ESTOQUE-PRODUTO.
XXXXXXXXXXX05 CODPROD PIC X(04).
XXXXXXXXXXX05 DESCPROD PIC X(25).
XXXXXXXXXXX05 QTDEST PIC 9(03).
XXXXXXXXXXX05 QTDMIN PIC 9(03).
XXXXXXXXXXX05 QTDMAX PIC 9(03).
XXXXXXXXXXX05 PRECOPROD PIC 9(04)V99.
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
Teoria ç
Manipula ão do arquivo
4
OPEN
INPUT indica que o arquivo será lido pelo programa. Não é possível
gravar um arquivo aberto como INPUT.
PROGRAMA
CADCLI RELCLI
É possível abrir todos os arquivos com um único comando OPEN, como mostra
o exemplo abaixo.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXOPEN INPUT CADCLI
XXXXXXXXXXX XXXXXXX MOVCLI
XXXXXXXXXXX OUTPUT NEWCAD
XXXXXXXXXXX XXXXXXX RELATO
READ
0,XXXXXFDxxCADCLI
XXXXXXXXXXXLABEL RECORD STANDARD
XXXXXXXXXXXBLOCK CONTAINS 0 RECORDS
XXXXXXXXXXXRECORDING MODE IS F
XXXXXXXXXXXRECORD CONTAINS 54 CHARACTERS
XXXXXXXXXXXDATA RECORD IS REG-CADCLI
XXXXXXXXXXX.
XXXXXXX01XXREG-CADCLI.
XXXXXXXXXX 05 CODCLI PIC X(04). 0100
lay-out
XXXXXXXXXX 05 NOMECLI PIC X(30). ANA PAULA DOS SANTOS SILVA
do arquivo
XXXXXXXXXX 05 CPFCLI PIC X(11). 36525415488
XXXXXXXXXX 05 RGCLI PIC X(09). 451547859
READ CADCLI
XXXXXXX01XXWS-REG-CADCLI.
XXXXXXXXXX 05 WS-CODCLI PIC X(04). 0100
XXXXXXXXXX 05 WS-NOMECLI PIC X(30). ANA PAULA DOS SANTOS SILVA
XXXXXXXXXX 05 WS-CPFCLI PIC X(11). 36525415488
XXXXXXXXXX 05 WS-RGCLI PIC X(09). 451547859
variável
espelho
7355 0100ANA PAULA DOS SANTOS SILVAXXXX36525415488451547859 0050ANA M
CADCLI
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO
BOF EOF
FILE STATUS 00 00 00 00 00 00 00 00 00 10 46 4
OPEN READ
= “10”
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXREADXCADCLI INTO WS-REG-CADCLI
XXXXXXXXXXXXXXXXAT ENDXXXXXXMOVE “S” TO WS-FIM-ARQ
XXXXXXXXXXXXXXXXXXXXXXXXXXXXDISPLAY “ACABOU O ARQUIVO CADCLI”
XXXXXXXXXXXXXXXXNOT AT ENDXXADD 1 TO WS-CTLIDO
XXXXXXXXXXXEND-READ
NOT = “10”
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXREADXCADCLI INTO WS-REG-CADCLI
0,XXXXXFDxxNEWCLI
XXXXXXXXXXXLABEL RECORD STANDARD
XXXXXXXXXXXBLOCK CONTAINS 0 RECORDS
XXXXXXXXXXXRECORDING MODE IS F
XXXXXXXXXXXRECORD CONTAINS 54 CHARACTERS
XXXXXXXXXXXDATA RECORD IS REG-NEWCLI
XXXXXXXXXXX.
XXXXXXX01XXREG-NEWCLI.
XXXXXXXXXX 05 CODCLI-N PIC X(04). 0100
lay-out
XXXXXXXXXX 05 NOMECLI-N PIC X(30). ANA PAULA DOS SANTOS SILVA
do arquivo
XXXXXXXXXX 05 CPFCLI-N PIC X(11). 36525415488
XXXXXXXXXX 05 RGCLI-N PIC X(09). 451547859
WRITE REG-NEWCLI
Após o
FROM, mas
antes do XXXXXXX01XXWS-REG-NEWCLI.
variável
espelho
0050ANA M
NEWCLI
0,XXXXXFDxxNEWCLI
XXXXXXXXXXXLABEL RECORD STANDARD
XXXXXXXXXXXBLOCK CONTAINS 0 RECORDS
XXXXXXXXXXXRECORDING MODE IS F
XXXXXXXXXXXRECORD CONTAINS 54 CHARACTERS
XXXXXXXXXXXDATA RECORD IS REG-NEWCLI
XXXXXXXXXXX.
XXXXXXX01XXREG-NEWCLI.
XXXXXXXXXX 05 CODCLI-N PIC X(04).
lay-out
XXXXXXXXXX 05 NOMECLI-N PIC X(30).
do arquivo
XXXXXXXXXX 05 CPFCLI-N PIC X(11).
XXXXXXXXXX 05 RGCLI-N PIC X(09).
APÓS
WRITE REG-NEWCLI
4
O XXXXXXX01XXWS-REG-NEWCLI.
WRITE XXXXXXXXXX 05 WS-CODCLI-N PIC X(04). 0100
XXXXXXXXXX 05 WS-NOMECLI-N PIC X(30). ANA PAULA DOS SANTOS SILVA
XXXXXXXXXX 05 WS-CPFCLI-N PIC X(11). 36525415488
XXXXXXXXXX 05 WS-RGCLI-N PIC X(09). 451547859
variável
espelho
0100ANA PAULA DOS SANTOS SILVAXXXX36525415488451547859 0050ANA M
NEWCLI
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXWRITEXREG-NEWCLI FROM WS-REG-NEWCLI
Observe a diferença:
4
Objetivo do Programa
Macro-Fluxo
CADFUNC
EEXXNN04
FOLHAPAG
Observação
Layout da SYSOUT
1 2 3 4 5
12345678901234567890123456789012345678901234567890
**************************************************
TOTAL DE REGISTROS LIDOS.........: ZZZ9
TOTAL DE REGISTROS GRAVADOS......: ZZZ9
SOMA DE TODOS OS SALARIOS........: $ZZZ.ZZZ.ZZ9,99
**************************************************
JOB de Execução
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//GPXXNN04 JOB ‘SEUNOME’,MSGCLASS=X,CLASS=C,NOTIFY=GPXXNN,TIME=(0,20)
//*****************************************************************
//STEP1 EXEC PGM=EEXXNN04
//STEPLIB DD DSN=GP.GERAL.LOADLIB,DISP=SHR
//CADFUNC DD DSN=GP.GPXX99.CADFUNC,DISP=SHR
//FOLHAPAG DD DSN=GP.GPXXNN.FOLHAPAG,DISP=(NEW,CATLG,DELETE),
// SPACE=(TRK,(1,1),RLSE),UNIT=SYSALLDA,
// DCB=(LRECL=43,RECFM=FB,DSORG=PS)
Programa COBOL
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
IDENTIFICATION DIVISION.
*----------------------------------------------------------------*
PROGRAM-ID. EEXXNN04.
AUTHOR. SEUNOME.
*----------------------------------------------------------------*
ENVIRONMENT DIVISION.
*----------------------------------------------------------------*
CONFIGURATION SECTION.
4
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CADFUNC ASSIGN TO UT-S-CADFUNC
FILE STATUS IS FS-CADFUNC
.
SELECT FOLHAPAG ASSIGN TO UT-S-FOLHAPAG
FILE STATUS IS FS-FOLHAPAG
.
*----------------------------------------------------------------*
DATA DIVISION.
*----------------------------------------------------------------*
FILE SECTION.
*----------------------------------------------------------------*
FD CADFUNC
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0 RECORDS
RECORDING MODE IS F
RECORD CONTAINS 43 CHARACTERS
DATA RECORD IS REG-CADFUNC
.
01 REG-CADFUNC.
05 CODFUNC-C PIC X(05).
05 NOMEFUNC-C PIC X(30).
05 VALORHORA-C PIC 9(02)V99.
05 QTDHRSTRAB-C PIC 9(04).
*----------------------------------------------------------------*
FD FOLHAPAG
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0 RECORDS
RECORDING MODE IS F
RECORD CONTAINS 43 CHARACTERS
DATA RECORD IS REG-FOLHAPAG
.
01 REG-FOLHAPAG.
05 CODFUNC-F PIC X(05).
05 NOMEFUNC-F PIC X(30).
05 SALARIO-F PIC 9(06)V99.
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
* DECLARACAO DAS VARIAVEIS ESPELHO DOS ARQUIVOS
*----------------------------------------------------------------*
01 WS-REG-CADFUNC.
05 WS-CODFUNC-C PIC X(05).
05 WS-NOMEFUNC-C PIC X(30).
05 WS-VALORHORA-C PIC 9(02)V99.
05 WS-QTDHRSTRAB-C PIC 9(04).
01 WS-REG-FOLHAPAG.
05 WS-CODFUNC-F PIC X(05).
05 WS-NOMEFUNC-F PIC X(30).
05 WS-SALARIO-F PIC 9(06)V99.
*----------------------------------------------------------------*
* COLOCAR AS MENSAGENS EM VARIAVEIS EH UMA BOA PRATICA
*----------------------------------------------------------------*
77 WS-MSG01 PIC X(60)
VALUE
"ERRO ABERTURA CADFUNC".
77 WS-MSG02 PIC X(60)
VALUE
"ERRO ABERTURA FOLHAPAG".
77 WS-MSG03 PIC X(60)
VALUE
"ERRO LEITURA CADFUNC".
77 WS-MSG04 PIC X(60)
VALUE
"ERRO GRAVACAO FOLHAPAG".
77 WS-MSG05 PIC X(60)
VALUE
"ERRO FECHAMENTO CADFUNC".
77 WS-MSG06 PIC X(60)
VALUE
"ERRO FECHAMENTO FOLHAPAG".
*----------------------------------------------------------------*
* VARIAVEIS DE TRABALHO
*----------------------------------------------------------------*
77 WS-MSG PIC X(60).
77 WS-FS PIC X(02).
*----------------------------------------------------------------*
* VARIAVEIS COM MASCARA DE EDICAO (FORMATADAS)
*----------------------------------------------------------------*
77 WS-CTGRAV-F PIC ZZZ9.
77 WS-CTLIDO-F PIC ZZZ9.
77 WS-SOMASAL-F PIC $ZZZ.ZZZ.ZZ9,99.
*----------------------------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------------------------*
0000-EEXXNN04.
PERFORM 1000-INICIALIZAR
PERFORM 2000-PROCESSAR
UNTIL FS-CADFUNC = "10"
PERFORM 3000-TERMINO
STOP RUN
.
1000-INICIALIZAR.
MOVE 0 TO WS-CTLIDO
MOVE 0 TO WS-CTGRAV
MOVE 0 TO WS-SOMASAL
PERFORM 1500-LER-CADFUNC
.
1500-LER-CADFUNC.
READ CADFUNC INTO WS-REG-CADFUNC
4
IF FS-CADFUNC = "00"
COMPUTE WS-CTLIDO = WS-CTLIDO + 1
ELSE
IF FS-CADFUNC NOT = "10"
MOVE WS-MSG03 TO WS-MSG
MOVE FS-CADFUNC TO WS-FS
GO TO 9000-ERRO
END-IF
END-IF
.
2000-PROCESSAR.
MOVE WS-CODFUNC-C TO WS-CODFUNC-F
MOVE WS-NOMEFUNC-C TO WS-NOMEFUNC-F
PERFORM 1500-LER-CADFUNC
.
3000-TERMINO.
MOVE WS-CTLIDO TO WS-CTLIDO-F
MOVE WS-CTGRAV TO WS-CTGRAV-F
MOVE WS-SOMASAL TO WS-SOMASAL-F
DISPLAY "=================================================="
DISPLAY "TOTAL DE REGISTROS LIDOS.........: " WS-CTLIDO-F
DISPLAY "TOTAL DE REGISTROS GRAVADOS......: " WS-CTGRAV-F
DISPLAY "SOMA DE TODOS OS SALARIOS........: " WS-SOMASAL-F
DISPLAY "=================================================="
CLOSE CADFUNC
CLOSE FOLHAPAG
FILE SECTION.
FILE SECTION.
c)
Nome do Arquivo OLDCLI
Nome do Registro REG-OLDCLI
Nome do Campo Tipo e Tamanho Descrição
CHAVE-O Chave de cliente
AGENCIA-O 9(10) Número da agência
NUM-CONTA-O 9(10) Número da conta
NOME-O X(40) Nome do cliente
SALDO-O S9(11)V99 COMP-3 Saldo do cliente
FILE SECTION.
4
SEXOCLI-SP X(01) Sexo – M / F
FILE SECTION.
WORKING-STORAGE SECTION.
WORKING-STORAGE SECTION.
Performance
Macro-Fluxo
SIMUEMP
GPXXNN03
EMPAPROV
Layout da SYSOUT
1 2 3 4 5
12345678901234567890123456789012345678901234567890
**************************************************
* DATA GREGORIANA 1 - 99/99/2099 *
* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *
* DATA JULIANA – 999 DE 2099 *
* DIA DA SEMANA – XXXXXXXXXXXXX *
**************************************************
1 2 3 4 5
12345678901234567890123456789012345678901234567890
==================================================
TOTAL DE SIMULACOES LIDAS............: ZZZ9
TOTAL DE SIMULACOES APROVADAS........: ZZZ9
TOTAL DE SIMULACOES REPROVADAS.......: ZZZ9
TEMPO TOTAL DE PROCESSAMENTO.........: HH:MM:SS:CC
==================================================
4
TX-JUROS-S 9(02)V99 Taxa de juros compostos ao mês
QTD-PARCELAS-S 9(02) Quantidade de parcelas
Parágrafo 1000-INICIALIZAR
Receber o horário inicial de processamento
Mover zero para os contadores:
simulações lidas
simulações aprovadas
simulações reprovadas
Abrir para leitura o arquivo SIMUEMP
Se file status for diferente de “00”
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Abrir para gravação o arquivo EMPAPROV
Se file status for diferente de “00”
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Executar o parágrafo 1500-LER-SIMUEMP
Parágrafo 2000-PROCESSAR
Se o valor do empréstimo for maior ou igual a R$ 100.000 e
o número de parcelas for maior ou igual a 50
somar 1 ao contador de simulações reprovadas
Senão
Calcular o valor da parcela
Calcular o valor total do empréstimo
Mover os dados da variável espelho do SIMUEMP
para a variável espelho do EMPAPROV
Gravar o registro do EMPAPROV usando sua variável espelho
Se file status for igual a “00” (sucesso)
Somar 1 ao contador de simulações aprovadas
senão
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Parágrafo 3000-TERMINO
Executar rotina 9000-IMPRIME-DATA
Fechar o arquivo SIMUEMP
Se file status for diferente de “00”
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Fechar o arquivo EMPAPROV
Se file status for diferente de “00”
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Receber o horário final de processamento
Calcular o tempo de processamento
Exibir os contadores de simulações lidas, aprovadas e reprovadas
Exibir o tempo total de processamento
Parágrafo 9000-ERRO
Exibir mensagem de erro
Exibir FILE STATUS
Mover +16 para a variável do RETURN-CODE
Encerrar o programa
Estou fera!
Fiz Certo!
Preparation
Presentation
EVALUATE
5
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXEVALUATE WS-SIGLA-UF
XXXXXXXXXXXXXXWHEN ‘SP’ DISPLAY ‘SAO PAULO’
XXXXXXXXXXXXXXWHEN ‘RJ’ DISPLAY ‘RIO DE JANEIRO’
XXXXXXXXXXXXXXWHEN ‘MG’ DISPLAY ‘MINAS GERAIS’
XXXXXXXXXXXXXXWHEN ‘AM’ DISPLAY ‘AMAZONAS’
XXXXXXXXXXXXXXWHEN ‘RR’ DISPLAY ‘RORAIMA’
XXXXXXXXXXXXXXWHEN OTHER DISPLAY ‘OUTRO ESTADO’
XXXXXXXXXXXEND-EVALUATE
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXEVALUATE TRUE
XXXXXXXXXXXXXXWHEN WS-SALDO NOT < 0 AND NOT > 10000
XXXXXXXXXXXXXXXXXXXPERFORM 062-CLIENTE-COMUM
XXXXXXXXXXXXXXWHEN WS-SALDO > 10000 AND NOT > 20000
XXXXXXXXXXXXXXXXXXXPERFORM 064-CLIENTE-ESPECIAL
XXXXXXXXXXXXXXWHEN WS-SALDO > 20000
XXXXXXXXXXXXXXXXXXXPERFORM 066-CLIENTE-PRIME
XXXXXXXXXXXEND-EVALUATE
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXEVALUATE FUNCAO ALSO ESTCIVIL ALSO DEPENDENTES
XXXXXXXWHEN “VENDEDOR” ALSO “CASADO” ALSO ‘S’
XXX MOVE 100 TO TOTSUBSID
XXXXXXXWHEN “VENDEDOR” ALSO “SOLTEIRO” ALSO NOT ‘S’
XXX MOVE 75 TO TOTSUBSID
XXXXXXXWHEN “SECRETARIA” ALSO “CASADO” ALSO NOT ‘S’
XXX MOVE 50 TO TOTSUBSID
XXXXXXXXXXXEND-EVALUATE
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXX EVALUATE MEDIA
WHEN 90 THRU 100 MOVE "A" TO GRAU
WHEN 80 THRU 89 MOVE "B" TO GRAU
WHEN 70 THRU 79 MOVE "C" TO GRAU
WHEN 00 THRU 69 MOVE "D" TO GRAU
WHEN OTHER PERFORM R900-ROTINA-ERRO THRU R900-FIM
END-EVALUATE
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
EVALUATE IDADE <= 19
WHEN TRUE PERFORM R100-ROTINA-MENOR
WHEN FALSE PERFORM R200-ROTINA-ADULTO
END-EVALUATE
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
* NESTE EVALUATE SE A VARIAVEL A VALER 1 OU 2 SERA EXECUTADO
* DISPLAY A
XXXXXXXXXXXEVALUATE A
XXXXXXXXXXXXXXWHEN 1
XXXXXXXXXXXXXXWHEN 2XXXXXXXXXXXXXXXDISPLAY A
XXXXXXXXXXXXXXWHEN 3XXXXXXXXXXXXXXXDISPLAY B
XXXXXXXXXXXEND-EVALUATE
XXXXXXXXXXXIF A > B
XXXXXXXXXXXXXXCONTINUE
XXXXXXXXXXXXXXDISPLAY B
XXXXXXXXXXXELSE
XXXXXXXXXXXXXXDISPLAY A
XXXXXXXXXXXEND-IF
XXXXXXXXXXXEVALUATE A
XXXXXXXXXXXXXXWHEN 1
XXXXXXXXXXXXXXWHEN 2
XXXXXXXXXXXXXXXXXXXCONTINUE
XXXXXXXXXXXXXXWHEN 3
XXXXXXXXXXXXXXXXXXXDISPLAY A
XXXXXXXXXXXEND-EVALUATE
XXXXX
XXXXXXXXXXXIF A > B
XXXXXXXXXXX NEXT SENTENCE
XXXXXXXXXXXELSE Ponto obrigatório, obrigando o
XXXXXXXXXXX DISPLAY A “ EH MENOR OU IGUAL A “ B fluxo de processamento seguir do
XXXXXXXXXXXEND-IF
NEXT SENTENCE para, neste
XXXXXXXXXXXDISPLAY “COMPARACAO EFETUADA” exemplo, o comando DISPLAY.
.
XXXXXXX150-CALCULA-JUROS.
COMPUTE WS-JUROS = WS-CAPITAL * (1 + (WS-TAXA ** WS-PERIODO))
DISPLAY WS-JUROS
.
COPY
5
* TAMANHO DO REGISTRO - 69 BYTES *
*----------------------------------------------------------------*
01 REG-CADPROD.
05 CODPROD PIC X(04).
05 DESCPROD PIC X(20).
05 UNIDPROD PIC X(05).
05 LOCALPROD PIC X(05).
05 QTDEST PIC 9(05).
05 QTDMAX PIC 9(05).
05 QTDMIN PIC 9(05).
05 PRECOCOMPRA PIC 9(06)V99.
05 PRECOVENDA PIC 9(06)V99.
05 PERCOMIS PIC 9(02)V99.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
* BOOK DE ROTINA - 9000-ERRO *
* NOME DA BOOK - ROTERRO *
* NOME DO PDS - GP.GPXXNN.BOOKLIB *
* VARIAVEIS USADAS - WS-MSG PIC X(60). *
* WS-FS PIC X(02). *
*----------------------------------------------------------------*
9000-ERRO.
DISPLAY "*-------------------------------------------------*"
DISPLAY "* TERMINO ANORMAL *"
DISPLAY "*-------------------------------------------------*"
DISPLAY " MENSAGEM.......: " WS-MSG
DISPLAY " FILE STATUS....: " WS-FS
DISPLAY "*-------------------------------------------------*"
DISPLAY "* CONTATE COM BREVIDADE O ANALISTA RESPONSAVEL *"
DISPLAY "*-------------------------------------------------*"
MOVE +16 TO RETURN-CODE
STOP RUN
.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
FILE SECTION.
FD CADPROD
RECORDING MODE IS F
RECORD CONTAINS 69 CHARACTERS
DATA RECORD IS REG-CADPROD
.
COPY CADPROD.
PROCEDURE DIVISION.
0000-GPXXNN11.
PERFORM 010-INICIALIZAR
PERFORM 030-PROCESSAR UNTIL FS-CADPROD = “10”
PERFORM 040-TERMINO
STOP RUN
.
COPY ROTERRO.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
* BOOK DE ARQUIVO - CADASTRO DE PRODUTOS *
* NOME DO BOOK - CADPROD *
* NOME DO PDS - GP.GPXXNN.BOOKLIB *
* NOME DO ARQUIVO - CADPROD *
* TAMANHO DO REGISTRO - 69 BYTES *
*----------------------------------------------------------------*
01 :XX-:REG-CADPROD.
05 :XX-:CODPROD PIC X(04).
05 :XX-:DESCPROD PIC X(20).
05 :XX-:UNIDPROD PIC X(05).
05 :XX-:LOCALPROD PIC X(05).
05 :XX-:QTDEST PIC 9(05).
05 :XX-:QTDMAX PIC 9(05).
05 :XX-:QTDMIN PIC 9(05).
05 :XX-:PRECOCOMPRA PIC 9(06)V99.
05 :XX-:PRECOVENDA PIC 9(06)V99.
05 :XX-:PERCOMIS PIC 9(02)V99.
5
Observe a letra C colocada nas linhas que foram copiadas da BOOK. Isso
significa que seu programa fonte ficou maior. Quando ocorrer um erro, por exemplo,
na linha 100, é preciso verificar nessa listagem do SPOOL (SD.ST ? S) onde está a
linha 100, pelo comando TOP; F 00100 e depois encontrar a linha correspondente em
seu programa fonte na COBLIB.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
COPY CADCLI REPLACING ==::== BY ==WS-REG-==
==:P:== BY ==WS-==
==:S:== BY ==-CADCLI==.
UNSTRING e STRING
UNSTRING WS-NOME-COMPLETO
DELIMITED BY SPACE
5
INTO WS-PRIMEIRO-NOME
WS-NOME-DO-MEIO
WS-ULTIMO-NOME
STOP RUN
.
Outros exemplos:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXSTRING “TOTAL DE REGISTROS LIDOS = “
WS-CTLIDO
XXXXXXXXXXXDELIMITED BY SIZE INTO WS-MENSAGEM1
STRING “O ALUNO “
WS-NOME-ALUNO
“ FOI “
WS-SITUACAO
“ COM MEDIA FINAL DE “
WS-MEDIA-FINAL
“ PONTOS.”
DELIMITED BY SIZE INTO WS-FRASE-FATAL
Outros PERFORMs
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PERFORM 010-INICIALIZAR
PERFORM 070-TERMINO
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PERFORM 030-PROCESSAR THRU 060-CALCULO
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PERFORM 088-IMPRIME-LINHA 5 TIMES
Exemplos:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PERFORM 030-PROCESSAR UNTIL FS-VCADPRD = ‘10’
5
PERFORM 080-CALCULA-JUROS WITH TEST AFTER
UNTIL WS-MES > 12
Corpo do Laço
Corpo do Laço
não não
Teste Teste
sim
sim
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PERFORM 055-IMPRIME-TABUADA
WITH TEST BEFORE
UNTIL WS-CONTADOR > 10
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PERFORM 040-IMPRIME-TABUADA
VARYING WS-CONTADOR FROM 1 BY 1
UNTIL WS-CONTADOR > 10
PERFORM 070-CALCULA-JUROS
VARYING WS-MES FROM WS-MES-INICIAL BY WS-INCREMENTO
UNTIL WS-MES-INICIAL > WS-MES-FINAL
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PERFORM rotina
VARYING variavel FROM valor_inicial BY incremento
UNTIL condicao
PERFORM 999-ROTINA
VARYING WS-CONT FROM 1 BY 1
UNTIL WS-CONT > 100
início
condição sim
(CONT > 100) fim
não
executa os comandos
(PERFORM 999-ROTINA)
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PERFORM 5 TIMES
DISPLAY “*----------------------*”
END-PERFORM
MOVE 0 TO WS-CONT
PERFORM 10 TIMES
5
DISPLAY “VALOR DO CONTADOR = “ WS-CONT
COMPUTE WS-CONT = WS-CONT + 1
END-PERFORM
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
MOVE 0 TO WS-CONT
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PERFORM VARYING WS-CONT FROM 1 BY 1 UNTIL WS-CONT > 10
DISPLAY “VALOR DO CONTADOR = “ WS-CONT
END-PERFORM
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PROCEDURE DIVISION.
MAIN-LINE SECTION.
PERFORM MOSTRAR-A
PERFORM MOSTRAR-C
PERFORM MOSTRAR-B
PERFORM MOSTRAR-D
STOP RUN
.
MOSTRAR-A SECTION.
DISPLAY '10'
DISPLAY '11'
.
MOSTRAR-B.
DISPLAY '20'
.
MOSTRAR-C SECTION.
DISPLAY '30'
DISPLAY '31'
.
MOSTRAR-D.
DISPLAY '40'
.
MOSTRAR-E.
DISPLAY '50'
.
MOSTRAR-F.
DISPLAY '60'
DISPLAY '66'
.
MOSTRAR-G SECTION.
DISPLAY '70'
.
MOSTRAR-OUTROS SECTION.
DISPLAY '90'
.
1 minuto
EXEMPLO MERGE
Objetivo do Programa
5
FUNCANT e FUNCNOVO, utilizando o algoritmo de merge, gerando o arquivo
FUNCCAD.
Macro-Fluxo
FUNCANT FUNCNOVO
EEXXNN05
FUNCCAD
Observação
Layout da SYSOUT
1 2 3 4 5
12345678901234567890123456789012345678901234567890
==================================================
TOTAL DE REGISTROS LIDOS FUNCANT.: ZZZ9
TOTAL DE REGISTROS LIDOS FUNCNOVO: ZZZ9
TOTAL DE REGISTROS GRAVADOS......: ZZZ9
==================================================
JOB de Execução
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
* BOOK DE ARQUIVO - CAD. DE FUNCIONARIO ANTERIOR *
* NOME DO BOOK - FUNCANT *
* NOME DO PDS - GP.GPXXNN.BOOKLIB *
* NOME DO ARQUIVO - FUNCANT *
* TAMANHO DO REGISTRO - 43 BYTES *
*----------------------------------------------------------------*
01 ::REG-FUNCANT.
05 ::CODFUNC-A PIC X(05).
05 ::NOMEFUNC-A PIC X(30).
05 ::VALORHORA-A PIC 9(02)V99.
05 ::QTDHRSTRAB-A PIC 9(04).
5
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
* BOOK DE ARQUIVO - CAD. DE FUNCIONARIO NOVO *
* NOME DO BOOK - FUNCNOVO *
* NOME DO PDS - GP.GPXXNN.BOOKLIB *
* NOME DO ARQUIVO - FUNCNOVO *
* TAMANHO DO REGISTRO - 43 BYTES *
*----------------------------------------------------------------*
01 ::REG-FUNCNOVO.
05 ::CODFUNC-N PIC X(05).
05 ::NOMEFUNC-N PIC X(30).
05 ::VALORHORA-N PIC 9(02)V99.
05 ::QTDHRSTRAB-N PIC 9(04).
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
* BOOK DE ARQUIVO - CAD. DE FUNCIONARIO *
* NOME DO BOOK - FUNCCAD *
* NOME DO PDS - GP.GPXXNN.BOOKLIB *
* NOME DO ARQUIVO - FUNCCAD *
* TAMANHO DO REGISTRO - 43 BYTES *
*----------------------------------------------------------------*
01 ::REG-FUNCCAD.
05 ::CODFUNC-C PIC X(05).
05 ::NOMEFUNC-C PIC X(30).
05 ::VALORHORA-C PIC 9(02)V99.
05 ::QTDHRSTRAB-C PIC 9(04).
Programa COBOL
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
IDENTIFICATION DIVISION.
*----------------------------------------------------------------*
PROGRAM-ID. EEXXNN05.
AUTHOR. SEUNOME.
*----------------------------------------------------------------*
ENVIRONMENT DIVISION.
*----------------------------------------------------------------*
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FUNCANT ASSIGN TO UT-S-FUNCANT
FILE STATUS IS FS-FUNCANT
.
SELECT FUNCNOVO ASSIGN TO UT-S-FUNCNOVO
FILE STATUS IS FS-FUNCNOVO
.
SELECT FUNCCAD ASSIGN TO UT-S-FUNCCAD
FILE STATUS IS FS-FUNCCAD
.
*----------------------------------------------------------------*
DATA DIVISION.
*----------------------------------------------------------------*
FILE SECTION.
*----------------------------------------------------------------*
FD FUNCANT
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0 RECORDS
RECORDING MODE IS F
RECORD CONTAINS 43 CHARACTERS
DATA RECORD IS REG-FUNCANT
.
COPY FUNCANT REPLACING ==::== BY ====.
*----------------------------------------------------------------*
FD FUNCNOVO
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0 RECORDS
RECORDING MODE IS F
RECORD CONTAINS 43 CHARACTERS
DATA RECORD IS REG-FUNCNOVO
.
COPY FUNCNOVO REPLACING ==::== BY ====.
*----------------------------------------------------------------*
FD FUNCCAD
LABEL RECORD IS STANDARD
BLOCK CONTAINS 0 RECORDS
RECORDING MODE IS F
RECORD CONTAINS 43 CHARACTERS
DATA RECORD IS REG-FUNCCAD
.
COPY FUNCCAD REPLACING ==::== BY ====.
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
* DECLARACAO DAS VARIAVEIS ESPELHO DOS ARQUIVOS
*----------------------------------------------------------------*
COPY FUNCANT REPLACING ==::== BY ==WS-==.
COPY FUNCNOVO REPLACING ==::== BY ==WS-==.
COPY FUNCCAD REPLACING ==::== BY ==WS-==.
*----------------------------------------------------------------*
* VARIAVEIS DE TRABALHO
*----------------------------------------------------------------*
77 WS-MSG PIC X(60).
77 WS-FS PIC X(02).
77 WS-CTLIDO-A PIC 9(04) COMP.
77 WS-CTLIDO-N PIC 9(04) COMP.
77 WS-CTGRAV PIC 9(04) COMP.
*----------------------------------------------------------------*
* VARIAVEIS COM MASCARA DE EDICAO (FORMATADAS)
*----------------------------------------------------------------*
5
77 WS-CTLIDO-A-F PIC ZZZ9.
77 WS-CTLIDO-N-F PIC ZZZ9.
77 WS-CTGRAV-f PIC ZZZ9.
*----------------------------------------------------------------*
* MENSAGENS DE ERRO DE FILE STATUS
*----------------------------------------------------------------*
77 WS-MSG01 PIC X(60)
VALUE
“ERRO ABERTURA FUNCANT”.
77 WS-MSG02 PIC X(60)
VALUE
“ERRO ABERTURA FUNCNOVO”.
77 WS-MSG03 PIC X(60)
VALUE
“ERRO ABERTURA FUNCCAD”.
77 WS-MSG04 PIC X(60)
VALUE
“ERRO LEITURA FUNCANT”.
77 WS-MSG05 PIC X(60)
VALUE
“ERRO LEITURA FUNCNOVO”.
77 WS-MSG06 PIC X(60)
VALUE
“ERRO GRAVACAO FUNCCAD”.
77 WS-MSG07 PIC X(60)
VALUE
“ERRO FECHAMENTO FUNCANT”.
77 WS-MSG08 PIC X(60)
VALUE
“ERRO FECHAMENTO FUNCNOVO”.
77 WS-MSG09 PIC X(60)
VALUE
“ERRO FECHAMENTO FUNCCAD”.
1000-INICIALIZAR.
MOVE 0 TO WS-CTLIDO-A
MOVE 0 TO WS-CTLIDO-N
MOVE 0 TO WS-CTGRAV
PERFORM 1500-LER-FUNCANT
PERFORM 1600-LER-FUNCNOVO
.
1500-LER-FUNCANT.
READ FUNCANT INTO WS-REG-FUNCANT
IF FS-FUNCANT = "00"
COMPUTE WS-CTLIDO-A = WS-CTLIDO-A + 1
ELSE
IF FS-FUNCANT = "10"
MOVE HIGH-VALUES TO WS-CODFUNC-A
ELSE
MOVE WS-MSG04 TO WS-MSG
MOVE FS-FUNCANT TO WS-FS
GO TO 9000-ERRO
END-IF
END-IF
.
IF FS-FUNCNOVO = "00"
COMPUTE WS-CTLIDO-N = WS-CTLIDO-N + 1
ELSE
IF FS-FUNCNOVO = "10"
MOVE HIGH-VALUES TO WS-CODFUNC-N
ELSE
MOVE WS-MSG05 TO WS-MSG
MOVE FS-FUNCNOVO TO WS-FS
GO TO 9000-ERRO
END-IF
END-IF
.
2000-PROCESSAR.
IF WS-CODFUNC-A < WS-CODFUNC-N
5
MOVE WS-CODFUNC-A TO WS-CODFUNC-C
MOVE WS-NOMEFUNC-A TO WS-NOMEFUNC-C
MOVE WS-QTDHRSTRAB-A TO WS-QTDHRSTRAB-C
MOVE WS-VALORHORA-A TO WS-VALORHORA-C
CLOSE FUNCANT
IF FS-FUNCANT NOT = "00"
MOVE WS-MSG07 TO WS-MSG
MOVE FS-FUNCANT TO WS-FS
GO TO 9000-ERRO
END-IF
CLOSE FUNCNOVO
IF FS-FUNCNOVO NOT = "00"
MOVE WS-MSG08 TO WS-MSG
MOVE FS-FUNCNOVO TO WS-FS
GO TO 9000-ERRO
END-IF
CLOSE FUNCCAD
IF FS-FUNCCAD NOT = "00"
MOVE WS-MSG09 TO WS-MSG
MOVE FS-FUNCCAD TO WS-FS
GO TO 9000-ERRO
END-IF
DISPLAY "=================================================="
DISPLAY " TERMINO NORMAL EENNXX05 "
DISPLAY "=================================================="
.
9000-ERRO.
DISPLAY "=================================================="
DISPLAY "MENSAGEM....: " WS-MSG
DISPLAY "FILE STATUS.: " WS-FS
DISPLAY "=================================================="
DISPLAY "== TERMINO ANORMAL DO PROGRAMA EEXXNN05 =="
DISPLAY "=================================================="
MOVE 12 TO RETURN-CODE
STOP RUN
.
Practice
PROCEDURE DIVISION.
PROCEDURE DIVISION.
WORKING-STORAGE SECTION. 5
FILE SECTION.
WORKING-STORAGE SECTION.
PROCEDURE DIVISION.
5) Dada as variáveis abaixo, monte uma data completa, usando o comando STRING,
no formato:
12 DE MARCO DE 2012
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
WORKING-STORAGE SECTION.
77 WS-DIA PIC 9(02)
VALUE 12.
77 WS-MES PIC X(09)
VALUE ‘MARCO’.
77 WS-ANO PIC 9(04)
VALUE 2012.
77 WS-DATA PIC X(30).
PROCEDURE DIVISION.
5
a) Executar do parágrafo 2300-INICIO-CALCULO até o parágrafo 2800-TERMINO-
CALCULO.
Performance
Atividade PROJETO 4
Objetivo do Programa
Macro-Fluxo
GPXXNN04
CLIUNIF
5
TOTALCOMPRAS-SP 9(08)V99 Valor total de Compras
ULTIMACOMPRA-SP X(08) Data da última compra AAAAMMDD
1 2 3 4 5
12345678901234567890123456789012345678901234567890
**************************************************
* DATA GREGORIANA 1 - 99/99/2099 *
* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *
* DATA JULIANA – 999 DE 2099 *
* DIA DA SEMANA – XXXXXXXXXXXXX *
**************************************************
1 2 3 4 5
12345678901234567890123456789012345678901234567890
==================================================
TOTAL DE CLIENTES SP............: ZZZ9
TOTAL DE CLIENTES RJ............: ZZZ9
TOTAL DE CLIENTES MG............: ZZZ9
TOTAL DE CLIENTES UNIFICADO.....: ZZZ9
TEMPO TOTAL DE PROCESSAMENTO....: HH:MM:SS:CC
==================================================
Observação
1) Pelo TSO, opção P.2 (Edit Entry Panel), crie os membros CLISP, CLIRJ,
CLIMG e CLIUNIF na BOOKLIB e digite uma BOOK para cada um dos
quatro arquivos, utilizando a string :XX-: no início dos campos, sendo então
um prefixo.
2) Pelo TSO, opção P.2 (Edit Entry Panel), crie o membro GPXXNN04 e digite
o programa COBOL. Faça os COPY BOOKs necessários.
JOB de Execução
5
//CLIUNIF DD DSN=GP.GPXXNN.CLIUNIF,DISP=(NEW,CATLG,DELETE),
// SPACE=(TRK,(1,1),RLSE),UNIT=SYSALLDA,
// DCB=(LRECL=94,RECFM=FB,DSORG=PS,BLKSIZE=0)
Parágrafo 1000-INICIALIZAR
Receber o horário inicial de processamento
Mover zero para os contadores:
Clientes lidos no arquivo CLISP
Clientes lidos no arquivo CLIRJ
Clientes lidos no arquivo CLIMG
Clientes gravados no arquivo CLIUNIF
Abrir para leitura o arquivo CLISP
Se file status for diferente de “00”
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Abrir para leitura o arquivo CLIRJ
Se file status for diferente de “00”
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Parágrafo 1100-LER-CLISP
Ler registro do arquivo CLISP carregando variável espelho
Se file status for igual a “00” (sucesso)
Somar 1 ao contador de lidos no arquivo CLISP
Senão
Se file status for igual a “10” (fim de arquivo)
Mover HIGH-VALUES para CPFCLI-SP (espelho)
Senão
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Parágrafo 1200-LER-CLIRJ
Ler registro do arquivo CLIRJ carregando variável espelho
Se file status for igual a “00” (sucesso)
Somar 1 ao contador de lidos no arquivo CLIRJ
Senão
Se file status for igual a “10” (fim de arquivo)
Mover HIGH-VALUES para CPFCLI-RJ (espelho)
Senão
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Parágrafo 1300-LER-CLIMG
Ler registro do arquivo CLIMG carregando variável espelho
Se file status for igual a “00” (sucesso)
Somar 1 ao contador de lidos no arquivo CLIMG
Senão
Se file status for igual a “10” (fim de arquivo)
Mover HIGH-VALUES para CPFCLI-MG (espelho)
Senão
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
5
Parágrafo 2000-PROCESSAR
Se CPFCLI-SP < CPFCLIRJ e CPFCLI-SP < CPFCLIMG
Mover espelho do registro de CLISP para CLIUNIF
Executar rotina 2100-GRAVAR-CLIUNIF
Executar rotina 1100-LER-CLISP
Senão
Se CPFCLI-RJ < CPFCLI-MG
Mover espelho do registro CLIRJ para CLIUNIF
Executar rotina 2100-GRAVAR-CLIUNIF
Executar rotina 1200-LER-CLIRJ
Senão
Mover espelho do registro CLIMG para CLIUNIF
Executar rotina 2100-GRAVAR-CLIUNIF
Executar rotina 1300-LER-CLIMG
Parágrafo 2100-GRAVAR-CLIUNIF
Gravar o registro do CLIUNIF usando sua variável espelho
Se file status for igual a “00” (sucesso)
Somar 1 ao contador de Clientes gravados no arquivo CLIUNIF
senão
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Estou fera!
Fiz Certo!
O que é JCL?
Para cada JOB que você submete, você precisa dizer ao sistema
operacional onde encontrar a apropriada entrada, como processar essa
entrada, e o que fazer com a saída resultante.Você usa a JCL (Job Control
Language - Linguagem de Controle de Serviços) para levar essas informações
ao sistema operacional através de um conjunto de comandos conhecidos como
comandos de controle de job.
Preparation
6
saibam como está seu conhecimento sobre o assunto e se você precisa ou
pode fornecer ajuda aos colegas e instrutor.
Presentation
Assim, nesta parte do treinamento você aprenderá JCL. Você precisa dela para
montar os JOBs de compilação e de execução de seus programas. Em geral o JOB de
compilação já está pronto no ambiente e você precisará perguntar aos colegas de
trabalho onde ele se encontra e como usá-lo. Já os JOBs de execução devem ser
montados pelo programador. Saber bem o JCL ajudará a destacá-lo dos demais.
6
emite o CALL é o programa PRINCIPAL e o programa que é executado a partir deste
CALL é o SUB-PROGRAMA. O SUB-PROGRAMA não pode terminar com STOP RUN,
mas sim com um GOBACK ou EXIT PROGRAM.
CALL
GOBACK
CONFDATA VERSPC
ou
CALL ‘VERCPF’ USING WS-DADOS-ENVIADOS
Endereço do
item de dado
Valor do Endereço
item de dado da cópia
Cópia do
item de dado
SUB-PROGRAMA
6
LINKAGE SECTION.
77 DADO1 PIC X(10).
77 DADO2 PIC X(10).
77 DADO3 PIC X(10).
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
01 WS-DADOS-ENVIADOS.
XXXX 05 WS-NUMERO-CPF PIC X(11).
XXXX 05 WS-RESULTADO PIC X(01).
*----------------------------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------------------------*
050-CHAMA-PROGRAMA-CPF.
MOVE “15524514585” TO WS-NUMERO-CPF
MOVE SPACES TO WS-RESULTADO
*
* O NOME DO SUB-PROGRAMA ESTA ENTRE ASPAS
*
XXXX CALL “VERCPF” USING WS-NUMERO-CPF
WS-RESULTADO
END-CALL
*
* O NOME DO SUB-PROGRAMA ESTA NA VARIAVEL WS-PROGRAMA
*
XXXX CALL WS-PROGRAMA USING WS-NUMERO-CPF
WS-RESULTADO
END-CALL
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
CALL “PROGRAMA” USING WS-DADOS
ON EXCEPTION DISPLAY “FALHA NA CHAMADA AO PROGRAMA”
END-CALL
Se um programa, que não foi chamado por nenhum outro programa, possuir a
instrução EXIT PROGRAM, essa instrução será ignorada e a próxima instrução após o
EXIT PROGRAM será executada. Já o GOBACK realmente encerra o programa, não
importando se há mais instruções no mesmo parágrafo e abaixo dele, devolvendo o
controle ao programa principal. Algumas empresas preferem usar GOBACK no lugar
de STOP RUN, fazendo com que qualquer programa possa ser chamado por outro.
IS INITIAL / CANCEL
A próxima vez que o programa for chamado, ele se lembra de seu estado da
última vez em que foi chamado. Todos os arquivos que estavam abertos continuam
abertos, e toda variável que assumiu algum valor continua com esse valor.
Embora possa ser útil a um programa lembrar seu estado chamada após
chamada, os sistemas formados por SUB-PROGRAMAS que guardam seu último
estado são poucos confiáveis e difíceis de tirar erros, pois não sabemos ao certo como
ficou seu último estado.
Um SUB-PROGRAMA pode ser forçado ao seu estado inicial toda vez que for
chamado quando incluímos a cláusula IS INITIAL no parágrafo PROGRAM-ID.
6
Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
IDENTIFICATION DIVISION.
*----------------------------------------------------------------*
PROGRAM-ID. VERCPF IS INITIAL.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
050-CHAMA-PROGRAMA-CPF.
*----------------------------------------------------------------*
MOVE “15524514585” TO WS-NUMERO-CPF
MOVE SPACES TO WS-RESULTADO
MOVE “VERCPF” TO WS-PROGRAMA
*
* CANCEL USADO EM UM CALL ESTATICO
*
XXXX CALL “VERICPF” USING WS-NUMERO-CPF
WS-RESULTADO
XXXX CANCEL “VERICPF”
*
* CANCEL USADO EM UM CALL DINAMICO
*
XXXX CALL WS-PROGRAMA USING WS-NUMERO-CPF
WS-RESULTADO
XXXX CANCEL WS-PROGRAMA
.
16 terminating messages
12 severe messages
08 error messages
04 warning messages
00 informational messages / success
6
// DCB=(LRECL=20,RECFM=FB,DSORG=PS,BLKSIZE=0)
Uma régua foi colocada no início do JOB para melhor identificar as colunas.
Uma linha na linguagem JCL começa com // nas duas primeiras colunas. Existem 3
tipos de linhas principais, também chamados de cartões, pois o JCL remonta à época
em que se usavam cartões perfurados, conforme mostra a figura a seguir:
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//XXXXXXXX JOB XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//**********************************************************************
//* COMENTARIO
//**********************************************************************
//XXXXXXXX EXEC XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//XXXXXXXX DD XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//XXXXXXXX DD XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//XXXXXXXX DD XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//XXXXXXXX EXEC XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//XXXXXXXX DD XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//XXXXXXXX DD XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//XXXXXXXX EXEC XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//XXXXXXXX DD XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//XXXXXXXX DD XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//XXXXXXXX DD XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Formato 1
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//GPAZ9901 JOB ’ACCOUNT’,MSGCLASS=X,CLASS=C,NOTIFY=GPAZ99,TIME=(0,20)
Formato 2
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//GPAZ9901 JOB ’ACCOUNT’,
// MSGCLASS=X,
// CLASS=C,
// NOTIFY=GPAZ99,
// TIME=(0,20)
Outros parâmetros do JOB não obrigatórios, mas que podem aparecer nas
empresas que usam mainframe são:
6
REGION Aloca espaço em memória. Equivale para todos os STEPs do
JOB. O valor default (padrão) é 512Kbytes, outros valores
devem ser múltiplos de 512Kbytes. Exemplos: REGION=1024K,
REGION=2M. Se REGION é codificada com 0K ou 0M, todo
espaço disponível é alocado ao job.
Sub-parâmetro “A”:
0 = imprime apenas o cartão JOB;
1 = imprime todos os cartões de JCL alimentados e os intercalados;
2 = imprime todos os cartões de JCL alimentados.
Sub-parâmetro “B”:
0 = NÃO imprime mensagens de alocação ou liberação de arquivo;
1 = imprime todas as mensagens de alocação e liberação de arquivo.
O valor default é:
(1,1) = exibe todos comandos de JCL codificados, expandidos e as
alocações
Formato 1
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//PASSO03xxEXEC PGM=GPAZ9901,COND=(0,NE,PASSO02)
Formato 2
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//PASSO03xxEXEC PGM=GPAZ9901,
// COND=(0,NE,PASSO02)
COND=((CODIGO,OPERADOR,STEPNAME),EVEN/ONLY)
COND=
(0,NE,PASSO2)
sim onde:
(4,GT,STEP1) Pular o step atual somente se o step1 terminou com return code
maior que 4
(0,EQ,STEP5) Pular o step atual somente se step5 terminou com return code
igual a 0
Outros parâmetros do EXEC não obrigatórios, mas que podem aparecer nas
empresas que usam mainframe são:
O STEPLIB vale apenas para o passo (STEP) onde foi codificado. Se for
codificado uma JOBLIB, ela invalida o STEPLIB. Exemplo:
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//GPAZ9901 JOB ’ACCOUNT’,MSGCLASS=X,CLASS=C,NOTIFY=GPAZ99,TIME=(0,20)
//PASSO01 xEXEC PGM=GPAZ9902
//STEPLIB DD DSN=GP.GERAL.LOADLIB,DISP=SHR
Teoria O cartão dd
Formato 1
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//PRDSEQM DD DSN=GP.GPAZ99.PRDSEQM,DISP=SHR
//PRDSEQF DD DSN=GP.GPAZ99.PRDSEQF,DISP=(NEW,CATLG,DELETE),
// SPACE=(TRK,(5,2),RLSE),UNIT=SYSALLDA,
// DCB=(DSORG=PS,RECFM=FB,LRECL=57,BLKSIZE=0)
//RELOCOR DD SYSOUT=*
Formato 2
6
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//PRDSEQM DD DSN=GP.GPAZ99.PRDSEQM,
// DISP=SHR
//PRDSEQF DD DSN=GP.GPAZ99.PRDSEQF,
// DISP=(NEW,CATLG,DELETE),
// SPACE=(TRK,(5,2),RLSE),
// UNIT=SYSALLDA,
// DCB=(DSORG=PS,RECFM=FB,LRECL=57,BLKSIZE=0)
//RELOCOR DD SYSOUT=*
DISP=(NEW,CATLG,DELETE)
DISP=(OLD,KEEP,KEEP)
DISP=(NEW,PASS,DELETE)
DISP=SHR
Exemplos válidos:
DISP=SHR: o arquivo é lido neste step, podendo ser lido por outros
programas de outros Jobs, pois o arquivo é de uso compartilhado (shared).
Exemplos inválidos:
SPACE=(TRK,(PRIM,SEC,DIR),RLSE,CONTIG,ROUND)
Vale notar que todo disco modelo 3390 contém 56.664 bytes por trilha, 15
trilhas por cilindro e 849.960 bytes por cilindro. O termo trilha (track) e cilindro
(cylinder) vem da época dos discos pré-RAID (redundant array of inexpensive
disks), que eram semelhantes a 8 discos de vinil empilhados e com um conjunto de
cabeçotes de leitura/gravação que se moviam sobre a superfície dos discos. Os discos
tinham superfície de gravação em ambos os lados. Das 16 superfícies, uma era usada
para informações de controle, o que deixava 15 para os dados. Uma trilha é a
quantidade de dados que podia ser lida de uma superfície em uma volta do disco, sem
precisar mover as cabeças. Um cilindro podia ser lido de todas as 15 superfícies sem
mover as cabeças. Isso é muito importante, já que um cilindro pode ser lido
rapidamente, sem qualquer movimento mecânico. O diagrama abaixo ilustra isso. Os
discos modernos usam armazenamento FBA (Fixed Block Architecture), mas devem
emular o formato dos discos 3390, de forma que os termos trilha (track) e cilindros
(cylinder) são ainda usados.
6
registros de tamanho variável, B para registros blocados,
A para registros cuja primeira posição contém caractere
ASA para impressora e U para registros de tamanho
indefinido. As possíveis combinações são: F, FB, V, VB,
U, FBA e FA.
Exemplo:
DCB=(RECFM=FB,LRECL=100,BLKSIZE=6000,DSORG=PS)
//ARQDATA DD *
20080901ANTONIO DA SILVA
20080912MARIA MOURA
20080925JOAO PEREIRA
/*
//SYSIN DD *
20080901ANTONIO DA SILVA
20080912MARIA MOURA
20080925JOAO PEREIRA
/*
ou
//SYSUDUMP DD SYSOUT=*
ou
//SYSABEND DD SYSOUT=*
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//GPAZ9901 JOB ’ACCOUNT’,MSGCLASS=X,CLASS=C,NOTIFY=GPAZ99,TIME=(0,20)
//JOBLIB DD DSN=GP.GERAL.LOADLIB,DISP=SHR
//PASSO01 xEXEC PGM=GPAZ9902
//PRDSEQM DD DSN=GP.GPAZ99.PRDSEQM1
// DSN=GP.GPAZ99.PRDSEQM2
// DSN=GP.GPAZ99.PRDSEQM3
6
Máximo de 255 arquivos sequenciais.
Máximo de 16 arquivos particionados.
Teoria ç
Fluxo de a ões de um job
JES interpreta
Determina a Digita o Submete o
o JCL e passa
Tarefa JCL JCL
p/ S.O.
P.2 sub
JOBID
S.O. executa o
serviço
SD JES agrupa as
ST Usuário
saídas e
consulta a
? saída
informações
S sobre o JOB
MAXCC
Classifica ão externa ç
Teoria de um arquivo
Practice
6
informações abaixo são falsas (F) ou verdadeiras (V):
WORKING-STORAGE SECTION.
77 WIND PIC X(001).
01 PROG010 PIC X(008) VALUE ‘PROG010’.
01 AREACALL PIC X(025).
PROCEDURE DIVISION.
...
EVALUATE TRUE
WHEN WIND = ‘A’
CALL PROG010 USING AREACALL
WHEN WIND = ‘B’
CALL ‘PROG020’ USING AREACALL
END-EVALUATE.
g) Qual a diferença entre o nome informado no DDname (DD) e o Data Set Name
(DSN)?
5) Com base no macro-fluxo abaixo escreva os comandos de JCL para incluir um novo
step (STEP0002).
ARQENT20 DSN=XPTO.PRODUTO.TABPRECO
DSN=XPTO.PRODUTO.LSTPRECO
ARQSAI20
LRECL=200
BLKSIZE=4800
6
se o step terminar normalmente catalogar o arquivo
senão excluir o arquivo
Performance
Atividade Projeto 5
Objetivo da Manutenção
Macro-Fluxo
GPXXNN05 PGMAUX01
CLIUNIF
Layout da Mensagem
Observação
6
Chamar por referência o sub-programa PGMAUX01 de forma estática,
passando a variável WS-DADOS-ENVIADOS. No campo WS-CPF mover o CPF que
se deseja verificar.
Se o CPF for válido, o campo WS-RESP conterá ‘1’, caso contrário ‘0’.
1) Pelo TSO, opção P.3.3 (Move / Copy Utility), copiar o programa GPXXNN04
para GPXXNN05.
Layout da SYSOUT
1 2 3 4 5
12345678901234567890123456789012345678901234567890
**************************************************
* CLIENTE COM CPF REJEITADO *
**************************************************
C.P.F. : 999.999.999-99
NOME : XXXXXXXXXXXXXXXXXXXXXXXXX
ENDERECO : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
TELEFONE : 99-9999-9999
COMPRAS : R$ ZZ.ZZZ.ZZ9,99
ULTIMA COMPRA : 99/XXX/9999
1 2 3 4 5
12345678901234567890123456789012345678901234567890
**************************************************
* DATA GREGORIANA 1 - 99/99/2099 *
* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *
* DATA JULIANA – 999 DE 2099 *
* DIA DA SEMANA – XXXXXXXXXXXXX *
**************************************************
1 2 3 4 5
12345678901234567890123456789012345678901234567890
==================================================
TOTAL DE CLIENTES SP............: ZZZ9
TOTAL DE CLIENTES RJ............: ZZZ9
TOTAL DE CLIENTES MG............: ZZZ9
TOTAL DE CLIENTES UNIFICADO.....: ZZZ9
TOTAL DE CLIENTES REJEITADOS....: ZZZ9
TEMPO TOTAL DE PROCESSAMENTO....: HH:MM:SS:CC
==================================================
JOB de Execução
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
77 WS-CTREJ PIC 9(04) COMP.
77 WS-CTREJ-F PIC ZZZ9.
01 WS-REG-CLIUNIF-F.
05 WS-CPFCLI-F.
10 WS-NUMCPF-F PIC 999.999.999.
10 FILLER PIC X(01)
VALUE ‘-’.
10 WS-DIGITOCPF-F PIC 99.
05 WS-NOMECLI-F PIC X(25).
05 WS-ENDCLI-F PIC X(30).
05 WS-FONECLI-F.
10 WS-DDD-F PIC 99.
10 FILLER PIC X(01)
VALUE ‘-’.
10 WS-FONE-PARTE1-F PIC X(04).
10 FILLER PIC X(01)
VALUE ‘-’.
10 WS-FONE-PARTE2-F PIC X(04).
05 WS-TOTALCOMPRAS-F PIC ZZ.ZZZ.ZZ9,99.
05 WS-ULTIMACOMPRA-F.
10 WS-DIA-ULTIMACOMPRA-F PIC 99.
10 FILLER PIC X(01)
VALUE ‘/’.
10 WS-MES-ULTIMACOMPRA-F PIC X(03).
10 FILLER PIC X(01)
VALUE ‘/’.
10 WS-ANO-ULTIMACOMPRA-F PIC 9(04).
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
2100-GRAVAR-CLIUNIF.
*----------------------------------------------------------------*
.
.
.
ELSE
COMPUTE WS-CTREJ = WS-CTREJ + 1
EVALUATE WS-ULTIMACOMPRA-UNIF(05:02)
WHEN 01 MOVE “JAN” TO WS-MES-ULTIMACOMPRA-F
WHEN 02 MOVE “FEV” TO WS-MES-ULTIMACOMPRA-F
WHEN 03 MOVE “MAR” TO WS-MES-ULTIMACOMPRA-F
WHEN 04 MOVE “ABR” TO WS-MES-ULTIMACOMPRA-F
WHEN 05 MOVE “MAI” TO WS-MES-ULTIMACOMPRA-F
WHEN 06 MOVE “JUN” TO WS-MES-ULTIMACOMPRA-F
WHEN 07 MOVE “JUL” TO WS-MES-ULTIMACOMPRA-F
WHEN 08 MOVE “AGO” TO WS-MES-ULTIMACOMPRA-F
WHEN 09 MOVE “SET” TO WS-MES-ULTIMACOMPRA-F
WHEN 10 MOVE “OUT” TO WS-MES-ULTIMACOMPRA-F
WHEN 11 MOVE “NOV” TO WS-MES-ULTIMACOMPRA-F
WHEN 12 MOVE “DEZ” TO WS-MES-ULTIMACOMPRA-F
END-EVALUATE
DISPLAY
“**************************************************”
DISPLAY
“* CLIENTE COM CPF REJEITADO *”
DISPLAY
“**************************************************”
DISPLAY “C.P.F. : “ WS-CPFCLI-F
DISPLAY “NOME : “ WS-NOMECLI-F
DISPLAY “ENDERECO : “ WS-ENDCLI-F
DISPLAY “TELEFONE : “ WS-FONECLI-F
DISPLAY “COMPRAS : R$ “ WS-TOTALCOMPRAS-F
DISPLAY “ULTIMA COMPRA : “ WS-ULTIMACOMPRA-F
END-IF
.
Parágrafo 2100-GRAVAR-CLIUNIF
Mover o número do CPF do cliente para a mensagem
Chamar o sub-programa passando essa mensagem
Cancelar o sub-programa, liberando a memória
Se CPF estiver correto
Gravar o registro do CLIUNIF usando sua variável espelho
Se file status for igual a “00” (sucesso)
Somar 1 ao contador de Clientes gravados no arquivo
CLIUNIF
senão
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
6
senão
Somar 1 ao contador de clientes rejeitados por CPF inválido
Mover os dados do cliente para as variáveis com máscara
Exibir essas variáveis conforme layout da SYSOUT
Estou fera!
Fiz Certo!
Preparation
7
O que você não sabe ?
Porque é importante conhecer estes tópicos ?
Quais são os seus temores ?
O que você considera difícil ?
Presentation
ADD (somar)
SUBTRACT (subtrair)
MULTIPLY (multiplicar)
DIVIDE (dividir)
COMPUTE (calcular)
7
imediatamente após o nome da variável de resultado. O COBOL faz um
arredondamento clássico para o resultado da instrução aritmética (valores menores
que 5 são truncados, e os maiores são arredondados para cima).
Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
ADD WS-VALOR TO WS-ACUMULADOR ROUNDED
ADD 3.14159 TO WS-CTIMP WS-CTLINHA ROUNDED
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
END-ADD
END-SUBTRACT
END-MULTIPLY
END-DIVIDE
END-COMPUTE
Todas as constantes e variáveis que são parte da adição devem ser numéricos.
Após o TO ou GIVING deve vir uma variável e não uma constante. No máximo duas
variáveis deverão anteceder a palavra GIVING. Ao usar TO, o conteúdo inicial da
variável de resultado, que deve ser numérico, é somado junto ao dos outros campos
(variável ou constante).
ADD A TO B C
COMPUTE B = B + A
COMPUTE C = C + A
ADD A B TO C
COMPUTE C = C + A + B
ADD A TO B GIVING C D
COMPUTE C = A + B
COMPUTE D = A + B
SUBTRACT
7
ser numéricos. Depois da palavra GIVING, contudo, o campo pode ser um item de
relatório. ou seja, pode possuir máscara de edição. Após FROM ou GIVING, deve
ser usada uma variável, e não uma constante.
SUBTRACT A B FROM C
COMPUTE C = C – A – B
Observe que GIVING é opcional com INTO, mas obrigatório com BY. Com
INTO sem GIVING, o resultado fica armazenado na variável após o INTO. A opção
REMAINDER é utilizada para determinar o resto da divisão, que fica armazenado na
variável após o REMAINDER. Depois da palavra GIVING, contudo, o campo pode ser
um item de relatório. ou seja, pode possuir máscara de edição.
Divisão por Zero também causa SIZE ERROR. Em uma divisão, a condição de
erro de tamanho tem um significado adicional: Se for feita uma tentativa de divisão por
zero, ocorrerá uma condição de erro de tamanho, porque a divisão por zero resulta em
um valor infinito. O que torna impossível definir um campo receptor muito grande.
DIVIDE A BY B GIVING C D E
COMPUTE C = A / B
COMPUTE D = A / B
COMPUTE E = A / B
MULTIPLY
MULTIPLY A BY B GIVING C
7
COMPUTE C = A * B
MULTIPLY A BY B GIVING C D E
COMPUTE C = A * B
COMPUTE D = A * B
COMPUTE E = A * B
−𝑏 ± √𝑏 2 − 4𝑎𝑐
𝑥=
2𝑎
Já com ADD, SUBTRACT, MULTIPLY, DIVIDE e COMPUTE para calcular a raiz quadrada
fica:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
MULTIPLY B BY B GIVING B-QUADRADO
MULTIPLY 4 BY A GIVING QUATRO-A
MULTIPLY QUATRO-A BY C GIVING QUATRO-A-C
SUBTRACT QUATRO-A-C FROM B-QUADRADO GIVING DELTA
COMPUTE RAIZ-DELTA = DELTA ** 0,5
MULTIPLY -1 BY B GIVING MENOS-B
ADD MENOS-B TO RAIZ-DELTA GIVING NUMERADOR
MULTIPLY 2 BY A GIVING DENOMINADOR
DIVIDE NUMERADOR BY DENOMINADOR GIVING X
Traduzindo:
3 4
(√1296 − √13824). 17,5 − √1908029761
7
condição de SOLTEIRO. O item de nível 88 não é o nome de uma variável, mas o
nome de uma condição. Refere-se especificamente ao item elementar
imediatamente precedente. SOLTEIRO é um nome de condição aplicado a variável
WS-ESTADO-CIVIL, uma vez que WS-ESTADO-CIVIL é imediatamente precedente
ao item de número 88.
Para setar, fazer um nome de condição ser verdadeiro usa-se a instrução SET.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
* SETANDO A VARIAVEL WS-COR-CABELO COM L
SET LOIRO TO TRUE
* EH O MESMO QUE
MOVE “L” TO WS-COR-CABELO
Não usar NOT TRUE ou FALSE para setar o nome da condição, pois gera os
seguintes erros:
A seguir um exemplo de programa que recebe uma data via PARM GO do JCL
e a valida.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*--------------------------------------------------------------*
IDENTIFICATION DIVISION.
*--------------------------------------------------------------*
7
PROGRAM-ID. VALIDADT.
*--------------------------------------------------------------*
ENVIRONMENT DIVISION.
*--------------------------------------------------------------*
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
*--------------------------------------------------------------*
DATA DIVISION.
*--------------------------------------------------------------*
WORKING-STORAGE SECTION.
*--------------------------------------------------------------*
01 WS-SITUACAO-DATA PIC X(01).
88 DATA-INVALIDA VALUE '0'.
88 DATA-VALIDA VALUE '1'.
01 WS-CALCULO-BISSEXTO.
05 WS-Q4 PIC 9(06) COMP.
05 WS-Q100 PIC 9(06) COMP.
05 WS-Q400 PIC 9(06) COMP.
05 WS-Q3600 PIC 9(06) COMP.
05 WS-R4 PIC 9(06) COMP.
05 WS-R100 PIC 9(06) COMP.
05 WS-R400 PIC 9(06) COMP.
05 WS-R3600 PIC 9(06) COMP.
*--------------------------------------------------------------*
LINKAGE SECTION.
*--------------------------------------------------------------*
01 LS-PARAMETRO.
05 LS-TAMANHO-PARAMETRO PIC S9(04) COMP.
05 LS-DATA-PARA-VALIDAR.
10 LS-ANO PIC 9(04).
10 LS-MES PIC 9(02).
10 LS-DIA PIC 9(02).
*
* TESTE 01 - ANO ENTRE 1 E 2099
*
IF DATA-VALIDA AND (LS-ANO < 1 OR > 2099)
SET DATA-INVALIDA TO TRUE
END-IF
*
* TESTE 02 - MES ENTRE 1 E 12
*
IF DATA-VALIDA AND (LS-MES < 1 OR > 12)
SET DATA-INVALIDA TO TRUE
END-IF
*
* TESTE 03 - MES COM 30 OU 31 DIAS
*
IF DATA-VALIDA AND (LS-MES = 1 OR 3 OR 5 OR 7 OR
8 OR 10 OR 12)
IF LS-DIA < 1 OR > 31
SET DATA-INVALIDA TO TRUE
END-IF
ELSE
IF LS-MES NOT = 2 AND (LS-DIA < 1 OR > 30)
SET DATA-INVALIDA TO TRUE
END-IF
END-IF
*
* TESTE 04 - FEVEREIRO EM ANO BISSEXTO
*
IF DATA-VALIDA AND LS-MES = 2
DIVIDE LS-ANO BY 4 GIVING WS-Q4 REMAINDER WS-R4
DIVIDE LS-ANO BY 100 GIVING WS-Q100 REMAINDER WS-R100
DIVIDE LS-ANO BY 400 GIVING WS-Q400 REMAINDER WS-R400
DIVIDE LS-ANO BY 3600 GIVING WS-Q3600 REMAINDER WS-R3600
*
* VERIFICANDO SE A DATA CONTINUA VALIDA
*
IF DATA-VALIDA
DISPLAY "DATA VALIDA = " LS-DATA-PARA-VALIDAR
ELSE
DISPLAY "DATA INVALIDA = " LS-DATA-PARA-VALIDAR
END-IF
STOP RUN
.
Arquivos com
Teoria múltiplos layouts
A - IDENTIFICAÇÃO
B - TRATAMENTO
C - PAGAMENTO
7
A - IDENTIFICAÇÃO
B - TRATAMENTO
C - PAGAMENTO
A - IDENTIFICAÇÃO
B - TRATAMENTO
C - PAGAMENTO
A - IDENTIFICAÇÃO
B - TRATAMENTO
B - TRATAMENTO
B - TRATAMENTO
B - TRATAMENTO
B - TRATAMENTO
C - PAGAMENTO
C - PAGAMENTO
C - PAGAMENTO
A - IDENTIFICAÇÃO FILLER
B - TRATAMENTO
C - PAGAMENTO FILLER
A - IDENTIFICAÇÃO FILLER
B - TRATAMENTO
C - PAGAMENTO FILLER
A - IDENTIFICAÇÃO FILLER
B - TRATAMENTO
C - PAGAMENTO FILLER
H - HEADER FILLER
D - DATA
D - DATA
D - DATA
D - DATA
D - DATA
D - DATA
D - DATA
T - TRAILER FILLER
Um arquivo médico em COBOL pode conter ambos desses conceitos. Ele pode
começar com um registro de cabeçalho (H), seguido por um grupo de registros A, B, C
(um grupo para cada paciente), e terminar com um registro de reboque (T). Isso dá um
arquivo com 5 tipos de registros.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
FILE SECTION.
*----------------------------------------------------------------*
FD CADALUNO
RECORDING MODE IS F.
01 REG-CADALUNO PIC X(70).
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
01 WS-REG-CADALUNO.
XXXX 05 WS-TIPO-REG PIC X(01).
XXXX 05 FILLER PIC X(69).
7
XXXX 05 WS-MES-ANO-REF PIC X(06).
05 FILLER PIC X(58).
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
READ CADALUNO INTO WS-REG-CADALUNO
...
HEADER
DATA READ CADALUNO WS-REG-CADALUNO-HEADER
DATA INTO WS-REG-CADALUNO
Objetivo do Programa
Macro-Fluxo
7
PSOLD PSMOV
EEXXNN06
PSNEW
Layout da SYSOUT
1 2 3 4 5
12345678901234567890123456789012345678901234567890
==================================================
TOTAL DE REGISTROS LIDOS OLD: ZZZ9
TOTAL DE REGISTROS LIDOS MOV: ZZZ9
TOTAL DE REGISTROS GRAVADOS.: ZZZ9
TOTAL DE REGISTROS INCLUIDOS: ZZZ9
TOTAL DE REGISTROS EXCLUIDOS: ZZZ9
TOTAL DE REGISTROS ALTERADOS: ZZZ9
TOTAL DE REGISTROS INVALIDOS: ZZZ9
TOTAL DE REGISTROS PERMANEC.: ZZZ9
==================================================
7
CODPS-M X(05) Código do produto/serviço
DESCPS-M X(30) Descrição do produto/serviço
VALORPS-M 9(05)V99 Valor do produto/serviço
TIPOMOV-M X(01) Tipo do movimento (I, E ou A)
Observação
O arquivo PSOLD possui os três tipos de registros Header, Data e Trailer nesta
ordem. Os registros de Data estão em ordem crescente de código de produto/serviço,
que é a condição fundamental para realizar o Balance Line.
O processamento deve ocorrer até que seja lido o registro de trailer dos
arquivos de entrada (INPUT) PSOLD e PSMOV.
Programa COBOL
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*--------------------------------------------------------------*
IDENTIFICATION DIVISION.
*--------------------------------------------------------------*
PROGRAM-ID. EEXXNN06.
AUTHOR. SEUNOME.
*--------------------------------------------------------------*
ENVIRONMENT DIVISION.
*--------------------------------------------------------------*
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT PSOLD ASSIGN TO UT-S-PSOLD
FILE STATUS IS FS-PSOLD
.
SELECT PSMOV ASSIGN TO UT-S-PSMOV
FILE STATUS IS FS-PSMOV
.
SELECT PSNEW ASSIGN TO UT-S-PSNEW
7
FILE STATUS IS FS-PSNEW
.
*--------------------------------------------------------------*
DATA DIVISION.
*--------------------------------------------------------------*
FILE SECTION.
*--------------------------------------------------------------*
FD PSOLD
LABEL RECORD STANDARD
BLOCK CONTAINS 0 RECORDS
RECORDING MODE IS F
RECORD CONTAINS 43 CHARACTERS
DATA RECORD IS REG-PSOLD
.
01 REG-PSOLD PIC X(43).
*--------------------------------------------------------------*
FD PSMOV
LABEL RECORD STANDARD
BLOCK CONTAINS 0 RECORDS
RECORDING MODE IS F
RECORD CONTAINS 44 CHARACTERS
DATA RECORD IS REG-PSMOV
.
01 REG-PSMOV PIC X(44).
*--------------------------------------------------------------*
FD PSNEW
LABEL RECORD STANDARD
BLOCK CONTAINS 0 RECORDS
RECORDING MODE IS F
RECORD CONTAINS 42 CHARACTERS
DATA RECORD IS REG-PSNEW
.
01 REG-PSNEW PIC X(42).
01 WS-REG-PSOLD.
05 WS-TIPO-REGISTRO-O PIC X(01).
05 FILLER PIC X(42).
*--------------------------------------------------------------*
01 WS-REG-PSMOV.
05 WS-TIPO-REGISTRO-M PIC X(01).
05 FILLER PIC X(43).
*--------------------------------------------------------------*
01 WS-REG-PSNEW.
05 WS-CODPS-N PIC X(05).
05 WS-DESCPS-N PIC X(30).
05 WS-VALORPS-N PIC 9(05)V99.
*--------------------------------------------------------------*
* FLAGS PARA O FILE STATUS DOS ARQUIVOS
*--------------------------------------------------------------*
*--------------------------------------------------------------*
* CONTADORES COM MASCARA DE EDICAO
*--------------------------------------------------------------*
*--------------------------------------------------------------*
* VARIAVEIS PARA A ROTINA DE ERRO
*--------------------------------------------------------------*
7
77 WS-MSG PIC X(60).
77 WS-FS PIC X(02).
*--------------------------------------------------------------*
PROCEDURE DIVISION.
*--------------------------------------------------------------*
0000-EEXXNN06.
PERFORM 1000-INICIALIZAR
PERFORM 2000-PROCESSAR UNTIL WS-TIPO-REGISTRO-O = "T"
AND WS-TIPO-REGISTRO-M = "T"
PERFORM 3000-TERMINO
STOP RUN
.
1000-INICIALIZAR.
MOVE 0 TO WS-CTLIDO-O
WS-CTLIDO-M
WS-CTGRAV
WS-CTINC
WS-CTEXC
WS-CTALT
WS-CTINV
WS-CTPERM
OPEN INPUT PSOLD
IF NOT SUCESSO-O
MOVE "ERRO ABERTURA PSOLD" TO WS-MSG
MOVE FS-PSOLD TO WS-FS
GO TO 9000-ERRO
END-IF
IF FIM-ARQ-O
MOVE "PSOLD VAZIO" TO WS-MSG
MOVE FS-PSOLD TO WS-FS
GO TO 9000-ERRO
END-IF
PERFORM 1500-LER-PSOLD
PERFORM 1600-LER-PSMOV
IF FIM-ARQ-M
MOVE "PSMOV VAZIO" TO WS-MSG
MOVE FS-PSMOV TO WS-FS
GO TO 9000-ERRO
END-IF
PERFORM 1600-LER-PSMOV
1500-LER-PSOLD.
READ PSOLD INTO WS-REG-PSOLD
IF SUCESSO-O
ADD 1 TO WS-CTLIDO-O
IF WS-TIPO-REGISTRO-O = "T"
MOVE HIGH-VALUES TO WS-CODPS-O
END-IF
ELSE
IF FIM-ARQ-O
IF WS-CTLIDO > 0
MOVE "PSOLD SEM TRAILER"
TO WS-MSG
MOVE FS-PSOLD TO WS-FS
GO TO 9000-ERRO
END-IF
ELSE
MOVE "ERRO LEITURA PSOLD" TO WS-MSG
MOVE FS-PSOLD TO WS-FS
GO TO 9000-ERRO
END-IF
END-IF
.
7
PERFORM 1600-LER-PSMOV
ELSE
PERFORM 2300-ALT-EXC
PERFORM 1500-LER-PSOLD
PERFORM 1600-LER-PSMOV
END-IF
END-IF
.
2100-MANTER.
PERFORM 2500-GRAVA-O
ADD 1 TO WS-CTPERM
.
2200-INCLUIR.
IF WS-TIPOMOV-M = "I"
PERFORM 2600-GRAVA-M
ADD 1 TO WS-CTINC
ELSE
ADD 1 TO WS-CTINV
END-IF
.
2300-ALT-EXC.
IF WS-TIPOMOV-M = "A"
PERFORM 2600-GRAVA-M
ADD 1 TO WS-CTALT
ELSE
IF WS-TIPOMOV-M = "E"
ADD 1 TO WS-CTEXC
ELSE
ADD 1 TO WS-CTINV
ADD 1 TO WS-CTPERM
PERFORM 2500-GRAVA-O
END-IF
END-IF
.
IF WS-VALORPS-M IS NUMERIC
MOVE WS-VALORPS-M TO WS-VALORPS-N
ELSE
MOVE WS-VALORPS-O TO WS-VALORPS-N
END-IF
3000-TERMINO.
MOVE WS-CTLIDO-O TO WS-CTLIDO-O-F
MOVE WS-CTLIDO-M TO WS-CTLIDO-M-F
MOVE WS-CTGRAV TO WS-CTGRAV-F
MOVE WS-CTINC TO WS-CTINC-F
MOVE WS-CTEXC TO WS-CTEXC-F
MOVE WS-CTALT TO WS-CTALT-F
MOVE WS-CTINV TO WS-CTINV-F
MOVE WS-CTPERM TO WS-CTPERM-F
DISPLAY "=================================================="
DISPLAY "TOTAL DE REGISTROS LIDOS OLD: " WS-CTLIDO-O-F
DISPLAY "TOTAL DE REGISTROS LIDOS MOV: " WS-CTLIDO-M-F
DISPLAY "TOTAL DE REGISTROS GRAVADOS.: " WS-CTGRAV-F
DISPLAY "TOTAL DE REGISTROS INCLUIDOS: " WS-CTINC-F
DISPLAY "TOTAL DE REGISTROS EXCLUIDOS: " WS-CTEXC-F
DISPLAY "TOTAL DE REGISTROS ALTERADOS: " WS-CTALT-F
DISPLAY "TOTAL DE REGISTROS INVALIDOS: " WS-CTINV-F
DISPLAY "TOTAL DE REGISTROS PERMANEC.: " WS-CTPERM-F
DISPLAY "=================================================="
CLOSE PSOLD
IF NOT SUCESSO-O
MOVE "ERRO FECHAMENTO PSOLD" TO WS-MSG
MOVE FS-PSOLD TO WS-FS
GO TO 9000-ERRO
END-IF
CLOSE PSMOV
IF NOT SUCESSO-M
MOVE "ERRO FECHAMENTO PSMOV" TO WS-MSG
MOVE FS-PSMOV TO WS-FS
GO TO 9000-ERRO
END-IF
CLOSE PSNEW
IF NOT SUCESSO-N
MOVE "ERRO FECHAMENTO PSNEW" TO WS-MSG
MOVE FS-PSNEW TO WS-FS
GO TO 9000-ERRO
END-IF
DISPLAY "=================================================="
DISPLAY " TERMINO NORMAL EEXXNN06 "
DISPLAY "=================================================="
.
9000-ERRO.
DISPLAY "=================================================="
DISPLAY "MENSAGEM....: " WS-MSG
DISPLAY "FILE STATUS.: " WS-FS
DISPLAY "=================================================="
DISPLAY "== TERMINO ANORMAL DO PROGRAMA EEXXNN06 =="
DISPLAY "=================================================="
MOVE 12 TO RETURN-CODE
STOP RUN
.
JOB de Execução
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//GPXXNN06 JOB SEUNOME,CLASS=A,MSGCLASS=X,NOTIFY=GPXXNN,TIME=(0,20)
//*******************************************************************
//STEP001 EXEC PGM=GPXXNN06
//STEPLIB DD DSN=GP.GERAL.LOADLIB,DISP=SHR
//PSOLD DD DSN=GP.GPXX99.PSOLD,DISP=SHR
//PSMOV DD DSN=GP.GPXX99.PSMOV,DISP=SHR
//PSNEW DD DSN=GP.GPXXNN.PSNEW,DISP=(OLD,CATLG,DELETE),
// SPACE=(TRK,(1,1),RLSE),UNIT=SYSALLDA,
// DCB=(LRECL=42,RECFM=FB,DSORG=PS,BLKSIZE=0)
Practice
7
todos os valores assumidos por cada uma delas:
01 VARIAVEIS.
05 COD-ENT-CD PIC 9(3) VALUE 7.
05 COD-EMP-CD PIC 9(3) VALUE ZEROS.
05 IND PIC 9(2) VALUE ZEROS.
05 QUO-EMP-CD PIC 9(3) VALUE ZEROS.
05 RES-EMP-CD PIC 9(3) VALUE ZEROS.
.............................................
PERFORM VARYING IND FROM 2 BY 1 UNTIL IND > 5
COMPUTE COD-EMP-CD = COD-EMP-CD + (COD-ENT-CD * IND)
END-PERFORM
DIVIDE COD-EMP-CD BY 2
GIVING QUO-EMP-CD
REMAINDER RES-EMP-CD
IF RES-EMP-CD > ZEROS
COMPUTE QUO-EMP-CD = IND * COD-EMP-CD
ELSE
DIVIDE COD-EMP-CD BY IND GIVING QUO-EMP-CD
END-IF
ADD 103 TO QUO-EMP-CD
MOVE QUO-EMP-CD TO RES-EMP-CD
DISPLAY 'RES-EMP-CD=' RES-EMP-CD.
Variáveis Valores
COD-ENT-CD
COD-EMP-CD
IND
QUO-EMP-CD
RES-EMP-CD
a) COMPUTE A = A + B
b) COMPUTE C = A + 7
c) COMPUTE C = A – B – 5
d) COMPUTE C = A / B
e) COMPUTE C = A * B
5
a) 𝑇 = 9 (𝐹 − 32)
𝐻
𝑀
b) 𝐶 = 745.6999 𝑇
𝐴+𝐵+𝐶
c) 𝑆=
2
0 – Maternal
1 – Ensino Fundamental I
2 – Ensino Fundamental II
3 – Ensino Médio
4 – Ensino superior
5 – Especialização
7
6 – Mestrado
7 – Doutorado
8 – Pós-Doutorado
WORKING-STORAGE SECTION.
Performance
Atividade Projeto 6
Objetivo do Programa
Macro-Fluxo
CLIOLD CLIMOV
GPXXNN06 PGMAUX02
CLINEW
Observação
Clientes que pagaram as suas dívidas virão com o movimento “E” e não devem
ser gravadas no novo arquivo. (Exclusão)
Clientes que adquiriram dívidas virão com o movimento “I” e devem ser
gravadas no novo arquivo. (Inclusão)
Clientes que continuam devendo virão com o movimento “A” e devem ter o
valor da dívida corrigida antes de gravar no novo arquivo. A correção será feita pelo
programa PGMAUX02, que vai somar juros no valor da dívida.
Clientes que não tem movimento devem ser exibidos na SYSOUT, seu código
e a mensagem “sem movimento” para posterior análise.
7
usuário):
1) Pela TSO, opção P.2 (Edit Entry Panel), crie o programa GPXXNN06 em
sua COBLIB.
4) Pela TSO, opção P.2 (Edit Entry Panel),crie o job EXECOB06 em sua
JOBLIB, monte o JOB de forma que os arquivos de entrada (CLIOLD e
CLIMOV) sejam lidos com o prefixo de seu instrutor (XX99) e altere XXNN
pelo prefixo de seu usuário.
Layout da SYSOUT
1 2 3 4 5
12345678901234567890123456789012345678901234567890
**************************************************
* DATA GREGORIANA 1 - 99/99/2099 *
* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *
* DATA JULIANA – 999 DE 2099 *
* DIA DA SEMANA – XXXXXXXXXXXXX *
**************************************************
1 2 3 4 5
12345678901234567890123456789012345678901234567890
==================================================
TOTAL DE CADASTROS LIDOS EM CLIOLD..........: ZZZ9
TOTAL DE MOVIMENTOS LIDOS EM CLIMOV.........: ZZZ9
TOTAL DE CADASTROS GRAVADOS EM CLINEW.......: ZZZ9
TOTAL DE CADASTROS INCLUIDOS EM CLINEW......: ZZZ9
TOTAL DE CADASTROS EXCLUIDOS DE CLIOLD......: ZZZ9
TOTAL DE CADASTROS ALTERADOS PARA CLINEW....: ZZZ9
TOTAL DE CADASTROS INVALIDOS................: ZZZ9
TOTAL DE MOVIMENTOS INVALIDOS...............: ZZZ9
TEMPO TOTAL DE PROCESSAMENTO.........: HH:MM:SS:CC
==================================================
7
TOTALDIVIDA-O 9(08)V99 Valor total da dívida
Parágrafo 1000-INICIALIZAR
Receber o horário inicial de processamento
Mover zero para os contadores:
cadastros lidos CLIOLD
movimentos lidos CLIMOV
cadastros gravados CLINEW
cadastros incluídos
cadastros excluídos
cadastros alterados
cadastros inválidos
movimentos inválidos
7
Se o arquivo estiver vazio (file status = “10”)
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Parágrafo 2100-INCLUIR
Se o tipo de movimento for “I”
Executar o parágrafo 2400-GRAVA-M
Somar 1 ao contador de cadastros incluídos
Senão
Somar 1 ao contador de movimentos inválidos
Parágrafo 2200-ALT-EXC
Se o tipo de movimento for “A”
Executar o parágrafo 2300-ALTERAR
Senão
Se o tipo de movimento for “E”
Somar 1 ao contador de cadastros excluídos
Senão
Somar 1 ao contador de movimentos inválidos
Parágrafo 2300-ALTERAR
Mover o total da dívida do CLIOLD para a Mensagem
Chamar dinamicamente o programa PGMAUX02 passando dados
7
Cancelar dinamicamente o programa PGMAUX02
Se a resposta for igual a “0” (sucesso)
Mover o valor recalculado da dívida para CLIOLD
Somar 1 ao contador de cadastros alterados
Executar o parágrafo 2400-GRAVA-M
Mover espaço para WS-RESP
Senão
Somar 1 ao contador de movimentos inválidos
Somar 1 ao contador de cadastros inválidos
Parágrafo 2400-GRAVA-M
Mover o código do CLIMOV para o código do CLINEW
Parágrafo 3000-TERMINO
Executar rotina 9000-IMPRIME-DATA
Estou fera!
Fiz Certo!
Preparation
8
O que você considera difícil ?
Presentation
É uma atividade que requer muita atenção aos detalhes e paciência nos ajustes
de layout. Portanto tenha muita certeza dos espaços em branco que você colocar para
que o relatório não fique desalinhado.
1ª – Especificação do Relatório
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
8
ENVIRONMENT DIVISION.
*----------------------------------------------------------------*
CONFIGURATION SECTION.
*----------------------------------------------------------------*
SPECIAL-NAMES
DECIMAL-POINT IS COMMA.
*----------------------------------------------------------------*
INPUT-OUTPUT SECTION.
*----------------------------------------------------------------*
FILE-CONTROL.
SELECT RELPROD ASSIGN TO UT-S-RELPROD
FILE STATUS IS FS-RELPROD.
2ª – Detalhamento do Relatório
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
WORKING-STORAGE SECTION.
01 WS-CABEC1.
05 WS-DATA-CABEC1 PIC X(10).
05 FILLER PIC X(02)
VALUE SPACES.
05 WS-HORA-CABEC1 PIC X(08).
05 FILLER PIC X(02)
VALUE SPACES.
05 FILLER PIC X(56)
VALUE
"RELACAO DE PRODUTOS PARA REPOSICAO DE ESTOQUE PAG. ".
05 WS-PAG-CABEC1 PIC Z9.
8
4ª – Manipulação do Relatório
Como o relatório é um arquivo gravado, ele precisa ser aberto como OUTPUT
e testar o FILE STATUS. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXOPEN OUTPUT RELPROD
ADD 1 TO WS-CTPAG
MOVE 4 TO WS-CTLIN
.
O WS-CABEC1 precisa ser impresso no início de cada página, por isso foi
utilizado a cláusula AFTER PAGE, que grava o registro somente depois de ter pulado
uma página. As demais linhas de cabeçalhos devem aparecer abaixo da primeira,
então não levam AFTER PAGE.
ADD 1 TO WS-CTIMP
ADD 1 TO WS-CTLIN
.
O rodapé deve ser impresso no final da página, mas nem sempre há linhas de
detalhe suficientes para preencher toda a página, então é necessário calcular quantas
linhas é necessário pular antes da impressão do rodapé. A cláusula AFTER N LINES
grava o rodapé somente depois de pular N linhas. Abaixo temos um exemplo da
impressão do rodapé.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
060-IMPRIME-RODAPE.
COMPUTE WS-PULA = 49 – WS-CTLINHA
MOVE 50 TO WS-CTLIN
.
Como neste exemplo estão sendo impressos 50 linhas por página, veja o
layout acima, e as linhas de rodapé são impressas exatamente nas linhas 49 e 50, é
preciso calcular quantas linhas faltam para chegar até o final da página, ou seja linha
49. A variável WS-PULA armazena esse resultado.
8
(REG-RELPROD), pela opção FROM.
REG-RELPROD
RELPROD
A opção FROM deve ser sempre utilizada para transferir as linhas do relatório a
serem impressas, definidas na WORKING-STORAGE SECTION, após serem
preparadas, para o registro do arquivo de impressão.
A seguir temos uma lista dos caracteres de controle ASA que controlam o
espaçamento da próxima linha em relação à última linha impressa: Observação –
blank é um espaço em branco.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
* NEXT LINE (AVANCA PARA PROXIMA LINHA)
XXXXXXXXXXXWRITE REG-RELATORIO FROM WS-LINHA AFTER 1 LINE
8
* NAO EH NECESSARIO COLOCAR AFTER 1 LINE, POIS EH DEFAULT
XXXXXXXXXXXWRITE REG-RELATORIO FROM WS-LINHA
EXEMPLO RELATÓRIO
Objetivo do Programa
Macro-Fluxo
8
ESTOQUE
EEXXNN07
RELATO
Layout do Relatório
01 12345678911234567892123456789312345678941234567895123456789612345678971234567898
02 12345678901234567890123456789012345678901234567890123456789012345678901234567890
01 DD/MM/20AA HH:MM:SS RELACAO DE PRODUTOS PARA REPOSICAO DO ESTOQUE PAG. Z9
02 --------------------------------------------------------------------------------
03 CODIGO DESCRICAO QT.EST. QT.MIN. QT.REP. ULT.PRECO
04 ------ ------------------------- ------- ------- ------- ---------
05 99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
06 99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
.. 99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
45 99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
46 99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
47 99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
48 99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
49 --------------------------------------------------------------------------------
50 INDUSTRIAS SEU NOME LTDA. SERVIMOS BEM PARA SERVIR SEMPRE
Observação
Programa COBOL
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
IDENTIFICATION DIVISION.
*----------------------------------------------------------------*
PROGRAM-ID. EEXXNN07.
AUTHOR. SEUNOME.
*----------------------------------------------------------------*
ENVIRONMENT DIVISION.
*----------------------------------------------------------------*
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT ESTOQUE ASSIGN TO UT-S-ESTOQUE
FILE STATUS IS FS-ESTOQUE
.
SELECT RELATO ASSIGN TO UT-S-RELATO
FILE STATUS IS FS-RELATO
.
*----------------------------------------------------------------*
DATA DIVISION.
*----------------------------------------------------------------*
8
FILE SECTION.
FD ESTOQUE
LABEL RECORD STANDARD
BLOCK CONTAINS 0 RECORDS
RECORDING MODE IS F
RECORD CONTAINS 45 CHARACTERS
DATA RECORD IS REG-ESTOQUE
.
01 REG-ESTOQUE.
05 CODPROD-E PIC 9(05).
05 DESCRICAO-E PIC X(25).
05 QTDEST-E PIC 9(03).
05 QTDMIN-E PIC 9(03).
05 QTDMAX-E PIC 9(03).
05 PRECO-E PIC 9(04)V99.
FD RELATO
LABEL RECORD OMITTED
RECORDING MODE IS F
RECORD CONTAINS 80 CHARACTERS
DATA RECORD IS REG-RELATO
.
01 REG-RELATO PIC X(80).
01 WS-DATA-SYS.
05 WS-ANO PIC 99.
05 WS-MES PIC 99.
05 WS-DIA PIC 99.
01 WS-HORA-SYS.
05 WS-HORA PIC 99.
05 WS-MINUTO PIC 99.
05 WS-SEGUNDO PIC 99.
01 WS-DATA-FORMATADA.
05 WS-DIA PIC 99.
05 FILLER PIC X(01)
VALUE “/”.
05 WS-MES PIC 99.
05 FILLER PIC X(03)
VALUE “/20”.
05 WS-ANO PIC 99.
01 WS-HORA-FORMATADA.
05 WS-HORA PIC 99.
8
05 FILLER PIC X(01)
VALUE “:”.
05 WS-MINUTO PIC 99.
05 FILLER PIC X(01)
VALUE “:”.
05 WS-SEGUNDO PIC 99.
*----------------------------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------------------------*
000-EEXXNN07.
PERFORM 010-INICIALIZAR
PERFORM 030-PROCESSAR
UNTIL FS-ESTOQUE = "10"
PERFORM 070-TERMINO
STOP RUN
.
PERFORM 999-FORMATA-DATA-HORA
PERFORM 020-LER-ESTOQUE
.
020-LER-ESTOQUE.
READ ESTOQUE INTO WS-REG-ESTOQUE
IF FS-ESTOQUE = "00"
ADD 1 TO WS-CTLIDO
ELSE
IF FS-ESTOQUE NOT = "10"
MOVE "ERRO LEITURA ESTOQUE" TO WS-MSG
MOVE FS-ESTOQUE TO WS-FS
GO TO 999-ERRO
END-IF
END-IF
.
030-PROCESSAR.
IF WS-QTDEST-E < WS-QTDMIN-E
IF WS-CTLIN > 49
PERFORM 040-IMPRIME-CABECALHO
END-IF
PERFORM 050-IMPRIME-DETALHE
IF WS-CTLIN = 48
PERFORM 060-IMPRIME-RODAPE
END-IF
ELSE
ADD 1 TO WS-CTDESP
END-IF
PERFORM 020-LER-ESTOQUE
.
ADD 1 TO WS-CTPAG
8
END-IF
MOVE 4 TO WS-CTLIN
.
050-IMPRIME-DETALHE.
MOVE WS-CODPROD-E TO LD-CODPROD
MOVE WS-DESCRICAO-E TO LD-DESCRICAO
MOVE WS-QTDEST-E TO LD-QTDEST
MOVE WS-QTDMIN-E TO LD-QTDMIN
COMPUTE WS-QTDREP = WS-QTDMAX-E – WS-QTDEST-E
MOVE WS-QTDREP TO LD-QTDREP
MOVE WS-PRECO-E TO LD-PRECO
ADD 1 TO WS-CTIMP
ADD 1 TO WS-CTLIN
.
MOVE 50 TO WS-CTLIN
.
070-TERMINO.
IF WS-CTLIN < 50
PERFORM 060-IMPRIME-RODAPE
END-IF
CLOSE ESTOQUE
IF FS-ESTOQUE NOT = "00"
MOVE "ERRO FECHAMENTO ESTOQUE" TO WS-MSG
MOVE FS-ESTOQUE TO WS-FS
GO TO 999-ERRO
END-IF
CLOSE RELATO
IF FS-RELATO NOT = "00"
MOVE "ERRO FECHAMENTO RELATO" TO WS-MSG
MOVE FS-RELATO TO WS-FS
GO TO 999-ERRO
END-IF
DISPLAY "*------------------------------------------*"
DISPLAY " DEU CERTO!!! )/_ "
DISPLAY " _.--..---'-,--O_ "
DISPLAY " \|..' ._O__)_ "
DISPLAY " ,-. _./ _ \..--( / "
DISPLAY " `\.-''__.-' \ ( \_ "
DISPLAY " `''' `\__ /\ "
DISPLAY " /) "
DISPLAY "*------------------------------------------*"
DISPLAY " TERMINO NORMAL DO EEXXNN07"
DISPLAY "*------------------------------------------*"
.
999-FORMATA-DATA-HORA.
ACCEPT WS-DATA-SYS FROM DATE
ACCEPT WS-HORA-SYS FROM TIME
8
MOVE CORRESPONDING WS-DATA-SYS TO WS-DATA-FORMATADA
MOVE CORRESPONDING WS-HORA-SYS TO WS-HORA-FORMATADA
.
Anatomia de um
remalina
80 ou 132 colunas
de 1/10 de polegada
JOB de Execução
12345678911234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//GPAZNN05 JOB SEUNOME,MSGCLASS=X,CLASS=C,NOTIFY=GPAZNN,TIME=(0,20)
//*****************************************************************
//STEP1 EXEC PGM=EEXXNN07
//STEPLIB DD DSN=GP.GERAL.LOADLIB,DISP=SHR
//ESTOQUE DD DSN=GP.GPXX99.ESTOQUE,DISP=SHR
//RELATO DD SYSOUT=*
Cabecalho,
Detalhe e
Rodapé.
Ok, já
entendi !
Practice
8
b) Variável WS-CTLINHA na rotina de impressão de Cabeçalho.
Performance
Atividade Projeto 7
Objetivo do Programa
Macro-Fluxo
MOVTOEST
GPXXNN07
RELMOV01
8
TIPOMOVTO X(01) Tipo do movimento E=entrada S=saída
QTDMOVTO 9(08) COMP-3 Quantidade movimentada
01 12345678911234567892123456789312345678941234567895123456789612345678971234567898
02 12345678901234567890123456789012345678901234567890123456789012345678901234567890
01 DD/MM/20AA ** BOX COMPANY DO BRASIL ** HH:MM:SS
02 RELATORIO DE MOVIMENTACAO DE ESTOQUE (REFERENCIA 9999/99) PAG. Z.ZZ9
03 --------------------------------------------------------------------------------
04 NUMERO DATA HORA PRODUTO QUANTIDADE
05 ---------- ---------- -------- ------- -----------
06 99.999.999 DD/MM/AAAA HH:MM:SS 9999 ZZ.ZZZ.ZZ9+
.. 99.999.999 DD/MM/AAAA HH:MM:SS 9999 ZZ.ZZZ.ZZ9+
45 99.999.999 DD/MM/AAAA HH:MM:SS 9999 ZZ.ZZZ.ZZ9+
46 99.999.999 DD/MM/AAAA HH:MM:SS 9999 ZZ.ZZZ.ZZ9+
47 99.999.999 DD/MM/AAAA HH:MM:SS 9999 ZZ.ZZZ.ZZ9+
48 99.999.999 DD/MM/AAAA HH:MM:SS 9999 ZZ.ZZZ.ZZ9+
49 --------------------------------------------------------------------------------
50 APOS O USO UTILIZE ESTE PAPEL COMO RASCUNHO RECICLE SUAS IDEIAS
Layout da SYSOUT
1 2 3 4 5
12345678901234567890123456789012345678901234567890
**************************************************
* DATA GREGORIANA 1 - 99/99/2099 *
* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *
* DATA JULIANA – 999 DE 2099 *
* DIA DA SEMANA – XXXXXXXXXXXXX *
**************************************************
1 2 3 4 5
12345678901234567890123456789012345678901234567890
=======================================================
BOX COMPANY DO BRASIL
=======================================================
TOTAL DE MOVIMENTOS LIDOS.................: ZZ.ZZ9
TOTAL DE PAGINAS IMPRESSAS................: ZZ.ZZ9
TOTAL DE MOVIMENTOS IMPRESSOS.............: ZZ.ZZ9
=======================================================
TEMPO TOTAL DE PROCESSAMENTO..............: HH:MM:SS:CC
=======================================================
Observação
WS-DATA-CABEC1 WS-HORA-CABEC1
Vou fazer
direito.
Eu
prometo!
LD-NUMMOVTO
LD-DATAMOVTO
LD-HORAMOVTO
LD-CODPRODMOVTO
LD-QTDMOVTO
1) Pela TSO, opção P.2 (Edit Entry Panel), crie o programa GPXXNN07 em
sua COBLIB.
4) Pela TSO, opção P.2 (Edit Entry Panel),crie o job EXECOB07 em sua
JOBLIB, monte o JOB de forma que o arquivos de entrada (MOVTOEST)
sejam lidos com o prefixo de seu instrutor (XX99) e o relatório será
impresso na classe de mensagem do JOB.
Parágrafo 1000-INICIALIZAR
Receber o horário inicial de processamento
Receber a data do sistema
Mover zero para os contadores:
registros lidos
página
registros impressos
Mover 99 para o contador de linha
8
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Parágrafo 1100-LER-MOVTOEST
Ler registro do arquivo MOVTOEST carregando variável espelho
Se file status for igual a “00” (sucesso)
Somar 1 ao contador de registros lidos
Senão
Se file status for igual a “10” (fim de arquivo)
Se WS-CTLIDO > 0
Erro -> arquivo não tem Trailer
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Senão
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Parágrafo 2000-PROCESSAR
Se o contador de linha for maior que 49
Executar o parágrafo 2100-IMPRIME-CABECALHO
Parágrafo 2100-IMPRIME-CABECALHO
Mover a data e a hora formatada para o cabeçalho 1
Mover o ano e mês de referencia para o cabeçalho 2
Somar 1 ao contador de página
Mover o contador de página para o cabeçalho 2
gravar os 5 cabeçalhos testando o file status
Se o file status for diferente de “00”
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Mover 5 para o contador de linha
Parágrafo 2200-IMPRIME-DETALHE
Mover para as variáveis da LINDET:
Número do movimento
Data do movimento
Hora do movimento
Código do produto
Se o tipo do movimento for de entrada
Mover a qtde para a LINDET
Senão
Multiplicar a qtde por -1 atribuindo o resultado para a LINDET
Parágrafo 2300-IMPRIME-RODAPE
8
Calcular WS-PULA = 48 – WS-CTLINHA
Parágrafo 3000-TERMINO
Executar rotina 9000-IMPRIME-DATA
Estou fera!
Fiz Certo!
Preparation
9
Reflexão É aqui que você se compromete !!
Presentation
Até agora, todos os projetos que você desenvolveu utilizou arquivos QSAM
(Queued Storage Access Method), onde os arquivos mantém seus registros
organizados sequencialmente, o que permite apenas o acesso sequencial aos
mesmos. Assim, uma vez começada a leitura dos registros, só se pode ler o próximo
registro, sem pular a sequencia.
0900MARTELO
0700CADEADO
0300ARRUELA
0400JANELA
0200PORCA
0500PORTA
0800PREGO
EOF
BOF
9
VSAM – KSDS (Key-Sequenced Data Set) – O arquivo é dividido em duas
partes, índice e dados. O índice contém a chave principal do arquivo. Um campo ou
uma sequencia de campos formam a chave principal, utilizada para ordenar o arquivo.
Uma chave principal identifica um único registro podendo ser, por exemplo, o código
de um produto, número de CPF, número de agencia e conta de uma conta corrente,
etc. O índice aponta para o registro na parte de dados do arquivo. É o tipo de arquivo
VSAM mais utilizado nas empresas e foco de nosso curso.
INDEX DATA
0100 0500PARAFUSO010003001000
0200 0600ARRUELAX030005001200
0300 0100PREGOXXX120015003200
0400 0200PORCAXXX001000300040
0500 0300BUCHAXXX111122223333
0600 0400CHAPAXXX000200030004
1 2 3 4 5 6
0001PARAFUSO 0005ARRUELA
7 8 9 10 11 12
0008PORCA 0012JANELA
13 14 15 16 17 18
014PORTA 0017MARTELO
19 20 21 22 23 24
0022PREGO
Depois da execução deste JOB o arquivo VSAM KSDS é criado, porém estará
vazio. É preciso um programa de CARGA, que colocará dados neste arquivo.
DA-I indica que a organização do arquivo é para acesso direto (DA = Direct
Access) e o I indica que o arquivo é indexado (I = Indexed).
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXDATAXXXXXXXXXXXXXXXXXXX DIVISION.
XXXXXXXFILEXXXXXXXXXXXXXXXXXXX SECTION.
0,XXXXXFDxxVCADPRD
XXXXXXXXXXXRECORD CONTAINS 69 CHARACTERS
XXXXXXXXXXXDATA RECORD IS REG-VCADPRD
XXXXXXXXXXX.
01XXREG-VCADPRD.
05 CODPROD-V PIC X(04).
05 DESCPROD-V PIC X(20).
05 UNIDPROD-V PIC X(05).
05 LOCALPROD-V PIC X(05).
05 QTDEST-V PIC 9(05).
05 QTDMAX-V PIC 9(05).
05 QTDMIN-V PIC 9(05).
05 PRECOCOMPRA-V PIC 9(06)V99.
05 PRECOVENDA-V PIC 9(06)V99.
05 PERCOMIS-V PIC 9(02)V99.
OPEN
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXOPEN INPUT VCADPRD
XXXXXXXXXXXOPEN OUTPUT VCADPRD
XXXXXXXXXXXOPEN I-O VCADPRD
INPUT indica que o arquivo será lido pelo programa. Não é possível
gravar um arquivo aberto como INPUT. Abrir um VSAM, que nunca teve
registros, como INPUT causará um erro (FILE STATUS 35), pois ele é
tratado como indisponível
READ 9
Lê um registro do arquivo. Há três formas de ler um arquivo VSAM KSDS,
dependendo do ACCESS MODE utilizado.
É idêntico ao arquivo sequencial. Uma vez que o arquivo VSAM KSDS tenha
sido aberto com OPEN INPUT, o READ lê o primeiro registro. Novos READ lerão os
demais registros na sequência, até encontrar FILE STATUS = “10” (EOF). Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
= “10”XXXXXXXXXXXREADXVCADPRDXINTOXWS-REG-VCADPRD
XXXXXXXXXXXREADXVCADPRDXINTOXWS-REG-VCADPRD
XXXXXXXXXXXXXXXXAT ENDXXXXXXXMOVE ‘S’ TO WS-FIMARQ
XXXXXXXXXXXXXXXXNOT AT ENDXXXADD 1 TO WS-CTLIDO
XXXXXXXXXXXEND-READ
NOT = “10”
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXMOVEx“0100”x TOxCODPROD-V
XXXXXXXXXXXREADXVCADPRDXINTOXWS-REG-VCADPRD
XXXXXX*----------------------------------------------------------------*
= “23”
XXXXXXXXXXXMOVEx“0100”x TOxCODPROD-V
XXXXXXXXXXXREADXVCADPRDXINTOXWS-REG-VCADPRD
XXXXXXXXXXXXXXXXINVALIDXKEYXXXXXDISPLAYX“REGISTROXNAOXLOCALIZADO”
XXXXXXXXXXXXXXXXNOTXINVALIDXKEYXADD 1 TO WS-CTLIDO
XXXXXXXXXXXEND-READ
NOT = “23”
XXXXXX*----------------------------------------------------------------*
= “23”
XXXXXXXXXXXMOVEx“0100”x TOxCODPROD-V
XXXXXXXXXXXREADXVCADPRDXINTOXWS-REG-VCADPRD KEY IS CODPROD-V
XXXXXXXXXXXXXXXXINVALIDXKEYXXXXXDISPLAYX“REGISTROXNAOXLOCALIZADO”
XXXXXXXXXXXXXXXXNOTXINVALIDXKEYXADD 1 TO WS-CTLIDO
XXXXXXXXXXXEND-READ
NOT = “23”
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXMOVEx“0100”x TOxCODPROD-V
XXXXXXXXXXXSTART VCADPRD KEY IS NOT LESS CODPROD-V
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXREADXVCADPRDXNEXTXINTOXWS-REG-VCADPRD
START
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXMOVEx“0100”x TOxCODPROD-V
XXXXXXXXXXXSTART VCADPRD
XXXXXX*----------------------------------------------------------------*
XXXXXX* O START ACIMA EQUIVALE AO START ABAIXO
XXXXXX*----------------------------------------------------------------*
9
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXMOVEx“0100”x TOxCODPROD-V
XXXXXXXXXXXSTART VCADPRD KEY IS NOT LESS CODPROD-V
XXXXXX*----------------------------------------------------------------*
= “23”
XXXXXXXXXXXMOVEx“0100”xTOxCODPROD-V
XXXXXXXXXXXSTARTXVCADPRDXKEYXISXEQUALXCODPROD-V
XXXXXXXXXXXXXXINVALIDXKEYXXXXXDISPLAYX “ERRO NO POCISIONAMENTO”
XXXXXXXXXXXXXXNOTXINVALIDXKEYXDISPLAYX “PODE PROSSEGUIR COM A CONSULTA”
XXXXXXXXXXXEND-START
NOT = “23”
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXWRITEXREG-VCADPRDXFROMXWS-REG-VCADPRD
= “22” XXXXXX*----------------------------------------------------------------*
XXXXXXXXXXXWRITEXREG-VCADPRDXFROMXWS-REG-VCADPRD
XXXXXXXXXXXXXXINVALID KEYXXXXXDISPLAYX“REGISTRO DUPLICADO”
XXXXXXXXXXXXXXNOTXINVALIDXKEYXADD 1 TO WS-CTGRAV
XXXXXXXXXXXEND-WRITE
NOT = “22”
O arquivo deve ser aberto como OUTPUT ou I-O para poder usar o WRITE. As
sentenças INVALID KEY e NOT INVALID KEY também podem ser utilizadas, porém
recomenda-se o uso do FILE STATUS.
REWRITE
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXMOVE “0100” TO CODPROD-V
= “23” XXXXXXXXXXXREAD VCADPRDX
XXXXXXXXXXX
XXXXXXXXXXXREWRITEXREG-VCADPRDXFROMXWS-REG-VCADPRD
XXXXXXXXXXXXXXINVALID KEYXXXXXDISPLAYX“REGISTRO NAO ALTERADO”
XXXXXXXXXXXXXXNOTXINVALIDXKEYXADD 1 TO WS-CTALT
XXXXXXXXXXXEND-REWRITE
NOT = “23”
O arquivo VSAM KSDS que será atualizado com a instrução REWRITE deve
ser aberto no modo I-O e o registro a ser alterado deve ser lido com a instrução READ,
antes da atualização. Apesar das sentenças INVALID KEY e NOT INVALID KEY
serem usadas, recomenda-se o uso de FILE STATUS.
DELETE
Exclui um registro. O arquivo VSAM KSDS que terá um registro excluído com a
instrução DELETE deve ser aberto no modo I-O e o registro deve ser lido com a
instrução READ, antes da exclusão. A instrução DELETE deve ser seguida do nome
do arquivo. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXMOVE “0100” TO CODPROD-V
= “23” XXXXXXXXXXXREAD VCADPRD
XXXXXXXXXXX
XXXXXXXXXXXDELETE VCADPRD
XXXXXXXXXXXXXXINVALID KEYXXXXXDISPLAYX“REGISTRO NAO LOCALIZADO”
XXXXXXXXXXXXXXNOTXINVALIDXKEYXADD 1 TO WS-CTEXC
XXXXXXXXXXXEND-DELETE
NOT = “23”
Apesar das sentenças INVALID KEY e NOT INVALID KEY serem usadas,
recomenda-se o uso de FILE STATUS.
CLOSE
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXCLOSE VCADPRD
OPEN INPUT
OPEN OUTPUT
SEQUENTIAL READ
WRITE
CLOSE
OPEN I-O
READ
WRITE
RANDOM
REWRITE
DELETE
CLOSE
OPEN INPUT
START
DYNAMIC
READ NEXT
CLOSE
Objetivo do Programa
Macro-Fluxo
CADPRD
EEXXNN08
VCADPRD
Observação
JOB de Execução
12345678911234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//GPXXNNE9xxJOBxxSEUNOME,CLASS=A,MSGCLASS=X,NOTIFY=GPXXNN,TIME=(0,20)
//*********************************************************************
//STEP001 EXEC PGM=IDCAMS
//SYSPRINTxxDDxxxSYSOUT=*
//SYSINxxxxxDDxx*
DELETE GP.GPXXNN.VCADPRD PURGE CLUSTER
IF MAXCC = 8 THEN SET MAXCC=0
DEFINE CLUSTER -
(NAME (GP.GPXXNN.VCADPRD) -
VOL (PR39T7) -
TRK (1,1) -
RECORDSIZE (69,69) -
KEYS (04,0) -
SHAREOPTIONS (2,3)) -
DATA(NAME(GP.GPXXNN.VCADPRD.DATA)) -
INDEX(NAME(GP.GPXXNN.VCADPRD.INDEX))
//STEP002 EXEC PGM=EEXXNN08
//CADPRD DD DSN=GP.GPXX99.CADPRD,DISP=SHR
//VCADPRD DD DSN=GP.GPXX99.VCADPRD,DISP=SHR
9
Nome do Arquivo CADPRD
Nome do Registro REG-CADPRD
Nome do Campo Tipo e Tamanho Descrição
CODPROD X(04) Código
DESCPROD X(20) Descrição
UNIDPROD X(05) Unidade (caixa, litro, Kg, etc)
LOCALPROD X(05) Localização no estoque
QTDEST 9(05) Quantidade em estoque
QTDMAX 9(05) Quantidade máxima em estoque
QTDMIN 9(05) Quantidade mínima em estoque
PRECOCOMPRA 9(06)V99 Preço de Compra
PRECOVENDA 9(06)V99 Preço de Venda
PERCOMIS 9(02)V99 Percentual de comissão
Layout da SYSOUT
1 2 3 4 5
12345678901234567890123456789012345678901234567890
==================================================
TOTAL DE REGISTROS LIDOS............: ZZZ9
TOTAL DE REGISTROS DUPLICADOS.......: ZZZ9
TOTAL DE REGISTROS GRAVADOS.........: ZZZ9
TOTAL DE REGISTROS FORA DE SEQUENCIA: ZZZ9
==================================================
Programa COBOL
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*--------------------------------------------------------------*
IDENTIFICATION DIVISION.
*--------------------------------------------------------------*
PROGRAM-ID. EEXXNN08.
AUTHOR. SEUNOME.
*--------------------------------------------------------------*
ENVIRONMENT DIVISION.
*--------------------------------------------------------------*
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CADPRD ASSIGN TO UT-S-CADPRD
FILE STATUS IS FS-CADPRD
.
SELECT VCADPRD ASSIGN TO DA-I-VCADPRD
ORGANIZATION IS INDEXED
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS FS-VCADPRD
RECORD KEY IS CODPROD-V
.
*--------------------------------------------------------------*
DATA DIVISION.
*--------------------------------------------------------------*
FILE SECTION.
FD CADPRD
LABEL RECORD STANDARD
BLOCK CONTAINS 0 RECORDS
RECORDING MODE IS F
RECORD CONTAINS 69 CHARACTERS
DATA RECORD IS REG-CADPRD
.
FD VCADPRD
RECORD CONTAINS 69 CHARACTERS
DATA RECORD IS REG-VCADPRD
.
01 REG-VCADPRD.
05 CODPRD-V PIC X(04).
05 DESCPROD-V PIC X(20).
05 UNIDPROD-V PIC X(05).
05 LOCALPROD-V PIC X(05).
05 QTDEST-V PIC 9(05).
05 QTDMAX-V PIC 9(05).
05 QTDMIN-V PIC 9(05).
05 PRECOCOMPRA-V PIC 9(06)V99.
05 PRECOVENDA-V PIC 9(06)V99.
05 PERCOMIS-V PIC 9(02)V99.
*-------------------------------------------------------------*
WORKING-STORAGE SECTION.
*-------------------------------------------------------------*
01 WS-REG-CADPRD.
05 WS-CODPRD PIC X(04).
05 WS-DESCPROD PIC X(20).
9
05 WS-UNIDPROD PIC X(05).
05 WS-LOCALPROD PIC X(05).
05 WS-QTDEST PIC 9(05).
05 WS-QTDMAX PIC 9(05).
05 WS-QTDMIN PIC 9(05).
05 WS-PRECOCOMPRA PIC 9(06)V99.
05 WS-PRECOVENDA PIC 9(06)V99.
05 WS-PERCOMIS PIC 9(02)V99.
01 WS-REG-VCADPRD.
05 WS-CODPRD-V PIC X(04).
05 WS-DESCPROD-V PIC X(20).
05 WS-UNIDPROD-V PIC X(05).
05 WS-LOCALPROD-V PIC X(05).
05 WS-QTDEST-V PIC 9(05).
05 WS-QTDMAX-V PIC 9(05).
05 WS-QTDMIN-V PIC 9(05).
05 WS-PRECOCOMPRA-V PIC 9(06)V99.
05 WS-PRECOVENDA-V PIC 9(06)V99.
05 WS-PERCOMIS-V PIC 9(02)V99.
01 WS-DATE-SYS.
05 WS-ANO-SYS PIC 99.
05 WS-MES-SYS PIC 99.
05 WS-DIA-SYS PIC 99.
01 WS-TIME-SYS.
05 WS-HORA-SYS PIC 99.
05 WS-MIN-SYS PIC 99.
05 WS-SEG-SYS PIC 99.
05 FILLER PIC XX.
01 WS-TIME-FORMATADA.
05 WS-HORA-FORMATADA PIC 99.
05 FILLER PIC X VALUE ":".
05 WS-MIN-FORMATADA PIC 99.
05 FILLER PIC X VALUE ":".
05 WS-SEG-FORMATADA PIC 99.
*--------------------------------------------------------------*
*--------------------------------------------------------------*
PROCEDURE DIVISION.
*--------------------------------------------------------------*
000-EEXXNN08.
PERFORM 999-IMPRIME-DATA-HORA
PERFORM 010-INICIALIZAR
PERFORM 030-PROCESSAR
UNTIL FS-CADPRD3 = "10"
PERFORM 040-TERMINO
PERFORM 999-IMPRIME-DATA-HORA
STOP RUN
.
010-INICIALIZAR.
MOVE 0 TO WS-CTLIDO
WS-CTGRAV
WS-CTDUP
WS-CTFORASEQ
PERFORM 020-LERCADPRD
.
030-PROCESSAR.
MOVE WS-REG-CADPRD TO WS-REG-VCADPRD
EVALUATE FS-VCADPRD
WHEN "00"
ADD 1 TO WS-CTGRAV
WHEN "21"
ADD 1 TO WS-CTFORASEQ
WHEN "22"
ADD 1 TO WS-CTDUP
WHEN OTHER
MOVE "ERRO GRAVACAO PRODUTO"
TO WS-MSG
MOVE FS-VCADPRD TO WS-FS
PERFORM 999-ERRO
END-EVALUATE
PERFORM 020-LERCADPRD
.
040-TERMINO.
DISPLAY "=================================================="
DISPLAY "TOTAL DE REGISTROS LIDOS.........: " WS-CTLIDO
DISPLAY "TOTAL DE REGISTROS GRAVADOS......: " WS-CTGRAV
9
DISPLAY "TOTAL DE REGISTROS DUPLICADOS....: " WS-CTDUP
DISPLAY "TOTAL DE REGISTROS FORA SEQUENCIA: " WS-CTFORASEQ
DISPLAY "=================================================="
CLOSE CADPRD
CLOSE VCADPRD
999-ERRO.
DISPLAY "*------------------------------------------*"
DISPLAY " MENSAGEM.....: " WS-MSG
DISPLAY " FILE STATUS..: " WS-FS
DISPLAY "*------------------------------------------*"
DISPLAY " "
DISPLAY "*------------------------------------------*"
DISPLAY " "
DISPLAY " ._`-\ )\,`-.-. "
DISPLAY " \'\` \)\ \)\ \|.) "
DISPLAY " \`) |\) )\ .)\ )\| "
DISPLAY " \ \)\ |)\ ` \ .')/| "
DISPLAY " ``-.\ \ )\ ` . ., '( "
DISPLAY " \\ -. `)\``- ._ .)` |\(,_ "
DISPLAY " `__ '\ `-- _\`. ` (/ "
DISPLAY " `\,\ .\\ / "
DISPLAY " '` ) (`-.\\ ` "
DISPLAY " /||\ `. * _*| "
DISPLAY " `-.( `\ "
DISPLAY " `. \ "
DISPLAY " `(C "
DISPLAY " DEU ERRO!!! "
DISPLAY "*------------------------------------------*"
STOP RUN
.
999-IMPRIME-DATA-HORA.
ACCEPT WS-DATE-SYS FROM DATE
DISPLAY "*------------------------------------------*"
DISPLAY " DATA : "
WS-DATE-FORMATADA
" HORA : "
WS-TIME-FORMATADA
DISPLAY "*------------------------------------------*"
.
9
2) O que acontece quando um arquivo VSAM vazio é aberto como INPUT no COBOL?
3) O que é IDCAMS?
9
//STEP001 EXEC PGM=IDCAMS 07
//SYSPRINT DD SYSOUT=* 08
//SYSIN DD * 09
DELETE GP.GPXXNN.PRODUTO PARGE CLASTER 10
IF MAXCC = 8 THEN SET MAXCC=12 11
DEFINE CLASTER - 12
(NAME (GP.GPXXNN.PRODUTO) - 13
VOL (PR39T7) - 14
TRK (1,1) 15
RECORDSIZE (20,20) - 16
KEYS (10,0) - 17
SHAREOPTIONS (2,3) - 18
DATA(NAME(GP.GPXXNN.PRODUTO.DATA)) - 19
INDICE(NAME(GP.GPXXNN.PRODUTO.INDEX)) 20
21
Atividade Projeto 8
Objetivo do Programa
Macro-Fluxo
MOVPRD
GPXXNN08 VCADPRD
RELOCOR
9
QTDEST-V 9(05) Quantidade em estoque
QTDMAX-V 9(05) Quantidade máxima em estoque
QTDMIN-V 9(05) Quantidade mínima em estoque
PRECOCOMPRA-V 9(06)V99 Preço de Compra
PRECOVENDA-V 9(06)V99 Preço de Venda
PERCOMIS-V 9(02)V99 Percentual de comissão
WS-PAG-CABEC1
WS-DATA-CABEC1
WS-HORA-CABEC1
1 12345678911234567892123456789312345678941234567895123456789612345678971234567898123456789912345678901234567891123456789212123456738
2 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
01 DD/MM/20AA HH:MM:SSxxxxxxxxxxxxxxxxxxxxxx xxOCORRENCIAS ATUALIZACAO CADASTRO DE PRODUTOSxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxPAG.xZ9
02 ------------------------------------------------------------------------------------------------------------------------------------
03 IMAGEM DO REGISTRO OCORRENCIA
04 ------------------------------------------------------------------------------------------------------------------------------------
05 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX
06 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX
07 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX
www.grandeporte.com.br
08 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX
09 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX
.. XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX
57 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX
58 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX
59 ------------------------------------------------------------------------------------------------------------------------------------
Parte 9
Layout do Relatório
APOS ALTERACAO
ANTES ALTERACAO
INCLUSAO EFETUADA
EXCLUSAO EFETUADA
MOVIMENTO INVALIDO
Parte 9 29
Layout da SYSOUT
1 2 3 4 5
12345678901234567890123456789012345678901234567890
**************************************************
* DATA GREGORIANA 1 - 99/99/2099 *
* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *
* DATA JULIANA – 999 DE 2099 *
* DIA DA SEMANA – XXXXXXXXXXXXX *
**************************************************
1 2 3 4 5
12345678901234567890123456789012345678901234567890
==================================================
MOVIMENTOS LIDOS................: ZZZ9
PRODUTOS INCLUIDOS..............: ZZZ9
PRODUTOS EXCLUIDOS..............: ZZZ9
PRODUTOS ALTERADOS..............: ZZZ9
MOVIMENTO INVALIDO..............: ZZZ9
LINHAS DE DETALHE IMPRESSAS.....: ZZZ9
PAGINAS IMPRESSAS...............: ZZZ9
TEMPO TOTAL DE PROCESSAMENTO....: HH:MM:SS:CC
==================================================
Observação
O arquivo deve ser definido como ACCESS MODE RANDOM, pois o arquivo já
possui dados e a manutenção (Inclusão, Exclusão e Alteração) será feita com base no
código do produto vindo do arquivo MOVPRD.
1) Pelo TSO, opção P.2 (Edit Entry Panel), crie o membro GPXXNN08 e digite
o programa COBOL.
JOB de Execução
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//GPXXNN08 JOB SEUNOME,CLASS=A,MSGCLASS=X,NOTIFY=GPXXNN,TIME=(1,20)
//JOBLIB DD DSN=GP.GERAL.LOADLIB,DISP=SHR
//*********************************************************************
//* STEP001 - EXCLUIR O VCADPRD E RECRIA-LO
//*********************************************************************
//STEP001 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DELETE GP.GPXXNN.VCADPRD PURGE CLUSTER
IF MAXCC = 8 THEN SET MAXCC=0
DEFINE CLUSTER -
(NAME (GP.GPXXNN.VCADPRD) -
VOL (PR39T7) -
TRK (1,1) -
RECORDSIZE (69,69) -
KEYS (04,0) -
SHAREOPTIONS (2,3)) -
DATA(NAME(GP.GPXXNN.VCADPRD.DATA)) -
INDEX(NAME(GP.GPXXNN.VCADPRD.INDEX))
//*********************************************************************
//* STEP002 - CARREGAR VCADPRD COM BASE NO ARQUIVO CADPRD
//* EXECUTAR O PROGRAMA EEXX99E8 PARA DAR A CARGA
//*********************************************************************
//STEP002 EXEC PGM=EEXX99E8,COND=(0,NE)
//VCADPRD DD DSN=GP.GPXXNN.VCADPRD,DISP=SHR
//CADPRD DD DSN=GP.GPAZ99.CADPRD,DISP=SHR
//*********************************************************************
//* STEP003 - IMPRIMIR O ARQUIVO VCADPRD COM O UTILITARIO IDCAMS
9
//*********************************************************************
//STEP003 EXEC PGM=IDCAMS,COND=(0,NE)
//STEPLIB DD DSN=GP.GERAL.LOADLIB,DISP=SHR
//SYSPRINT DD SYSOUT=*
//VCADPRD DD DSN=GP.GPXXNN.VCADPRD,DISP=SHR
//SYSIN DD *
PRINT INFILE(VCADPRD) CHAR
//*
//*********************************************************************
//* STEP004 - EXECUTAR O PROGRAMA GPXXNN08 PARA ATUALIZAR VCADPRD
//*********************************************************************
//STEP004 EXEC PGM=GPXXNN08,COND=(0,NE)
//STEPLIB DD DSN=GP.GERAL.LOADLIB,DISP=SHR
//VCADPRD DD DSN=GP.GPXXNN.VCADPRD,DISP=SHR
//MOVPROD DD DSN=GP.GPXX99.MOVPROD,DISP=SHR
//RELOCOR DD SYSOUT=*
//*
//*********************************************************************
//* STEP005 - VAMOS IMPRIMIR O ARQUIVO VCADPRD COM O UTILITARIO IDCAMS
//*********************************************************************
//STEP005 EXEC PGM=IDCAMS,COND=(0,NE)
//STEPLIB DD DSN=GP.GERAL.LOADLIB,DISP=SHR
//SYSPRINT DD SYSOUT=*
//VCADPRD DD DSN=GP.GPXXNN.VCADPRD,DISP=SHR
//SYSIN DD *
PRINT INFILE(VCADPRD) CHAR
//*
Parágrafo 1000-INICIALIZAR
Receber o horário inicial de processamento
Inicializar contadores com zero
Movimentos Lidos
Produtos Incluído
Produtos Excluído
Produtos Alterado
Movimento Inválido
Linhas de Detalhe Impresso
Página
Inicializar com 99 o contador de linha
Parágrafo 1100-LER-MOVPRD
Ler registro do arquivo MOVPRD carregando variável espelho
Se file status for igual a “00” (sucesso)
Somar 1 ao contador movimentos lidos
Senão
Se file status for diferente de “10” (fim de arquivo)
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Parágrafo 2000-PROCESSAR
se WS-TIPOMOVTO-M = “I”
Executar o parágrafo 2100-INCLUSAO
se WS-TIPOMOVTO-M = “E”
Executar o parágrafo 2200-EXCLUSAO
se WS-TIPOMOVTO-M = “A”
Executar o parágrafo 2300-ALTERACAO
se WS-TIPOMOVTO-M não for “I”, “E” ou “A”
Mover WS-REG-MOVPRD para LD-IMAGEM
Mover “MOVIMENTO INVALIDO” para LD-OCORRENCIA
Executar o parágrafo 2400-IMPRIME-RELOCOR
Somar 1 ao contador de movimentos inválidos
Acho que
podemos
9
usar o
evaluate
hehehehhe
Parágrafo 2200-EXCLUSAO
Mover WS-CODPROD-M para CODPROD-V (campo chave)
9
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Parágrafo 2400-IMPRIME-RELOCOR
Se WS-CTLINHA > 59
Executar o parágrafo 2500-IMPRIME-CABECALHO
Se WS-CTLINHA = 58
Executar o parágrafo 2700-IMPRIME-RODAPE
Parágrafo 2500-IMPRIME-CABECALHO
Mover a data e a hora formatada para o cabeçalho 1
Somar 1 ao contador de página
Mover o contador de página para o cabeçalho 1
gravar os 4 cabeçalhos testando o file status
Se o file status for diferente de “00”
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Mover 4 para o contador de linha
Parágrafo 2600-IMPRIME-DETALHE
9
gravar a linha de detalhe testando o file status
Se o file status for diferente de “00”
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Parágrafo 3000-TERMINO
Se WS-CTLINHA < 60
Executar o parágrafo 2700-IMPRIME-RODAPE
Estou fera!
Fiz Certo!
Quantas dimensões
uma variável pode ter
na linguagem COBOL?
7
Versão 2.3.5
Parte 10 3
Preparation
Presentation
INITIALIZE
10
série de IFs encadeados, pois temos que decidir, de acordo com o mês da venda, qual
total deve ser somado.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------------------------*
060-TOTALIZA-VENDAS.
EVALUATE WS-MES
WHEN 01 ADD WS-VALOR-VENDA TO WS-TOTAL-01
WHEN 02 ADD WS-VALOR-VENDA TO WS-TOTAL-02
WHEN 03 ADD WS-VALOR-VENDA TO WS-TOTAL-03
WHEN 04 ADD WS-VALOR-VENDA TO WS-TOTAL-04
WHEN 05 ADD WS-VALOR-VENDA TO WS-TOTAL-05
WHEN 06 ADD WS-VALOR-VENDA TO WS-TOTAL-06
WHEN 07 ADD WS-VALOR-VENDA TO WS-TOTAL-07
WHEN 08 ADD WS-VALOR-VENDA TO WS-TOTAL-08
WHEN 09 ADD WS-VALOR-VENDA TO WS-TOTAL-09
WHEN 10 ADD WS-VALOR-VENDA TO WS-TOTAL-10
WHEN 11 ADD WS-VALOR-VENDA TO WS-TOTAL-11
WHEN 12 ADD WS-VALOR-VENDA TO WS-TOTAL-12
END-EVALUATE
.
Esse problema pode ser resolvido criando uma tabela (vetor) unidimensional
com 12 ocorrências, uma para cada mês. A cláusula OCCURS (ocorre) é usada na
DATA DIVISION na definição de uma variável para indicar quantas vezes essa
variável deve ser repetida. A cláusula OCCURS não pode ser usada em variáveis de
nível 01, 77 ou 88. Exemplo:
WS-TOTAL-VENDAS
01 02 03 04 05 06 07 08 09 10 11 12
WS-TOTAL
06
Podemos usar OCCURS para criar tabelas de até 7 dimensões. Abaixo temos
alguns exemplos dessas tabelas:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
* TABELA DE UMA DIMENSAO – UM CLIENTE COM ATE 5 TELEFONES
*----------------------------------------------------------------*
01 WS-DADOS-DO-CLIENTE.
05 WS-CODCLI PIC X(05).
05 WS-NOMECLI PIC X(30).
05 WS-TELEFONES-CLI.
XXXX 10 WS-FONE PIC X(10) OCCURS 5 TIMES.
WS-DADOS-DO-CLIENTE
WS-TELEFONES-CLI
WS-NOMECLI
01 02 03 04 05
WS-CODCLI
WS-FONE (3)
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
* TABELA DE DUAS DIMENSOES – UMA LOJA COM ATE 5 VENDEDORES E O
* TOTAL DE SUAS VENDAS NO TRIMESTRE, MES A MES.
*----------------------------------------------------------------*
01 WS-VENDAS-DA-LOJA.
05 WS-VENDEDOR OCCURS 5 TIMES.
XXX 10 WS-CODVEND PIC X(05).
XXX 10 WS-NOMEVEND PIC X(30).
XXXX 10 WS-VENDAS-TRIMESTRE OCCURS 3 TIMES.
XXXXXXX 15 WS-VENDAS PIC 9(06)V99.
WS-CODVEND (01)
WS-NOMEVEND (02) WS-VENDAS (02,03)
01
02
01 02 03
10
03
04
05
WS-VENDEDOR (04)
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
* TABELA DE TRES DIMENSOES – UMA CLASSE COM ATE 5 ALUNOS, QUE
* CURSAM 4 DISCIPLINAS E TEM 3 NOTAS POR DISCIPLINA.
*----------------------------------------------------------------*
01 WS-DADOS-DA-CLASSE.
05 WS-DADOS-DOS-ALUNOS OCCURS 5 TIMES.
XXX 10 WS-MATRICULA PIC X(08).
XXX 10 WS-NOMEALUNO PIC X(30).
XXXX 10 WS-DADOS-DISCIPLINA OCCURS 4 TIMES.
XXXXXXX 15 WS-DISCIPLINA PIC X(15).
XXXXXXX 15 WS-NOTAS-DISCIPLINA OCCURS 3 TIMES.
XXXXXXXXXX 20 WS-NOTA PIC 9(02)V9.
01 02 03 04
01 1 2 3 1 2 3 1 2 3 1 2 3
02 1 2 3 1 2 3 1 2 3 1 2 3
03 1 2 3 1 2 3 1 2 3 1 2 3
WS-MATRICULA(02)
04 1 2 3 1 2 3 1 2 3 1 2 3 WS-NOTA (02,04,01)
05 1 2 3 1 2 3 1 2 3 1 2 3
WS-DADOS-DOS-ALUNOS (05)
01 WS-PRODUTOS.
05 WS-CODPROD PIC X(05)
OCCURS 100 TIMES
ASCENDING KEY WS-CODPROD
INDEXED BY WS-IDX-CODPROD.
01 ETIQUETA.
05 WS-LINHA-ETIQUETA OCCURS 3 TIMES
INDEXED BY WS-LINHA-INDEX.
05 WS-COLUNA-ETIQUETA OCCURS 3 TIMES
INDEXED BY WS-COLUNA-INDEX.
10 FILLER PIC X(01).
10 CAMPO-ETIQUETA PIC X(25).
SET WS-IDX-MES TO 1
SET WS-IDX-MES UP BY 1
Pesquisa em
Teoria tabela interna (search)
SET IDX-PROD TO 1
SEARCH WS-REG-PRODUTOS
AT END
DISPLAY “PRODUTO NAO LOCALIZADO”
WHEN WS-CODPROD(IDX-PROD) = WS-CP
DISPLAY “PRODUTO LOCALIZADO”
DISPLAY “CODIGO.........: “ WS-CODPROD(IDX-PROD)
DISPLAY “DESCRICAO......: “ WS-DESCPROD(IDX-PROD)
DISPLAY “PRECOPROD......: “ WS-PRECOPROD(IDX-PROD)
END-SEARCH
MOVE 7 TO WS-MES
Quando você usar SEARCH ALL não é preciso setar o índice antes do mesmo
iniciar. O índice usado sempre é o associado com o primeiro index-name na cláusula
OCCURS, e varia durante execução para maximizar a eficiência de pesquisa.
Para usar a declaração SEARCH ALL, sua tabela deve estar ordenada pelas
KEY(s) especificadas dentro da cláusula OCCURS. Você pode especificar qualquer
KEY dentro da condição WHEN, mas tudo que precede os data-names na opção KEY
também deve ser testado.
O teste deve ser uma condição EQUAL TO, e o data-name KEY ou tenha que
ser o assunto da condição ou o nome de uma variável condicional com que o nome a
ser testado. O condição WHEN também pode ser uma condição de combinação,
formada de uma simples condição com AND como o único conetivo lógico.
A KEY e seu objeto de comparação devem ser compatíveis, como declarado
na relação regras de teste.
10
WORKING-STORAGE SECTION.
WORKING-STORAGE SECTION.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
DATA DIVISION
WORKING-STORAGE SECTION.
77 WS-NOME PIC X(20).
01 WS-BANCO-DO-POLVO.
05 WS-CONTA-POUPANCA
OCCURS 400 TIMES
INDEXED BY IDX1.
10 WS-NUMERO-CONTA PIC 9(06).
10 WS-NOME-CLIENTE PIC X(20).
10 WS-SALDO-POUPANCA PIC 9(06)V99.
PROCEDURE DIVISION.
ACCEPT WS-NOME FROM SYSIN
SET IDX1 TO 1
SEARCH WS-CONTA-POUPANCA
AT END
DISPLAY “NOME NAO ENCONTRADO”
10
WHEN WS-NOME = WS-NOME-CLIENTE (IDX1)
DISPLAY WS-NUMERO-CONTA (IDX1) " - "
WS-NOME-CLIENTE (IDX1) " - "
WS-SALDO-POUPANCA (IDX1)
Atividade Projeto 9
Objetivo do Programa
Macro-Fluxo
RELMOV01
Nome do Arquivo
Nome do Registro
REG-RELMOV01
RELMOV01
Tipo e Tamanho
X(80)
Descrição
Relatório de 80 colunas
10
Nome do Arquivo CADPROD
Nome do Registro REG-CADPROD
Nome do Campo Tipo e Tamanho Descrição
CODPROD 9(04) Código do produto
DESCPROD X(20) Descrição do produto
QTDEST 9(08) COMP-3 Quantidade em estoque
PRECOUNIT 9(08)V99 COMP-3 Preço Unitário
01 12345678911234567892123456789312345678941234567895123456789612345678971234567898
02 12345678901234567890123456789012345678901234567890123456789012345678901234567890
01 DD/MM/20AA ** BOX COMPANY DO BRASIL ** HH:MM:SS
02 RELATORIO DE MOVIMENTACAO DE ESTOQUE A PARTIR DE DD/MM/AAAA PAG. Z.ZZ9
03 --------------------------------------------------------------------------------
04 NUMERO DATA HORA PRODUTO QUANTIDADE
05 ----------- ---------- -------- --------------------------- -----------
06 99.999.999 DD/MM/AAAA HH:MM:SS 9999 – XXXXXXXXXXXXXXXXXXXX ZZ.ZZZ.ZZ9+
.. 99.999.999 DD/MM/AAAA HH:MM:SS 9999 – XXXXXXXXXXXXXXXXXXXX ZZ.ZZZ.ZZ9+
45 99.999.999 DD/MM/AAAA HH:MM:SS 9999 – XXXXXXXXXXXXXXXXXXXX ZZ.ZZZ.ZZ9+
46 99.999.999 DD/MM/AAAA HH:MM:SS 9999 – XXXXXXXXXXXXXXXXXXXX ZZ.ZZZ.ZZ9+
47 99.999.999 DD/MM/AAAA HH:MM:SS 9999 – XXXXXXXXXXXXXXXXXXXX ZZ.ZZZ.ZZ9+
48 99.999.999 DD/MM/AAAA HH:MM:SS 9999 – XXXXXXXXXXXXXXXXXXXX ZZ.ZZZ.ZZ9+
49 --------------------------------------------------------------------------------
50 APOS O USO UTILIZE ESTE PAPEL COMO RASCUNHO RECICLE SUAS IDEIAS
LD-NUMMOVTO
LD-DATAMOVTO
LD-HORAMOVTO
LD-CODPRODMOVTO
LD-DESCPRODMOVTO
LD-QTDMOVTO
Layout da SYSOUT
1 2 3 4 5
12345678901234567890123456789012345678901234567890
**************************************************
* DATA GREGORIANA 1 - 99/99/2099 *
* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *
* DATA JULIANA – 999 DE 2099 *
* DIA DA SEMANA – XXXXXXXXXXXXX *
**************************************************
1 2 3 4 5
12345678901234567890123456789012345678901234567890
=======================================================
BOX COMPANY DO BRASIL
=======================================================
TOTAL DE MOVIMENTOS LIDOS..............: 99999
TOTAL DE PAGINAS IMPRESSAS.............: 99999
TOTAL DE MOVIMENTOS IMPRESSOS..........: 99999
TOTAL DE MOVIMENTOS DESPREZADOS........: 99999
=======================================================
TEMPO TOTAL DE PROCESSAMENTO...........: HH:MM:SS
=======================================================
Observação
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
DATA DIVISION
WORKING-STORAGE SECTION.
01 WS-TAB-CADPROD.
05 WS-REG-TAB-CADPROD OCCURS 100 TIMES
ASCENDING KEY WS-TAB-CODPROD INDEXED BY IDX1.
10 WS-TAB-CODPROD PIC 9(04).
10 WS-TAB-DESCPROD PIC X(20).
77 WS-INDICE PIC 9(03).
77 WS-FLAG PIC X(01).
Na LINKAGE SECTION, criar a variável para receber via PARM do JCL a data
de referencia.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
LINKAGE SECTION.
01 LS-PARAMETRO.
05 LS-LENGTH PIC S9(4) COMP.
05 LS-DATAREF PIC X(10).
No Parágrafo 1000-INICIALIZAR:
após a abertura de todos os outros arquivos:
Abrir para leitura o arquivo CADPROD
Se file status for diferente de “00”
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Parágrafo 1500-CARREGA-TABELA
Ler registro do arquivo CADPROD carregando variável espelho
Se FILE STATUS = “00”
Somar 1 ao WS-INDICE
Mover WS-CODPROD para WS-TAB-CODPROD (WS-INDICE)
Mover WS-DESCPROD para WS-TAB-DESCPROD (WS-INDICE)
Se FILE STATUS diferente de “10”
Mover mensagem de erro para variável da rotina de erro
Mover file status para variáveis da rotina de erro
Executar rotina de erro (9000-ERRO)
Parágrafo 2000-PROCESSAR
Mover “N” para WS-FLAG
Se WS-FLAG = “S”
Mover WS-CODPRODMOVTO para WS-MENS-CODPROD
Mover WS-TIPOMOVTO para WS-MENS-TIPOMOVTO
Mover WS-QTDMOVTO para WS-MENS-QTDE
Chamar dinamicamente o programa PGMAUX03
passando WS-MSG-COMUNICACAO
Cancelar dinamicamente o programa PGMAUX03
Se WS-MENS-CLASSIF = 0
Mover “N” para WS-FLAG
Se WS-FLAG = “S”
Se o contador de linha for maior que 49
Executar o parágrafo 2100-IMPRIME-CABECALHO
10
Somar 1 ao contador de desprezado
Parágrafo 2200-IMPRIME-DETALHE
Mover para as variáveis da LINDET:
Número do movimento
Data do movimento
Hora do movimento
Código do produto
Se o tipo do movimento for de entrada
Mover a qtde para a LINDET
Senão
Multiplicar a qtde por -1 atribuindo o resultado para a LINDET
Parágrafo 3000-TERMINO
Tirar o teste do trailer, pois trata-se de um filtro e será impresso
menos registros que o registrado no trailer.
10
Estou fera!
Fiz Certo!
ANEXOS
Versão 2.3.5
Parte 11 3
S001-4 Wrong length record; Input file record length is not equal to the length stated in the DD or the FD.
IO error, damaged tape, device malfunction; With disk, reading a dataset that was allocated but never written to.
Writing to input file; Concatenation of files with different record lengths or record formats.
S001-5 Reading after the end of the file by non-COBOL program. COBOL intercepts this and displays "QSAM error,
status 92". Out of space on output disk file.
S002 With variable format files used for output.
The record is larger than the track size.
The record length is greater than allowed maximum 32,768.
The wrong record length is being used on output.
The 4-byte record length indicator is wrong.
Record greater than 32,768 bytes
S013-10 A dummy file with no blocksize.
S013-14 A library has run out of space in its directory. You have to backup, delete, and restore the library with
IEBCOPY. A dataset is sequential, but the JCL indicates that it is a library.
S013-18 A library member was specified in the JCL but was not found.
S013-20 The block size is not a multiple of record length.
Check record length in program, compare to actual record length of file
S013-34 The block size was found to be 0. A new file is being created but block size was not in the JCL.
S013-40 Reading a file whose JCL has SYSOUT=
S106 The program on the program library was unreadable. Recompile and link.
S122 The job was canceled because it violated some restriction. A dump was requested
S137 A tape has a bad trailer label. Copy the file with IEBGENER, ignoring the error. The copy will be good.
Using LABEL=2 when there's only one dataset on the tape.
S213 A disk dataset was not actually on the volume stated in the VOL=SER=.
A disk dataset was not actually on the volume indicated in the catalog.
S222 The job was cancelled because it violated some restriction. No dump was requested.
S237 The block count on a tape trailer label is wrong. Probably caused by hardware error. Copy the file with
IEBGENER, ignoring the error. The copy will be good. A problem with the second volume of tape or disk.
S313, 314 An Input/output error in the VTOC of a disk volume. Inform support staff.
S322 The job used more CPU time than it should have. Either the estimate is wrong or the program is in an
uncontrollable loop.
S413 A volume was needed that could not be mounted.
S422 Too many job steps.
S513 Two jobs or DDNAMES wanting same tape at same time.
S522 Job was waiting too long.
S613 A bad tape label.
S637 A bad concatenation, different types of devices were used. An unreadable tape mark or label.
S706 The program on the library was not executable. See linkage editor report that put the program on library.
S713 The tape was unexpired and the operator terminated the job.
S714 Labels on the tape were bad.
EBCDIC e a sigla para Extendet Binary Coded Decimal Interchange Code, desenvolvida para os Mainframes
no início dos anos de 1960 e são ainda usadas hoje em dia, principalmente nos Mainframes da IBM.
Dec Hex char Dec Hex Char Dec Hex Char Dec Hex Char
LOW-VALUES 0 0 NUL (null) 64 40 SP (space) 128 80 192 C0 {
1 1 SOH (start of heading) 65 41 129 81 a 193 C1 A
2 2 STX (start of text) 66 42 130 82 b 194 C2 B
3 3 ETX (end of text) 67 43 131 83 c 195 C3 C Usados para
4 4 PF (punch off) 68 44 132 84 d 196 C4 D representar
5 5 HT (horizontal tab) 69 45 133 85 e 197 C5 E
números
6 6 LC (lower case) 70 46 134 86 f 198 C6 F
7 7 DEL (delete) 71 47 135 87 g 199 C7 G positivos.
8 8 GE 72 48 136 88 h 200 C8 H
9 9 RLF 73 49 137 89 i 201 C9 I
10 A SMM (start of manual message) 74 4A ¢ 138 8A 202 CA
11 B VT (vertical tab) 75 4B . 139 8B 203 CB
12 C FF (form feed) 76 4C < 140 8C 204 CC
13 D CR (carriage return) 77 4D ( 141 8D 205 CD
14 E SO (shift out) 78 4E + 142 8E 206 CE
15 F SI (shift in) 79 4F | 143 8F 207 CF
16 10 DLE (data link escape) 80 50 & 144 90 208 D0 }
17 11 DC1 (device control 1) 81 51 145 91 j 209 D1 J
18 12 DC2 (device control 2) 82 52 146 92 k 210 D2 K Usados para
19 13 TM (tape mark) 83 53 147 93 l 211 D3 L representar
20 14 RES (restore) 84 54 148 94 m 212 D4 M
números
21 15 NL (new line) 85 55 149 95 n 213 D5 N
22 16 BS (back space) 86 56 150 96 o 214 D6 O negativos.
23 17 IL (idle) 87 57 151 97 p 215 D7 P
24 18 CAN (cancel) 88 58 152 98 q 216 D8 Q
25 19 EM (end of medium) 89 59 153 99 r 217 D9 R
26 1A CC (cursor control) 90 5A ! 154 9A 218 DA
27 1B CU1 (customer use 1) 91 5B $ 155 9B 219 DB
28 1C IFS (interchange file separator) 92 5C * 156 9C 220 DC
29 1D IGS (interchange group separator) 93 5D ) 157 9D 221 DD
30 1E IRS (interchange record separator) 94 5E ; 158 9E 222 DE
31 1F IUS (interchange unit separator) 95 5F ¬ 159 9F ¤ 223 DF
32 20 DS (digit select) 96 60 - 160 A0 224 E0 \
33 21 SOS (start of significance) 97 61 / 161 A1 ~ 225 E1
34 22 FS (field separator) 98 62 162 A2 s 226 E2 S
35 23 99 63 163 A3 t 227 E3 T
36 24 BYP (bypass) 100 64 164 A4 u 228 E4 U
37 25 LF (line feed) 101 65 165 A5 v 229 E5 V
38 26 ETB (end of transmission block) 102 66 166 A6 w 230 E6 W
39 27 ESC (escape) 103 67 167 A7 x 231 E7 X
40 28 104 68 168 A8 y 232 E8 Y
41 29 105 69 169 A9 z 233 E9 Z
42 2A SM (set mode) 106 6A ¦ 170 AA 234 EA
43 2B CU2 (customer use 2) 107 6B , 171 AB 235 EB
44 2C 108 6C % 172 AC 236 EC
45 2D ENQ (enquiry) 109 6D _ 173 AD 237 ED
46 2E ACK (acknowledge) 110 6E > 174 AE 238 EE
47 2F BEL (bell) 111 6F ? 175 AF 239 EF
48 30 112 70 176 B0 240 F0 0
49 31 113 71 177 B1 241 F1 1
50 32 SYN (synchronous idle) 114 72 178 B2 242 F2 2
51 33 115 73 179 B3 243 F3 3 Usados para
52 34 PN (punch on) 116 74 180 B4 244 F4 4
53 35 RS (reader stop) 117 75 181 B5 245 F5 5
representar
54 36 UC (upper case) 118 76 182 B6 246 F6 6 números sem
55 37 EOT (end of transmission) 119 77 183 B7 247 F7 7 sinal.
56 38 120 78 184 B8 248 F8 8
57 39 121 79 ` 185 B9 249 F9 9
58 3A 122 7A : 186 BA 250 FA
59 3B CU3 (customer use 3) 123 7B # 187 BB 251 FB
60 3C DC4 (device control 4) 124 7C @ 188 BC 252 FC
61 3D NAK (negative acknowledge) 125 7D ' 189 BD 253 FD
62 3E 126 7E = 190 BE 254 FE
63 3F SUB (substitute) 127 7F " 191 BF 255 FF HIGH-VALUES
Teoria POTÊNCIA DE 2
1 Byte
2 Bytes
3 Bytes
4 Bytes