Você está na página 1de 404

COBOL Level 1

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Sobre o autor

Prof. Nelson Goncalves


, de Oliveira

,
Cientista da Computacão pelo IMES-SCS,
,
Especialista em Telecomunicacões pela
FAAP-SP, mestrando em ciência da
,
computacão pela UFAbc-sp.

Iniciou a carreira como desenvolvedor de


software em 1987, especializando-se em
COBOL para Mainframes IBM.

Professor universitário Desde 2000,


leciona diversas disciplinas nos cursos de
,
Ciência da Computacão e Informática.

fundou a Grande Porte em 2008 com o


objetivo de difundir essa experiência para
nelson@grandeporte.com.br o mercado.

“O COBOL tem aberto as portas de


diversas empresas para os nossos
alunos e, mesmo após 55 anos de
existência, continua firme e forte
suportando globalmente o comércio
mundial.”

Versão 2.3.5 – PDF liberado em 26/04/2015

Fique atento para novas versões em nosso site.


Parte

A Almirante Grace Murray Hopper (1906 – 1992) foi


uma das primeiras programadoras do sistema Haward Mark I
e foi a criadora do primeiro compilador para uma linguagem de
programação de computadores. Criou a Linguagem de
programação FLOW-MATIC, que serviu como base para a
criação da linguagem COBOL, participando ativamente da
validação da primeira versão desta linguagem.
Versão 2.3.5
Parte 1 3

1
Preparation

Trocando Ideias É agora que você fala !!

Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na


capa desta parte. Isso é importante para que seu instrutor e seus colegas
saibam como está seu conhecimento sobre o assunto e se você precisa ou
pode fornecer ajuda aos colegas e instrutor.

 O que você já sabe ?


 O que você não sabe ?
 Porque é importante conhecer estes tópicos ?
 Quais são os seus temores ?
 O que você considera difícil ?

Reflexão É aqui que você se compromete !!

Depois de falar sobre o assunto com seus colegas e instrutor, escreva,


desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses
tópicos. Comprometa-se!

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


4 Parte 1

Presentation

História Conheca
, a xpto !!

A XPTO consultoria em desenvolvimento de software é uma empresa


especializada no desenvolvimento de soluções informatizadas para seus clientes.
Suas soluções atendem as mais diversas plataformas de Hardware e Sistemas
Operacionais, tais como Mainframe (Z/OS), AS/400 (OS/400), RISC (UNIX), PC
(Windows/Linux), Tablets (Android/iOS), bem como aplicações para a Internet.

Suas soluções de software são também desenvolvidas nas mais diversas


linguagens de programação, tais como COBOL, Java, C#, C/C++, HTML, ASP.NET,
etc.

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.

Chama-se plataforma Mainframe ao computador de Grande Porte da IBM para


processamento de transações. É utilizado por grandes empresas e está vivendo uma
fase de crescimento, apesar da dificuldade de se encontrar mão de obra qualificada. A
linguagem de programação mais utilizada nesta plataforma é o COBOL. Criada no fim
da década de 1950 é a linguagem mais importante nesta plataforma, de fácil
compreensão por ser parecida com o inglês corrente. Este será o foco de seu
treinamento.

Então vamos lá, bons estudos e tenham muita dedicação.

Consultoria
em
Desenvolvimento
de
Software

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 1 5

Teoria
Introdu ão à ç 1
linguagem cobol

Origens

O COBOL foi criado em 1959 pelo CODASYL (Conference on Data Systems


Language), um dos três comitês propostos numa reunião no Pentágono em Maio de
1959, organizado por Charles Phillips do Departamento de Defesa dos Estados
Unidos. O CODASYL foi formado para recomendar as diretrizes de uma linguagem de
programação para negócios. Foi constituído por membros representantes de seis
fabricantes de computadores e três órgãos governamentais, a saber:

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

William Selden e Gertrude Tierney da IBM


Howard Bromberg e Howard Discount da RCA
Vernon Reeves e Jean E. Sammet da Sylvania Electric Products

Este subcomitê completou as especificações para o COBOL no fim do ano de


1959. Elas foram inspiradas em grande parte pela linguagem FLOW-MATIC inventada
por Grace Murray Hopper, e pela linguagem COMTRAN da IBM inventada por Bob
Bemer.

As especificações foram aprovadas pelo CODASYL. A partir daí foram


aprovadas pelo Comitê Executivo em Janeiro de 1960, e enviadas à gráfica do
governo, que as editou e imprimiu com o nome de COBOL 60. O COBOL foi
desenvolvido num período de seis meses, e continua ainda em uso depois de mais de
50 anos.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


6 Parte 1
Grace Murray Hopper

Grace Hopper foi uma analista de sistemas da marinha americana nas


décadas de 1940 e 1950, criadora da linguagem de programação FLOW-MATIC, hoje
extinta. Como sua linguagem serviu como base para a criação do COBOL, atribui-se à
ela o título de “Mãe do COBOL”. É (equivocadamente) de autoria de Hopper a
invenção da palavra "bug", usada para designar uma falha em um código-fonte, devido
a uma traça que ela encontrou esmagada em um relê do computador UNIVAC MARK
II.

Almirante Grace Murray Hopper 1º bug (inseto = erro) de computador


 1906 – 1992

FLOW-MATIC

A linguagem FLOW-MATIC, originalmente conhecida como B-0 (Business


Language version 0), foi a primeira linguagem de processamento de dados parecida
com o idioma inglês. Ela foi desenvolvida para o UNIVAC I da Remington Rand por
Grace M. Hopper.

Grace havia observado que os usuários da área de negócios não se sentiam


confortáveis com a notação matemática exigida pelo FORTRAN, que foi a primeira
linguagem de programação de alto nível, significando FORmula TRANslator (Tradutor
de Fórmulas). No final de 1953 ela propôs que os problemas de processamento de
dados deveriam ser expressos usando palavras-chave em inglês, mas a gestão da
Rand considerava a ideia inviável. No início de 1955, ela e sua equipe escreveram
uma especificação para uma linguagem de programação com essas características e
implementaram um protótipo. O compilador do FLOW-MATIC tornou-se publicamente
disponível no início de 1958 e foi substancialmente completado em 1959.

O FLOW-MATIC foi a primeira linguagem de programação a expressar suas


operações usando comandos em inglês, foi o primeiro sistema que separou a
descrição dos dados das operações. Sua linguagem de definição de dados, diferente

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 1 7

dos comandos de execução, não eram em inglês, em vez disso, as estruturas de

1
dados eram definidas preenchendo formulários pré-impressos.

O FLOW-MATIC foi a maior influência no projeto do COBOL. Muitos de seus


elementos foram incorporados ao COBOL, tais como:

 Definição dos arquivos em detalhes, separando em arquivos de entrada


(INPUT) e saída (OUTPUT).
 Qualificação dos nomes de dados (cláusulas IN e OF)
 Cláusulas IF END OF DATA (AT END) na operação de leitura (READ) de
arquivos
 Constante figurativa ZERO (originalmente ZZZ...ZZZ, onde a quantidade de Z's
indicava a precisão)
 Dividir o programa em seções, separando diferentes partes dos programas. O
FLOW-MATIC incluía as seções COMPUTER (ENVIRONMENT DIVISION),
DIRECTORY (DATA DIVISION) e COMPILER (PROCEDURE DIVISION).

CONTRAM

A linguagen COMTRAN (COMmercial TRANslator) é uma antiga linguagem de


programação desenvolvida na IBM. Seu objetivo era ser uma linguagem de
programação comercial equivalente a linguagem de programação cientítica FORTRAN
(FORmula TRANslator). Ela serviu como impulsionadora da linguagem COBOL. foi
desenvolvida em 1957 por Bob Bemer (Robert William Bemer 1920 – 2004), foi
influenciada pelo FLOW-MATC e influenciou o COBOL. O CONTRAM foi a primeira
linguagem de programação a usar a cláusula PIC.

Muitos elementos da COMTRAN foram incorporados ao COBOL, tais como:

 Cláusula PIC, define o tamanho dos dados e seu tipo


 Divisão do código em parágrafos com nomes, sendo possível pular (GO TO)
para um nome de parágrafo
 Cláusula AT END nas operações de arquivos de entrada
 Constante figurativa HIGH-VALUE
 Retorno ao sistema operacional de um valor numérico quando o programa
encerra. (RETURN-CODE)

COBOL II

O COBOL é uma linguagem de alto nível, isto é, semelhante a linguagem


humana. É um acrônimo e significa COmmon Business Oriented Language
(Linguagem Comum Orientada aos Negócios). Como seu nome indica, o objetivo
desta linguagem é permitir o desenvolvimento de aplicações comerciais para pessoas
sem conhecimento profundo de computadores. Por isso a linguagem COBOL usa
frases normais da língua inglesa, e a estrutura de um programa COBOL se assemelha
a um texto com divisões, seções, parágrafos e frases em inglês. Uma das
características importantes do COBOL é sua auto documentação: um programador
pode entender um programa COBOL pela simples leitura de sua codificação.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


8 Parte 1

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.

No COBOL II foram incluídos comandos para COPY book, PERFORM IN-LINE,


DELIMITADORES DE ESCOPO e os comandos EVALUATE e INITIALIZE entre outros.

O módulo objeto gerado ficou mais potente, podendo utilizar todas as


facilidades dos sistemas operacionais modernos. Pode-se rodar um programa acima
da linha dos 16 MBytes e com 31 bits de endereçamento de memória tornando mais
fácil o desenvolvimento de grandes aplicações. O compilador foi totalmente reescrito
tendo sido eliminados comandos e instruções obsoletas das versões anteriores,
tratando-se de um compilador novo, o COBOL II apresenta algumas melhorias em
relação ao antigo permitindo uso mais eficiente dos recursos, como maior facilidade de
depuração BATCH e novo formato das listagens de compilação.

Grace Hopper em 1960


com o manual da
1ª versão do COBOL

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 1 9

Teoria PROCESSAMENTO BATCH


1
== EM LOTES ==

É a modalidade de processamento onde uma coleção de registros de um ou


mais arquivos de entrada é processada e um ou mais arquivos de saída são gravados.
Não há interação com o usuário, uma vez iniciado um programa batch, ele só termina
quando todos os dados de entrada foram processados ou quando acontecer um erro
de processamento.

Os algoritmos desenvolvidos para esta modalidade de processamento têm o


seguinte aspecto:

algoritmo batch
execute rotina-inicializar
execute rotina-processar até fim dos arquivos de entrada
execute rotina-termino
fim-algoritmo

Na rotina-inicializar, realizamos as seguintes tarefas:


 Inicialização das variáveis (contadores e acumuladores)
 Abertura dos arquivos de entrada e saída
 Leitura do primeiro registro dos arquivos de entrada

Na rotina-processar, realizamos as seguintes tarefas:


 Seleção de registros para o processamento, pelos operadores
relacionais (=, <, >, >=, <= e NOT =) e operadores lógicos (AND,
OR e NOT)
 Processamento dos campos numéricos pelos operadores
aritméticos (+,-,*,/ e **)
 Movimentação de campos da entrada para a saída
 Gravação do registro de saída
 Leitura do próximo registro do arquivo de entrada

Na rotina-termino, realizamos as seguintes tarefas:


 Exibição de uma estatística de processamento, mostrando
registros lidos, gravados, desprezados, selecionados, etc.
(contadores e acumuladores)
 Fechamento dos arquivos de entrada e de saída
 Exibição de mensagem avisando do término normal do
processamento

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


10 Parte 1
O processamento em lotes é uma atividade corriqueira, que realizamos toda a
vez que precisamos lidar com um lote de documentos, fichas de inscrição, provas para
corrigir, contas para conferir, etc.

rotina-inicializar Começamos organizando a mesa onde vamos trabalhar,


zerando a calculadora, abrindo o lote de documentos e pegando o primeiro documento
da pilha.

rotina-processar Enquanto houver documentos na pilha, para cada


documento vamos processando seus dados, contabilizando ocorrências, acumulando
valores e por último pegamos o próximo documento da pilha.

rotina-termino No final, aliviados pelo término do trabalho, fechamos o lote,


exibimos o resultado do processamento e avisamos que acabou.

Exemplo de processamento em lote (batch)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 1 11

EXEMPLO PROCESSAMENTO BATCH


1
Objetivo do Programa

Calcular o valor a receber de vários funcionários, com base na quantidade de


horas trabalhadas, com salário fixo de R$ 25,00 por hora.

Macro-Fluxo

SYSIN

EEXXNN01

SYSOUT

Observação

A quantidade de horas trabalhadas pelos funcionários está gravada em uma


SYSIN. O programa EEXXNN01 lê todas as horas gravadas na SYSIN, e para cada
uma delas, calcula o salário e o exibe na SYSOUT.

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.

A SYSIN (SYSTEM INPUT) é lida com o comando ACCEPT, que carrega na


variável informada o dado lido. Exemplo:

ACCEPT QTDHSTRAB FROM SYSIN

A SYSOUT (SYSTEM OUTPUT) é gravada com o comando DISPLAY, que


exibe constantes e valores de variáveis informadas. Exemplo:

DISPLAY "TOTAL DE FUNCIONARIOS LIDOS.: " CONTFUNC

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


12 Parte 1
JOB de Execução

Observe a SYSIN, onde as horas trabalhadas estão informadas. O último valor


0000 é um indicador de que não há mais horas para calcular o salário. É comum
utilizar um valor previamente combinado para indicar o término dos dados da SYSIN,
essa técnica é conhecida como SENTINELA.

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 1 13
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

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 "*-------------------------------------------------*"
.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


14 Parte 1

Teoria Comandos básicos

ACCEPT da SYSIN

O COBOL foi desenvolvido originalmente para processar arquivos de dados e


ainda é usado com esta finalidade. Entretanto, em muitas ocasiões existe a
necessidade de interação com o operador do Mainframe. Usamos o comando (verbo)
ACCEPT para receber os dados de entrada por meio de um cartão DD do JCL (tratado
no programa COBOL como SYSIN). Exemplo:

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
//*

Abaixo temos um exemplo de ACCEPT da SYSIN:


----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
ACCEPT QTDHRSTRAB FROM SYSIN

Quando a opção FROM é omitida o padrão FROM SYSIN é assumido.

Cada vez que o programa passa pela instrução ACCEPT, uma linha da SYSIN
do JCL é carregada na variável QTDHRSTRAB.

É necessário colocar no programa COBOL uma condição para parar de ler a


SYSIN. Observe no JCL acima que o último número é tudo zero. No programa a
SYSIN será lida até que (UNTIL) se encontre o valor zero (0).

Essa técnica é chamada de SENTINELA, pois temos um valor previamente


combinado que indica o término da SYSIN. Se isso não for feito, o ACCEPT lerá os
números da SYSIN até acabar e depois repetirá a leitura do último número vária vezes,
até que o programa pare por TIME OUT, ou seja, acabar o tempo reservado para ele
executar.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 1 15

DISPLAY

Exibe constantes e/ou variáveis num dispositivo de saída. Normalmente é o


dispositivo cujo DDNAME é SYSOUT. Exemplo: 1
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
.......999-ERRO.
...........DISPLAY "*------------------------------------------*"
...........DISPLAY " MENSAGEM.....: " WS-MSG
...........DISPLAY " FILE STATUS..: " WS-FS
...........DISPLAY "*------------------------------------------*"
...........DISPLAY " TERMINOxANORMALxDOxPROGRAMAx xxxxxxx"
...........DISPLAY "*------------------------------------------*"
...........STOP RUN
............

COMPUTE

Realiza operações aritméticas mais sofisticadas, utilizando o operador de


atribuição = (sinal de igualdade) e uma expressão aritmética. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
COMPUTE WS-CONTADOR = WS-CONTADOR + 1
COMPUTE WS-SALARIO-ANUAL = WS-SALARIO-MES * 12
COMPUTE WS-DIAGONAL = ((2 * WS-LADO ** 2) ** 0,5)

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.

Os operadores aritméticos possuem prioridades diferentes, como mostra a


tabela abaixo. Quando houver operadores de mesma prioridade, eles serão
executados da esquerda para a direita.

Operação Símbolo Prioridade


Parênteses ( ) 0
Potência ** 1
Multiplicação * 2
Divisão / 2
Adição + 3
Subtração - 3

Deve haver um espaço em branco antes e depois do operador aritmético e


do operador de atribuição. Fique atento ao fato de que as expressões aritméticas
devem ser escritas em formato linear. Exemplo, a expressão aritmética abaixo

𝐵
𝑥 =𝐴+
𝐷
𝐶+𝐸+𝐹
convertida para o formato linear fica

X = A + (B /(C + (D / (E + F))))

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


16 Parte 1
MOVE Básico

A instrução MOVE copia o valor de uma constante ou o conteúdo de uma


variável para uma ou mais variáveis. IMPORTANTE: A instrução não MOVE dados,
mas sim faz uma CÓPIA.
Alinhamento alfabético ou alfanumérico
Os dados são acomodados na variável receptora alinhado-se da esquerda para
a direita. Se a variável emissora for maior que a receptora, os caracteres mais a direita,
em excesso, serão truncados na variável receptora. Se a emissora for menor que a
receptora os caracteres faltantes para preencher o campo receptor serão preenchidos
com SPACES. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
MOVE “GRACE HOPPER” TO WS-NOME

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 1 17

As constantes figurativas SPACES, HIGH-VALUES e LOW-VALUES só podem

1
ser movidas para variáveis alfanuméricas. A opção ALL move uma constante repetida
vezes até preencher a variável receptora.

A constante figurativa ZERO, ZEROS ou ZEROES, pode ser movida para


variáveis numéricas e alfanuméricas.

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


18 Parte 1
Abaixo temos um trecho de programa COBOL mostrando os diversos tipos de
variáveis, alguns MOVEs e o DISPLAY dos valores.

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

O comando DISPLAY exibe na SYSOUT as seguintes informações:

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 1 19

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

Os MOVES que produzem resultados errados, geram os seguintes conteúdos:

*----------------------------------------------*
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!

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


20 Parte 1
Na compilação, as mensagens de erros para os MOVEs inválidos são:

"VE-NUMERICO-INTEIRO (NUMERIC INTEGER)" and "VR-ALFABETICO (ALPHABETIC)" did not follow


the "MOVE" statement compatibility rules. The statement was discarded.

"VE-NUMERICO-NAO-INTEIRO (NUMERIC NON-INTEGER)" and "VR-ALFANUMERICO (ALPHANUMERIC)" did


not follow the "MOVE" statement compatibility rules. The statement was discarded.

"VE-NUMERICO-NAO-INTEIRO (NUMERIC NON-INTEGER)" and "VR-ALFANUMERICO-EDITADO


(ALPHANUMERIC-EDITED)" did not follow the "MOVE" statement compatibility rules. The
statement was discarded.

"VE-NUMERICO-NAO-INTEIRO (NUMERIC NON-INTEGER)" and "VR-ALFABETICO (ALPHABETIC)" did not


follow the "MOVE" statement compatibility rules. The statement was discarded.

"VE-NUMERICO-EDITADO (NUMERIC-EDITED)" and "VR-ALFABETICO (ALPHABETIC)" did not follow


the "MOVE" statement compatibility rules. The statement was discarded.

"VE-ALFANUMERICO-EDITADO (ALPHANUMERIC-EDITED)" and "VR-NUMERICO-INTEIRO (NUMERIC


INTEGER)" did not follow the "MOVE" statement compatibility rules. The statement was
discarded.

"VE-ALFANUMERICO-EDITADO (ALPHANUMERIC-EDITED)" and "VR-NUMERICO-NAO-INTEIRO (NUMERIC


NON-INTEGER)" did not follow the "MOVE" statement compatibility rules. The statement
was discarded.

"VE-ALFANUMERICO-EDITADO (ALPHANUMERIC-EDITED)" and "VR-NUMERICO-EDITADO (NUMERIC-


EDITED)" did not follow the "MOVE" statement compatibility rules. The statement was
discarded.

"VE-ALFABETICO (ALPHABETIC)" and "VR-NUMERICO-INTEIRO (NUMERIC INTEGER)" did not follow


the "MOVE" statement compatibility rules. The statement was discarded.

"VE-ALFABETICO (ALPHABETIC)" and "VR-NUMERICO-NAO-INTEIRO (NUMERIC NON-INTEGER)" did not


follow the "MOVE" statement compatibility rules. The statement was discarded.

"VE-ALFABETICO (ALPHABETIC)" and "VR-NUMERICO-EDITADO (NUMERIC-EDITED)" did not follow


the "MOVE" statement compatibility rules. The statement was discarded.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 1 21

IF ELSE END-IF

Permite o desvio condicional do fluxo de processamento. Operadores


relacionais e lógicos são usados para montar uma condição, que pode ser verdadeira
ou falsa, de acordo com os valores das variáveis desta condição.
1
Abaixo do IF são executadas as instruções se a condição for verdadeira, após
o ELSE são executadas as instruções se a condição for falsa. Um IF pode ou não ter
ELSE. O THEN é opcional e raramente usado. Não será usado neste treinamento.

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

CONDIÇÃO – As condições podem sem simples (apenas operador relacional)


ou complexas (expressões aritméticas, relacionais e lógicas). As tabelas abaixo
mostram os operadores relacionais, operadores lógicos e os testes de categoria.

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


22 Parte 1
Exemplos:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXX*--------------------IF SEM ELSE---------------------*
XXXXXXXXXXXIF WS-SALARIO < 400
XXXXXXXXXXX COMPUTE WS-SALARIO = WS-SALARIO + 200
XXXXXXXXXXX PERFORM 050-IMPRIME-DEMONSTRATIVO
XXXXXXXXXXXEND-IF

XXXXXX*--------------------IF COM ELSE---------------------*


XXXXXXXXXXXIF WS-MEDIA NOT < 7
XXXXXXXXXXX DISPLAY “ALUNO APROVADO COM MEDIA = ” WS-MEDIA
XXXXXXXXXXXELSE
XXXXXXXXXXX DISPLAY “ALUNO REPROVADO COM MEDIA = ” WS-MEDIA
XXXXXXXXXXXEND-IF

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

XXXXXX*-----------IF DE TESTE DE MULTIPLO VALORES----------*


XXXXXXXXXXXIF WS-OPCAO = 1 OR 2 OR 3 OR 4 OR 5
XXXXXXXXXXX DISPLAY “BOA OPCAO”
XXXXXXXXXXXEND-IF

XXXXXXXXXXXIF WS-VALOR = 2 OR > 3 OR NOT < 4


XXXXXXXXXXX DISPLAY “VALOR IDEAL”
XXXXXXXXXXXEND-IF

XXXXXXXXXXXIF WS-OPCAO = 8 OR 9 AND WS-VALOR = 7 OR 9


XXXXXXXXXXX DISPLAY “OTIMA COMBINACAO”
XXXXXXXXXXXEND-IF

XXXXXX*-----------IF DE EXPRESSAO ARITMETICA---------------*


XXXXXXXXXXXIF WS-SALARIO + WS-BONUS > 5000
XXXXXXXXXXX DISPLAY “OTIMO SALARIO, JA PODE CASAR.”
XXXXXXXXXXXEND-IF

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 1 23

PERFORM Básico

Executa apenas 1 vez o bloco de instruções de um parágrafo ou SECTION.


Exemplos: 1
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PERFORM 010-INICIALIZAR
PERFORM 070-TERMINO

PERFORM com a opção UNTIL

Executa o bloco de instruções de um parágrafo ou SECTION até que uma


determinada situação ocorra.

Se nada for informado, é feito o teste da condição ANTES de executar o


parágrafo ou SECTION, mas é possível especificar se o teste deve ser feito antes ou
depois com a opção WITH TEST BEFORE ou WITH TEST AFTER, respectivamente.

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


24 Parte 1

Teoria MACRO-FLUXO

É a visão geral do algoritmo em relação aos arquivos de entrada e de saída. Os


símbolos utilizados em macro-fluxo e seu significado são mostrados abaixo:

Símbolo Significado

ou Arquivo sequencial em fita magnética

Arquivo sequencial em disco

Arquivo indexado em disco

Tabela de um banco de dados relacional

Relatório (Arquivo para impressão)

Programa

SYSIN (System Input – Entrada via JCL)

SYSOUT (System Output – Saída via


SPOOL)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 1 25

No Macro-Fluxo os arquivos de entrada (INPUT) ficam acima do programa, e

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.

Um programa complexo não significa um programa difícil. O termo


complexidade aqui se refere a quantidade de instruções que o programa deverá
executar para atingir seu objetivo.

Abaixo temos um exemplo de macro-fluxo onde o arquivo de vendas é lido e é


gravado um relatório de comissões a pagar através do programa GeraComi.

vendas Arquivo de entrada


(leitura) INPUT

GeraComi

Arquivo de saída
Comissao (gravação) OUPUT

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


26 Parte 1

Practice

Atividade Revisão aos pares

Responda as questões abaixo, depois peça para


que seu colega as corrija.

1) Dadas as sentenças abaixo, coloque V ou F entre os parênteses, caso a mesma


seja verdadeira ou falsa.

A. ( ) – O COBOL foi criado em 1959 pelo CODASYL, mas a primeira versão só saiu
em 1960 com o nome COBOL 60.

B. ( ) – Grace Hopper criou a linguagem FLOW-MATIC, que junto com a linguagem


CONTRAM de Bob Bemer, foram as principais linguagens que influenciaram o
COBOL.

C. ( ) – O COBOL é uma linguagem de baixo nível (próxima a linguagem de


máquina), parecida com o Assembly, de difícil aprendizagem e altamente
complexa.

D. ( ) – COBOL é um acrônimo para Completely Over and Beyond Obvius Logic.

E. ( ) – No processamento BATCH, uma coleção de registros é processada, sem a


intervenção do usuário, até que todos os registros terminem ou um erro de
processamento ocorra.

F. ( ) – São exemplos de processamento Batch: Pagar uma conta de luz no caixa


eletrônico, consultar o saldo de uma conta corrente via internet, entrevistar um
candidato a uma vaga de emprego e escrever um e-mail solicitando a 2ª via de
um boleto.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 1 27

2) Coloque entre parênteses qual parte do processamento BATCH essas tarefas são

1
executadas:

a) rotina-inicializar b) rotina-processar c) rotina-termino

( ) – Processamento dos campos numéricos pelos operadores aritméticos


(+, -, *, / ou **)

( ) – Abertura dos arquivos de entrada e saída

( ) – Fechamento dos arquivos de entrada e saída

( ) – Exibição de mensagem avisando do término normal de processamento

( ) – Inicialização das variáveis (Contadores e Acumuladores)

( ) – Leitura do primeiro registro do arquivo de entrada

( ) – Leitura do próximo registro do arquivo de entrada

3) Coloque V ou F se as ações abaixo caracterizam (verdadeiro) ou não (falso) um


processamento batch

( ) – O professor corrigindo as avaliações de uma turma

( ) – Um contador registrando no livro fiscal as notas fiscais emitidas por uma


empresa no mês passado

( ) – Pagar uma conta de telefone no caixa eletrônico de um banco

( ) – Dar baixa no estoque de uma geladeira vendida na loja

( ) – Separar do cadastro de clientes aqueles que não compram a mais de 30 dias

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


28 Parte 1
4) Marque com um X os comandos COBOL com erro de sintaxe ou de lógica,
sublinhando a parte errada.

a. ( ) ACCEPT WS-HORASTRAB FROM SYSOUT

b. ( ) DISPLAY “PROCESSADO COM SUCESSO”

c. ( ) DISPLAY “LIDOS = ” WS-CTLIDO

d. ( ) DISPLAY ((2 * WS-LADO ** 2) ** 0,5)

e. ( ) COMPUTE WS-DIAGONAL = ((2 * WS-LADO ** 2) ** 0,5)

f. ( ) COMPUTE WS-SALARIO=WS-HORASTRAB*WS-SALARIOHORA

g. ( ) MOVE 25 TO WS-SALARIO-A WS-SALARIO-B WS-SALARIO-C

h. ( ) MOVE WS-SALARIO TO 25

i. ( ) MOVE WS-LADO1 WS-LADO2 WS-LADO3 TO WS-TRIANGULO

j. ( ) IF WS-QTDEST NOT < 1000

k. ( ) IF WS-SALDO IS NUMERIC AND ALPHABETIC

l. ( ) IF WS-SALDO IS POSITIVE OR NEGATIVE

m. ( ) IF WS-TIPOCONTA = “CC” OR “CP” OR “CI”

n. ( ) PERFORM 010-INICIALIZAR 020-PROCESSAR 030-TERMINO

o. ( ) PERFORM 055-CALCULO UNTIL WS-SENTINELA = 0

p. ( ) PERFORM WITHOUT TEST 040-EXIBE-RESULTADO

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 1 29

Atividade Flip chart


1
Em grupo de até 3 alunos, faça os Macro-fluxos solicitados,
compare com os de seus colegas e anote os corretos.

a) O programa PGMFOPAG processa a folha de pagamento de uma empresa.


Ele lerá o arquivo HORARIO (sequencial em disco) e a tabela TABFUNC
(tabela de um banco de dados) e gravará o arquivo FOLHAPAG (sequencial
em fita magnética) e imprimirá o relatório CHEQUES.

b) O programa ATUESTOK atualiza o estoque de uma empresa com base na


movimentação. Lerá o arquivo CADANT (sequencial em disco) e o arquivo
MOVESTOK (sequencial em fita magnética) e gravará o arquivo CADATU
(sequencial em disco) e imprimirá o relatório RELOCORR.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


30 Parte 1

Trabalhe em duplas TEXTO  COBOL

Converta a especificação do programa abaixo para


a PROCEDURE DIVISION do COBOL.

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”

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 1 31

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


32 Parte 1

Trabalhe em duplas COBOL  TEXTO

Converta o programa COBOL abaixo para texto.

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"
.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 1 33

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


34 Parte 1

Performance

Todos Juntos PROJETO 1

Objetivo do Programa

O Departamento Financeiro do Banco DOPOLVO S.A. precisa de um programa


para simular empréstimos aos seus clientes.

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

𝑣𝑝 = (𝑣𝑒 ∗ 𝑗 / 100) / (1 − 1 / (1 + 𝑗 / 100) ∗∗ 𝑛 )

Macro-Fluxo

SYSIN

GPXXNN01

SYSOUT

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 1 35

Layout da SYSIN

Nome do Registro WS-REG-SYSIN


1
Tipo e
Nome da Variável Tamanho Descrição do Dado
do Dado
WS-NUM-SIMULACAO 9(04) Número da Simulação
WS-VAL-EMPRESTIMO 9(06)V99 Valor do Empréstimo
WS-JUROS 9(02)V99 Percentual de Juros Compostos ao Mês
WS-QTD-PARCELAS 9(02) Quantidade de Parcelas

Layout da SYSOUT

O resultado do processamento será exibido na SYSOUT pela instrução


DISPLAY. Para cada simulação de empréstimo exibir os seguintes dados:
11234567892123456789312345678941234567895
12345678901234567890123456789012345678901234567890
**************************************************
NUMERO DA SIMULACAO.....: 9999
VALOR DO EMPRESTIMO.....: 99999999
JUROS...................: 9999
QTDE. DE PARCELAS.......: 99
VALOR DA PARCELA ........: 99999999
VALOR TOTAL.............: 9999999999
**************************************************

No final do processamento, exibir o seguinte resumo:

11234567892123456789312345678941234567895
12345678901234567890123456789012345678901234567890
**************************************************
TOTAL DE SIMULACOES LIDAS........: 9999
TOTAL DE SIMULACOES PROCESSADAS..: 9999
**************************************************

Bem como a frase:

11234567892123456789312345678941234567895
12345678901234567890123456789012345678901234567890
**************************************************
* TERMINO NORMAL DE PROCESSAMENTO DO GPXXNN01 *
**************************************************

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


36 Parte 1

Observação

O parágrafo principal chama os parágrafos inicializar, processar e término,


formando a seguinte hierarquia de parágrafos:

0000-PRINCIPAL

1000-INICIALIZAR 2000-PROCESSAR 3000-TERMINO

1500-LER-SYSIN 1500-LER-SYSIN

JOB de Execução

O dados para realização da simulação do empréstimo podem ser vistas na


SYSIN. Observe a última simulação com tudo zero (sentinela), que indicará ao
programa que não há mais simulações para processar:

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

Orientação para processamento


1
Parágrafo Principal (0000-GPXXNN01)
Executa o parágrafo 1000-INICIALIZAR
Executa o parágrafo 2000-PROCESSAR
até que o registro lido na SYSIN seja o sentinela
Executar o parágrafo 3000-TERMINO
Encerrar o programa

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

No parágrafo 3000-TERMINO fazer:


Exibir o resumo do processamento
Exibir frase de término normal

Com base nesta especificação de programa, escreva nas páginas seguintes a


PROCEDURE DIVISION do programa COBOL que atenda a necessidade do Banco
DOPOLVO S.A.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


38 Parte 1

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 1 39

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


40 Parte 1

Avaliação Então...Como foi ?!?

Estou fera!

Fiz Certo!

 Muito Bom  Bom  regular  ruim  Muito ruim

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte

O que é um Mainframe?

É um computador de Grande Porte. Nos anos


70 e 80 quando quase todos os computadores eram
grandes, o termo Mainframe era usado para se
referir a diferentes sistemas de computadores. Hoje
a maioria desses sistemas se foram, e o termo
Mainframe quase sempre se refere aos
computadores IBM zSeries. De agora em diante
quando falarmos sobre Mainframes, estaremos
falando da zSeries.

IBM System Z10 David Stephens


What on earth is a Mainframe?
Versão 2.3.5
Parte 2 3

Preparation 2

Trocando Ideias É agora que você fala !!

Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na


capa desta parte. Isso é importante para que seu instrutor e seus colegas
saibam como está seu conhecimento sobre o assunto e se você precisa ou
pode fornecer ajuda aos colegas e instrutor.

 O que você já sabe ?


 O que você não sabe ?
 Porque é importante conhecer estes tópicos ?
 Quais são os seus temores ?
 O que você considera difícil ?

Reflexão É aqui que você se compromete !!

Depois de falar sobre o assunto com seus colegas e instrutor, escreva,


desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses
tópicos. Comprometa-se!

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


4 Parte 2

Presentation

História O acesso ao Mainframe

Vamos agora acessar o ambiente mainframe. Em geral, demora uma ou duas


semanas para que seja criado um usuário e senha para o estagiário acessar
mainframe, é um processo burocrático, onde o gerente do estagiário manda e-mail
para a área de segurança (Security Office), justificando a necessidade do acesso, etc,
etc. Mas aqui na XPTO seu acesso será imediato. Seu usuário e senha já estão
criados e você poderá acessar agora o ambiente.

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.

Pratique bastante, pois a XPTO aprecia muito o estagiário que tem


desenvoltura com a interface baseada em caractere do mainframe.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 5

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.

Uma vez conectado (login) ao TSO, o usuário pode excluir, visualizar,


submeter e acompanhar Jobs (serviços), alocar, renomear, mover, copiar e excluir
arquivos, e também utilizar outros aplicativos do sistema operacional que rodam sob o
TSO como, por exemplo, RACF, HCD, SDSF, Control/M, Endevor etc. O TSO controla
todos estes aplicativos.

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


6 Parte 2

Teoria Login e logoff

O acesso ao TSO é feito por um Software de Telnet (tele network = rede à


distância). Usamos o Tn3270 plus, cujo ícone está no desktop.

Um duplo-clique neste ícone inicializa o programa, que tem este


aspecto:

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.

Anote aqui o IP e a Porta para se conectar em nosso servidor:

IP
SOCKET
PORT

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 7

Você obterá a seguinte tela:

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.

Informar o seu USERID (identificação do usuário) e pressione ENTER, então


informe sua senha e pressione ENTER novamente. Quando aparecer os 3 asteriscos,
você estará logado, pressione ENTER mais uma vez para ir ao menu principal do TSO.
Outra maneira de Logar no TSO é digitar o comando L seguido do seu usuário, indo
direto para a tela de digitação da senha, exemplo:

L GPAZ99

Anote aqui o seu USERID:

USERID

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


8 Parte 2

Para sair do TSO pressionar X (EXIT) no menu principal ou PF3.

Se o painel Specify Disposition of Log Data Set aparecer, escolher a opção 2


Delete data set without printing para excluir o arquivo de LOG sem imprimi-lo. O LOG
registra todas as ações que o usuário executou durante a sessão do TSO. Isso é bom
para a empresa investigar quem fez algo de errado. No nosso caso podemos excluir
sem imprimi-lo.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 9

Quando aparecer READY, digitar LOGOFF e pressionar ENTER que a sessão


do TSO será encerrada.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


10 Parte 2

Atividade Prática de laboratório

Com seu usuário e senha em mãos, fazer o LOGIN


e o LOGOFF para se familiarizar com o procedimento.

Descubra como alterar sua senha (Password). Anote


o procedimento abaixo.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 11

ç
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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


12 Parte 2
A partir do Menu Principal, no campo OPTION ===> informamos as letras da
opção que desejamos acessar. As mais comuns, que usaremos em nosso curso são:
P – que leva ao menu ISPF/PDF – Interactive System Productivity Facility /
Program Development Facility. Que usaremos para manipular arquivos, editar
programas e submeter Jobs (serviços).
SD – que leva ao menu System Display and Search Facility – Que usaremos
para acompanhar a execução dos Jobs (serviços).
A navegação pelos menus e painéis é feita selecionando opções, preenchendo
campos e pressionando uma tecla de ação. A mais comum é a ENTER, que executa a
ação selecionada. Abaixo temos uma imagem do teclado de um terminal IBM 3270
que é emulado nos terminais PC (Personal Computer) e uma relação das teclas de
ação e seus efeitos.

PF7
Ctrl esquerdo Ctrl direito

PF10 PF11

Program Function (PF) PF8 Program Attention (PA)


PA1 Encerra um comando iniciado com
PF1 (Help) Exibe ajuda contextualizada erro ou Esc pressionado por engano
PF2 (Split) Divide a Janela do TSO no Cursor no PC usar tecla Page Up
PF3 Voltar ou sair salvando PA2 Desfaz o que foi digitado
PF5 Repete o último comando No PC usar tecla Page Down
PF7 Retrocede uma página
PF8 Avança uma página Outras Teclas
PF9 Navega entre 2 janelas abertas com PF2 Tab Salta o cursor para o próximo campo
PF10 Desloca tela à esquerda CLR Limpa a tela
PF11 Desloca tela à direita no PC usar ESC ou Ctrl+C
PF12 Cancela ação em curso ou sair sem salvar Enter Executa a ação solicitada
Reset desbloqueia o teclado
no PC usar Ctrl esquerdo

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 13

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

No painel ISPF Setting vamos modificar a localização da linha de comando,


que por default (padrão) está localizado em baixo na tela, tirando a barra (/) do campo
Command line at bottom e pressionando ENTER. A linha de comando passa então
para cima. Vamos desmarcar também a Tab to action bar choices, pois ao
pressionarmos a tecla HOME, o cursor é posicionado na linha de comando e não na
primeira linha da tela.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


14 Parte 2

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 15

Atividade Prática de laboratório


2
Modifique as configurações de sua sessão TSO/E,
conforme solicitadas abaixo. Anote o procedimento.

a) Posicionar a linha de comando na parte superior da tela.


(Command line at bottom).

b) Configure a tecla HOME para que, quando pressionada, posicionar o cursor na


linha de comando. (Tab to action bar choices).

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


16 Parte 2

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:

a) O nome do arquivo consiste em uma ou mais partes, chamadas


qualificadores. Eles são conectados por pontos.
b) Cada qualificador deve iniciar com um caractere alfabético de A a Z ou
caracteres nacionais americanos @, # ou $.
c) O tamanho de cada qualificador não deve exceder 8 caracteres.
d) O tamanho máximo do nome de um arquivo é 44 caracteres, incluindo os
pontos conectores.

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

A Organização de um Arquivo (DSorg = Data Set Organizartion) diz respeito a


forma como os dados são arranjados ou organizados dentro de um arquivo. As
organizações mais comuns são:

PS – Physical Sequential (Físico Sequencial)

É um arquivo que possui registros organizados


sequencialmente, um atrás do outro, podendo ser de
tamanho fixo ou variável. São os arquivos mais
comuns para o armazenamento de dados para
processamento em lote (Batch).

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 17
PO – Partitioned Organization (Particionado) ou
PDS – Partitioned Data Set

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.

Ambos os arquivos (PS ou PO/PDS) podem ser “blocados”. Um arquivo


blocado permite que o equipamento que o lê (unidade de disco ou fita), faça a leitura
de um grupo de registros de uma única vez (bloco de registros), armazenando-os em
um buffer de memória e disponibilizando para a aplicação um registro por vez. Isso
agiliza a leitura, pois o acesso aos dados em disco ou fita é mais lento por possuírem
componentes mecânicos. Entre os registros (arquivo não blocado) ou entre os blocos
de registros (arquivo blocado) há um espaço não gravado chamado IRG (Inter Record
Gap).

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


18 Parte 2
O processo de criação de arquivos é chamado de Alocação. O modo mais fácil
de alocar um arquivo é consultando as características de um arquivo já existente,
assim essas características ficam gravadas na memória e são repassadas para o
arquivo que se deseja alocar. A partir do menu principal do TSO escolhemos:

P (Menu PDF), 3 (utilities) e 2 (data set), ou digitamos P.3.2.

No painel Data Set Utility deixamos o campo Option em branco e preenchemos


os campos Project, Group e Type com o nome do arquivo que desejamos consultar as
informações (características do arquivo).

Um arquivo particionado (PDS – Partitioned Data Set) possuem um nome de


arquivo com 3 níveis (qualificadores).

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 19

Vamos consultar as informações do arquivo GP.GPAZ99.COBLIB.

Quando pressionamos ENTER, as informações do arquivo aparecem no painel

2
Data Set Information.

Depois pressionamos PF3 para voltar ao painel Data Set Utility.

Aquelas informações ficaram armazenadas na memória e serão utilizadas na


alocação do próximo arquivo.

Para alocarmos um novo arquivo colocamos no campo Option a opção A


(Allocate new data set) e nos campos Project, Group e Type o nome do arquivo que
desejamos alocar, por exemplo, GP.GPNE19.BOOKLIB e pressionamos ENTER.

As informações consultadas anteriormente são automaticamente preenchidas


nos campos. Basta pressionar ENTER que o arquivo é alocado e a mensagem “data
set allocated” aparece no canto superior direito da tela.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


20 Parte 2

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 21

Atividade Prática de laboratório


2
Faça a alocação dos seguintes arquivos (DATA
SET), substituindo XXNN pela identificação de seu
usuário. Utilize como base os arquivos de seu instrutor.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


22 Parte 2

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.

No campo Initial View, temos a possibilidade de exibir as seguintes


informações dos arquivos:

1 – Volume em qual disco (storage) o arquivo se encontra

2 – Espaço quantas trilhas (56.664 bytes no modelo de disco 3390)

3 – Atributos dados armazenados no catálogo (VTOC – volume table


of contents) que aponta a localização física dos arquivos

4 – Total todas as informações juntas

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 23

Depois de informado o Dsname Level e o Initial View, pressione ENTER e os


arquivos serão exibidos, conforme tela a seguir.

INITIAL VIEW 1
2
INITIAL VIEW 2

INITIAL VIEW 3

INITIAL VIEW 4

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


24 Parte 2

Atividade Prática de laboratório

Visualize os DATA SET que você alocou na


atividade anterior, alterando o valor do campo INITIAL
VIEW desde 1 até 4.

O que acontece, na visualização dos arquivos, quando pressionamos PF10 ou


PF11 repetidas vezes?

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 25

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:

E (Edit) Editar arquivo / membros


V (View) Visualizar arquivo / membros, não permite alterações
B (Browse) Exibe arquivo / membros, não permite alterações
R (Rename) Renomear arquivo / membros
D (Delete) Excluir arquivo / membros
Z (Compress) Comprime arquivos particionados com 100% de uso
/ exibe menu com diversas ações. Digitar o número da ação desejada.
I (Information) Exibe informações sobre o Data Set
S (Information Short) Exibe informações reduzidas sobre o Data Set

Abaixo vamos editar os membros da GP.GPAZ99.JOBLIB.

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


26 Parte 2

A charge faz referência ao Parallel Sysplex, onde é possível conectar até 32


mainframes, permitindo que todos trabalhem em conjunto para a execução de uma
tarefa.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 27

Atividade Prática de laboratório


2
Execute os procedimentos solicitados nos Data
Sets alocados na atividade anterior, anotando como o
procedimento foi realizado:

A) Visualizar as informações do DATA SET GP.GPXXNN.COBLIB.

B) Renomear o DATA SET GP.GPXXNN.DADOS.PESSOAIS para


GP.GPXXNN.PESSOAIS.

C) Excluir o DATA SET GP.GPXXNN.PESSOAIS.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


28 Parte 2

Teoria ç
Edi ão de membros

Para adicionar um membro em um particionado, utilizamos a opção P.2 para


abrir o painel Edit Entry Utility. Informamos nos campos Project, Group e Type o nome
do particionado e no campo member o nome do membro que desejamos criar e
pressionamos ENTER. Um membro vazio é aberto no modo de edição e já podemos
digitar nossos textos.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 29

Na linha Command podemos usar os seguintes comandos:

CANCEL sai da edição do membro sem salvar

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.

No campo SCROOL podemos escolher:

PAGE paginação da tela inteira. Abreviadamente P.


CSR paginação até a posição do cursor. Abreviadamente C.
número paginação pelo número de linhas indicado

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


30 Parte 2
A melhor escolha para o SCROOL é CSR, pois colocamos o cursos no linha
desejada e pressionamos PF8, avançando a tela, mas parando na posição do cursor.

Os comandos que podem ser utilizados na lateral esquerda da tela de edição


são:

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.

Comandos para grupos de linhas (blocos de linhas)

MM marca o início e o término do bloco que desejamos mover,


usar A ou B no destino
CC marca o início e o término do bloco que desejamos copiar,
usar A ou B no destino
DD marca o início e o término do bloco que desejamos excluir
RR marca o início e o término do bloco que desejamos repetir
)) marca o início e o término do bloco que desejamos deslocar para a direita.
(( marca o início e o término do bloco que desejamos deslocar para a esquerda.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 31

Atividade Prática de laboratório


2
Crie o membro TESTE dentro do particionado
GP.GPXXNN.COBLIB e digite trechos do texto abaixo.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


32 Parte 2

Teoria cópia de membros

Podemos copiar membros de arquivos particionados. Basta informar a origem e


o destino do membro. A partir do menu principal digitamos P.3.3 para acessar o painel
Move/Copy Utility.

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 33

Atividade Prática de laboratório


2
Execute os procedimentos abaixo e anote como foram
feitos:

A) Copie os membros ESKELETO e EEXXNN01 da COBLIB de seu instrutor para


seu PDS COBLIB. Anote o procedimento abaixo.

B) Mova o membro DICAS da COBLIB de seu instrutor para seu PDS COBLIB.
Anote o procedimento abaixo. O que ocorreu?

C) Copie os membros COMPCOB e CCXXNN01 da JOBLIB de seu instrutor para seu


PDS JOBLIB. Anote o procedimento abaixo.

D) Renomeie os membros (usando a opção P.3.4) EEXXNN01 de seu PDS COBLIB e


CCXXNN01 do seu PDS JOBLIB, trocando XXNN pelo prefixo de seu usuário, e
responda: Logo após a alteração, o membro ficou com o nome alterado?
O que fazer para mostrar o nome alterado do membro?

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


34 Parte 2

Teoria Compilando programa cobol

O programa COBOL é chamado de Programa Fonte e está escrito em uma


linguagem de alto nível, pois está mais próximo da linguagem humana, no caso inglês
estruturado. Um programa fonte não pode ser executado, porque o computador não
“fala inglês”. É preciso convertê-lo para uma sequência de zeros (0) e uns(1)
(linguagem binária), facilmente reconhecida e executada pelo computador, chamado
de Módulo de Carga (Load Module).

O processo de converter um programa fonte em módulo de carga (Load


Module) é chamado de Compilação. Na verdade ocorrem três etapas, como mostra a
figura abaixo:

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)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 35

1º - Pré-Compilação – O pré-compilador procura a instrução COPY seguida do


nome de um arquivo (membro) que será inserido no fonte COBOL. Muitas rotinas já
prontas e o layout dos arquivos não são digitados, mas sim inseridos no fonte pela

2
instrução COPY. Isso é feito antes de passar o programa fonte pela compilação.

2º - Compilação – O compilador faz uma análise sintática, em busca de


palavras do COBOL escritas erroneamente, como por exemplo PERFORMI, no lugar
de PERFORM, ou END IF no lugar de END-IF. Depois é feita uma análise semântica
(de significado), onde os comandos incompletos são apontados como errados,
exemplo ADD 1 WS-CTLIDO, no lugar de ADD 1 TO WS-CTLIDO. Se tudo estiver
certo, ocorre a tradução para a linguagem da máquina, menos as instruções de I-O
(Input-Output), que são os comandos OPEN. CLOSE, READ, WRITE, REWRITE e
DELETE. Esses comandos são substituídos por chamadas (CALL) à funções de I-O,
que estão em biblioteca externa.

3º - Linkage-Editor – O linkeditor analisa os CALLs existentes no programa


compilado e acessa uma biblioteca de funções, buscando a função chamada e
substituindo no ponto onde está o CALL. Assim o Módulo de Carga (Load Module) é
gerado e está pronto para uso.

Um log com o resultado do processo de Compilação e Linkedição é gravado e


armazenado em uma fila (SPOOL – Simultaneous Peripheral Operations Online), para
consulta posterior.

Normalmente chamamos de compilação a execução dessas três etapas. O


JOB de compilação que usaremos está abaixo:
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//GPXXNN01 JOB SEUNOME,MSGCLASS=X,CLASS=C,NOTIFY=&SYSUID,TIME=(0,20)
//*****************************************************************
//* JOB DE COMPILACAO PROGRAMA COBOL BATCH
//* TROCAR XXNN POR SEU USUARIO
//*****************************************************************
// JCLLIB ORDER=GP.LB.PROCLIB
//COBCOMP EXEC DFHCOBOL,INSTR='GPXXNN',NOME='GPXXNN01'
//LKED.SYSIN DD *
NAME GPXXNN01(R)
/*

Esse JOB executa as três etapas do processo de compilação. Os exercícios da


apostila têm o seguinte formato: GPXXNN01, onde:

GP significa Grande Porte


XX é a sigla que identifica seu instrutor
NN é o número do aluno
01 é o número do projeto

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


36 Parte 2
Para preparar o JOB de compilação para compilar, por exemplo, o projeto
GPAZ9901 devemos, no TSO, utilizar o comando C (CHANGE) da seguinte forma:

C XXNN AZ99 ALL

Com o comando SUB, submetemos esse JOB ao JES, que atribuirá um


número ao JOB, chamado de Job Id. Esse número será usado na identificação do JOB
na fila do JES.

Pressione ENTER de tempos em tempos, até aparecer uma notificação no topo


da tela, com o MAXCC obtido. Se tudo der certo, obteremos MAXCC = 0. Caso
contrário, o MAXCC será 4, 8 ou 12.

Quando obtemos MAXCC diferente de zero, o programa fonte COBOL está


com erro. Precisamos tirar os erros do programa e recompilar, até obter MAXCC=0.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 37

Atividade Prática de laboratório


2
Compile o programa EEXXNN01. Anote o
procedimento abaixo. Qual foi o MAXCC de retorno?

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


38 Parte 2

Tirando erros detectados


Teoria na compila ão ç
A partir do Menu Principal do TSO escolhemos SD (SDSF-System Display and
Search Facility) e depois ST (Display status of jobs in the JES2 queues). Chegamos ao
SPOOL.

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.

Coloque um S do lado esquerdo do arquivo SYSPRINT COBCOMP COBOL


para ele ser aberto.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 39

Utilize o comando F MESSAGE para localizar o início das mensagens de erro


que ocorreram em seu programa fonte

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.

Divida a tela em duas partes, posicionando o cursor no topo da tela e


pressionando PF2. Você sabe que a tela está dividida quando aparece uma linha
pontilhada. Para “trocar de tela” pressione PF9. Em uma tela mantenha os erros e na
outra abra o programa fonte para correção. Retire os erros e recompile o programa,
até obter MAXCC=0.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


40 Parte 2

Atividade Prática de laboratório

Encontre e elimine os erros do programa


EEXXNN01. Recompile até encontrar MAXCC=0. Anote o
procedimento abaixo.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 41

Teoria Executando cobol


2
Para executarmos um programa compilado (Load Module), montamos um JOB
de execução. A seguir temos o Job de execução do programa do exemplo. Observe a
SYSIN, que será lida com o comando ACCEPT do COBOL.

Depois de executar com sucesso, digite SD.ST a partir do menu principal do


TSO, coloque um S ao lado da SYSOUT para abri-la. No programa fonte COBOL, o
resultado do comando DISPLAY aparece na SYSOUT.

No exemplo, a finalidade do exercício é o calcular o salário de funcionários, que


ganham lidos da SYSIN na SYSOUT.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


42 Parte 2
ALGUMAS DICAS

Dica 1) Na opção SD.ST, é possível abrir o JOB submetido digitando SJ no


lado esquerdo do JOBNAME. SJ é a sigla para submit job.

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 43

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


44 Parte 2

Atividade Prática de laboratório

Execute o programa EEXXNN01 utilizando o job


CCXXNN01 e compare seus resultados com os dos
outros colegas. Anote o procedimento abaixo.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 45

Practice 2

Atividade Revisão aos pares

Responda as questões abaixo, depois peça para


que seu colega as corrija.

1) Coloque as letras, que representam a navegação pelos menus do TSO nos


parênteses que indicam o nome do painel correspondente.

A – P.0 ( ) – SDSF STATUS DISPLAY ALL CLASSES


B – P.3.2 ( ) – ISPF Settings
C – P.3.3 ( ) – Data Set List Utility
D – P.3.4 ( ) – Edit Entry Panel
E – SD.ST ( ) – Data Set Utility
F – P.2 ( ) – Move/Copy Utility

2) Associe os comandos utilizados durante a edição de um membro com a sua ação.

A – CAPS ON ( ) – ativa as cores para a linguagem COBOL


B – NUM OFF ( ) – posiciona o cursor na linha informada
C – RES ( ) – Localiza uma string no membro
D – HI ON COBOL ( ) – apaga as mensagens exibidas pelo TSO
E – SAVE ( ) – sai da edição do membro sem salvar
F – CANCEL ( ) – enumera as linhas de 1 em 1
G – L nn ( ) – habilita o UNDO (desfazer)
H – M + PF8 ( ) – salva o membro
I – M + PF7 ( ) – transforma tudo o que for digitado em maiúsculo
J – F string ( ) – substitui todas as ocorrência da string1 por string2
K – RECOVERY ON ( ) – substitui 1ª ocorrência da string1 por string2
L – C XXXX YYYY ( ) – desfaz a última modificação no texto
M – UNDO ( ) – Avança para o fim do texto
N – C XXXX YYYY ALL ( ) – Avança para o início do texto

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


46 Parte 2
3) Com base no texto abaixo, localize as palavras em vermelho no caça-palavras.

O processo de COMPILACAO transforma um programa FONTE escrito


em uma linguagem de alto nível, como o COBOL, em um módulo de CARGA
que é a linguagem da MAQUINA (binário). No Mainframe, esse processo
ocorre em três etapas, a pré-compilacao, que faz a inserção de BOOK com o
comando COPY, a compilação, que faz análise SINTATICA e SEMANTICA no
fonte, indicando as rotinas de I-O com CALL e a LINKEDICAO, que substitui
esses CALLs pelas respectivas funções de I-O.

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 47

Dinâmica Pense rápido !


2
Neste bate-bola, fale o nome de um colega, faça
uma pergunta e jogue a bola para ele. Quem recebe a
bola, responde a pergunta e repete o jogo.
Anote as respostas mais criativas!

SD.ST

P.2

Menu / Painel

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


48 Parte 2

Performance

Atividade Para casa

Instalação do Hercules

Faça a instalação do ambiente mainframe no seu


computador pessoal. Nossos alunos já instalaram esse
ambiente em diversas versões de Windows (do 95 ao
Seven) e em diversas configurações de hardware (desde
NetPC, Notebook até Desktops).

No DVD que você recebeu há os seguintes arquivos:

abendassist.exe programa com diversas tabelas de abends


Helpdib.hlp arquivo de Help também com tabelas de abends
Instalação do Hercules.doc manual de instalação passo a passo do ambiente
GrandePorte-1.zip arquivo com o ambiente mainframe compactado

Serão necessários aproximadamente 22 GB livres em seu HD para essa


instalação.

É 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.

O Hercules é um emulador de computador que permite que softwares


projetados para computadores mainframe IBM (System/370, System/390, zSeries e
System z) e para mainframes plug-compatível (como máquinas de Amdahl) funcionem
em outros tipos de computadores, como os computadores pessoais por exemplo.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 2 49

Embora existam outros emuladores de mainframe que desempenhem uma


função semelhante, o Hercules é considerado o melhor de sua categoria. O Hercules é

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.

O Hercules foi o primeiro emulador de mainframe a incorporar 64 bits


z/Architecture suporte, superando as ofertas comerciais. Roger Bowler, programador
de sistemas mainframe, iniciou o desenvolvimento do emulador Hercules em 1999.
Jay Maynard atualmente mantém e hospeda o projeto.

Para mais informações consulte www.hercules-390.org

Roger Bowler

Engenheiro do sistema z/OS e criador do


emulador Hercules ESA/390, que em 1999 causou
uma grande revolução no mundo dos computadores
mainframe, permitindo que pessoas físicas puderem
executar pela primeira vez, softwares de mainframe
em seus próprios PCs, e o mais importante, de graça.

Jay Maynard

Gerente de projetos do emulador de


mainframe Open Source Hercules. Foi um
programador de mainframe e sistemas de rede por
mais de 15 anos, e tem também trabalhado com uma
grande variedade de computadores como sistemas
Unix, AS/400 e outros sistemas de computadores.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


50 Parte 2

Avaliação Então...Como foi ?!?

Estou fera!

Fiz Certo!

 Muito Bom  Bom  regular  ruim  Muito ruim

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte

Teste de Turing - Um computador pode ser chamado


"inteligente" se conseguir enganar uma pessoa fazendo-se
passar por um ser humano.

O logo da Apple é atribuído erroneamente como um


tributo a Alan Turing, com a marca de mordida fazendo
referencia ao seu método de suicídio.

Alan Turing
1912 – 1954
Versão 2.3.5
Parte 3 3

Preparation
3
Trocando Ideias É agora que você fala !!

Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na


capa desta parte. Isso é importante para que seu instrutor e seus colegas
saibam como está seu conhecimento sobre o assunto e se você precisa ou
pode fornecer ajuda aos colegas e instrutor.

 O que você já sabe ?


 O que você não sabe ?
 Porque é importante conhecer estes tópicos ?
 Quais são os seus temores ?
 O que você considera difícil ?

Reflexão É aqui que você se compromete !!

Depois de falar sobre o assunto com seus colegas e instrutor, escreva,


desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses
tópicos. Comprometa-se!

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


4 Parte 3

Presentation

História Ficando íntimo do cobol

Continuando com seu programa de treinamento,


vamos agora ficar mais íntimos do COBOL. Vamos
conhecer os comandos básicos, necessários para o
processamento batch.

Esses comandos devem ter seu significado e


sintaxe dominados pelos estagiários. Você deve sabê-
los na ponta da língua.

Também aprenderemos um pouco de


matemática, onde os sistemas de numeração decimal,
binário e hexadecimal serão usados para representar
os números armazenados em diversos tipos de
variáveis do COBOL.

Você ficará maravilhado com a grande


quantidade de programas que já são possíveis de se
fazer com o conhecimento que você vai adquirir nesta
parte do treinamento.

Boas práticas de programação também serão


exigidas e seus programas devem segui-las. Não basta
fazer o programa funcionar, ele também deve ser
esteticamente bonito, de fácil leitura e compreensão.
Fazer um programa é fácil, o difícil é dar manutenção.
Escreva seus programas pensando no próximo.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 5

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

Colunas de 1 a 6 (N) não usado


Coluna 7 (C) área de indicação
Colunas de 8 a 11 (A) margem A
Colunas de 12 a 72 (B) margem B
Colunas de 73 a 80 (N) não usado

Área de indicação (Coluna 7)

(-) 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.

Linhas em branco com * na coluna 7, são tratadas mais rapidamente pelo


compilador COBOL, pois são ignoradas logo no início da compilação.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


6 Parte 3
(/) Barra – Indica, para a impressora que deve fazer um salto de página. Isso é
interessante quando desejamos que determinada parte do programa comece no início
da próxima página, como por exemplo as DIVISIONS, os parágrafos da PROCEDURE
DIVISION, etc. Deve estar em uma linha em branco.
Exemplo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
/
......*----------------------------------------------------------------*
.......PROCEDURE ................ ..DIVISION.
......*----------------------------------------------------------------*

Margem A – Colunas de 8 a 11

Posição a partir da qual se escrevem o nome de Divisão, Seção, Parágrafo e


os níveis FD (FILE DESCRIPTION), 01 (grupo de variáveis) e 77 (variável individual).

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
......*----------------------------------------------------------------*
.......DATA............................ DIVISION.
......*----------------------------------------------------------------*
.......FILE....... ....... ....... .... SECTION.
.......WORKING-STORAGE....... ......... SECTION.

Margem B – Colunas de 12 a 72

Posição a partir da qual se escrevem os valores dos parágrafos e as instruções


COBOL.

----+-*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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 7

Folha de codificação COBOL

É um formulário para escrever o programa fonte COBOL, da época em que o


programa precisava ser perfurado em cartões. Podem-se ver claramente as colunas e
as margens A e B.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


8 Parte 3

Teoria As 4 divisões

De maneira semelhante a um livro com seus capítulos, parágrafos e itens, um


programa COBOL é formado por uma hierarquia de divisão (DIVISION), seção
(SECTION), parágrafo e instruções. Uma regra importante em COBOL é que todo
nome de Divisão, Seção e Parágrafo deve ser terminada por ponto final (.). O código
COBOL possui quatro divisões que devem ser utilizadas nesta ordem:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
.......IDENTIFICATION DIVISION.
.......ENVIRONMENT DIVISION.
.......DATA DIVISION.
.......PROCEDURE DIVISION.

Por questões de estética e melhor visualização, costuma-se digitar essas


divisões da seguinte forma, com DIVISION na coluna 44:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
......*----------------------------------------------------------------*
.......IDENTIFICATION.................. DIVISION.
......*----------------------------------------------------------------*
......*----------------------------------------------------------------*
.......ENVIRONMENT..................... DIVISION.
......*----------------------------------------------------------------*
......*----------------------------------------------------------------*
.......DATA............................ DIVISION.
......*----------------------------------------------------------------*
......*----------------------------------------------------------------*
.......PROCEDURE....................... DIVISION.
......*----------------------------------------------------------------*

IDENTIFICATION DIVISION.

Esta é a DIVISION de identificação do programa. Não contêm SECTIONs, mas


somente alguns parágrafos pré-estabelecidos e opcionais. O único parágrafo
obrigatório é o PROGRAM-ID (Identificação do Programa). A identificação do
programa deve ser uma palavra com até 8 caracteres (letras ou números), começando
por uma letra, que será usado no processo de linkedição para identificar o programa e
nomear o programa objeto. Possui a seguinte estrutura.

----+-*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.

Todos os parágrafos que possuem a palavra COMENTARIO, não possuem


efeito. São parâmetros opcionais para documentação do programa. Observe a
utilização do ponto final (.) no programa fonte COBOL. Nenhum destes pontos pode
ser omitido para não causar erro de compilação.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 9

ENVIRONMENT DIVISION.

Esta DIVISION descreve os computadores e os arquivos usados pelo programa.


Possui duas SECTIONs e sua estrutura é a seguinte:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
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.

SELECT RELATO ASSIGN TO UT-S-RELATO


FILE STATUS IS FS-RELATO.

CONFIGURATION SECTION.

Esta SECTION destina-se a uma descrição geral do ambiente do computador.


Ela é composta por três parágrafos: SOURCE-COMPUTER, OBJECT-COMPUTER e
SPECIAL-NAMES.

SOURCE-COMPUTER. nome do computador de desenvolvimento (opcional).

OBJECT-COMPUTER. nome do computador de produção (opcional).

SPECIAL-NAMES. tem valores pré-definidos em COBOL, para especificar


alfabeto, moeda, ou separador de decimal (vírgula ou
ponto), mas todos os valores são opcionais. O separador
de decimais é usado mais frequentemente (DECIMAL-
POINT IS COMMA.). Esta instrução informa que a vírgula
(COMMA) será usada como separador de decimais.

INPUT-OUTPUT SECTION.

Esta SECTION destina-se a configuração dos arquivos. No parágrafo FILE-


CONTROL, informando ao COBOL o nome interno e externo dos arquivos, bem como
a organização dos registros, modo de acesso e variável de FILE STATUS.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


10 Parte 3
DATA DIVISION.

É a DIVISION do programa onde são definidos os layout dos arquivos


(registros e campos), variáveis e constantes e dados passados por outros programas.
A DATA DIVISION é composta por três SECTIONs:

FILE SECTION, WORKING-STORAGE SECTION e LINKAGE SECTION.

FILE SECTION.

A FILE SECTION é a seção usada para detalhar o layout dos arquivos


(registros e campos). Os níveis usados são FD (FILE DESCRIPTION) para arquivo, 01
para registro e de 02 a 49 para campos. Exemplo:

----+-*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).

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 11

WORKING-STORAGE SECTION.

NA WORKING-STORAGE SECTION são definidas todas as variáveis que o


programa precisa para seu completo funcionamento. Não há parágrafos nesta
SECTION, e as variáveis podem ser definidas como grupos hierárquicos (níveis 01 a
49), ou variáveis independentes (nível 77) em qualquer ordem, desde que não se crie

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

A figura abaixo ilustra a hierarquia dos níveis.

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


12 Parte 3
NIVEL

O nível é um número variando de 01 a 49 que define a hierarquia da variável


em relação as outra variáveis. Em COBOL pode-se agrupar as variáveis e concatená-
las formando hierarquias como no exemplo abaixo:

WS-DATA-SISTEMA WS-DATA-SISTEMA
WS-ANO
WS-MES
WS-DIA WS-ANO WS-MES WS-DIA

Neste exemplo, a variável WS-DATA-SISTEMA é formada pelas seguintes


variáveis WS-DIA, WS-MES e WS-ANO. Em COBOL, os níveis de 01 a 49 podem ser
usados para especificar estas hierarquias, onde um valor maior significa dependência.
O exemplo acima acrescido dos níveis seria:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXX01 WS-DATA-SISTEMA.
XXXXXXXXXXX05 WS-ANO PIC 9(02).
XXXXXXXXXXX05 WS-MES PIC 9(02).
XXXXXXXXXXX05 WS-DIA PIC 9(02).

Os níveis de 50 a 99 tem uso específico, reservado para futuras expansões do


COBOL. Atualmente usam-se dois níveis nesta faixa:

Nível 77 – usado quando a variável não tem hierarquia (independente).


Nível 88 – usado para nomes condicionais.

----+-*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”.

De todos estes níveis, somente o nível 01 e o nível 77 podem ser codificados


na margem A do fonte COBOL (coluna 8), observe que o nome da variável deve ficar
na margem B. Todos os outros níveis devem ser codificados na margem B (coluna 12).

O COBOL exige também que toda a hierarquia de um grupo de itens comece


com um item de nível 01. A partir dele, cada nível subordinado deve ter o mesmo
número, por exemplo, se para o segundo nível for escolhido o número 05 todos os
itens do segundo nível devem ter nível 05, e se para o terceiro nível for escolhido o
número 10, todos os itens do terceiro nível devem ser especificado com o nível 10.

NOME DA VARIÁVEL

Qualquer nome de variável pode ter no máximo 30 caracteres, incluindo letras,


números e hífen, sendo que pelo menos um dos caracteres deve ser letra e não pode
começar ou terminar por hífen. Quando uma variável criada na DATA DIVISION não
for referenciada em nenhum comando do programa, não será necessário criar um
nome de variável para ela, e neste caso usa-se a palavra FILLER.

A palavra FILLER é o nome padrão para identificar variáveis anônimas.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 13

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:

A A variável é alfabética (letras e espaço)

3
9 A variável é numérica (números)
X A variável é alfanumérica (letras, números e outros caracteres)

A quantidade de caracteres contidos na variável é especificada no formato


repetindo-se as letras acima. Por exemplo, se a variável WS-CONTADOR tem 5
algarismos, seu formato será:

xxxxxxx77 WS-CONTADOR PIC 99999.

Pode-se abreviar esta repetição colocando o número de repetições entre


parênteses:
77 WS-CONTADOR PIC 9(05).

Quando uma variável numérica tiver casas decimais, não se carrega na


memória do computador o separador decimal (vírgula).

Se a variável WS-VALOR-PROD tiver, por exemplo, o valor de 2,35, seu valor


fica na memória como 0000235. Mas o programa COBOL precisa saber em que
posição estava a vírgula que desapareceu (vírgula implícita). A vírgula implícita é
definida no formato pela letra V (virtual), como abaixo:

77 WS-VALOR-PROD PIC 99999V99.


ou
77 WS-VALOR-PROD PIC 9(05)V99.
ou
77 WS-VALOR-PROD PIC 9(05)V9(02).

Em um grupo de variáveis contidos em uma hierarquia (com níveis de 01 a 49)


só podem ter a cláusula PIC as variáveis no nível mais baixo da hierarquia (variáveis
elementares). Exemplo:

----+-*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).

Alinhamento de dado Alfanumérico (JUSTIFIED ou JUST)


Por default um dado alfanumérico é alinhado à esquerda, mas para alinhá-lo a
direita é preciso informar essa intenção com a cláusula JUSTIFIED. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
77 WS-TEXTO1 PIC X(30) JUSTIFIED RIGHT.
77 WS-TEXTO2 PIC X(30) JUST RIGHT.

Não existe JUSTIFIED LEFT.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


14 Parte 3
VALOR INICIAL (VALUE)

Esta cláusula é opcional em COBOL. Seu objetivo é definir um valor para a


variável quando o programa se inicia. Se ela for omitida, a variável correspondente
terá valores imprevisíveis (lixo de memória). No caso de variáveis que serão usadas
como contadores ou acumuladores, é conveniente que eles comecem com o valor
zero.
Em COBOL existem 2 tipos de constantes: numérica e alfanumérica.

As constantes numéricas são escritas colocando-se diretamente o valor na


instrução. Exemplo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
77 WS-IDADE-MINIMA PIC 9(02)
VALUE 18.

As constantes alfanuméricas devem ser colocadas entre apóstrofes (‘) ou


aspas (“). Exemplo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
77 WS-NOME-ALUNO PIC A(30)
VALUE
‘GRACE MURRAY HOPPER’.

Não se pode misturar em uma cadeia de caracteres (string) o uso de


apóstrofes com aspas, ou seja, se uma string começou a ser escrito com apóstrofes,
deve terminar com apóstrofes.

As constantes alfanuméricas em COBOL podem ter no máximo 160 caracteres.

Podem-se usar ainda como valor-inicial as CONSTANTES FIGURATIVAS, que


são valores pré-definidos no COBOL, são elas:

ZERO A variável numérica será preenchido com 0 (zero).


ZEROS
ZEROES

SPACE A variável alfabética ou alfanumérica será preenchido com


SPACES espaços.

LOW-VALUE (menor valor) A variável alfanumérica será preenchida com bits 0


LOW-VALUES (primeiro caractere da tabela EBCDIC)

HIGH-VALUE (maior valor) A variável alfanumérica será preenchida com bits 1


HIGH-VALUES (último caractere da tabela EBCDIC)

QUOTE Insere um apóstrofe no lugar indicado


QUOTES

Quando desejamos preencher toda a variável com um determinado conteúdo,


usamos ALL, por exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
77 WS-TRACO1 PIC X(80) VALUE ALL ‘-’.
77 WS-TRACO2 PIC X(80) VALUE ALL ‘X-’.
77 WS-TRACO3 PIC X(80) VALUE ALL ‘*-#-’.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 15

LINKAGE SECTION.

A LINKAGE SECTION é a seção onde declaramos as variáveis usadas para


receber dados do parâmetro PARM do JCL ou do programa PRINCIPAL, através da
instrução CALL com USING.

----+-*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.
*----------------------------------------------------------------*

Abaixo temos outro exemplo, onde o programa PRINCIPAL passa ao programa


SUB-PROGRAMA o conteúdo da variável WS-NOME.

PROGRAMA PRINCIPAL

SUB-PROGRAMA

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


16 Parte 3
PROCEDURE DIVISION.

Esta divisão controla a execução do programa, é onde colocamos os


comandos oriundos do algoritmo planejado pelo programador. Os comandos
(instruções) do COBOL são formados por um único verbo da língua inglesa, seguido
dos parâmetros necessários, e que serão discutidos um a um nos parágrafos
seguintes. As instruções de um programa COBOL podem ser reunidas em parágrafos,
e estes em seções, definidas pelo programador com o fim de tornar o programa mais
fácil de ser entendido. Exemplo:

----+-*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"
.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 17

Boas práticas
Teoria de programa ão ç
INDENTAÇÃO

Indentação (recuo, neologismo derivada da palavra em inglês indentation,


3
também se encontra as formas identação e endentação) é um termo aplicado ao
código fonte de um programa para indicar que os termos hierarquicamente dispostos
têm o mesmo avanço relativamente a sua posição.
O objetivo da indentação é alinhar comandos, de forma que fique mais fácil ao
programador que estiver analisando o código, visualizar e, por decorrência, entender o
conjunto de instruções. Algumas instruções trabalham com subconjuntos (blocos) de
(outras) instruções; por meio da indentação colocam-se instruções que façam parte de
um mesmo bloco num mesmo alinhamento.
O caso mais comum é o das instruções de teste (IF), onde normalmente existe
pelo menos um bloco de instruções que deve ser executado quando a condição
testada for satisfeita e, opcionalmente, outro bloco de instruções que devem ser
executadas quando a condição testada não for satisfeita, exemplo:

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.

Se o primeiro bloco fosse:


A = (B * C ) ** 4
C = A / 0.005

E o segundo bloco fosse:


A = (B * C ) ** 5
C = A / 0.015

E a especificação fosse feita sem indentação:


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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


18 Parte 3
Ficaria mais difícil analisar do que se houvesse sido especificado com
indentação:

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 vantagem fica muito mais evidente quando houver IFs encadeados :

----+-*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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 19

Colunas 44 e 52

Há uma prática de programação na maioria dos ambientes de desenvolvimento


COBOL Mainframe que é o uso das colunas 44 e 52 para sempre colocar certas
instruções.

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”.

Não seguir a prática de programação do uso das colunas 44 e 52 não causará


erro de compilação ou mesmo de lógica no programa, mas se há um padrão é melhor
segui-lo.

Evitar Hard Coding

Hard Coding é o uso de constantes no programa fonte. Quando a mesma


constante é utilizada em diversos pontos do programa e houver a necessidade de
alterá-la, será necessário fazê-lo em todos os pontos onde essa constante ocorrer e,
neste caso, pode acontecer de alguma não ser alterada o que pode ocasionar erro de
lógica no programa, daí a importância e evitar o Hard Coding.
Exemplo de Constantes Alfanuméricas:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
MOVE “ERRO ABERTURA ARQUIVO CADCLI”
TO WS-MSG-ERRO

MOVE “CONTATE O ANALISTA RESPONSAVEL”


TO WS-AVISO

A solução é declarar variáveis para as mensagens e inicializá-las com o texto.

----+-*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.
*----------------------------------------------------------------*

MOVE WS-MSG01 TO WS-MSG-ERRO


MOVE WS-MSG02 TO WS-AVISO

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


20 Parte 3
Exemplo de Constantes Numéricas:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
COMPUTE WS-AREA = 3.14159 * WS-RAIO ** 2

COMPUTE WS-LUCRO = ((WS-P-VENDA / WS-P-COMPRA) – 1) * 100

A única constante numérica importante nos cálculos acima é o valor de PI


3.14159, cuja precisão está na quantidade de casas decimais usadas e que pode
sofrer alterações se houver a necessidade de modificar a precisão dos cálculos. As
outras constantes numéricas não são importantes e nunca terão seus valores
alterados. A solução para o Hard-Code acima é:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
WORKING-STORAGE SECTION.
77 WS-PI PIC 9(1)V9(05)
VALUE 3.14159.
*----------------------------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------------------------*
* PRECISOU SUBSTITUIR 3.14159 POR WS-PI – HARD CODING RESOLVIDO
*----------------------------------------------------------------*
COMPUTE WS-AREA = WS-PI * 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

O Termo Hard Coding foi cunhado em 1990 por Rich


Galichon, na época um analista/programador na Mobil (Empresa
Petrolífera). O termo foi usado como uma referência aos circuitos
eletrônicos que uma vez feitos, não podem ser alterados. A idéia
era mostrar a inflexibilidade que resultava do uso de dados
inseridos diretamente no código fonte, ao invés de obtê-los na
entrada, via teclado ou leitura de arquivo.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 21

Teoria Medida de informacão


,

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.

Todo dado ocupa espaço na Memória do computador. Esse espaço é medido


em BYTEs, que significa BYNARY TERM (termo Binário). Um BYTE é formado por
oito BITs, que significa BINARY DIGIT (digito Binário). Um grupo de 4 bits é chamado
NIBBLE.

7 6 5 4 3 2 1 0

BIT NIBBLE

BYTE

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


22 Parte 3
Múltiplos do BYTE

A unidade de medida fundamental da informação é o bit, acrônimo de binary


digit (digito binário), cujo símbolo é b. Um agrupamento de 8 bits formam um Byte,
acrônimo de Binary Term (Termo Binário), símbolo B.

Tradicionalmente, utilizam-se os prefixos do Sistema Internacional (SI) de


Medidas para se medir os múltiplos do Byte, com a utilização de potência de 2 no
lugar de potência de 10 (que seria o correto). Porém em 1998 o IEC (International
Electrotechnical Commission) criou nomes e símbolos próprios para a área que lida
com o processamento e transmissão de dados, mas ainda são poucos utilizados. As
tabelas abaixo exibem estes prefixos:

Nome SI Símbolo SI Valor (quantidade de bytes)


Kilobyte kB 1003 = 1.000 este k deve ser minúsculo
06
Megabyte MB 10 = 1. 000. 000
Gigabyte GB 1009 = 1. 000. 000. 000
Terabyte TB 1012 = 1. 000. 000. 000. 000
Petabyte PB 1015 = 1. 000. 000. 000. 000. 000
Exabyte EB 1018 = 1. 000. 000. 000. 000. 000. 000
Zettabyte ZB 1021 = 1. 000. 000. 000. 000. 000. 000. 000
Yottabyte YB 1024 = 1. 000. 000. 000. 000. 000. 000. 000. 000
Nome IEC Símbolo IEC Valor (quantidade de bytes) em uso
Kibibyte KiB 210 = 1.024 Kilobyte
Mebibyte MiB 220 = 1.048.576 Megabyte
Gibibyte GiB 230 = 1.073.741.824 Gigabyte
Tebibyte TiB 240 = 1.099.511.627.776 Terabyte
50
Pebibyte PiB 2 = 1.125.899.906.842.624 Petabyte
60
Exbibyte EiB 2 = 1.152.921.504.606.846.976 Exabyte
70
Zebibyte ZiB 2 = 1.180.591.620.717.411.303.424 Zettabyte
Yobibyte YiB 280 = 1.208.925.819.614.629.174.706.176 Yottabyte

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 23

Os fabricantes de HD (Hard Disk – Disco Rígido), memória e mídias ópticas


(CD-ROM, DVD-ROM, Bluray) utilizam o SI (potência de 10), enquanto que os
fabricantes de sistemas operacionais (Microsoft, IBM, Apple, Sun) utilizam o IEC
(potência de 2).

3
“NOOOOOOSSA!!!”

Regra para conversão de unidades em seus múltiplos e divisores.

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


24 Parte 3

Teoria Sistemas de numeracão


,

Decimal

Utiliza 10 símbolos: 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9.

É um sistema posicional, onde a posição a esquerda vale 10 vezes o valor da


posição da direita.

103 102 101 100

Exemplo:
7 4 1 8
100 . 8 = 1 . 8 = 8

101 . 1 = 10 . 1 = 10

102 . 4 = 100 . 4 = 400


+

103 . 7 = 1000 . 7 = 7000

Binário 7418

Utiliza 2 símbolos: 0 e 1.

É um sistema posicional, onde a posição à esquerda vale 2 vezes o valor da


posição à direita.

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.

Os símbolos alfabéticos valem 10 (A), 11 (B), 12 (C), 13 (D), 14 (E) e 15 (F).

3
É um sistema posicional onde a posição à esquerda vale 16 vezes o valor da
posição à direita.

163 162 161 160

Exemplo:

B 1 F E
160 . E = 1 . 14 = 14

161 . F = 16 . 15 = 240

162 . 1 = 256 . 1 = 256 +

163 . B = 4096 . 11 = 45056


45566

Cada digito hexadecimal representa 4 bits em binário, portanto para converter


de hexadecimal para binário basta isolar os dígitos em hexadecimal e convertê-los
para binário. Abaixo temos uma tabela e algumas mãos que o ajudará nessa
conversão.
Hexadecimal Binário
0 0000
1 0001
2 0010
4 4 3 0011
8
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
A 1010
B 1011
C 1100
D 1101
E 1110
F 1111

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


26 Parte 3

Representacão
, de
Teoria números no cobol

Variável Zonada (PIC com USAGE DISPLAY)

É o formato padrão (default) das variáveis numéricas.

----+-*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.

As variáveis zonadas não são boas para a realização de cálculos, pois o


computador precisa primeiro converter os valores armazenados nessas variáveis para
binário, depois realizar o cálculo (que sempre é em binário) e por fim, o resultado é
convertido novamente para zonado.

O uso dessas variáveis é para exibição (USAGE DISPLAY). Neste formato


cada dígito decimal ocupa um Byte.

Exemplo 1: O número 7418 em Zonado PIC 9(4) fica:

F 7 F 4 F 1 F 8

O comando DISPLAY exibe, buscando os caracteres correspondentes ao


número hexadecimal na tabela EBCDIC o valor: 7418
O comando WRITE grava no arquivo, buscando os caracteres correspondentes
ao número hexadecimal na tabela EBCDIC o valor: 7418

Exemplo 2: O número +7418 em Zonado PIC S9(4) fica:

F 7 F 4 F 1 C 8

O comando DISPLAY exibe, buscando os caracteres correspondentes ao


número hexadecimal na tabela EBCDIC o valor: 741H
O comando WRITE grava no arquivo, buscando os caracteres correspondentes
ao número hexadecimal na tabela EBCDIC o valor: 741H

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 27

Exemplo 3: O número -7418 em zonado PIC S9(4) fica:

F 7 F 4 F 1 D 8

O comando DISPLAY exibe, buscando os caracteres correspondentes ao


número hexadecimal na tabela EBCDIC o valor: 741Q
O comando WRITE grava no arquivo, buscando os caracteres correspondentes
3
ao número hexadecimal na tabela EBCDIC o valor: 741Q

Observe que:

F(16) = 1111(2) NEUTRO


C(16) = 1100(2) POSITIVO
D(16) = 1101(2) NEGATIVO

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:

Número Positivo Negativo Exemplo para PIC S9v99


0 { } número armazenado
1 A J +3,15 31E
2 B K -3,15 31N
3 C L +2,7 27{
4 D M -2,7 27}
5 E N +0,01 00A
6 F O -0,01 00J
7 G P +1 10{
8 H Q -1 10}
9 I R +3,33 33C

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


28 Parte 3
Variável Binária (PIC com USAGE COMPUTATIONAL)

É o formato das variáveis binárias. Pode-se abreviar para COMP. O número é


primeiro convertido para binário antes de ser armazenado nesse tipo de variável.

----+-*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.

O tamanho da variável deve seguir a tabela abaixo:

DE ATÉ BYTES VALORES


S9(01) COMP S9(04) COMP 2 -32768 a + 32767
S9(05) COMP S9(09) COMP 4 -2.147.483.648 a + 2.147.483.647
S9(10) COMP S9(18) COMP 8 Valores com ate 18 algarismos

Exemplo 1: para armazenar o número 245 binário, PIC 9(4) COMP, fazemos:

a) Converter 245 para binário

245(10) = 1111 0101(2)

b) PIC 9(4) COMP ocupa 2 bytes

c) Colocar 1111 0101(2) na variável, da direita para a esquerda, preenchendo com


zeros os bits à esquerda.

0000 0000 1111 0101

d) Converter cada nibble para hexadecimal.

00 F5(16)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 29

e) O comando DISPLAY converte o formato do número binário para zonado e só


então o exibe, buscando os caracteres correspondentes ao número
hexadecimal na tabela EBCDIC.
O comando WRITE não converte o formato do número, gravando no arquivo os
caracteres correspondentes ao número hexadecimal na tabela EBCDIC.

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:

a) Converter 245 para binário:

245(10) = 1111 0101(2)

b) PIC S9(4) COMP ocupa 2 bytes, deixando o bit mais significativo (o da


esquerda) reservado para o sinal (0 é positivo e 1 é negativo).

bit do sinal

c) Colocar 1111 0101(2) na variável, da direita para a esquerda, preenchendo com


zeros os bits à esquerda.

0 000 0000 1111 0101

bit do sinal

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


30 Parte 3

d) Converter cada nibble para hexadecimal.

00 F5(16)

e) O comando DISPLAY O comando DISPLAY converte o formato do número


binário para zonado e só então o exibe, buscando os caracteres
correspondentes ao número hexadecimal na tabela EBCDIC.
O comando WRITE não converte o formato do número, gravando no arquivo os
caracteres correspondentes ao número hexadecimal na tabela EBCDIC.

00F5

DISPLAY WRITE

F0F2F4C5 00F5

024E b 5

Exemplo 3: para armazenar o número -245 em binário, PIC S9(4) COMP, fazemos:

a) Converter o módulo de -245 para binário.

|-245(10)| = 245(10) = 1111 0101(2)

b) PIC S9(4) COMP ocupa 2 bytes, deixando o bit mais significativo (o da


esquerda) reservado para o sinal (0 é positivo e 1 é negativo).

bit do sinal

c) Colocar 1111 0101(2) na variável preenchendo com zeros à esquerda.

1 000 0000 1111 0101

bit do sinal

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 31

d) Inverter os dígitos, todo 1 vira 0 e todo 0 vira 1 (não mexer no sinal).

1 111 1111 0000 1010

3
bit do sinal

e) Somar 1 ao número invertido (não mexer no sinal)

1 111 1111 0000 1011

bit do sinal

f) Converter cada nibble para hexadecimal

FF 0B(16)

g) O comando DISPLAY O comando DISPLAY converte o formato do número


binário para zonado e só então o exibe, buscando os caracteres
correspondentes ao número hexadecimal na tabela EBCDIC.
O comando WRITE não converte o formato do número, gravando no arquivo os
caracteres correspondentes ao número hexadecimal na tabela EBCDIC.

FF0B

DISPLAY WRITE

F0F2F4D5 FF0B

024N b b E o COMP-4 ?

É verdade, existe ainda o COMP-4,


que, quanto ao formato é exatamente o
mesmo que o COMP. A única diferença
é que a variável é criada em um nível
hierárquico de memória mais alto
(próxima à CPU), o que torna seu
acesso mais rápido.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


32 Parte 3
Variável Decimal-Compactada (PIC com USAGE COMPUTATIONAL-3)

É 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.

O nibble de sinal vale 1100(2) = C(16) se positivo, 1101(2) = D(16) se negativo ou


1111(2) = F(16) se sem sinal.

Para determinar o tamanho da variável, deve-se proceder da seguinte forma,


dependendo se o comprimento da variável é par ou impar. Exemplo:

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 33

Exemplo 1: para armazenar o número 2012 em decimal-compactado, PIC 9(4)


COMP-3, fazer os seguintes passos:
a) PIC 9(4) possui comprimento par, então ocupará 4+1 = 5 nibbles, ou 3 bytes.

b) O nibble menos significativo (o da direita) armazena F (neutro), e os dígitos


3
ocupam os demais nibbles. Os nibbles à esquerda são preenchidos com zero.

0 2 0 1 2 F

c) Converter cada nibble para hexadecimal

02 01 2F(16)

d) O comando DISPLAY O comando DISPLAY converte o formato do número


binário para zonado e só então o exibe, buscando os caracteres
correspondentes ao número hexadecimal na tabela EBCDIC.
O comando WRITE não converte o formato do número, gravando no arquivo os
caracteres correspondentes ao número hexadecimal na tabela EBCDIC.

02012F

DISPLAY WRITE

F2F0F1F2 02012F

2012 b b b

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


34 Parte 3
Exemplo 2: para armazenar o número +2012 em decimal compactado PIC
S9(4) COMP-3, fazemos:

a) PIC 9(4) possui comprimento par, então ocupará 4+1 = 5 nibbles, ou 3 bytes.

b) O nibble menos significativo (o da direita) armazena C (positivo), e os dígitos


ocupam os demais nibbles. Os nibbles à esquerda são preenchidos com zero.

0 2 0 1 2 C

c) O comando DISPLAY O comando DISPLAY converte o formato do número


binário para zonado e só então o exibe, buscando os caracteres
correspondentes ao número hexadecimal na tabela EBCDIC.
O comando WRITE não converte o formato do número, gravando no arquivo os
caracteres correspondentes ao número hexadecimal na tabela EBCDIC.

02012C

DISPLAY WRITE

F2F0F1C2 02012C

201B b b b

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 35

Exemplo 3: para armazenar o número -2012 em decimal compactado PIC


S9(4) COMP-3, fazer os seguintes passos:

a) PIC 9(4) possui comprimento par, então ocupará 4+1 = 5 nibbles, ou 3 bytes.

b) O nibble menos significativo (o da direita) armazena D (negativo), e os dígitos


3
ocupam os demais nibbles. Os nibbles à esquerda são preenchidos com zero.

0 2 0 1 2 D

c) O comando DISPLAY O comando DISPLAY converte o formato do número


binário para zonado e só então o exibe, buscando os caracteres
correspondentes ao número hexadecimal na tabela EBCDIC.
O comando WRITE não converte o formato do número, gravando no arquivo os
caracteres correspondentes ao número hexadecimal na tabela EBCDIC.

02012D

DISPLAY WRITE

F2F0F1D2 02012D

201K b b b

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


36 Parte 3

Teoria MÁSCARA DE EDICÃO


,

A cláusula PICTURE ou abreviadamente PIC tem alguns formatos próprios


para fazer edição de variáveis numéricas no momento de uma impressão.

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.

Para evitar os zeros à esquerda, bem como colocar pontos separadores de


milhares, sinais positivo ou negativo, etc, a PIC pode ter outros símbolos no lugar do 9
para melhorar a apresentação, é o que chamamos de MÁSCARA de EDIÇÃO.

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 37

VALOR MÁSCARA VALOR EXIBIDO


9 Exibe o valor numérico com zeros à esquerda
0012 9(4) 0012
Z Suprime todos os zeros à esquerda de um número nas posições em que exista esse caractere.
2345 ZZ99 2345
0321 ZZ99 X321
0032 ZZ99 XX32

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


38 Parte 3

Teoria Comandos complementares

ACCEPT do Sistema Operacional

O comando ACCEPT pode além de receber dados do dispositivo de entrada


padrão SYSIN, receber informações do sistema operacional contidas em um
registrador especial (DATE, DAY, DAY-OF-WEEK, ou TIME). Exemplos:

----+-*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

DATE – A variável receptora deve ser PIC 9(06). O formato da data é


YYMMDD (data gregoriana), 20/12/2005 será expresso como 051220. No exemplo
acima, a variável WS-DATA-SISTEMA deve ter o seguinte LAYOUT.

----+-*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).

DAY-OF-WEEK – A variável receptora deve ser PIC 9(1), onde:

1 = segunda-feira
2 = terça-feira
3 = quarta–feira
4 = quinta-feira
5 = sexta-feira
6 = sábado
7 = domingo

No exemplo acima, a variável WS-DIA-SEMANA deve ter o seguinte LAYOUT.

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
77 WS-DIA-SEMANA PIC 9.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 39

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

MOVE CORRESPONDING e MOVE por partes

Quando a variável emissora e receptora são item de grupo e possuem


variáveis elementares com o mesmo nome, usa-se a opção CORRESPONDING,
abreviadamente CORR para mover as variáveis elementares com o mesmo nome.
Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
WORKING-STORAGE SECTION.
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).
*----------------------------------------------------------------*
PRODEDURE DIVISION.
*----------------------------------------------------------------*
MOVE CORRESPONDING WS-DATA-SISTEMA TO WS-DATA-FORMATADA

WS-DATA-SISTEMA

WS-ANO WS-MES WS-DIA

WS-DIA / WS-MES /20 WS-ANO

WS-DATA-FORMATADA

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


40 Parte 3
Porém se for necessário fazer referência a uma das variáveis que possuem o
mesmo nome, é necessário indicar a variável de grupo a qual ela pertence. Exemplo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
DISPLAY WS-MES OF WS-DATA-SISTEMA

É possível mover pedaços da variável emissora para uma determinada posição


na variável receptora. No trecho de programa COBOL abaixo, temos um exemplo
deste MOVE.

----+-*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
*----------------------*

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 41

Practice

3
Atividade Revisão aos pares

Responda as questões abaixo, depois peça para


que seu colega as corrija.

1) Converta as medidas abaixo para Bytes

a) 28 MiB

b) 67 GiB

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


42 Parte 3
2) Converta os Bytes abaixo para GB e GiB

a) 71.940.702.208 B

b) 7.146.825.580.544 B

3) Converta os tamanhos dos HD abaixo para GiB.

a) 80 GB

b) 1 TB

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 43

4) Associe os números armazenados nos formatos informados pelas PICTURES a


esquerda com a representação hexadecimal a direita

a) PIC 9(4) VALUE 123 ( ) 432C


b) PIC S9(3) VALUE -56 ( ) 00432D
c) PIC S9(2) VALUE +84 ( ) F0F5D6

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

Utilize o espaço abaixo como rascunho.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


44 Parte 3
5) O que será exibido na SYSOUT quando o número -140,57 for movido para variáveis
com as seguintes máscaras:

a) PIC 9(3) _____________________________________

b) PIC 9(5)V99 _____________________________________

c) PIC S9(2) _____________________________________

d) PIC S9(4)V99 _____________________________________

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 _____________________________________

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 45

6) Monte o parágrafo FILE-CONTROL que atenda o Macro-Fluxo abaixo.

a)
SYSIN

3
PGM0001

PRDSEQM

FILE-CONTROL.

b)
PRDSEQV

PGM0002

PRDSEQM

FILE-CONTROL.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


46 Parte 3
c)
OLDCLI MOVCLI

PGM0003

RELOCOR
NEWCLI

FILE-CONTROL.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 47

Atividade Prática de laboratório

Vamos colocar para funcionar o programa escrito


no PROJETO 1. Execute os passos abaixo:
3

1) Copie o membro GPXXNN01 da COBLIB de seu instrutor para a sua


COBLIB.

2) Copie o membro EXECOB01 da JOBLIB de seu instrutor para a sua


JOBLIB.

3) Renomeie o membro GPXXNN01 substituindo XXNN pela sua identificação.

4) Complete o programa COBOL com base em sua especificação do


PROJETO 1.

5) Compile com o job COMPCOB e elimine os erros até obter MAXCC = 0

6) Execute o programa com o job EXECOB01. Compare o resultado com os


dos colegas.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


48 Parte 3

Atividade Prática de laboratório

Vamos acrescentar uma rotina no programa


GPXXNN01, para exibir data nos diversos formatos.

Nome da rotina (parágrafo): 9000-IMPRIME-DATA

Onde será chamada (PERFORM): no final da rotina 3000-TERMINO, antes da


mensagem de término normal do programa.

Layout da SYSOUT (utilize a régua vermelha como guia):

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!?

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 49

3
Todos Juntos PROJETO 2

Objetivo da Manutenção no Programa

A equipe do Banco do Polvo S.A. solicitou algumas alterações no projeto de


simulação de empréstimo:

a) Informar tempo total de processamento


b) Exibir os dados da Simulação do Empréstimo formatados

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


50 Parte 3

Observação

Manutenção em programas é uma atividade comum em um ambiente de


desenvolvimento mainframe. Execute os passos abaixo (Lembre-se de que XXNN
é o seu prefixo de usuário):

1) Copie o programa GPXXNN01 para GPXXNN02 em sua COBLIB. As


alterações serão feitas nessa cópia.

2) Copie o membro EXECOB01 para EXECOB02 em sua JOBLIB. Altere o


nome do programa no parâmetro PGM= para GPXXNN02.

3) Digite as manutenções solicitadas

4) Compile com o job COMPCOB e elimine os erros até obter MAXCC = 0

5) Execute o programa com o job EXECOB02. Compare o resultado com os


dos colegas.

Orientação para processamento

Para calcular o tempo de processamento, proceder da seguinte maneira:

1) Declarar as seguintes variáveis na WORKING-STORAGE SECTION:


----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
WORKING-STORAGE SECTION.

*==> VARIAVEL PARA RECEBER O HORARIO DE INICIO DO PROCESSAMENTO


01 WS-HORARIO-INICIAL.
05 WS-HORA-I PIC 9(02).
05 WS-MIN-I PIC 9(02).
05 WS-SEG-I PIC 9(02).
05 WS-CENT-I PIC 9(02).

*==> VARIAVEL PARA RECEBER O HORARIO DE TERMINO DO PROCESSAMENTO


01 WS-HORARIO-FINAL.
05 WS-HORA-F PIC 9(02).
05 WS-MIN-F PIC 9(02).
05 WS-SEG-F PIC 9(02).
05 WS-CENT-F PIC 9(02).

*==> VARIAVEL PARA ARMAZENAR A DIFERENCA ENTRE HORARIO DE INICIO


* E TERMINO DO PROCESSAMENTO EM CENTESIMOS DE SEGUNDOS
77 WS-DIFERENCA PIC 9(07).

*==> VARIAVEL PARA RECEBER O TEMPO DO PROCESSAMENTO SEM FORMATACAO


01 WS-TEMPO-PROCESSAMENTO.
05 WS-HORA-P PIC 9(02).
05 WS-MIN-P PIC 9(02).
05 WS-SEG-P PIC 9(02).
05 WS-CENT-P PIC 9(02).

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 3 51
*==> VARIAVEL PARA RECEBER O TEMPO DO PROCESSAMENTO COM FORMATACAO
01 WS-TEMPO-PROCESSAMENTO-F.
05 WS-HORA-PF PIC 99.
05 FILLER PIC X(01)
VALUE “:”.
05 WS-MIN-PF PIC 99.
05 FILLER PIC X(01)
VALUE “:”.
05 WS-SEG-PF PIC 99.

3
05 FILLER PIC X(01)
VALUE “:”.
05 WS-CENT-PF PIC 99.

2) No parágrafo 1000-INICIALIZAR receber a hora de início do processamento.


----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
1000-INICIALIZAR.
ACCEPT WS-HORARIO-INICIAL FROM TIME

3) No parágrafo 3000-TERMINO receber a hora do término do processamento.


----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
3000-TERMINO.
ACCEPT WS-HORARIO-FINAL FROM TIME

Na sequência, calcular e armazenar na variável WS-DIFERENCA a diferença


entre esses dois horários em centésimos de segundo, conforme fórmula abaixo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
COMPUTE WS-DIFERENCA = ( WS-HORA-F * 360000 +
WS-MIN-F * 6000 +
WS-SEG-F * 100 +
WS-CENT-F) -
( WS-HORA-I * 360000 +
WS-MIN-I * 6000 +
WS-SEG-I * 100 +
WS-CENT-I)

Calcular e armazenar o tempo de processamento conforme variável e cálculos


abaixo:

----+-*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

mover os tempos calculados para as variáveis formatadas.

----+-*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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


52 Parte 3

Avaliação Então...Como foi ?!?

Estou fera!

Fiz Certo!

 Muito Bom  Bom  regular  ruim  Muito ruim

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte

O pequeno cartucho retangular usado no sub-sistema de


fita magnética IBM 3480 é aproximadamente 1/4 do tamanho de
um rolo de fita magnética padrão de 10,5 polegadas, mesmo
assim ele armazena 20% mais dados - um total de 200 milhões
de caracteres. A taxa ao qual os dados podem ser armazenados
ou recuperados nos cartuchos de fita de dióxido de cromo de 1/2
polegada, foi o resultado do uso de 18 trilhas de gravação,
alcançando uma densidade de aproximadamente 30.000 bytes por
polegada - seis vezes a densidade das unidades de fita IBM
usadas anteriormente.
Fonte: IBM
Versão 2.3.5
Parte 4 3

Preparation

Trocando Ideias É agora que você fala !! 4


Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na
capa desta parte. Isso é importante para que seu instrutor e seus colegas
saibam como está seu conhecimento sobre o assunto e se você precisa ou
pode fornecer ajuda aos colegas e instrutor.

 O que você já sabe ?


 O que você não sabe ?
 Porque é importante conhecer estes tópicos ?
 Quais são os seus temores ?
 O que você considera difícil ?

Reflexão É aqui que você se compromete !!

Depois de falar sobre o assunto com seus colegas e instrutor, escreva,


desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses
tópicos. Comprometa-se!

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


4 Parte 4

Presentation

História Arquivos sem fim...

Os dados das empresas ficam armazenados em arquivos. A quantidade é tão


grande que eles não cabem todos em unidades de disco, chamadas DASD (Direct
Access Storage Device), e devem ficar armazenadas em data cartridge (Cartucho de
Dados), como mostra a figura abaixo:

Os cartuchos ficam armazenados em uma


máquina que, com o uso de um braço robótico,
carrega os cartuchos na unidade de
leitora/gravação, de acordo com a solicitação do
JOB em JCL. Como mostra a figura ao lado.

É fundamental dominar
a manipulação de arquivos em
COBOL, já que todos os dados
estão armazenados nesses
objetos.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 4 5

Tipos de arquivos:
Teoria Sequencial e indexado

Arquivos são entidades lógicas que armazenam dados. Os arquivos são


gravados em meios magnéticos, tais como discos ou cartuchos ou em meios ópticos,
tais como CDs, DVDs ou Blu-ray. Os dados gravados nesses meios não apagam

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.

Os dados são organizados nos arquivos em diversas estruturas. Em todas elas


os dados são organizados em campos. Um agrupamento de campos de dados sobre
um mesmo objeto é chamado de registro. Um conjunto de registros formam um
arquivo.

Os arquivos podem ter a seguinte estrutura:

PHYSICAL SEQUENTIAL (PS) – Os registros estão organizados em sequência,


um atrás do outro. É a única forma de organizar registros em cartuchos e fitas
magnéticas. O acesso à esses registros só pode ser feita sequencialmente. Entre os
registros existe um espaço chamado INTERRECORD GAP (IRG) ou INTERBLOCK
GAP.

Arquivo sequencial blocado.


REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO

REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO

REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO

BOF IRG IRG EOF

Arquivo sequencial não blocado


REGISTRO

REGISTRO
REGISTRO

REGISTRO

REGISTRO

REGISTRO
REGISTRO

BOF IRG IRG IRG IRG IRG IRG EOF

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


6 Parte 4
DIRECT ACCESS - INDEXED – O arquivo é gravado em discos magnéticos,
que permitem o acesso direto ao registro. Possui duas partes, INDEX e DATA. No
DATA ficam os registros de dados, e no INDEX fica um índice que, com base em um
campo chave (RECORD KEY), aponta para o registro no DATA.

Teoria Elementos de um arquivo

Um ARQUIVO armazena dados sobre um tipo de objeto em particular, por


exemplo ESTOQUE, que é o nome do arquivo.

Os dados são organizados em REGISTROS, que armazenam vários dados de


um produto em específico, por exemplo:

0004CANETA ESFER. PRETA 025200500000150

Os registros possuem CAMPOS, com um dado deste produto, por exemplo


0008, que é o código do produto.

ARQUIVO

CAMPO REGISTRO

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 4 7

Teoria Layout do arquivo

Um arquivo possui um layout, com nome do arquivo, nome de registro e um


descritivo de seus campos com nome, tipo de dado e tamanho. Quanto ao tipo de
dado a linguagem COBOL utiliza os seguintes símbolos para sua representação:

Alfanumérico – X Alfabético – A Numérico – 9


4
Colocamos entre parênteses um número que é a quantidade de caracteres ou
dígitos utilizados na formação do campo. No caso de campo numérico, a letra V
(virtual) é usada para representar uma vírgula implícita, que não é contada no
tamanho do campo.

Por exemplo, o arquivo estoque possui o seguinte layout:

Nome do Arquivo ESTOQUE


Nome do Registro REG-ESTOQUE
Nome do Campo Tipo e Tamanho Descrição
CODPROD PIC X(04) Código do produto
DESCPROD PIC X(25) Descrição do produto
QTDEST PIC 9(3) Quantidade em estoque
QTDMIN PIC 9(3) Quantidade mínima
QTDMAX PIC 9(3) Quantidade máxima
PRECOPROD PIC 9(4)V99 Preço do produto

Para padronizar, o nome do registro será REG-nomedoarquivo.

Observe que REG-ESTOQUE possui 44 caracteres de largura (Bytes). Para


encontrar essa quantidade, basta somar os números entre parênteses
4+25+3+3+3+4+2=44.

Outra forma de se escrever o layout é:

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


8 Parte 4

Tratamento de
Teoria arquivo sequencial

Grandes quantidades de dados estão armazenados em arquivos sequenciais.


Esses arquivos ficam armazenados em meios magnéticos, tais como discos, fitas ou
cartuchos. A figura abaixo mostra uma Fita Magnética, não mais usada atualmente e
um Cartucho, mais comum.

Para que um programa COBOL possa manipular os arquivos é necessário


cumprir três etapas:

 Especificação do Arquivo

 Detalhamento do Arquivo

 Manipulação do Arquivo

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 4 9

Teoria ç
Especifica ão do arquivo

Um arquivo precisa ser especificado na ENVIRONMENT DIVISION, SEÇÃO


INPUT-OUTPUT SECTION, parágrafo FILE-CONTROL. A cláusula SELECT faz essa
especificação, como mostra o exemplo abaixo:

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.

O formato geral do SELECT é:

SELECT nome-logico-arquivo ASSIGN TO nome-externo-ddname

O nome-lógico-arquivo pode ter no máximo 30 caracteres de tamanho e deve


seguir a regra para formação de nomes definidos pelo programador, ou seja, pode
começar por número, pode conter hífen (menos no início e no fim), não pode conter
espaço em branco e não pode ser uma palavra reservada do COBOL.

O nome-externo-ddname pode vir com os seguintes complementos:

numero-do-sistema–tipo-de-arquivo–numero-do-dispositivo–modo-de-acesso–nome-externo-ddname

numero-do-sistema: é definido pela empresa usuária do mainframe

tipo-de-arquivo: UR = Unit Record (terminal ou impressora)


UT = Utility (disco sequencial)
DA = Direct Access (disco)

numero-do-dispositivo: SYSALLDA = todos os discos do ambiente


SYSDA = discos do sistema
número definido para o disco, exemplo: 3390

modo-de-acesso: S = Sequencial
I = Indexado
R = Relativo
D = Dinâmico

nome-externo: nome do arquivo no JOB, chamado de DDNAME

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


10 Parte 4
Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
FILE-CONTROL.
SELECT ESTOQUE-PRODUTO ASSIGN TO SYS007-UT-3400-S-ESTOQUE
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS FS-ESTOQUE-PRODUTO.

O nome externo do arquivo aparece do lado esquerdo do cartão DD no JOB.


Exemplo:
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//GPXXNN11 JOB SEUNOME,CLASS=A,MSGCLASS=X,NOTIFY=GPXXNN,TIME=(0,20)
//********************************************************************
//STEP001 EXEC PGM=ATUPROD
//STEPLIB DD DSN=GP.GERAL.LOADLIB,DISP=SHR
//ESTOQUE DD DSN=GP.GPXXNN.ESTOQUE,DISP=SHR

Neste exemplo, ESTOQUE-PRODUTO é o nome lógico do arquivo, ESTOQUE


é o nome externo (DDNAME) e GP.GPXXNN.ESTOQUE é o nome do arquivo no
catalogo do sistema (DSN = DATA SET NAME).

ORGANIZATION IS SEQUENCIAL indica que os registros estão organizados


sequencialmente dentro do arquivo. Quando não informado, esse é o valor default
(padrão).

ACCESS MODE IS SEQUENCIAL indica que os registros serão acessados


sequencialmente, um a um, desde o início do arquivo. Quando não informado, esse é
o valor default (padrão).

FILE STATUS IS FS-ESTOQUE-PRODUTO, indica uma variável, com formato


PIC X(02), que conterá um código de FILE STATUS, indicando se a operação de I-O
(Input-Outupt), tais como OPEN, READ, WRITE e CLOSE foi realizada com sucesso.
Essa variável, uma vez indicada, é carregada automaticamente pelo sistema
operacional, toda vez que uma operação de I-O for realizada.

A boa prática de programação sugere que todos os comandos de I-O devem


ser seguidos de um teste na variável de FILE STATUS para verificar possíveis erros. A
variável de FILE STATUS pode receber, entre outros, os seguintes valores:

FILE STATUS SIGNIFICADO


'00' SUCCESSFUL COMPLETION
'10' END OF FILE
'35' OPEN, FILE NOT PRESENT
'39' OPEN, FILE ATTRIB CONFLICTING
'41' OPEN, FILE IS OPEN
'42' CLOSE, FILE IS CLOSED
'46' SEQUENTIAL READ WITHOUT POSITIONING
'47' READING FILE NOT OPEN AS
'48' WRITE WITHOUT OPEN IO
INPUT/IO/EXTEND
'9x' PERMISSION NOT OK

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 4 11

Teoria Detalhamento do arquivo

Na DATA DIVISION, há a seção FILE SECTION, usada para detalhar um


arquivo, seus registros e campos. Todo arquivo especificado no parágrafo FILE-

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.

FD significa FILE DESCRIPTION (descrição do arquivo) e deve ser seguida do


nome lógico do arquivo. Deve ser escrito na margem A.

LABEL RECORD STANDARD indica a utilização de etiquetas (label)


padronizadas. É uma cláusula opcional. O label de um arquivo consiste de um registro
especial, que contém campos como: nome do arquivo, data de criação, o tempo que
deve durar, local do arquivo no disco, informações sobre código de acesso ao arquivo
para evitar acessos não autorizados, etc. Labels de arquivos em fitas precedem e
sucedem o próprio arquivo na fita. Label de arquivos em discos são armazenados na
VTOC (Volume Table of Contents). A utilização de labels garantem que os programas
processem os registros corretos.

BLOCK CONTAINS 0 RECORDS indica a quantidade de registros lógicos que


existem em um registro físico (bloco). Isso é conhecido como blocagem do arquivo.
Abaixo temos um exemplo de arquivo blocado com 5 registros lógicos por bloco.
REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO

REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO

REGISTRO
REGISTRO
REGISTRO
REGISTRO
REGISTRO

BOF IRG IRG EOF

O FATOR DE BLOCO é a quantidade de registros lógicos dentro de um


registro físico, neste exemplo o FATOR DE BLOCO é 5. Quando não sabemos o fator
de bloco, colocamos 0 na cláusula BLOCK CONTAINS, assim, o próprio sistema
determina o fator de bloco. É uma cláusula opcional.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


12 Parte 4
O bloco de registros é carregado para uma memória (Buffer) que é uma fila
FIFO (First-in First-out) e os registros do Buffer são entregues, um a um, ao comando
READ. Quando o Buffer esvazia, um novo bloco de registro é lido e carregado no
Buffer. Isso aumenta a velocidade de leitura do arquivo.

RECORDING MODE IS F indica que todos os registros serão gravados com o


mesmo tamanho. O F indica FIXED (fixo). É uma cláusula obrigatória.

RECORD CONTAINS NN CHARACTERS indica o tamanho do registro em


caracteres. Para se chegar a esse tamanho, é preciso somar os campos que formam o
registro. Não se soma o V (vírgula implícita). É uma cláusula opcional.

DATA RECORD IS REG-ESTOQUE-PRODUTO indica o nome do registro. É


uma cláusula opcional.

01 REG-ESTOQUE-PRODUTO. especifica o registro. 01 é o número do nível


do registro.

05 CODPROD PIC X(04). especifica o campo. 05 é o número do nível do


campo, que pode ser de 02 a 49.

É necessário observar com atenção o uso correto do ponto final na FILE


SECTION, como está demonstrado nos exemplos acima.

Teoria Variável espelho

Na WORKING-STORAGE-SECTION declaramos a variável espelho, onde


detalhamos os campos do registro do arquivo.

O uso da variável espelho é uma boa prática de programação, pois após as


operações de I-O, os dados não se perdem.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXX01 WS REG-ESTOQUE-PRODUTO.
XXXXXXXXXXX05 WS-CODPROD PIC X(04).
XXXXXXXXXXX05 WS-DESCPROD PIC X(25).
XXXXXXXXXXX05 WS-QTDEST PIC 9(03).
XXXXXXXXXXX05 WS-QTDMIN PIC 9(03).
XXXXXXXXXXX05 WS-QTDMAX PIC 9(03).
XXXXXXXXXXX05 WS-PRECOPROD PIC 9(04)V99.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 4 13

Teoria ç
Manipula ão do arquivo

Na PROCEDURE DIVISION utilizamos as diversas instruções para manipular


os arquivos, tais como OPEN, CLOSE, READ e WRITE.

4
OPEN

O primeiro passo na manipulação de um arquivo é abri-lo. Isso é feito através


do comando OPEN. Esse comando abre contato com o dispositivo físico do arquivo.
Há 3 modos de abertura de arquivo, que são INPUT, OUTPUT e EXTEND.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

XXXXXXXXXXXOPEN INPUT CADCLI

XXXXXXXXXXXOPEN OUTPUT VCADPRD

XXXXXXXXXXXOPEN EXTEND CADALUN

 INPUT indica que o arquivo será lido pelo programa. Não é possível
gravar um arquivo aberto como INPUT.

 OUTPUT indica que o arquivo será gravado e é vazio no momento da


abertura. Não é possível ler um arquivo aberto como OUTPUT.

 EXTEND indica que o arquivo será gravado e não é vazio no momento


da abertura, ou seja, serão acrescentados registros após o último.

O nome do arquivo utilizado no comando OPEN é o nome lógico do arquivo,


que aparece logo após o SELECT da FILE-CONTROL.

OPEN INPUT CADCLI OPEN OUTPUT RELCLI

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


14 Parte 4
A recomendação, porém, é abrir um arquivo de cada vez e testar o FILE
STATUS para saber se houve sucesso ou não na operação. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXOPEN INPUT CADCLI

XxxxxxxxxxxIF FS-CADCLI NOT = “00”


XXXXXXXXXXXXXXMOVE “ERRO ABERTURA CADCLI” TO WS-MSG
XXXXXXXXXXXXXXMOVE FS-CADCLI TO WS-FS
XXXXXXXXXXXXXXGO TO 999-ERRO
XXXXXXXXXXXEND-IF

READ

Faz a leitura do arquivo, obtendo o próximo registro lógico e carregando o


layout do arquivo e, se especificado no INTO, carrega também a variável espelho. A
figura abaixo ilustra a movimentação dos dados do arquivo para os campos no layout
do arquivo e para a variável espelho, declarada na WORKING-STORAGE SECTION.
O READ não apaga os registros do arquivo que está lendo, em outras palavras, ele faz
uma cópia do registro.

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 4 15

Quando o READ atinge o EOF, o conteúdo dos campos e das variáveis


espelho permanecem com os dados do último registro lido com sucesso. Um READ
após EOF produz um FILE STATUS 46 (Sequential Read Without Positioning).

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

É possível utilizar o READ para testar se a leitura do arquivo atingiu a etiqueta


EOF (END OF FILE) através da cláusula AT END, também é possível especificar o
que fazer quando a leitura for um sucesso através da cláusula NOT AT END. Exemplo:

= “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 recomendação, porém, é testar o FILE STATUS para saber se houve


sucesso ou não na operação. Exemplo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXREADXCADCLI INTO WS-REG-CADCLI

XXXXXXXXXXXIF FS-CADCLI = “00”


XXXXXXXXXXXXXXADD 1 TO WS-CTLIDO
XXXXXXXXXXXELSE
XXXXXXXXXXXXXXIF FS-CADCLI NOT = “10”
XXXXXXXXXXXXXXXXXMOVE “ERRO LEITURA CADCLI”
TO WS-MSG
XXXXXXXXXXXXXXXXXMOVE FS-CADCLI TO WS-FS
XXXXXXXXXXXXXXXXXGO TO 999-ERRO
XXXXXXXXXXXEND-IF
XXXXXXXXXXXEND-IF

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


16 Parte 4
WRITE

Faz a inclusão de um registro lógico no arquivo. Os dados podem vir da


variável espelho especificado na cláusula FROM. O WRITE move os dados do layout
do arquivo para o arquivo físico, portando o WRITE é destrutivo, porém os dados
armazenados na variável espelho não são apagadas.

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.

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
0050ANA M

NEWCLI

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 4 17

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 recomendação é testar o FILE STATUS para saber se houve sucesso ou não


na operação. Exemplo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXWRITEXREG-NEWCLI FROM WS-REG-NEWCLI

XXXXXXXXXXXIF FS-NEWCLI NOT = “00”


XXXXXXXXXXXXXXXMOVE “ERRO GRAVAVAO NEWCLI” TO WS-MSG
XXXXXXXXXXXXXXXMOVE FS-CADCLI TO WS-FS
XXXXXXXXXXXXXXXGO TO 999-ERRO
XXXXXXXXXXXEND-IF

Observe a diferença:

O READ é seguido pelo nome lógico do arquivo para


READ nome-lógico-arquivo
ler um registro.

O WRITE é seguido pelo nome do registro a ser


WRITE nome-registro
gravado.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


18 Parte 4
CLOSE

Fecha o arquivo especificado. Todos os arquivos abertos devem ser fechados.


É possível fechar todos os arquivos com um único comando CLOSE, como mostra o
exemplo abaixo.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXCLOSE CADCLI MOVCLI NEWCLI

Porém a recomendação é testar o FILE STATUS para verificar o sucesso da


operação. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXCLOSE CADCLI

XXXXXXXXXXXIF FS-CADCLI NOT = “00”


XXXXXXXXXXXXXXXMOVE “ERRO FECHAMENTO CADCLI”
TO WS-MSG
XXXXXXXXXXXXXXXMOVE FS-CADCLI TO WS-FS
XXXXXXXXXXXXXXXGO TO 999-ERRO
XXXXXXXXXXXEND-IF

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 4 19

EXEMPLO USO DE ARQUIVO

4
Objetivo do Programa

Calcular o salário dos funcionários com base no salário hora e quantidade de


horas trabalhadas armazenadas no arquivo CADFUNC. Gravar o arquivo FOLHAPAG
com os dados do funcionário e o seu salário.

Exibir a quantidade de funcionários lidos e gravados, bem como a soma do


salário a ser pago.

Macro-Fluxo

CADFUNC

EEXXNN04

FOLHAPAG

Observação

O salário do funcionário é obtido pela multiplicação do salário hora pelas horas


trabalhadas. Esse resultado é armazenado em variável de trabalho. Um acumulador é
usado para acumular os salários dos funcionários, que será exibido na SYSOUT.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
77 WS-SALARIO PIC 9(06)V99.
77 WS-SOMASAL PIC 9(09)V99.

COMPUTE WS-SALARIO = WS-QTDHRSTRAB-C * WS-VALORHORA-C


COMPUTE WS-SOMASAL = WS-SOMASAL + WS-SALARIO

Utilize máscara de edição para exibir os contadores e o acumulador.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


20 Parte 4

Layout dos Arquivos

Nome do Arquivo CADFUNC


Nome do Registro REG-CADFUNC
Nome do Campo Tipo e Tamanho Descrição
CODFUNC-C X(05) Código do funcionário
NOMEFUNC-C X(30) Nome do funcionário
VALORHORA-C 9(02)V99 Valor por hora do funcionário
QTDHRSTRAB-C 9(04) Quantidade de horas trabalhadas

Nome do Arquivo FOLHAPAG


Nome do Registro REG-FOLHAPAG
Nome do Campo Tipo e Tamanho Descrição
CODFUNC-F X(05) Código do funcionário
NOMEFUNC-F X(30) Nome do funcionário
SALARIO-F 9(06)V99 Salário do funcionário

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

O arquivo de entrada CADFUNC está com o prefixo do seu instrutor, já o


arquivo FOLHAPAG está com o prefixo de seu usuário.

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)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 4 21

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


22 Parte 4
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
* VARIAVEIS DE FILE STATUS
*----------------------------------------------------------------*
77 FS-CADFUNC PIC X(02).
77 FS-FOLHAPAG PIC X(02).

*----------------------------------------------------------------*
* 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).

77 WS-CTLIDO PIC 9(04) COMP.

77 WS-CTGRAV PIC 9(04) COMP.

77 WS-SALARIO PIC 9(06)V99 COMP.

77 WS-SOMASAL PIC 9(09)V99 COMP.

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

OPEN INPUT CADFUNC

IF FS-CADFUNC NOT = "00"


MOVE WS-MSG01 TO WS-MSG
MOVE FS-CADFUNC TO WS-FS
GO TO 9000-ERRO
END-IF

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 4 23
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
OPEN OUTPUT FOLHAPAG

IF FS-FOLHAPAG NOT = "00"


MOVE WS-MSG02 TO WS-MSG
MOVE FS-FOLHAPAG TO WS-FS
GO TO 9000-ERRO
END-IF

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

COMPUTE WS-SALARIO = WS-QTDHRSTRAB-C * WS-VALORHORA-C


COMPUTE WS-SOMASAL = WS-SOMASAL + WS-SALARIO

MOVE WS-SALARIO TO WS-SALARIO-F

WRITE REG-FOLHAPAG FROM WS-REG-FOLHAPAG

IF FS-FOLHAPAG NOT = "00"


MOVE WS-MSG04 TO WS-MSG
MOVE FS-FOLHAPAG TO WS-FS
GO TO 9000-ERRO
END-IF

COMPUTE WS-CTGRAV = WS-CTGRAV + 1

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

IF FS-CADFUNC NOT = "00"


MOVE WS-MSG05 TO WS-MSG
MOVE FS-CADFUNC TO WS-FS
GO TO 9000-ERRO
END-IF

CLOSE FOLHAPAG

IF FS-FOLHAPAG NOT = "00"


MOVE WS-MSG06 TO WS-MSG
MOVE FS-FOLHAPAG TO WS-FS
GO TO 9000-ERRO
END-IF

DISPLAY "TERMINO NORMAL EEXXNN04"


.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


24 Parte 4
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
9000-ERRO.
DISPLAY "=================================================="
DISPLAY "MENSAGEM....: " WS-MSG
DISPLAY "FILE STATUS.: " WS-FS
DISPLAY "=================================================="
DISPLAY "== TERMINO ANORMAL DO PROGRAMA EEXXNN04 =="
DISPLAY "=================================================="
MOVE 12 TO RETURN-CODE
STOP RUN
.

Maximum Disk Storage Capacity


2304 TB (ou TiB)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 4 25

Atividade Trabalho em dupla


4
1) Monte a FILE SECTION para os arquivos abaixo. Não
faça o detalhamento dos campos, coloque apenas o
tamanho do registro total.

a) Nome do Arquivo OLDPROD


Nome do Registro REG-OLDPROD
Nome do Campo Tipo e Tamanho Descrição
CODPROD-O X(04) Código
DESCPROD-O X(20) Descrição
UNIDPROD-O X(05) Unidade (caixa, litro, Kg, etc)
LOCALPROD-O X(05) Localização no estoque
QTDEST-O 9(05) Quantidade em estoque
QTDMAX-O 9(05) Quantidade máxima em estoque
QTDMIN-O 9(05) Quantidade mínima em estoque
PRECOCOMPRA-O 9(06)V99 COMP-3 Preço de Compra
PRECOVENDA-O 9(06)V99 COMP-3 Preço de Venda
PERCOMIS-O 9(02)V99 COMP-3 Percentual de comissão

FILE SECTION.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


26 Parte 4

b) Nome do Arquivo PRDTP1


Nome do Registro REG-PRDTP1
Nome do Campo Tipo e Tamanho Descrição
CODPROD-1 X(04) Código
DESCPROD-1 X(20) Descrição
QTDEST-1 9(05) COMP Quantidade em estoque
QTDMAX-1 9(05) COMP Quantidade máxima em estoque
QTDMIN-1 9(05) COMP Quantidade mínima em estoque

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 4 27

d) Nome do Arquivo CLISP


Nome do Registro REG-CLISP
Nome do Campo Tipo e Tamanho Descrição
CODCLI-SP X(04) Código
NOMECLI-SP X(25) Nome
ENDCLI-SP X(30) Endereço completo
FONECLI-SP X(10) Telefone com DDD
CPFCLI-SP X(11) CPF
RGCLI-SP X(09) RG
NASCCLI-SP X(08) Data Nasc. AAAAMMDD

4
SEXOCLI-SP X(01) Sexo – M / F

FILE SECTION.

2) Monte as variáveis espelho dos layouts de arquivos abaixo

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

WORKING-STORAGE SECTION.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


28 Parte 4

b) Nome do Arquivo PRDTP1


Nome do Registro REG-PRDTP1
Nome do Campo Tipo e Tamanho Descrição
CODPROD-1 X(04) Código
DESCPROD-1 X(20) Descrição
QTDEST-1 9(05) COMP Quantidade em estoque
QTDMAX-1 9(05) COMP Quantidade máxima em estoque
QTDMIN-1 9(05) COMP Quantidade mínima em estoque

WORKING-STORAGE SECTION.

3) Associe as situações à esquerda com o código de FILE STATUS à direita.

a) Arquivo não localizado na abertura ( ) “00”


b) Conflito com os atributos do arquivo ( ) “10”
c) Fechar um arquivo já fechado ( ) “35”
d) Tentou ler depois do fim do arquivo ( ) “39”
e) Gravar arquivo não aberto para gravação ( ) “41”
f) Sucesso na operação de I-O ( ) “42”
g) Abrir um arquivo já aberto ( ) “46”
h) A leitura atingiu o fim do arquivo ( ) “47”
i) Ler arquivo não aberto para leitura ( ) “48”

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 4 29

Performance

Todos Juntos PROJETO 3


4
Objetivo da Manutenção no Programa

A equipe do Banco do Polvo S.A. solicitou novas alterações no projeto de


simulação de empréstimo:

As simulações de empréstimos serão lidas do arquivo SIMUEMP e as


simulações aprovadas, de acordo com um critério, serão gravadas no arquivo
EMPAPROV.

No final do processamento, exibir a quantidade de simulações lidas, aprovadas


e reprovadas.

Macro-Fluxo

SIMUEMP

GPXXNN03

EMPAPROV

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


30 Parte 4
Observação

Todas as simulações que solicitam um valor de empréstimo maior ou igual a


R$ 100.000 e que possuem um número de parcelas maior ou igual a 50, devem ser
reprovadas.

Todas as operações de I-O (OPEN, READ, WRITE e CLOSE) devem ter o


respectivo FILE STATUS testado e no caso de erro, exibir mensagem apropriada.
Como boa prática de programação, coloque as mensagens associadas ao FILE
STATUS em variáveis.

Mais uma vez, a manutenção de programas é uma atividade comum em um


ambiente de desenvolvimento mainframe. Execute os passos abaixo (Lembre-se de
que XXNN é o seu prefixo de usuário):

1) Copie o programa GPXXNN02 para GPXXNN03 em sua COBLIB. As


alterações serão feitas nessa cópia.

2) Digite as manutenções solicitadas

3) Compile com o job COMPCOB e elimine os erros até obter MAXCC = 0

4) Copie o job EXECOB03 da JOBLIB de seu instrutor e altere XXNN pelo


prefixo de seu usuário.

5) Execute o programa com o job EXECOB03. Compare o resultado com os


dos colegas.

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 4 31

Layout dos Arquivos

Nome do Arquivo SIMUEMP


Nome do Registro REG-SIMUEMP
Nome do Campo Tipo e Tamanho Descrição
NUM-SIMULACAO-S 9(04) Número da simulação
VAL-EMPRESTIMO-S 9(06)V99 Valor do empréstimo

4
TX-JUROS-S 9(02)V99 Taxa de juros compostos ao mês
QTD-PARCELAS-S 9(02) Quantidade de parcelas

Nome do Arquivo EMPAPROV


Nome do Registro REG-EMPAPROV
Nome do Campo Tipo e Tamanho Descrição
NUM-SIMULACAO-E 9(04) Número da simulação
VAL-EMPRESTIMO-E 9(06)V99 Valor do empréstimo
TX-JUROS-E 9(02)V99 Taxa de juros compostos ao mês
QTD-PARCELAS-E 9(02) Quantidade de parcelas
VALOR-PARCELA-E 9(06)V99 Valor da parcela
TOTAL-EMP-E 9(07)V99 Valor total do empréstimo

Orientação para processamento

Parágrafo Principal (0000-GPXXNN03)


Executar o parágrafo 1000-INICIALIZAR
Executar o parágrafo 2000-PROCESSAR
até que o file status do arquivo SIMUEMP seja “10”
Executar o parágrafo 3000-TERMINO
Encerrar o programa

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


32 Parte 4
Parágrafo 1500-LER-SIMUEMP
Ler registro do arquivo SIMUEMP carregando variável espelho
Se file status for igual a “00” (sucesso)
Somar 1 ao contador de simulações lidas
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 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)

Executar o parágrafo 1500-LER-SIMUEMP

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 4 33

Parágrafo 9000-ERRO
Exibir mensagem de erro
Exibir FILE STATUS
Mover +16 para a variável do RETURN-CODE
Encerrar o programa

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


34 Parte 4

Avaliação Então...Como foi ?!?

Estou fera!

Fiz Certo!

 Muito Bom  Bom  regular  ruim  Muito ruim

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte

É frequentemente útil combinar dois ou


mais arquivos em um único arquivo maior. Se os
arquivos não estão ordenados, isso é fácil de
conseguir porque nós podemos simplesmente
anexar os registros de um arquivo no final do
outro. Mas se os arquivos estão ordenados, a
tarefa é um pouco mais complicada,
especialmente se há mais de dois arquivos,
porque nós precisamos preservar a ordenação no
arquivo combinado. O algoritmo de MERGE
permite juntar dois ou mais arquivos,
preservando a ordenação.
Versão 2.3.5
Parte 5 3

Preparation

Trocando Ideias É agora que você fala !!

Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na


capa desta parte. Isso é importante para que seu instrutor e seus colegas
saibam como está seu conhecimento sobre o assunto e se você precisa ou
5
pode fornecer ajuda aos colegas e instrutor.

 O que você já sabe ?


 O que você não sabe ?
 Porque é importante conhecer estes tópicos ?
 Quais são os seus temores ?
 O que você considera difícil ?

Reflexão É aqui que você se compromete !!

Depois de falar sobre o assunto com seus colegas e instrutor, escreva,


desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses
tópicos. Comprometa-se!

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


4 Parte 5

Presentation

História COBOL a fundo

Neste ponto de seu treinamento, a XPTO Consultoria em Desenvolvimento de


Software espera que seus estagiários desenvolvam mais seus conhecimentos da
linguagem COBOL, conhecendo novas formas de escrever desvios condicionais, como
ganhar tempo, utilizando lay-outs de arquivos já montados, como manipular strings e
finalmente, o algoritmo de merge.

Procure desenvolver seus programas pensando sempre na próxima pessoa


que vai dar manutenção. Não basta o programa estar funcionando, é preciso também
que ele seja de fácil manutenção, ou seja, ter boa manutenibilidade.

Em engenharia de software, manutenibilidade é um aspecto da qualidade de


software que se refere à facilidade de um software de ser modificado a fim de corrigir
defeitos, adequar-se a novos requisitos, aumentar a suportabilidade ou se adequar a
um ambiente novo. Tais atividades são conhecidas como a manutenção de software,
assim como definido pela ISO/IEC 9126.

Vamos então conhecer COBOL mais a fundo...

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 5 5

Teoria Comandos complementares

EVALUATE

Compara o conteúdo de uma variável ou mais variáveis contra diversos valores


indicados, efetuando as instruções correspondentes. É o chamado desvio condicional
múltiplo. Exemplo:

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


6 Parte 5
CONTINUE ou NEXT SENTENCE
É possível escrever um IF onde só há instruções para executar se a condição
for FALSA. Neste caso é preciso colocar abaixo do IF um dos seguintes comandos:
CONTINUE ou NEXT SENTENCE.
CONTINUE desvia o fluxo do processamento para a próxima instrução.
Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXIF A > B
XXXXXXXXXXXXXXCONTINUE
XXXXXXXXXXXELSE
XXXXXXXXXXXXXXDISPLAY A
XXXXXXXXXXXEND-IF

XXXXXXXXXXXIF A > B
XXXXXXXXXXXXXXCONTINUE
XXXXXXXXXXXXXXDISPLAY B
XXXXXXXXXXXELSE
XXXXXXXXXXXXXXDISPLAY A
XXXXXXXXXXXEND-IF

XXXXXXXXXXXEVALUATE A
XXXXXXXXXXXXXXWHEN 1
XXXXXXXXXXXXXXWHEN 2
XXXXXXXXXXXXXXXXXXXCONTINUE
XXXXXXXXXXXXXXWHEN 3
XXXXXXXXXXXXXXXXXXXDISPLAY A
XXXXXXXXXXXEND-EVALUATE

XXXXXXXXXXXDISPLAY “FIM DO EXEMPLO”

NEXT SENTENCE desvia o fluxo do processamento para a primeira instrução


após o próximo ponto. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXIF A > B
XXXXXXXXXXX NEXT SENTENCE
XXXXXXXXXXXELSE
XXXXXXXXXXX DISPLAY A “ EH MENOR OU IGUAL A “ B
XXXXXXXXXXXEND-IF.

XXXXXXXXXXXDISPLAY “COMPARACAO EFETUADA”

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
.

Assim, o fluxo de processamento continua após o próximo ponto. No primeiro


exemplo é OBRIGATÓRIO colocar um ponto logo após o END-IF, pois desejávamos
que o DISPLAY fosse executado. No segundo exemplo, sem o ponto no END-IF, o
fluxo de processamento pula para o próximo parágrafo, após o ponto que encerra o
parágrafo atual. O CONTINUE e o NEXT SENTENCE podem ser usados em qualquer
lugar na PROCEDURE DIVISION.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 5 7

COPY

O comando COPY insere nos programas COBOL o conteúdo de membros de


arquivos particionados (PDS – partitioned data set). Esses membros são chamados de
BOOKS.
As BOOKS podem conter descrições de registros de arquivos ou rotinas
padronizadas que podem ser repetidas em muitos programas. Abaixo temos um
exemplo de cada.
----+-*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 *

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
.

No local conveniente do programa fonte COBOL, colocamos, na margem B, o


COPY seguido do nome da BOOK, acompanhado de um ponto final. Exemplo:

----+-*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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


8 Parte 5
Durante o processo de pré-compilação, todos os COPYs serão executados e o
conteúdo das books serão inseridas no programa fonte COBOL, para então serem
passados ao compilador.

COPY com REPLACING


O uso das variáveis espelho faz com que seja necessário copiar o layout do
arquivo na WORKING-STORAGE SECTION. É possível utilizar uma única BOOK e
utilizar a opção REPLACING BY do comando COPY para substituir strings dentro da
BOOK, por outra qualquer que desejamos. Essa string deverá ser delimitada pelo sinal
de dois pontos. Exemplo:

----+-*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.

A string de origem e a de destino deverão estar delimitadas por dois sinais de


igual (==). Os exemplos abaixo mostram algumas trocas de strings que podem ser
feitas.

1º exemplo – troca da string :XX-: por WS-


----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
COPY CADPROD REPLACING ==:XX-:== BY ==WS-==.

2º exemplo – eliminar a string :XX-:


----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
COPY CADPROD REPLACING ==:XX-:== BY ====.

3º exemplo – troca da string :XX-: por WS-VS-


----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
COPY CADPROD REPLACING ==:XX-:== BY ==WS-VS-==.

O coringa pode ser vazio, isto é :: (dois-pontos e dois-pontos). Na verdade é a


situação mais comum e recomendamos como boa prática de programação. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
01 ::REG-CADPROD.
05 ::CODPROD PIC X(04).
05 ::DESCPROD PIC X(20).

Nas empresas, os layouts dos arquivos são digitados em BOOKS para


simplificar a digitação dos programas e para evitar que erros na digitação do layout do
arquivo possam causar erros nos programas. O comando COPY pode ser utilizado em
qualquer divisão do programa fonte COBOL.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 5 9

A seguir algumas imagens do resultado do comando COPY após a execução


do pré-compilador.

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


10 Parte 5
É possível usar vários coringas diferentes e trocá-los conforme nossa
necessidade. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
* BOOK DE ARQUIVO - CADASTRO DE CLIENTES *
* NOME DO BOOK - CADCLI *
* NOME DO PDS - GP.GPXXNN.BOOKLIB *
* NOME DO ARQUIVO - CADCLI *
* TAMANHO DO REGISTRO - 64 BYTES *
*----------------------------------------------------------------*
01 ::CADPROD.
05 :P:CODCLI:S: PIC X(04).
05 :P:NOMECLI:S: PIC X(20).
05 :P:ENDCLI:S: PIC X(30).
05 :P:FONECLI:S: PIC X(10).

Abaixo o comando COPY para fazer a troca dos coringas.

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
COPY CADCLI REPLACING ==::== BY ==WS-REG-==
==:P:== BY ==WS-==
==:S:== BY ==-CADCLI==.

O resultado dessas trocas é:

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 5 11

UNSTRING e STRING

A instrução UNSTRING separa o conteúdo de uma string em strings menores,


usando o espaço em branco ou outra string qualquer, indicada entre aspas ou
apóstrofes. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
WORKING-STORAGE SECTION.
77 WS-NOME-COMPLETO PIC X(25).
77 WS-PRIMEIRO-NOME PIC X(25).
77 WS-NOME-DO-MEIO PIC X(25).
77 WS-ULTIMO-NOME PIC X(25).
PROCEDURE DIVISION.
000-LBSTR01.
MOVE 'GRACE MURRAY HOPPER' TO WS-NOME-COMPLETO

UNSTRING WS-NOME-COMPLETO
DELIMITED BY SPACE

5
INTO WS-PRIMEIRO-NOME
WS-NOME-DO-MEIO
WS-ULTIMO-NOME

DISPLAY 'PRIMEIRO NOME ' WS-PRIMEIRO-NOME


DISPLAY 'NOME DO MEIO ' WS-NOME-DO-MEIO
DISPLAY 'ULTIMO NOME ' WS-ULTIMO-NOME

STOP RUN
.

A instrução STRING concatena (junta) o conteúdo de variáveis e constantes


em um único campo receptor, delimitando pelo tamanho da variável ou string de
origem ou por espaço em branco. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
WORKING-STORAGE SECTION.
77 WS-NOME-COMPLETO PIC X(25).
77 WS-PRIMEIRO-NOME PIC X(25).
77 WS-NOME-DO-MEIO PIC X(25).
77 WS-ULTIMO-NOME PIC X(25).
PROCEDURE DIVISION.
000-LBSTR02.
MOVE 'GRACE' TO WS-PRIMEIRO-NOME
MOVE 'MURRAY' TO WS-NOME-DO-MEIO
MOVE 'HOPPER' TO WS-ULTIMO-NOME

STRING WS-PRIMEIRO-NOME DELIMITED BY SPACE


' ' DELIMITED BY SIZE
WS-NOME-DO-MEIO DELIMITED BY SPACE
' ' DELIMITED BY SIZE
WS-ULTIMO-NOME DELIMITED BY SPACE
INTO WS-NOME-COMPLETO

DISPLAY 'NOME COMPLETO...: ' WS-NOME-COMPLETO


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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


12 Parte 5
Caso o tamanho da variável receptora seja menor que o tamanho dos dados
concatenados, esses dados serão truncados. O alinhamento é sempre feito da
esquerda para a direita.

Outros PERFORMs

A instrução PERFORM executa um bloco de instruções que pode estar em um


parágrafo ou SECTION (OUT-LINE) ou dentro do próprio PERFORM (IN-LINE).

PERFORM OUT–LINE – Executa as instruções de um parágrafo ou SECTION,


retornando em seguida para a próxima instrução após o PERFORM. Há 5 formatos de
PERFORM OUT-LINE.

PERFORM básico – executa apenas 1 parágrafo ou SECTION.


Exemplos:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PERFORM 010-INICIALIZAR

PERFORM 070-TERMINO

PERFORM com opção THRU – executa todos os parágrafos ou


SECTIONs entre o primeiro e o último, inclusive.
Exemplos:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PERFORM 030-PROCESSAR THRU 060-CALCULO

PERFORM 110-LEVANTAMENTO THRU 220-ENCERRAMENTO

PERFORM com opção TIMES – executa o parágrafo ou SECTION uma


determinada quantidade de vezes. Também pode ser usado com a opção
THRU.
Exemplos:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PERFORM 088-IMPRIME-LINHA 5 TIMES

PERFORM 070-DETALHA-CALCULO WS-VEZES TIMES

PERFORM 110-CALCULO-1 THRU 220-CALCULO-3 12 TIMES

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 5 13

PERFORM com opção UNTIL – executa o parágrafo ou SECTION até


que uma determinada situação ocorra. Também pode ser usada a opção THRU.
Se nada for informado, é feito o teste da condição ANTES de executar o
parágrafo ou SECTION, mas é possível especificar se o teste deve ser feito
antes ou depois com a opção WITH TEST BEFORE ou WITH TEST AFTER,
respectivamente.

Exemplos:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PERFORM 030-PROCESSAR UNTIL FS-VCADPRD = ‘10’

PERFORM 055-IMPRIME-TABUADA WITH TEST BEFORE


UNTIL WS-CONTADOR > 10

5
PERFORM 080-CALCULA-JUROS WITH TEST AFTER
UNTIL WS-MES > 12

PERFORM 010-INICIO THRU 080-FIM UNTIL WS-CTMES > 12

PERFORM WITH PERFORM WITH


TEST BEFORE = TEST AFTER =
while (cond) do {} while (cond)

Corpo do Laço

Corpo do Laço

não não
Teste Teste

sim
sim

Próximo Comando Próximo Comando

É possível escrever esses PERFORMs em diversas linhas, usando o


endentamento, para melhor visualização.

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PERFORM 055-IMPRIME-TABUADA
WITH TEST BEFORE
UNTIL WS-CONTADOR > 10

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


14 Parte 5
PERFORM com opção VARYING – executa o parágrafo ou SECTION
variando o conteúdo de uma variável, de um valor inicial (FROM),
incrementando um valor (BY) até que uma situação ocorra (UNTIL). Exemplos:

----+-*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

O diagrama de blocos abaixo ilustra o seguinte PERFORM VARYING:

----+-*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

inicializa variável com o


valor inicial (FROM)
(WS-CONT = 1)

condição sim
(CONT > 100) fim

não
executa os comandos
(PERFORM 999-ROTINA)

Incrementar variável com


o valor do incremento (BY)
(CONT = CONT + 1)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 5 15

PERFORM IN–LINE – Executa as instruções que estão logo abaixo do


comando PERFORM. Deve ser delimitado pela frase END-PERFORM. Há 3 formatos
de PERFORM IN-LINE.

PERFORM com opção TIMES – executa as instruções uma


determinada quantidade de vezes. Exemplos:

----+-*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

PERFORM com opção UNTIL – executa as instruções até que uma


determinada situação ocorra. Se nada for informado, é feito o teste da condição
ANTES de executar as instruções, mas é possível especificar se o teste deve
ser feito antes ou depois com a opção WITH TEST BEFORE ou WITH TEST
AFTER, respectivamente. Exemplos:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
MOVE 0 TO WS-CONT

PERFORM UNTIL WS-CONT > 10


DISPLAY “VALOR DO CONTADOR = “ WS-CONT
COMPUTE WS-CONT = WS-CONT + 1
END-PERFORM

PERFORM com opção VARYING – executa as instruções variando o


conteúdo de uma variável, de um valor inicial (FROM), incrementando um valor
(BY) até que uma situação ocorra (UNTIL). Exemplos:

----+-*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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


16 Parte 5
É preciso tomar cuidado ao dividir a PROCEDURE DIVISION em seções, pois
quando se utiliza o PERFORM para chamar uma seção, todos os parágrafos da seção
são executados. Exemplo:

----+-*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'
.

Atividade CORRENDO CONTRA O TEMPO

O que será exibido na SYSOUT após a execução da


PROCEDURE DIVISION acima?

1 minuto

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 5 17

EXEMPLO MERGE

Objetivo do Programa

Unificar o Cadastro de Funcionários, que está dividido em dois arquivos

5
FUNCANT e FUNCNOVO, utilizando o algoritmo de merge, gerando o arquivo
FUNCCAD.

Macro-Fluxo

FUNCANT FUNCNOVO

EEXXNN05

FUNCCAD

Observação

Um pré-requisito para executar o algoritmo do merge é os arquivos estarem


ordenados por uma chave, neste caso o código do funcionário.

O algoritmo começa lendo o primeiro registro de cada arquivo de entrada.


Depois é feito uma comparação entre essas chaves, gravando sempre a que for
menor. Isso garante que o arquivo gerado também fique ordenado.

O primeiro arquivo que chegar no fim (EOF), receberá HIGH-VALUES na chave


(variável espelho), o que forçará a gravação dos registros remanescentes do outro
arquivo.

O algoritmo termina quando ambos os arquivos de entrada chegarem no final


(EOF).

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


18 Parte 5
Layout dos Arquivos

Nome do Arquivo FUNCANT


Nome do Registro REG-FUNCANT
Nome do Campo Tipo e Tamanho Descrição
CODFUNC-A X(05) Código do funcionário
NOMEFUNC-A X(30) Nome do funcionário
VALORHORA-A 9(02)V99 Valor por hora do funcionário
QTDHRSTRAB-A 9(04) Quantidade de horas trabalhadas

Nome do Arquivo FUNCNOVO


Nome do Registro REG-FUNCNOVO
Nome do Campo Tipo e Tamanho Descrição
CODFUNC-N X(05) Código do funcionário
NOMEFUNC-N X(30) Nome do funcionário
VALORHORA-N 9(02)V99 Valor por hora do funcionário
QTDHRSTRAB-N 9(04) Quantidade de horas trabalhadas

Nome do Arquivo FUNCCAD


Nome do Registro REG-FUNCCAD
Nome do Campo Tipo e Tamanho Descrição
CODFUNC-C X(05) Código do funcionário
NOMEFUNC-C X(30) Nome do funcionário
VALORHORA-C 9(02)V99 Valor por hora do funcionário
QTDHRSTRAB-C 9(04) Quantidade de horas trabalhadas

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

Os arquivos de entrada (FUNCANT e FUNCNOVO) estão com o prefixo do


instrutor, já o de saída (FUNCCAD) está com o prefixo do aluno.
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//GPXXNN05 JOB SEUNOME,MSGCLASS=X,CLASS=C,NOTIFY=GPXXNN,TIME=(0,20)
//*****************************************************************
//STEP1 EXEC PGM=EEXXNN05
//STEPLIB DD DSN=GP.GERAL.LOADLIB,DISP=SHR
//FUNCANT DD DSN=GP.GPXX99.FUNCANT,DISP=SHR
//FUNCNOVO DD DSN=GP.GPXX99.FUNCNOVO,DISP=SHR
//FUNCCAD DD DSN=GP.GPXXNN.FUNCCAD,DISP=(NEW,CATLG,DELETE),
// SPACE=(TRK,(1,1),RLSE),UNIT=SYSALLDA,
// DCB=(LRECL=43,RECFM=FB,DSORG=PS,BLKSIZE=0)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 5 19

BOOK dos Arquivos

----+-*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).

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


20 Parte 5

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-==.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 5 21
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
* VARIAVEIS DE FILE STATUS
*----------------------------------------------------------------*
77 FS-FUNCANT PIC X(02).
77 FS-FUNCNOVO PIC X(02).
77 FS-FUNCCAD PIC X(02).

*----------------------------------------------------------------*
* 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”.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


22 Parte 5
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------------------------*
0000-EEXXNN05.
PERFORM 1000-INICIALIZAR
PERFORM 2000-PROCESSAR UNTIL FS-FUNCNOVO = "10"
AND FS-FUNCANT = "10"
PERFORM 3000-TERMINO
STOP RUN
.

1000-INICIALIZAR.
MOVE 0 TO WS-CTLIDO-A
MOVE 0 TO WS-CTLIDO-N
MOVE 0 TO WS-CTGRAV

OPEN INPUT FUNCANT

IF FS-FUNCANT NOT = "00"


MOVE WS-MSG01 TO WS-MSG
MOVE FS-FUNCANT TO WS-FS
GO TO 9000-ERRO
END-IF

OPEN INPUT FUNCNOVO

IF FS-FUNCNOVO NOT = "00"


MOVE WS-MSG02 TO WS-MSG
MOVE FS-FUNCNOVO TO WS-FS
GO TO 9000-ERRO
END-IF

OPEN OUTPUT FUNCCAD

IF FS-FUNCCAD NOT = "00"


MOVE WS-MSG03 TO WS-MSG
MOVE FS-FUNCCAD TO WS-FS
GO TO 9000-ERRO
END-IF

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
.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 5 23
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
1600-LER-FUNCNOVO.
READ FUNCNOVO INTO WS-REG-FUNCNOVO

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

WRITE REG-FUNCCAD FROM WS-REG-FUNCCAD

IF FS-FUNCCAD NOT = "00"


MOVE WS-MSG06 TO WS-MSG
MOVE FS-FUNCCAD TO WS-FS
GO TO 9000-ERRO
END-IF

COMPUTE WS-CTGRAV = WS-CTGRAV + 1


PERFORM 1500-LER-FUNCANT
ELSE
MOVE WS-CODFUNC-N TO WS-CODFUNC-C
MOVE WS-NOMEFUNC-N TO WS-NOMEFUNC-C
MOVE WS-QTDHRSTRAB-N TO WS-QTDHRSTRAB-C
MOVE WS-VALORHORA-N TO WS-VALORHORA-C

WRITE REG-FUNCCAD FROM WS-REG-FUNCCAD

IF FS-FUNCCAD NOT = "00"


MOVE WS-MSG06 TO WS-MSG
MOVE FS-FUNCCAD TO WS-FS
GO TO 9000-ERRO
END-IF

COMPUTE WS-CTGRAV = WS-CTGRAV + 1


PERFORM 1600-LER-FUNCNOVO
END-IF
.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


24 Parte 5
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
3000-TERMINO.
MOVE WS-CTLIDO-A TO WS-CTLIDO-A-F
MOVE WS-CTLIDO-N TO WS-CTLIDO-N-F
MOVE WS-CTGRAV TO WS-CTGRAV-F
DISPLAY "=================================================="
DISPLAY "TOTAL DE REGISTROS LIDOS FUNCANT.: " WS-CTLIDO-A-F
DISPLAY "TOTAL DE REGISTROS LIDOS FUNCNOVO: " WS-CTLIDO-N-F
DISPLAY "TOTAL DE REGISTROS GRAVADOS......: " WS-CTGRAV-F
DISPLAY "=================================================="

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
.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 5 25

Practice

Atividade Revisão aos pares

1) Codifique um EVALUATE para testar o conteúdo da


5
variável WS-FUNCAO e mover o percentual total de
subsidio que a empresa pagará de plano de assistência
médica oferecido aos funcionários, para a variável WS-
TOTSUBSID, sabendo que:

 Gerente (WS-FUNCAO = 4) subsidio de 50%.


 Coordenador (WS-FUNCAO = 3) subsidio de 25%.
 Auxiliar Administrativo (WS-FUNCAO = 1) subsidio 0%.

PROCEDURE DIVISION.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


26 Parte 5
2) Codifique um EVALUATE para testar o conteúdo das variáveis WS-FUNCAO e
WS-ESTADOCIVIL, para mover o percentual total de subsidio que a empresa pagará
de plano de assistência médica oferecido aos funcionários, para a variável
WS-TOTSUBSID sabendo que:

 Gerente (WS-FUNCAO = 4) subsidio de 50%,


se casado (WS-ESTADOCIVIL = 2) subsidio adicional de 25%.
 Coordenador (WS-FUNCAO = 3), subsidio de 25%,
se casado (WS-ESTADOCIVIL = 2) subsidio adicional de 12,5%.
 Auxiliar Administrativo (WS-FUNCAO = 1), subsidio 0,
se casado (WS-ESTADOCIVIL = 2) subsidio adicional de 12,5%.

PROCEDURE DIVISION.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 5 27

3) Data a book abaixo


----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
* BOOK DE ARQUIVO - CADASTRO DE CLIENTES *
* NOME DO BOOK - CADCLI *
* NOME DO PDS - GP.GPXXNN.BOOKLIB *
* NOME DO ARQUIVO - CADCLI *
* TAMANHO DO REGISTRO - 84 BYTES *
*----------------------------------------------------------------*
01 ::REG-CADCLI.
05 ::CODCLI PIC X(04).
05 ::NOMECLI PIC X(30).
05 ::ENDCLI PIC X(40).
05 ::FONECLI PIC X(10).

a) Escreva o comando COPY para trocar o coringa vazio por WS-

WORKING-STORAGE SECTION. 5

b) Escreva o comando COPY para eliminar o coringa vazio:

FILE SECTION.

c) Escreva o comando COPY para trocar o coringa vazio por WRK-VAR-

WORKING-STORAGE SECTION.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


28 Parte 5
4) Data as variáveis abaixo
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
WORKING-STORAGE SECTION.
77 WS-TEXTO PIC X(30)
VALUE
'CANETA;LAPIS;BORRACHA'.
77 WS-PROD1 PIC X(10).
77 WS-PROD2 PIC X(10).
77 WS-PROD3 PIC X(10).

Escreva um comando UNSTRING para separar as strings delimitadas por (;)


ponto-e-vírgula na variável TEXTO para as variáveis PROD1, PROD2 e PROD3.

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 5 29

Atividade Trabalho em dupla

Monte o comando perform para as seguintes situações:

5
a) Executar do parágrafo 2300-INICIO-CALCULO até o parágrafo 2800-TERMINO-
CALCULO.

b) Executar o parágrado 8600-TRANSMITE-SAUDACAO 50 vezes

c) Executar do paráfrado 1100-ADMISSAO-FASE1 até o parágrafo 1800-ADMISSAO-


FASE8 até que a variável WS-STATUS seja 'AK'

d) Executar o parágrafo 2100-IMPRIME-TABUADA variando WS-CONT de 1 até 10,


de uma em uma unidade.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


30 Parte 5

Performance

Atividade PROJETO 4

Objetivo do Programa

A Chapéu de Couro Indústria Brasileira S.A. precisa de um programa para


unificar seu cadastro de clientes. Atualmente ele está dividido em 3 arquivos:

CLISP com os clientes de São Paulo,


CLIRJ com os clientes do Rio de Janeiro e
CLIMG com os clientes de Minas Gerais.

O cadastro unificado será gravado no arquivo CLIUNIF.

Macro-Fluxo

CLISP CLIRJ CLIMG

GPXXNN04

CLIUNIF

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 5 31

Layout dos Arquivos

Nome do Arquivo CLISP


Nome do Registro REG-CLISP
Nome da Variável Tipo e Tamanho Descrição do Dado
CPFCLI-SP X(11) Número do CPF
NOMECLI-SP X(25) Nome do Cliente
ENDCLI-SP X(30) Endereço do Cliente
FONECLI-SP X(10) Telefone do Cliente com DDD

5
TOTALCOMPRAS-SP 9(08)V99 Valor total de Compras
ULTIMACOMPRA-SP X(08) Data da última compra AAAAMMDD

Nome do Arquivo CLIRJ


Nome do Registro REG-CLIRJ
Nome da Variável Tipo e Tamanho Descrição do Dado
CPFCLI-RJ X(11) Número do CPF
NOMECLI-RJ X(25) Nome do Cliente
ENDCLI-RJ X(30) Endereço do Cliente
FONECLI-RJ X(10) Telefone do Cliente com DDD
TOTALCOMPRAS-RJ 9(08)V99 Valor total de Compras
ULTIMACOMPRA-RJ X(08) Data da última compra AAAAMMDD

Nome do Arquivo CLIMG


Nome do Registro REG-CLIMG
Nome da Variável Tipo e Tamanho Descrição do Dado
CPFCLI-MG X(11) Número do CPF
NOMECLI-MG X(25) Nome do Cliente
ENDCLI-MG X(30) Endereço do Cliente
FONECLI-MG X(10) Telefone do Cliente com DDD
TOTALCOMPRAS-MG 9(08)V99 Valor total de Compras
ULTIMACOMPRA-MG X(08) Data da última compra AAAAMMDD

Nome do Arquivo CLIUNIF


Nome do Registro REG-CLIUNIF
Nome da Variável Tipo e Tamanho Descrição do Dado
CPFCLI-UNIF X(11) Número do CPF
NOMECLI-UNIF X(25) Nome do Cliente
ENDCLI-UNIF X(30) Endereço do Cliente
FONECLI-UNIF X(10) Telefone do Cliente com DDD
TOTALCOMPRAS-UNIF 9(08)V99 Valor total de Compras
ULTIMACOMPRA-UNIF X(08) Data da última compra AAAAMMDD

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


32 Parte 5
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 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

Para utilizar o algoritmo do MERGE, todos os arquivos de entrada devem estar


ordenados por um campo chave, no caso o CPF do cliente.

Execute os passos abaixo (Lembre-se de que XXNN é o seu prefixo de


usuário):

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.

3) Compile com o job COMPCOB e elimine os erros até obter MAXCC = 0

4) Copie o job EXECOB04 da JOBLIB de seu instrutor e altere XXNN pelo


prefixo de seu usuário.

5) Execute o programa com o job EXECOB04. Compare o resultado com os


dos colegas.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 5 33

JOB de Execução

Os arquivos de entrada (CLISP, CLIRJ e CLIMG) estão com o prefixo do


instrutor, já o de saída (CLIUNIF) está com o prefixo do aluno.
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//GPXXNN04 JOB SEUNOME,MSGCLASS=X,CLASS=C,NOTIFY=GPXXNN,TIME=(0,20)
//*****************************************************************
//STEP1 EXEC PGM=GPXXNN04
//STEPLIB DD DSN=GP.GERAL.LOADLIB,DISP=SHR
//CLISP DD DSN=GP.GPXX99.CLISP,DISP=SHR
//CLIRJ DD DSN=GP.GPXX99.CLIRJ,DISP=SHR
//CLIMG DD DSN=GP.GPXX99.CLIMG,DISP=SHR

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)

Orientação para processamento

Parágrafo Principal (0000-GPXXNN04)


Executa o parágrafo 1000-INICIALIZAR
Executa o parágrafo 2000-PROCESSAR
até que o file status do arquivo CLISP seja “10” e
file status do arquivo CLIRJ seja “10” e
file status do arquivo CLIMG seja “10”
Executar o parágrafo 3000-TERMINO
Encerrar o programa

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)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


34 Parte 5
Abrir para leitura o arquivo CLIMG
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 CLIUNIF
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)
Ler o primeiro registro do arquivo CLISP (1100-LER-CLISP)
Ler o primeiro registro do arquivo CLIRJ (1200-LER-CLIRJ)
Ler o primeiro registro do arquivo CLIMG (1300-LER-CLIMG)

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)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 5 35

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)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


36 Parte 5
Parágrafo 3000-TERMINO
Executar rotina 9000-IMPRIME-DATA
Fechar 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)
Fechar 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)
Fechar o arquivo CLIMG
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 CLIUNIF
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:
Clientes lidos no arquivo CLISP
Clientes lidos no arquivo CLIRJ
Clientes lidos no arquivo CLIMG
Clientes gravados no arquivo CLIUNIF
Exibir o tempo total de processamento

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 5 37

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


38 Parte 5

Avaliação Então...Como foi ?!?

Estou fera!

Fiz Certo!

 Muito Bom  Bom  regular  ruim  Muito ruim

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte

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.

site publib.boulder.ibm.com da IBM.


Versão 2.3.5
Parte 6 3

Preparation

Trocando Ideias É agora que você fala !!

Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na


capa desta parte. Isso é importante para que seu instrutor e seus colegas

6
saibam como está seu conhecimento sobre o assunto e se você precisa ou
pode fornecer ajuda aos colegas e instrutor.

 O que você já sabe ?


 O que você não sabe ?
 Porque é importante conhecer estes tópicos ?
 Quais são os seus temores ?
 O que você considera difícil ?

Reflexão É aqui que você se compromete !!

Depois de falar sobre o assunto com seus colegas e instrutor, escreva,


desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses
tópicos. Comprometa-se!

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


4 Parte 6

Presentation

História O ambiente mainframe

Durante o treinamento de COBOL para mainframe, você deve aprender, além


do COBOL, o ambiente de desenvolvimento mainframe. Por isso você aprendeu TSO
e agora vai aprender JCL.

O conhecimento do ambiente de desenvolvimento é fundamental para que você


tenha desenvoltura para desenvolver e testar seus programas. O JCL é o que mais
diferencia um desenvolvedor mainframe de outro, por exemplo da baixa plataforma.

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.

Além disso, você aprenderá a usar os programas que já existem no ambiente,


desenvolvidos por outros colegas, como por exemplo um programa para verificar se o
CPF está correto, para classificar um produto, etc. Não é preciso reinventar a roda,
devemos aprender a chamar esses programas passando parâmetros e receber deles
o resultado do processamento.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 6 5

Teoria Chamada a outros programas

Um programa COBOL pode chamar outros programas para execução,


passando dados que podem ou não serem alterados

Esse é um procedimento muito comum. Por exemplo, um programa que verifica


a consistência do número do CPF é feito uma única vez e todos os programas que
precisam verificar se um número de CPF é correto podem chamá-lo, passando o
número e recebendo como resposta se ele é correto ou não.

O Comando CALL chama outro programa para execução. O programa que

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.

A figura abaixo mostra outro exemplo de chamada de programas. Um JOB


inicializa um programa, que pode chamar sequencialmente um ou mais programas,
estes por sua vez, podem chamar outros e etc.

JOB PGM001 VERCPF

CALL
GOBACK
CONFDATA VERSPC

Em geral, nos ambientes de desenvolvimento, existem grandes bibliotecas de


SUB-PROGRAMAS para uso pelos programadores, objetivando a modularização dos
sistemas, reuso de software, otimização do desenvolvimento, etc.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


6 Parte 6
CALL USING/ END-CALL

O Comando CALL chama um SUB-PROGRAMA, que pode ou não receber


dados do programa PRINCIPAL, por referência (quando o endereço do dado é
passado e o SUB-PROGRAMA pode alterar esse dado) ou por valor (quando o SUB-
PROGRAMA recebe uma cópia do dado e não pode alterar o dado original).

Chamada por Referência – No momento do CALL o endereço do item de


dado é passado ao SUB-PROGRAMA. Isso é transparente para o programador. O
valor do item de dado pode ser alterado pelo SUB-PROGRAMA e o programa
PRINCIPAL pode usar esse novo valor. A cláusula BY REFERENCE é default e não é
obrigatório informá-la.
CALL ‘VERCPF’ USING BY REFERENCE WS-DADOS-ENVIADOS

ou
CALL ‘VERCPF’ USING WS-DADOS-ENVIADOS

A figura abaixo ilustra a chamada a SUB-PROGRAMA passando dados por


referência.

Endereço do
item de dado

CALL .. BY Direção do Sub-programa


REFERENCE Fluxo de dados chamado

Chamada por valor – Neste caso o SUB-PROGRAMA recebe uma cópia do


item de dado e, mesmo que esse valor seja alterado, o programa PRINCIPAL tem
acesso apenas ao dado original. A cláusula BY CONTENT não é default e deve ser
informada sempre que desejarmos realizar uma chamada por valor.
CALL ‘VERCPF’ USING BY CONTENT WS-DADOS-ENVIADOS

A figura abaixo ilustra a chamada a SUB-PROGRAMA passando dados por


valor.

CALL .. BY Direção do Sub-programa


CONTENT Fluxo de dados chamado

Valor do Endereço
item de dado da cópia
Cópia do
item de dado

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 6 7

Os dados são carregados no SUB-PROGRAMA nas variáveis declaradas na


LINKAGE SECTION. A mesma quantidade de variáveis usadas no CALL USING deve
ser declarada na LINKAGE SECTION. Essas mesmas variáveis devem também ser
informadas na PROCEDURE DIVISION com a cláusula USING, como mostra a figura
abaixo. As variáveis podem também estar separadas por vírgula.
PROGRAMA PRINCIPAL

CALL “SUBPROG” USING VAR1 VAR2 VAR2

SUB-PROGRAMA

6
LINKAGE SECTION.
77 DADO1 PIC X(10).
77 DADO2 PIC X(10).
77 DADO3 PIC X(10).

PROCEDURE DIVISION USING DADO1 DADO2 DADO3.

CALL ESTÁTICO – O SUB-PROGRAMA é chamado como uma constante,


com seu nome informado entre aspas ou apóstrofe. O programa PRINCIPAL e o SUB-
PROGRAMA fazem parte de um mesmo módulo (LOAD MODULE), assim quando o
controle passa para o SUB-PROGRAMA ele já está na memória e as chamadas
subsequentes do SUB-PROGRAMA o encontram no último estado, exceto quando o
programa chamado possui o atributo IS INITIAL no parágrafo PROGRAM-ID.

Se você alterar e compilar o SUB-PROGRAMA, o programa principal também


precisará ser recompilado, pois ele tem uma cópia anterior do sub-programa. Isso
pode se tornar um problema, pois se um programa muito utilizado for sempre chamado
de forma estática por diversos programas e precisar sofrer alteração, todos os demais
programas precisam ser recompilados. Exemplo:

----+-*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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


8 Parte 6
CALL DINÂMICO – O nome do SUB-PROGRAMA é carregado em uma
variável, que é usada para emitir o CALL. O SUB-PROGRAMA é um módulo
independente e só é carregado na memória quando é chamado. As chamadas
sucessivas encontram o SUB-PROGRAMA no último estado, exceto quando o
programa chamado possui o atributo IS INITIAL no parágrafo PROGRAM-ID.
Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------------------------*
050-CHAMA-PROGRAMA-CPF.
MOVE “VERCPF” TO WS-PROGRAMA
MOVE “15524514585” TO WS-NUMERO-CPF
MOVE SPACES TO WS-RESULTADO

*
* O NOME DO SUB-PROGRAMA ESTA NA VARIAVEL WS-PROGRAMA
*
XXXX CALL WS-PROGRAMA USING WS-NUMERO-CPF
WS-RESULTADO

END-CALL

A cláusula END-CALL é opcional.

É possível detectar a falha do CALL com a opção ON EXCEPTION, como


mostra o exemplo abaixo:

----+-*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

GOBACK ou EXIT PROGRAM

Finaliza o SUB-PROGRAMA e devolve o controle ao PROGRAMA PRINCIPAL,


executando a próxima instrução após o comando CALL. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
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.
*----------------------------------------------------------------*
080-VERIFICA-CPF.
*----------------------------------------------------------------*
* SUPONDO QUE O CPF ESTAVA ERRADO MOVEREMOS NOK PARA LS-RESULTADO
*----------------------------------------------------------------*
MOVE “NOK” TO LS-RESULTADO
GOBACK
.

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 6 9

IS INITIAL / CANCEL

A primeira vez que um SUB-PROGRAMA é chamado ele está em seu estado


inicial, todos os arquivos estão fechados e todas as variáveis estão com os valores
indicados pela cláusula VALUE.

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.

Se um programa só precisa lembrar de seu estado anterior algumas vezes, ou


seja, se ele precisa voltar ao seu estado inicial somente quando for necessário à lógica
proposta para solucionar o problema, usamos o comando CANCEL no programa
principal, retirando o SUB-PROGRAMA da memória, forçando-o assim ao seu estado
inicial na próxima vez em que for chamado. Exemplo:

----+-*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
.

Quando o comando CANCEL é executado o espaço de memória ocupado pelo


SUB-PROGRAMA é liberado e se o SUB-PROGRAMA for chamado novamente ele
estará em seu estado inicial, ou seja com todos os arquivos fechados e todas as
variáveis estão com os valores indicados pela cláusula VALUE.

Na prática, todo CALL é seguido de seu respectivo CANCEL.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


10 Parte 6

Teoria Finalidade do jcl

Para que um programa seja executado no mainframe é necessário escrever um


JOB (serviço) utilizando a JCL – Job Control Language (Linguagem de Controle de
Serviços). O JOB é submetido à execução e encaminhado ao JES – Job Entry
Subsystem (Subsistema de Entrada de Serviços), que atribui um número ao JOB (Job
Id) e faz uma análise sintática do JCL. Se tudo estiver correto, o JES orienta o Sistema
Operacional na execução do serviço. Quando o serviço é encerrado, um código de
retorno é informado (MAXCC – Maximum Condition Code) e um conjunto de
informações é organizado em arquivos e disponibilizado no SPOOL (Simultaneous
Peripheral Operations Online), com o resultado do processamento, para posterior
consulta.

Abaixo temos os valores de MAXCC

16 terminating messages
12 severe messages
08 error messages
04 warning messages
00 informational messages / success

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 6 11

Teoria Elementos de jcl

Abaixo temos um exemplo de JOB para executar um programa que lê e grava


um arquivo:
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//GPAZNN03 JOB SEUNOME,MSGCLASS=X,CLASS=C,NOTIFY=GPAZNN,TIME=(0,20)
//*****************************************************************
//STEP1 EXEC PGM=GPAZNN03
//STEPLIB DD DSN=GP.GERAL.LOADLIB,DISP=SHR
//ESTOQUE DD DSN=GP.GPAZ99.ESTOQUE,DISP=SHR
//REPOSIC DD DSN=GP.GPAZNN.REPOSIC,DISP=(NEW,CATLG,DELETE),
// SPACE=(TRK,(1,1),RLSE),UNIT=SYSALLDA,

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:

JOB especifica os parâmetros de execução do serviço


EXEC especifica o programa que será executado
DD especifica os arquivos que serão lidos ou gravados e seus parâmetros.

No exemplo acima, o JOB executa o programa GPAZNN03 que lê o arquivo


ESTOQUE e grava o arquivo REPOSIC.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


12 Parte 6

Teoria Estrutura básica de um job

Um JOB tem a seguinte disposição dos cartões JOB, EXEC e DD:

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

Em um JOB temos somente um cartão JOB, de 1 a 255 cartões EXEC e de 1 a


1635 cartões DD para cada cartão EXEC.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 6 13

Teoria Posicionamento de um job

Podemos dividir uma linha da JCL em quatro partes:

Colunas Conteúdo Observação .


01 e 02 // obrigatório, menos na entrada de dados
03 a 10 nome do cartão pode ser um JOBNAME, STEPNAME ou DDNAME
12 a 15 operador tipo do cartão, pode ser JOB, EXEC ou DD
16 a 72 operando parâmetros do cartão, separados por vírgula e sem
espaço.
Um espaço em branco após um operando começa um
comentário.

Regras para a codificação de um JOB:

a) É necessário um espaço em branco entre o nome do cartão, o operador e o


operando.
b) Toda linha JCL começa com // nas colunas 1 e 2, exceto quando vai se
6
inserir dados via SYSIN ou INPUT STREAM.
c) Um comentário começa com //* nas colunas de 1 a 3.
d) Um JOB sempre começa por um cartão JOB. Isso significa que a primeira
linha não pode ser comentário.
e) Um JOB é composto de pelo menos um programa. Este programa pode ser
um utilitário do Sistema Operacional (SORT, IDCAMS, etc), um programa
desenvolvido pelo programador ou um procedimento catalogado (PROC).
f) Cada cartão EXEC é chamado STEP e sempre executa um utilitário,
programa, ou PROC.
g) Cada cartão EXEC possui cartões DD que indicam os arquivos necessários
para o funcionamento do programa, utilitário ou PROC.
h) Não confundir JCL ERROR com ABEND. Um JCL ERROR é um erro de
sintaxe ou indisponibilidade de recursos e o programa, utilitário ou PROC
não é executado. Um ABEND é uma falha no programa que, em alguns
casos, pode até mesmo ser causado por indisponibilidade de recursos do
sistema, tais como disco (DASD) ou memória.

Não invente nomes para o JOBNAME, STEPNAME ou DDNAME. Use o


padrão da empresa em que estiver trabalhando.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


14 Parte 6

Teoria O cartão job

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)

GPAZ9901 é o JOBNAME, nome do JOB. Os seis primeiros caracteres deve


ser seu UserID ou um nome padronizado, estabelecido pela área
de produção do CPD. O JOBNAME pode ter de 1 a 8 caracteres
de tamanho e deve começar por um caractere alfabético na
coluna 3.
JOB Nome do cartão. Obrigatório. Deve ter um espaço em branco
antes e outro depois. Deve começar na coluna 12.
‘ACCOUNT’ Informações de contabilização. Este parâmetro é utilizado para
indicar de quem será cobrado o serviço, em outras palavras, o
tempo gasto pelo mainframe. Deve ser codificado entre
apóstrofes. Cada empresa utiliza um padrão.
CLASS Define a classe que será submetida na fila de JOBS. O sinal de
igual (=) não pode ter espaço em branco antes ou depois. Pode-
se usar letras de A até Z e dígitos de 0 a 9.
MSGCLASS Define a classe de SYSOUT (saída) onde serão gerados todos
os arquivos de log durante o tempo que o JOB permanecer no
sistema. Pode-se usar letras de A até Z e dígitos de 0 a 9.

NOTIFY Emite uma notificação com o MAXCC (Maximum Condition


Code) do JOB executado para o usuário indicado. Pode-se usar
&SYSUID, para utilizar o usuário logado no TSO.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 6 15

TIME Tempo de CPU para executar o JOB. Não é o tempo corrido,


mas sim o tempo que a CPU se dedica ao JOB, visto que ele
compartilha seu tempo com todos os JOBs em execução no
Sistema Operacional. Não inclui tempo de espera nas operações
de I-O (OPEN, CLOSE, READ, WRITE, etc). O primeiro valor é
minutos (de 0 a 1440) e o segundo é segundos (de 1 a 59).
Codificando TIME=1440 ou TIME=NOLIMIT, dará ao JOB ou
STEP uma quantidade de tempo ilimitada. Para permitir que o
JOB ou STEP use a quantidade máxima de tempo, codifique
TIME=MAXIMUM, que permite ao JOB ou STEP executar por
357912 minutos (aproximadamente 248 dias).

Outros parâmetros do JOB não obrigatórios, mas que podem aparecer nas
empresas que usam mainframe são:

PRTY Define a prioridade do JOB na fila de execução. PRTY=n.


Quanto menor o número, maior a prioridade. n varia entre 0 e 15.

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.

MSGLEVEL Especifica o nível de mensagens do sistema que se deseja


imprimir. Sua Sintaxe é: MSGLEVEL=(A,B), onde A pode ser 0, 1
ou 2 e B pode ser 0 ou 1. O valor default é MSGLEVEL=(1,1). O
parâmetro A corresponde a informações do JCL e o B
corresponde a informações de alocações. Os possíveis valores
são:

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

TYPRUN Tipo de Execução. Pode ser:

TYPRUN=HOLD, retém o JOB na fila de entrada, aguardando


um comando do operador

TYPRUN=SCAN, verifica o JCL para detectar erros de sintaxe e


inibe a execução do JOB.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


16 Parte 6

Teoria O cartão exec

Formato 1
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//PASSO03xxEXEC PGM=GPAZ9901,COND=(0,NE,PASSO02)

Formato 2
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//PASSO03xxEXEC PGM=GPAZ9901,
// COND=(0,NE,PASSO02)

PASSO03 É o STEPNAME. Deve iniciar na coluna 3 e ter no máximo 8


caracteres. Tradicionalmente se utiliza o nome STEPnn, mas
pode ser qualquer nome, desde que comece por um caractere
alfabético.

EXEC Nome do cartão. Obrigatório. Deve ter um espaço em branco


antes e outro depois. Deve começar na coluna 12.

PGM Nome do programa ou utilitário a ser executado no step. No


exemplo acima, GPAZ9901 é um programa que deverá estar na
biblioteca padrão do sistema, no nosso caso a
GP.GERAL.LOADLIB. Antes de dar OPEN no programa, o
sistema irá verificar se o programa realmente existe. Em seguida
irá verificar os recursos solicitados pelos cartões DD para só
então dar OPEN no programa e carregá-lo para a memória.

PROC Usado no lugar de PGM, identifica a execução de uma


procedure catalogada no arquivo particionado GP.LB.PROCLIB.

COND Condiciona a execução do step atual em função do que ocorreu


nos steps anteriores; não faz sentido usá-lo no primeiro step do
JOB. Seu formato é:
PASSO2

COND=((CODIGO,OPERADOR,STEPNAME),EVEN/ONLY)
COND=
(0,NE,PASSO2)
sim onde:

não CODIGO qualquer valor numérico entre 0 e 4095


PASSO03

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 6 17

OPERADOR GT = GREATER THAN


GE = GREATER OR EQUAL THAN
LT = LESS THAN
LE = LESS OR EQUAL THAN
EQ = EQUAL
NE = NOT EQUAL
EVEN executa o passo MESMO QUE alguns dos passos
anteriores tenham terminado de forma anormal
(ABEND) ou emitido um return code diferente de
0.
ONLY executa o passo SOMENTE SE um dos passos
anteriores tenham terminado de forma anormal
(ABEND) ou emitido um return code diferente de
0.
Todos os programas ao terminarem, emitem um código de retorno (return
code) para o sistema operacional. Se for 0 (zero) significa que terminou com sucesso.
A lógica da codificação do COND é para “pular” o passo (STEP), ou seja, para que o
STEP não seja executado.

No exemplo COND=(4,GT,COMPILA), se o step COMPILA terminou com


return code maior que 4, o STEP atual não será executado. Para que o STEP seja
executado o resultado do COND tem de ser FALSO.
6
Alguns exemplos de COND=

(0,NE) Pular o step atual somente se os steps anteriores terminaram


com return code igual a 0.

(4,LT) Pular o step atual somente se todos os steps anteriores


terminaram com return code menores que 4

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

REGION Aloca memória para os steps individualmente. Se esse


parâmetro for codificado no cartão JOB, será ignorado no cartão
EXEC. Exemplos: REGION=1024K, REGION=2M. Se REGION é
codificada com 0K ou 0M, todo espaço disponível é alocado ao
step.

TIME Define um limite de tempo de CPU para os steps individualmente.


Equivale ao parâmetro TIME do cartão JOB. O parâmetro TIME
no cartão JOB não anula o TIME do cartão EXEC. É um
acréscimo a ele.

PARM Também conhecido como PARM GO, permite passar dados


diretamente para a LINKAGE SECTION do COBOL. É usado em
programas parametrizados, onde um parâmetro orienta o
processamento. PARM=value. Value é uma string que pode ter
de 1 a 100 caracteres de tamanho, delimitado por apóstrofes.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


18 Parte 6
Exemplo:
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//STEP10 EXEC PGM=GPAZ9912,PARM=’20081026’

No COBOL, a LINKAGE SECTION deve conter as seguintes variáveis:


----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
......*----------------------------------------------------------------*
.......LINKAGE.................. SECTION.
......*----------------------------------------------------------------*
.......01 CAMPO-PARAMETRO.
05 CAMPO-TAMANHO PIC S9(4) COMP.
05 CAMPO-DADO PIC X(08).
......*----------------------------------------------------------------*
.......PROCEDURE DIVISION USING CAMPO-PARAMETRO.
......*----------------------------------------------------------------*

A primeira variável contém o comprimento do parâmetro, devendo sempre ser


PIC S9(04) COMP e a segunda o dado do parâmetro em si.

Teoria Joblib e steplib

Para se executar um programa, o sistema precisa carregar os programas


executáveis (Load Modules) de algum lugar. Em nosso caso, os módulos executáveis
ficam na GP.GERAL.LOADLIB, que é um arquivo particionado e o módulo objeto é um
de seus membros.

Logo abaixo do cartão JOB codificamos uma JOBLIB, indicando a biblioteca


(Library ou Load) de onde devem ser carregados os programas executáveis. Ele é
válido para todos os steps. Exemplo:
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//GPAZ9901 JOB ’ACCOUNT’,MSGCLASS=X,CLASS=C,NOTIFY=GPAZ99,TIME=(0,20)
//JOBLIB DD DSN=GP.GERAL.LOADLIB,DISP=SHR

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 6 19

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=*

PRDSEQF DDNAME. É o nome do arquivo colocado na frente do ASSIGN


TO no programa COBOL. Deve ter de 1 a 8 caracteres de
tamanho e começar com um caractere alfabético.

DD Nome do cartão. Obrigatório. Deve ter um espaço em branco


antes e outro depois. Deve começar na coluna 12. DD significa
DATA DEFINITION.

DSN DATA SET NAME, denomina o nome do arquivo catalogado.


Deve ter de 1 a 44 caracteres de tamanho, separados por um
ponto a cada 8 caracteres no máximo. Os arquivos podem ser
temporários ou não temporários. Todos os arquivos não
temporários devem ter nomes de acordo com os padrões da
instalação. Todos os arquivos temporários devem ter nomes de
1 a 8 caracteres de tamanho e precedidos de &&, se omitido, o
sistema atribui um nome aleatório, tornando-o temporário, ou
seja, criado e removido no mesmo JOB

DISP Informa a situação (status) do arquivo no sistema operacional.


Exemplos:

DISP=(NEW,CATLG,DELETE)

DISP=(OLD,KEEP,KEEP)

DISP=(NEW,PASS,DELETE)

DISP=SHR

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


20 Parte 6
O primeiro sub-parâmetro é o status do arquivo:

SHR arquivo já existe e pode ser lido por outro programa.

OLD arquivo já existe e é de uso exclusivo do programa.

NEW arquivo é novo e será criado neste step.

MOD Se arquivo não existe, ele será criado. Se já existe, é de uso


exclusivo e será acrescido de mais registros.

O segundo sub-parâmetro indica a ação a ser tomada em caso de término


normal do step:

CATLG Catalogar o arquivo. Obviamente que esta opção deve estar


sempre acompanhada de NEW no primeiro sub-parâmetro.
Porque se o arquivo estiver sendo lido (OLD) é porque já está
catalogado.

UNCATLG Tira o arquivo do catalogo, mas não o apaga. Evite usar.

DELETE Apaga o arquivo.

KEEP Mantém o arquivo do que jeito que estava antes.

PASS indica que o arquivo é temporário e será passado aos steps


subsequentes.

O terceiro sub-parâmetro indica a ação a ser tomada em caso de término


anormal do step. Quando não informado, assume o valor do segundo sub-parâmetro:

CATLG Catalogar o arquivo. Obviamente que esta opção deve estar


sempre acompanhada de NEW no primeiro sub-parâmetro.
Porque se o arquivo estiver sendo lido (OLD) é porque já está
catalogado.

UNCATLG Tira o arquivo do catalogo, mas não o apaga. Evite usar.

DELETE Apaga o arquivo.

KEEP Mantém o arquivo do jeito que estava antes.

Se o arquivo é de entrada (OLD ou SHR) não precisa especificar demais


parâmetros, pois naturalmente já está catalogado e o sistema saberá encontrá-lo. Se
for de saída você deverá usar os demais parâmetros do exemplo PRDSEQF.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 6 21

Exemplos válidos:

DISP=(NEW,PASS,DELETE): o arquivo é criado neste step e passado aos


demais somente se o programa der return code 0. Se o programa ABENDar,
o arquivo será excluído.

DISP=(NEW,PASS): o arquivo é criado neste step e passado aos demais


em qualquer condição de termino.

DISP=(OLD,PASS): o arquivo é lido neste step e passado aos demais em


qualquer condição de termino.

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:

DISP=(SHR,CATLG,DELETE): Como o arquivo não é novo (SHR) ele já


está catalogado. Não é possível recatalogá-lo.

DISP=(NEW,KEEP,DELETE): Como o arquivo é novo (NEW) não é


possível manter (KEEP) o arquivo como estava antes. 6
Default:

Se você colocar apenas DISP=SHR o sistema assume (SHR,KEEP,KEEP).

SPACE Especifica o espaço que o sistema deve alocar para o arquivo


novo que está sendo gravado em disco. Se não houver o espaço
solicitado o JOB será cancelado. O formato geral é:

SPACE=(TRK,(PRIM,SEC,DIR),RLSE,CONTIG,ROUND)

TRK espaço alocado em trilhas (47.476 bytes no disco modelo


3380 ou 56.664 bytes no modelo 3390). Também pode ser CYL,
espaço alocado em cilindros (712.140 bytes no modelo 3380 ou
849.960 no modelo 3390) ou um número que indica o tamanho
de um bloco de registros. Observe que 1 CYL = 15 TRK.

PRIM = Quantidade primária de alocação.

SEC = Quantidade secundária de alocação, também conhecida


como extends.

DIR = Quantidade em unidades de blocos de 256 bytes (pouco


usado).
Disco IBM 350
Apresentado em 13/09/1956 RLSE = Libera o espaço não utilizado.
Pilha de 40 discos de 24 polegadas
Capacidade 4,4 Megabytes
Aluguel anual de US$ 35.000,00 CONTIG = Solicita que o espaço primário seja alocado apenas
em trilhas e cilindros contíguos (pouco usado).

ROUND = Arredonda para número inteiro de cilindros, e aloca


em cilindros, quando o espaço solicitado é em blocos (pouco
usado).

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


22 Parte 6
A alocação do espaço funciona da seguinte forma ((de 1 a 15 * SEC) + PRIM)

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.

IBM 3390 DASD

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 6 23

VOL=SER= Especifica o número de série do volume (DASD) onde o arquivo


(DATA SET) está ou será localizado.

UNIT Especifica o tipo de dispositivo onde o arquivo será criado.


Geralmente disco é SYSDA. SYSALLDA significa que o sistema
pode procurar em todos (ALL) os dispositivos para encontrar um
com espaço suficiente para o arquivo. Para arquivos em fita,
usar TAPE.

DCB DATA CONTROL BLOCK. Indica o formato do arquivo a ser


gravado. Não é necessário para arquivos a serem lidos, pois o
catálogo já guarda essas informações. A ordem dos sub-
parâmetros não importa. Seus sub-parâmetros são:

RECFM Acrônimo para RECORD FORMAT, é o formato do


registro. F para registros de tamanho fixo, V para

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.

LRECL Acrônimo para LOGIC RECORD LENGTH, é o tamanho


do registro em bytes. Quando você especifica V para o
parâmetro RECFM, o valor informado deve ser o
tamanho do maior registro no arquivo mais 4 bytes.
Esses 4 bytes contém o tamanho real de cada registro de
comprimento variável no arquivo.

DSORG Acrônimo para DATA SET ORGANIZATION, é a


organização dos registros no arquivo. DA é acesso direto
(disco), PO é particionado (disco), PS é físico sequencial
(fita ou cartucho) e IS é indexado sequencial (disco).

BLKSIZE Acrônimo para BLOCK SIZE, é o tamanho de um bloco


de registros. Quando omitido ou colocando 0 o sistema
calcula a blocagem ideal.

BUFNO Acrônimo para BUFFERS NUMBER é a quantidade de


buffers. O default é BUFNO=5.

Exemplo:

DCB=(RECFM=FB,LRECL=100,BLKSIZE=6000,DSORG=PS)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


24 Parte 6
SYSOUT Direcionar as saídas para a impressora. Exemplo:

//ARQRELAT DD SYSOUT=* fila default (msgclass)


//RELOCORR DD SYSOUT=Z

* INPUT STREAM, serve para passar dados ao programa, através


de um arquivo, via JCL. Os caracteres /* funcionam como
delimitadores. Exemplos:

//ARQDATA DD *
20080901ANTONIO DA SILVA
20080912MARIA MOURA
20080925JOAO PEREIRA
/*
//SYSIN DD *
20080901ANTONIO DA SILVA
20080912MARIA MOURA
20080925JOAO PEREIRA
/*

DUMMY Ou DSN=NULLFILE, O arquivo recebe o estado de “nulo”. O


arquivo não existe. O primeiro read no arquivo gera file status 10
(EOF). Exemplo:
//ARQENT DD DUMMY
//ARQSAI DD DUMMY,SYSOUT=*,DCB=(LRECL=133)

SYSUDUMP É usado para despejar o conteúdo de vários registradores,


variáveis e arquivos acessados no exato momento de um
termino anormal (ABEND), dentro de um arquivo ou do SPOOL.
O despejo é em hexadecimal. Exemplo:
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//SYSUDUMP DD DSN=TEST.PROD.LIB

ou
//SYSUDUMP DD SYSOUT=*

SYSABEND É usado para despejar o conteúdo de vários registradores,


variáveis e arquivos acessados e o núcleo, no exato momento
de um termino anormal (ABEND), dentro de um arquivo ou do
SPOOL. O despejo é em hexadecimal. Exemplo:
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//SYSABEND DD DSN=TEST.PROD.LIB

ou
//SYSABEND DD SYSOUT=*

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 6 25

Concatenando arquivos (DATA SETs)

No JCL, nós podemos concatenar diferentes arquivos, informando seus


nomes um após o outro. Todos os arquivos concatenados devem ser do
mesmo tipo. Por exemplo, arquivos particionados PDS (partitioned data set)
podem ser concatenados apenas com outros arquivos particionados. Exemplo:

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

No programa, nós vamos lê-los como um único arquivo. Os limites para


concatenação de arquivos pelo sistema operacional são:

6
 Máximo de 255 arquivos sequenciais.
 Máximo de 16 arquivos particionados.

Teoria ç
Fluxo de a ões de um job

JOB ENTRY SISTEMA


PROGRAMADOR TSO
SUBSYSTEM OPERACIONAL

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


26 Parte 6

Classifica ão externa ç
Teoria de um arquivo

O SORT é o utilitário para classificar (ordenar) arquivos. Abaixo temos um


exemplo de classificação de um cadastro de clientes, onde as 4 primeiras posições é o
código do cliente, que será usado como critério de classificação em ordem crescente.
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890

//STEPNN EXEC PGM=SORT


//SYSPRINT DD SYSOUT=*
//SORTIN DD DSN=GP.GPXXNN.CADCLI,DISP=SHR
//SORTOUT DD DSN=GP.GPXXNN.CADCLIS,DISP=(NEW,CATLG,DELETE),
// SPACE=(TRK,(5,2),RLSE),UNIT=SYSALLDA,
// DCB=(DSORG=PS,RECFM=FB,LRECL=57,BLKSIZE=0)
//SYSIN DD *
SORT FIELDS=(01,04,CH,A)
//SYSOUT DD SYSOUT=*

SORTIN indica o arquivo que será classificado (entrada)


SORTOUT indica o arquivo que será o resultado da classificação (saída)
SORT FIELDS campos no registro de entrada que serão referencias para a
classificação, os parâmetros auxiliares que compõem este
parâmetro são (PI,PF,TD,TO), onde:
PI posição inicial do campo
PF posição final do campo
TD tipo do dado, podendo ser
BI binário
PK decimal compactado
ZD decimal zonado
CH caractere
TO tipo de ordenação, podendo ser
A ascendente (crescente)
D descendente (decrescente)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 6 27

Practice

Atividade Revisão aos pares

1) Verifique o fragmento de programa abaixo e indique se a

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.

( ) O comando CALL associado à condição WIND = ’A’ provocará um erro de


compilação (faltaram as aspas)

( ) O programa indicado no CALL associado à condição WIND = ’A’ será incluído no


LOAD MODULE do programa principal na fase de linkedição do mesmo, pois se trata
de um CALL estático.

( ) O comando CALL associado à condição WIND = ‘B’ provocará um erro de


compilação (aspas não permitidas no comando CALL).

( ) O programa indicado no CALL associado à condição WIND = ‘B’ será incluído no


LOAD MODULE do programa principal na fase de linkedição do mesmo, pois se trata
de um CALL estático.

( ) O comando CALL associado à condição WIND = ’A’ é um CALL dinâmico e, portanto


o programa indicado será carregado, em tempo execução do programa principal.

( ) O comando CALL associado à condição WIND = ‘B’ é um CALL dinâmico e, portanto


o programa indicado será carregado, em tempo execução do programa principal.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


28 Parte 6
2) Associe a informação da esquerda com o cartão e o argumento JCL onde ela é
informada:

A – Nome do JCL (JOB) ( ) – DD / DISP


B – Contabilização ( ) – DD / SYSUDUMP
C – Classe de Execução (fila) ( ) – JOB / JOBNAME
D – Classe de mensagens do sistema ( ) – DD / DSNAME
E – Onde está o programa ( ) – DD / SYSOUT
F – Nome do step (passo) ( ) – DD / DDNAME
G – Nome do programa ( ) – DD / DCB
H – Condição para execução do step ( ) – DD / UNIT
I – Parâmetros para o programa ( ) – JOB / ACCOUNT
J – Nome da definição de dados ( ) – EXEC / COND
K – Nome do arquivo ( ) – DD / SPACE
L – Disposição (status) do arquivo ( ) – JOBLIB ou STEPLIB
M – Periférico do arquivo ( ) – JOB / CLASS
N – Espaço necessário para o arquivo ( ) – EXEC / PGM
O – Informações a respeito do registro ( ) – EXEC / STEPNAME
P – Classe do Relatório ( ) – EXEC / PARM
Q – Mapa da memória em caso de ABEND ( ) – JOB / MSGCLASS

Atividade Trabalho em dupla

3) Questões de entrevista. Reveze com seu colega


perguntando as questões abaixo, verifique e anote a resposta
correta.

a) Quais são os 3 tipos de “cartões” de comandos usados no JCL?

b) Como é possível concatenar arquivos em um JOB?

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 6 29

c) Qual a diferença entre a especificação de um DISP=OLD e DISP=SHR para um


arquivo?

d) Como fazer um comentário no JCL?

e) Qual é o propósito da palavra chave TIME em um comando JCL?


6

f) Como se usa a palavra chave DUMMY no JCL?

g) Qual a diferença entre o nome informado no DDname (DD) e o Data Set Name
(DSN)?

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


30 Parte 6
4) Monte o JOB abaixo conforme explicações:

Nome do JOB = JOB00001, contabilizar para ‘XPTO.4250’. Classe de execução = A e


classe de mensagens do sistema = Z. Imprimir somente os cartões JOB e não imprimir
as mensagens de alocação ou liberação de arquivos. Alocar 2 Mbytes para todo o job.
Notificar o usuário logado no TSO. Limitar o tempo de execução do job para 30
segundos.
No STEP01 executar o programa = PROGRA01 passando a informação “20120101”
como parâmetro. O módulo objeto do programa se encontra no arquivo particionado
AD.DC40.MODULOS.OBJETO
Arquivo de entrada = informar o arquivo AD.DC40.BRGP.UPDT.ARQENT no
DDNAME ARQENT, com acesso compartilhado.
Arquivo de saída = AD.DC40.BRPG.UPDT.ARQSAI, sequencial, fixo e blocado.
Catalogar em disco se o job terminar normalmente, caso contrário excluí-lo,
DDNAME=ARQSAI, tamanho do registro=100, tamanho do bloco=10000, alocar 10
trilhas em primário e 2 trilhas em secundário liberando o espaço não utilizado. A
unidade de armazenamento utilizada será DASD071.
Arquivo de saída DDNAME=ARQRELAT em impressora, utilizar a classe do cartão
JOB.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 6 31

5) Com base no macro-fluxo abaixo escreva os comandos de JCL para incluir um novo
step (STEP0002).

ARQENT20 DSN=XPTO.PRODUTO.TABPRECO

Local onde se encontra o programa:


XPTO.MODULOS.LOADPROD
PROG030 Codificar no comando EXEC o parâmetro COND para que esse passo
execute somente se o passo anterior (STEP0001) terminar normalmente
(return code = 0)

DSN=XPTO.PRODUTO.LSTPRECO
ARQSAI20
LRECL=200
BLKSIZE=4800

6
se o step terminar normalmente catalogar o arquivo
senão excluir o arquivo

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


32 Parte 6

Performance

Atividade Projeto 5

Objetivo da Manutenção

A Chapéu de Couro Indústria Brasileira S.A. solicitou uma alteração no


projeto de unificação do cadastro de clientes:

Só gravar os clientes no cadastro unificado se o CPF estiver correto. Para


verificar o CPF, utilizar o sub-programa PGMAUX01.

Macro-Fluxo

CLISP CLIRJ CLIMG

GPXXNN05 PGMAUX01

CLIUNIF

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 6 33

Layout da Mensagem

Nome do Registro WS-DADOS-ENVIADOS


Nome do Campo Tipo e Tamanho Descrição
WS-CPF X(11) CPF a ser verificado
WS-RESP X(01) Resposta da verificação

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’.

Os clientes com CPF inválido são desprezados e não serão gravados no


cadastro unificado, porém seus dados serão exibidos na SYSOUT conforme layout
abaixo.

Após a chamada estática do programa, retirá-lo da memória (CANCEL),


garantido que na próxima chamada ele volte ao seu estado inicial.

Execute os passos abaixo (Lembre-se de que XXNN é o seu prefixo de


usuário):

1) Pelo TSO, opção P.3.3 (Move / Copy Utility), copiar o programa GPXXNN04
para GPXXNN05.

2) Copiar também o JOB EXECOB04 para EXECOB05, alterando o nome do


programa (PGM=GPXXNN05) e a disposição do arquivo CLIUNIF, que já
existe, devido ao projeto 4, de DISP=NEW para DISP=OLD

3) Digite as manutenções solicitadas, compile com o job COMPCOB e elimine


os erros até obter MAXCC = 0

4) Execute o programa com o job EXECOB05. Compare o resultado com os


dos colegas.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


34 Parte 6

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 6 35

JOB de Execução

Os arquivos de entrada (CLISP, CLIRJ e CLIMG) estão com o prefixo do


instrutor, já o de saída (CLIUNIF) está com o prefixo do aluno.
11234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//GPXXNN05 JOB SEUNOME,MSGCLASS=X,CLASS=C,NOTIFY=GPXXNN,TIME=(0,20)
//*****************************************************************
//STEP1 EXEC PGM=GPXXNN05
//STEPLIB DD DSN=GP.GERAL.LOADLIB,DISP=SHR
//CLISP DD DSN=GP.GPXX99.CLISP,DISP=SHR
//CLIRJ DD DSN=GP.GPXX99.CLIRJ,DISP=SHR
//CLIMG DD DSN=GP.GPXX99.CLIMG,DISP=SHR
//CLIUNIF DD DSN=GP.GPXXNN.CLIUNIF,DISP=OLD,
// SPACE=(TRK,(1,1),RLSE),UNIT=SYSALLDA,
// DCB=(LRECL=96,RECFM=FB,DSORG=PS,BLKSIZE=0)

Orientação para processamento


6
Será necessário criar um contador para os clientes rejeitados e variáveis com
máscara para exibir os dados desses clientes na WORKING-STORAGE-SECTION.

----+-*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).

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


36 Parte 6
e na rotina 2100-GRAVAR-CLIUNIF realizar os seguintes MOVEs quando for exibir os
dados dos clientes rejeitados:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
2100-GRAVAR-CLIUNIF.
*----------------------------------------------------------------*
.
.
.
ELSE
COMPUTE WS-CTREJ = WS-CTREJ + 1

MOVE WS-CPFCLI-UNIF(01:09) TO WS-NUMCPF-F


MOVE WS-CPFCLI-UNIF(10:02) TO WS-DIGITOCPF-F
MOVE WS-NOMECLI-UNIF TO WS-NOMECLI-F
MOVE WS-ENDCLI-UNIF TO WS-ENDCLI-F
MOVE WS-FONECLI-UNIF(01:02) TO WS-DDD-F
MOVE WS-FONECLI-UNIF(03:04) TO WS-FONE-PARTE1-F
MOVE WS-FONECLI-UNIF(07:04) TO WS-FONE-PARTE2-F
MOVE WS-TOTALCOMPRAS-UNIF TO WS-TOTALCOMPRAS-F
MOVE WS-ULTIMACOMPRA-UNIF(07:02)
TO WS-DIA-ULTIMACOMPRA-F
MOVE WS-ULTIMACOMPRA-UNIF(01:04)
TO WS-ANO-ULTIMACOMPRA-F

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
.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 6 37

A principal manutenção ocorrerá no seguinte parágrafo:

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

No parágrafo 1000-INICIALIZAR, acrescentar


Mover zero para o contador de clientes rejeitados

E no parágrafo 3000-TERMINO, acrescentar


Exibir o contador de clientes rejeitados

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


38 Parte 6

Avaliação Então...Como foi ?!?

Estou fera!

Fiz Certo!

 Muito Bom  Bom  regular  ruim  Muito ruim

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte

Algoritmo de Balance Line

A origem do simpático nome


desse algoritmo parece não ser documentada,
mas provavelmente deriva do
"balanceamento" dos valores chaves uns
contra os outros que forma o coração desse
algoritmo. Vale notar que o Balance Line é
mais do que um algoritmo, é uma abordagem
de projeto e muitas rotinas customizadas
podem ser desenvolvidas com base nela.
Versão 2.3.5
Parte 7 3

Preparation

Trocando Ideias É agora que você fala !!

Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na


capa desta parte. Isso é importante para que seu instrutor e seus colegas
saibam como está seu conhecimento sobre o assunto e se você precisa ou
pode fornecer ajuda aos colegas e instrutor.

 O que você já sabe ?

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 ?

Reflexão É aqui que você se compromete !!

Depois de falar sobre o assunto com seus colegas e instrutor, escreva,


desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses
tópicos. Comprometa-se!

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


4 Parte 7

Presentation

História O Algoritmo mais usado

É importante conhecer os outros operadores aritméticos além do COMPUTE.


Há empresas que pedem para usar COMPUTE o mínimo possível. A justificativa é que
as expressões aritméticas mais complexas são difíceis de entender e que quebrá-las
em expressões mais simples ajuda melhor a compreender sua construção.

Agora, o algoritmo mais usado em processamento batch é o BALANCE LINE. A


idéia é ter um arquivo com a movimentação (transações) ocorridas ao longo do dia ou
de um período qualquer. Esse arquivo é ordenado (classificado) e serve como base
para atualizar um cadastro (de estoque, de contas, de funcionários, etc).

Inclusive é o algoritmo mais solicitado em testes de admissão na área de


desenvolvimento COBOL Mainframe. Assim, caro estagiário da XPTO Consultoria em
Desenvolvimento de Software, é preciso dominá-lo. Sabê-lo de cor, ok?

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 7 5

Teoria Operadores aritméticos

As instruções para efetuar cálculos aritméticos em COBOL são:

ADD (somar)
SUBTRACT (subtrair)
MULTIPLY (multiplicar)
DIVIDE (dividir)
COMPUTE (calcular)

Todos possuem a opção ROUNDED, ON SIZE ERROR e END-terminador.

ROUNDED – Para obter resultados arredondados, a opção ROUNDED pode


ser especificada em qualquer instrução aritmética. Em todos os casos, ela vem

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

ON SIZE ERROR – Quando a variável que recebe o resultado da operação


aritmética não tem tamanho suficiente para conter o resultado, o COBOL trunca o
valor resultante (o valor perde algarismos à esquerda), e o COBOL não emite avisos
ou código de erro. Para que se possa detectar esta situação é necessário codificar na
instrução aritmética a clausula ON SIZE ERROR, onde podemos colocar uma
mensagem de erro, parar o programa ou desviar para um parágrafo especial de
tratamento de erro. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
ADD WS-VALOR TO WS-ACUMULADOR
ON SIZE ERROR
DISPLAY “ESTOUROU A VARIAVEL WS-ACUMULADOR”
MOVE “S” TO WS-FLAG-ERRO
END-ADD

END-terminador – Visando permitir uma programação estrutura, todas as


instruções aritméticas do COBOL permitem terminador de escopo. Exemplo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
END-ADD
END-SUBTRACT
END-MULTIPLY
END-DIVIDE
END-COMPUTE

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


6 Parte 7
ADD

Acumula constantes e variáveis em uma ou mais variáveis de resultado. O


conteúdo da variável de resultado também é somado com os demais valores.
Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
ADD 18 TO WS-TOTAL
ADD WS-VALOR TO WS-ACUMULADOR-TOTAL
ADD WS-DEBITO WS-CREDITO TO WS-SALDO
ADD WS-BONUS TO WS-SALARIO WS-COMISSAO

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

Ao usar o formato GIVING, a variável de resultado receberá a soma, mas seu


conteúdo inicial não será parte da instrução ADD. Depois da palavra GIVING, contudo,
o campo pode ser um item de relatório, ou seja, pode possuir máscara de edição.
Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
ADD 365 TO WS-TEMPO GIVING WS-RESULTADO
ADD WS-VALOR TO WS-ACUMULADO GIVING LD-TOTAL
ADD WS-DEBITO TO WS-CREDITO GIVING WS-SALDO WS-RESULT

ADD WS-VAL1 WS-VAL2 TO WS-TOTAL


GIVING WS-SOMA-FINAL ROUNDED
ON SIZE ERROR
DISPLAY “ERRO NO TAMANHO DA VARIAVEL WS-SOMA-FINAL”
DISPLAY “CONTATE O ANALISTA RESPONSAVEL”
GO TO 9000-ERRO
END-ADD

Abaixo exemplos de ADD e o equivalente com COMPUTE.


----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
ADD A TO B
COMPUTE B = B + A

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 7 7

SUBTRACT

Subtrai uma ou mais constantes e variáveis numéricas de uma variável de


resultado. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
SUBTRACT 1 FROM WS-CONTATOR

SUBTRACT WS-ENCARGOS WS-DEBITOS FROM WS-SALDO

SUBTRACT WS-VALOR-1 WS-VALOR-2


FROM WS-SALDO
GIVING WS-RESULTADO

SUBTRACT WS-VAL1 FROM WS-VAL2


GIVING WS-DIFERENCA ROUNDED
ON SIZE ERROR
DISPLAY “ERRO NO TAMANHO DA VARIAVEL WS-DIFERENCA”
DISPLAY “CONTATE O ANALISTA RESPONSAVEL”
GO TO 9000-ERRO
END-SUBTRACT

Duas ou mais variáveis ou constantes podem ser subtraídas da variável de


resultado. O GIVING direciona o resultado para uma variável de resultado.

Todas as constantes e variáveis que são parte da instrução SUBTRACT devem

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.

Ao usar o formato GIVING, a variável de resultado receberá o resultado da


subtração, mas seu conteúdo inicial não será parte da instrução SUBTRACT.

Abaixo exemplo de SUBTRACT e o equivalente com COMPUTE.


----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
SUBTRACT A FROM B
COMPUTE B = B – A

SUBTRACT A B FROM C

COMPUTE C = C – A – B

SUBTRACT A B FROM C GIVING D E


COMPUTE D = C – A - B
COMPUTE E = C – A - B

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


8 Parte 7
DIVIDE

Efetua uma divisão, determinando o quociente e, se indicado, o resto. Possui 2


formatos: INTO e BY. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
DIVIDE 4 INTO WS-CONTADOR

DIVIDE 12 INTO WS-SALARIO-ANUAL GIVING WS-SALARIO-MENSAL

DIVIDE WS-NUM INTO WS-SOMADOR


GIVING WS-QUOCIENTE REMINDER WS-RESTO

DIVIDE WS-CONTADOR BY 4 GIVING WS-CONTATOR

DIVIDE WS-SALARIO-ANUAL BY 12 GIVING WS-SALARIO-MENSAL

DIVIDE WS-SOMADOR BY WS-NUM GIVING WS-QUOCIENTE REMAINDER WS-RESTO

DIVIDE WS-SOMADOR BY WS-NUM


GIVING WS-QUOCIENTE ROUNDED
REMAINDER WS-RESTO
ON SIZE ERROR
DISPLAY “ERRO NO TAMANHO DA VARIAVEL WS-QUOCIENTE”
DISPLAY “CONTATE O ANALISTA RESPONSAVEL”
GO TO 9000-ERRO
END-DIVIDE

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.

Abaixo exemplo de DIVIDE e o equivalente com COMPUTE.


----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
DIVIDE A INTO B
COMPUTE B = B / A

DIVIDE A INTO B GIVING C


COMPUTE C = B / A

DIVIDE A BY B GIVING C D E
COMPUTE C = A / B
COMPUTE D = A / B
COMPUTE E = A / B

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 7 9

MULTIPLY

Efetua a multiplicação entre variáveis. Exemplo:


----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
MULTIPLY 4 BY WS-VALOR
MULTIPLY WS-SALARIO-MES BY 12 GIVING WS-SALARIO-ANUAL

MULTIPLY WS-SALARIO-MES BY WS-QTD-MESES


GIVING WS-SALARIO-ANUAL ROUNDED
ON SIZE ERROR
DISPLAY “ERRO NO TAMANHO DA VARIAVEL WS-SALARIO-ANUAL”
DISPLAY “CONTATE O ANALISTA RESPONSAVEL”
GO TO 9000-ERRO
END-MULTIPLY

Depois da palavra GIVING, contudo, o campo pode ser um item de relatório. ou


seja, pode possuir máscara de edição.

Abaixo exemplo de MULTIPLY e o equivalente com COMPUTE.


----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
MULTIPLY A BY B
COMPUTE B = B * A

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


10 Parte 7
COMPUTE

Como visto anteriormente, realiza operações aritméticas mais sofisticadas,


utilizando o operador de atribuição = e uma expressão aritmética. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
COMPUTE WS-CONTADOR = WS-CONTADOR + 1
COMPUTE WS-SALARIO-ANUAL = WS-SALARIO-MES * 12
COMPUTE WS-DIAGONAL = ((WS-LADO ** 2) ** 0,5)

COMPUTE WS-SALARIO-ANUAL = WS-SALARIO-MES * 12 ROUNDED


ON SIZE ERROR
DISPLAY “ERRO NO TAMANHO DA VARIAVEL WS-SALARIO-ANUAL”
DISPLAY “ENTRE EM CONTATO COM O ANALISTA RESPONSAVEL”
GO TO 9000-ERRO
END-COMPUTE

Para comparação, a fórmula de Báskara para determinar as raízes de uma


equação de 2º grau é:

−𝑏 ± √𝑏 2 − 4𝑎𝑐
𝑥=
2𝑎

Com compute, o cálculo de uma das raízes fica:


----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
COMPUTE X = ((-1) * B + (B ** 2 – 4 * A * C) ** 0,5)) /
(2 * A)

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

(36 − 24). 17,5 − 209

12.17,5 − 209 = 210 − 109 = 1

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 7 11

Teoria Uso de flags (nivel 88)

O uso de flags é muito comum na programação COBOL e ela é implementada


com o nível 88 seguido de um nome de condição.

Um nome de condição é uma palavra definida pelo usuário, estabelecida na


DATA DIVISION, dando um nome a um valor específico que pode ser assumido por
um identificador. Por exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
WORKING-STORAGE SECTION.
01 WS-ESTADO-CIVIL PIC X(01).
88 SOLTEIRO VALUE “S”.
88 CASADO VALUE “C”.
88 DIVORCIADO VALUE “D”.
88 VIUVO VALUE “V”.

Quando a variável WS-ESTADO-CIVIL for igual a “S”, chamamos essa

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.

O nome de condição é sempre codificado no nível 88 e tem apenas uma


cláusula VALUE associada a ele. Como o nome de condição não é um nome de
campo, ele não tem uma cláusula PICTURE.

Então no lugar de testar a variável WS-ESTADO-CIVIL contra um conteúdo,


por exemplo “S”, como mostra o código abaixo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXIF WS-ESTADO-CIVIL = “S”
DISPLAY “O ESTADO CIVIL EH SOLTEIRO”
END-IF

Podemos testar diretamente o nome da condição, como mostra o código


abaixo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXIF SOLTEIRO
DISPLAY “O ESTADO CIVIL EH SOLTEIRO”
END-IF

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


12 Parte 7
Agora um exemplo de código sem o uso de flag.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXIF WS-COR-CABELO = “C”
DISPLAY “CASTANHO”
ELSE
IF WS-COR-CABELO = “P”
DISPLAY “PRETO
ELSE
IF WS-COR-CABELO = “L”
DISPLAY “LOIRO”
ELSE
DISPLAY “OUTRO”
END-IF
END-IF
END-IF

E o mesmo código com o uso de flag.


----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
WORKING-STORAGE SECTION.
01 WS-COR-CABELO PIC X(01).
88 CASTANHO VALUE “C”.
88 PRETO VALUE “P”.
88 LOIRO VALUE “L”.
*----------------------------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------------------------*
IF CASTANHO
DISPLAY “CASTANHO”
ELSE
IF PRETO
DISPLAY “PRETO
ELSE
IF LOIRO
DISPLAY “LOIRO”
ELSE
DISPLAY “OUTRO”
END-IF
END-IF
END-IF

Abaixo um exemplo de código com o uso de flag para a verificação do FILE


STATUS.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
WORKING-STORAGE SECTION.
77 WS-MSG01 PIC X(60)
VALUE
“ERRO LEITURA CADCLI”.
01 FS-CADCLI PIC X(02).
88 FIM-ARQUIVO VALUE “10”.
88 SUCESSO VALUE “00”.
*----------------------------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------------------------*
020-LER-CADCLI.
READ CADCLI INTO WS-REG-CADCLI
IF SUCESSO
ADD 1 TO WS-CTLIDO
ELSE
IF NOT FIM-ARQUIVO
MOVE WS-MSG01 TO WS-MSG
MOVE FS-CADCLI TO WS-FS
GO TO 9000-ERRO
END-IF
END-IF

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 7 13

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:

SET LOIRO TO NOT TRUE 


"NOT" was found in the "SET" statement. It was not allowed in this context.
The statement was discarded.

SET LOIRO TO FALSE 


"FALSE" was found in the "SET" statement. It was not allowed in this context.
The statement was discarded.

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


14 Parte 7
*--------------------------------------------------------------*
PROCEDURE DIVISION
USING LS-PARAMETRO.
*--------------------------------------------------------------*
*
* PRIMEIRO VAMOS CONSIDERAR QUE A DATA EH VALIDA
*
SET DATA-VALIDA TO TRUE

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

IF WS-R4 = 0 AND WS-R100 NOT = 0 OR


WS-R400 = 0 AND WS-R3600 NOT = 0
IF LS-DIA < 1 OR > 29
SET DATA-INVALIDA TO TRUE
END-IF
ELSE
IF LS-DIA < 1 OR > 28
SET DATA-INVALIDA TO TRUE
END-IF
END-IF
END-IF

*
* 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
.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 7 15

Arquivos com
Teoria múltiplos layouts

Arquivos complexos não podem armazenar seus dados em apenas um tipo de


registro, então eles tem múltiplos tipos de registros. Por exemplo, registros médicos
podem ter um tipo de registro para identificar o paciente (nome, endereço, etc), outro
tipo de registro para dados sobre o tratamento, e um terceiro tipo para informações de
pagamento. Vamos chamá-los de registros A, B e C respectivamente. Quando todos
esses tipos de registros são armazenados em um arquivo, esse arquivo possui
"multiplos tipos de registros", ou "registros redefinidos".

A - IDENTIFICAÇÃO

B - TRATAMENTO

C - PAGAMENTO

7
A - IDENTIFICAÇÃO

B - TRATAMENTO

C - PAGAMENTO

A - IDENTIFICAÇÃO

B - TRATAMENTO

C - PAGAMENTO

Quando um arquivo contém múltiplos tipos de registros (registros redefinidos),


frequentemente esses registros são organizados em grupos. Usando o exemplo do
arquivo médico acima, os dados de um paciente deve consistir de um registro de
identificação do paciente (A), seguido por um registro de tratamento (B) seguido por
um registro de pagamento(C). Outro paciente poderia conter um registro de
identificação do paciente (A), seguido por 5 registros de tratamento (B), seguido por 3
registros de pagamento(C). Esses registros de paciente são frequentemente
associados através de um campo chave, mas algumas vezes a ordem no arquivo é a
coisa que os mantém unidos.

A - IDENTIFICAÇÃO

B - TRATAMENTO

B - TRATAMENTO

B - TRATAMENTO

B - TRATAMENTO

B - TRATAMENTO

C - PAGAMENTO

C - PAGAMENTO

C - PAGAMENTO

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


16 Parte 7
Para garantir que todos os registros tenham o mesmo comprimento (record
legth), um FILLER (enchedor) é atribuído no final dos registros menores, de forma a
igualar ao tamanho do maior. Ou todos os registros possuem um FILLER para chegar
a um número redondo.

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

Uma outra estrutura comum de arquivo contendo múltiplos tipos de registros é


um arquivo que começa com um registro de cabeçalho (H=Header), digamos para
identificar o fornecedor e a data de processamento, seguido por registros de dados
(D=Data) e terminando com um registro de reboque (T=Trailer) que contém a
contagem dos registros e a soma dos campos numéricos individuais. Esses totais são
frequentemente usados como uma checagem dos dados depois de um processamento,
onde a soma dos registros individuais deve ser igual ao total no registro de reboque.

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 7 17
REDEFINES

O COBOL permite que um item de dado seja redefinido (REDEFINES) para


representar dados com outro layout. Primeiro informamos o item de dado original,
depois na sequência, suas redefinições. Exemplo:

----+-*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).

01 WS-REG-CADALUNO-HEADER REDEFINES WS-REG-CADALUNO.


XXXX 05 FILLER PIC X(01).
XXXX 05 WS-SIGLA-SYS PIC X(05).

7
XXXX 05 WS-MES-ANO-REF PIC X(06).
05 FILLER PIC X(58).

01 WS-REG-CADALUNO-DATA REDEFINES WS-REG-CADALUNO.


XXXX 05 FILLER PIC X(01).
XXXX 05 WS-CODCLI PIC X(04).
XXXX 05 WS-NOMECLI PIC X(20).
05 WS-ENDCLI PIC X(30).
05 WS-TELEFONE PIC X(10).
05 FILLER PIC X(05).

01 WS-REG-CADALUNO-TRAILER REDEFINES WS-REG-CADALUNO.


XXXX 05 FILLER PIC X(01).
XXXX 05 WS-QTDE-REG PIC 9(05).
05 FILLER PIC X(64).

Vale notar que as variáveis WS-REG-ALUNO, WS-REG-ALUNO-HEADER,


WS-REG-ALUNO-DATA e WS-REG-ALUNO-TRAILER estão todas localizados na
mesma posição na memória RAM sendo, portanto o mesmo item de dado. Quando um
dado for carregado em um desses itens de dados, todos terão o mesmo conteúdo. A
lógica do programa precisará decidir qual layout utilizar, dependendo do conteúdo de
um determinado campo, no caso WS-TIPO-REG.

Utilizamos o comando READ para ler o arquivo carregando a variável espelho


que não foi redefinida, como mostra o código abaixo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
READ CADALUNO INTO WS-REG-CADALUNO

...

IF WS-TIPO-REG NOT = “H”


DISPLAY “ARQUIVO NAO TEM HEADER”
ELSE
DISPLAY “ARQUIVO TEM HEADER”
END-IF

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


18 Parte 7
O header deve ser o primeiro registro do arquivo, enquanto o trailer deve ser o
último. A lógica do programa que irá manipular esse arquivo deve garantir que isso
aconteça.

HEADER
DATA READ CADALUNO WS-REG-CADALUNO-HEADER
DATA INTO WS-REG-CADALUNO

DATA WS-REG-CADALUNO WS-REG-CADALUNO-DATA


DATA
DATA WS-REG-CADALUNO-TRAILER
TRAILER

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


EXEMPLO BALANCE LINE
Parte 7 19

Objetivo do Programa

Atualizar o cadastro de produtos e serviços PSOLD com base no arquivo de


movimento PSMOV, utilizando um algoritmo de BALANCE LINE, gerando o arquivo
PSNEW.

Para cada registro do arquivo PSOLD pode haver nenhum ou um registro no


arquivo PSMOV.

Macro-Fluxo

7
PSOLD PSMOV

EEXXNN06

PSNEW

Layout dos Arquivos

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


20 Parte 7

Nome do arquivo PSOLD


Nome do Registro REG-PSOLD
Nome do Campo Tipo e Tamanho Descrição
TIPO-REGISTRO-O X(01) Tipo do registro
FILLER X(42)

Nome do arquivo PSOLD


Nome do Registro REG-PSOLD-HEADER
Nome do Campo Tipo e Tamanho Descrição
FILLER X(01) Header “H”
SIGLA-SYS-O X(05) Sigla do Sistema
ANO-MES-REF-O X(06) Ano e mês de referência
FILLER X(31)

Nome do arquivo PSOLD


Nome do Registro REG-PSOLD-DATA
Nome do Campo Tipo e Tamanho Descrição
FILLER X(01) Data “D”
CODPS-O X(05) Código do produto/serviço
DESCPS-O X(30) Descrição do produto/serviço
VALORPS-O 9(05)V99 Valor do produto/serviço

Nome do arquivo PSOLD


Nome do Registro REG-PSOLD-TRAILER
Nome do Campo Tipo e Tamanho Descrição
FILLER X(01) Trailer “T”
QTD-REG-O 9(05) Quantidade de registros
FILLER X(37)

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 7 21

Nome do arquivo PSMOV


Nome do Registro REG-PSMOV
Nome do Campo Tipo e Tamanho Descrição
TIPO-REGISTRO-M X(01) Tipo do registro
FILLER X(43)

Nome do arquivo PSMOV


Nome do Registro REG-PSMOV-HEADER
Nome do Campo Tipo e Tamanho Descrição
FILLER X(01) Header “H”
SIGLA-SYS-M X(05) Sigla do Sistema
ANO-MES-REF-M X(06) Ano e mês de referência
FILLER X(31)

Nome do arquivo PSMOV


Nome do Registro REG-PSMOV-DATA
Nome do Campo Tipo e Tamanho Descrição
FILLER X(01) Data “D”

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)

Nome do arquivo PSMOV


Nome do Registro REG-PSMOV-TRAILER
Nome do Campo Tipo e Tamanho Descrição
FILLER X(01) Trailer “T”
QTD-REG-M 9(05) Quantidade de registros
FILLER X(38)

Nome do arquivo PSNEW


Nome do Registro REG-PSNEW
Nome do Campo Tipo e Tamanho Descrição
CODPS-N X(05) Código do produto/serviço
DESCPS-N X(30) Descrição do produto/serviço
VALORPS-N 9(05)V99 Valor do produto/serviço

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


22 Parte 7

Observação

Todos os produtos e serviços existentes atualmente estão gravados no arquivo


PSOLD, as alterações solicitadas estão no arquivo PSMOV e o resultado do Balance-
Line deve ser gravado no arquivo PSNEW.

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 arquivo PSMOV também possui Header, Data e Trailer, com os registros de


Data em ordem crescente de código de produto/serviço. Há no registro de Data o
campo TIPOMOV-M com o tipo de movimento:

I – Indica que o produto/serviço será incluído no PSNEW. Então esse


produto/Serviço não pode existir no PSOLD.

E – Indica que o produto/serviço existente no PSOLD não será gravado no


PSNEW.

A – Indica que o produto/serviço existente no PSOLD terá seus dados


alterados (com exceção do CODPS-O) com base no arquivo PSMOV.

O programa precisa garantir que os arquivos PSOLD e PSMOV tenham o


primeiro registro HEADER, a partir do segundo registro DATA e o último registro
TRAILER.

O processamento deve ocorrer até que seja lido o registro de trailer dos
arquivos de entrada (INPUT) PSOLD e PSMOV.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 7 23

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


24 Parte 7
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*--------------------------------------------------------------*
WORKING-STORAGE SECTION.
*--------------------------------------------------------------*
* DEFINICAO DAS VARIAVEIS ESPELHOS E SUAS REDEFINICOES
*--------------------------------------------------------------*

01 WS-REG-PSOLD.
05 WS-TIPO-REGISTRO-O PIC X(01).
05 FILLER PIC X(42).

01 WS-REG-PSOLD-HEADER REDEFINES WS-REG-PSOLD.


05 FILLER PIC X(01).
05 WS-SIGLA-SYS-O PIC X(05).
05 WS-ANO-MES-REF-O PIC X(06).
05 FILLER PIC X(31).

01 WS-REG-PSOLD-DATA REDEFINES WS-REG-PSOLD.


05 FILLER PIC X(01).
05 WS-CODPS-O PIC X(05).
05 WS-DESCPS-O PIC X(30).
05 WS-VALORPS-O PIC 9(05)V99.

01 WS-REG-PSOLD-TRAILER REDEFINES WS-REG-PSOLD.


05 FILLER PIC X(01).
05 WS-QTD-REG-O PIC 9(05).
05 FILLER PIC X(37).

*--------------------------------------------------------------*

01 WS-REG-PSMOV.
05 WS-TIPO-REGISTRO-M PIC X(01).
05 FILLER PIC X(43).

01 WS-REG-PSMOV-HEADER REDEFINES WS-REG-PSMOV.


05 FILLER PIC X(01).
05 WS-SIGLA-SYS-M PIC X(05).
05 WS-ANO-MES-REF-M PIC X(06).
05 FILLER PIC X(32).

01 WS-REG-PSMOV-DATA REDEFINES WS-REG-PSMOV.


05 FILLER PIC X(01).
05 WS-CODPS-M PIC X(05).
05 WS-DESCPS-M PIC X(30).
05 WS-VALORPS-M PIC 9(05)V99.
05 WS-TIPOMOV-M PIC X(01).

01 WS-REG-PSMOV-TRAILER REDEFINES WS-REG-PSMOV.


05 FILLER PIC X(01).
05 WS-QTD-REG-M PIC 9(05).
05 FILLER PIC X(38).

*--------------------------------------------------------------*

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

01 FS-PSOLD PIC X(02).


88 SUCESSO-O VALUE "00".
88 FIM-ARQ-O VALUE "10".

01 FS-PSMOV PIC X(02).


88 SUCESSO-M VALUE "00".
88 FIM-ARQ-M VALUE "10".

01 FS-PSNEW PIC X(02).


88 SUCESSO-N VALUE "00".
88 FIM-ARQ-N VALUE "10".

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 7 25
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*--------------------------------------------------------------*
* CONTADORES NO FORMATO BINARIO
*--------------------------------------------------------------*

77 WS-CTLIDO-O PIC 9(04) COMP.


77 WS-CTLIDO-M PIC 9(04) COMP.
77 WS-CTGRAV PIC 9(04) COMP.
77 WS-CTINC PIC 9(04) COMP.
77 WS-CTEXC PIC 9(04) COMP.
77 WS-CTALT PIC 9(04) COMP.
77 WS-CTINV PIC 9(04) COMP.
77 WS-CTPERM PIC 9(04) COMP.

*--------------------------------------------------------------*
* CONTADORES COM MASCARA DE EDICAO
*--------------------------------------------------------------*

77 WS-CTLIDO-O-F PIC ZZZ9.


77 WS-CTLIDO-M-F PIC ZZZ9.
77 WS-CTGRAV-F PIC ZZZ9.
77 WS-CTINC-F PIC ZZZ9.
77 WS-CTEXC-F PIC ZZZ9.
77 WS-CTALT-F PIC ZZZ9.
77 WS-CTINV-F PIC ZZZ9.
77 WS-CTPERM-F PIC ZZZ9.

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

OPEN INPUT PSMOV


IF NOT SUCESSO-M
MOVE "ERRO ABERTURA PSMOV" TO WS-MSG
MOVE FS-PSMOV TO WS-FS
GO TO 9000-ERRO
END-IF

OPEN OUTPUT PSNEW


IF NOT SUCESSO-N
MOVE "ERRO ABERTURA PSNEW" TO WS-MSG
MOVE FS-PSNEW TO WS-FS
GO TO 9000-ERRO
END-IF

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


26 Parte 7
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
PERFORM 1500-LER-PSOLD

IF FIM-ARQ-O
MOVE "PSOLD VAZIO" TO WS-MSG
MOVE FS-PSOLD TO WS-FS
GO TO 9000-ERRO
END-IF

IF WS-TIPO-REGISTRO-O NOT = "H"


MOVE "PSOLD NAO TEM HEADER" TO WS-MSG
MOVE FS-PSOLD TO WS-FS
GO TO 9000-ERRO
END-IF

PERFORM 1500-LER-PSOLD

IF WS-TIPO-REGISTRO-O NOT = "D"


MOVE "PSOLD NAO TEM DATA" TO WS-MSG
MOVE FS-PSOLD TO WS-FS
GO TO 9000-ERRO
END-IF

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

IF WS-TIPO-REGISTRO-M NOT = "H"


MOVE "PSMOV NAO TEM HEADER" TO WS-MSG
MOVE FS-PSMOV TO WS-FS
GO TO 9000-ERRO
END-IF

PERFORM 1600-LER-PSMOV

IF WS-TIPO-REGISTRO-M NOT = "D"


MOVE "PSMOV NAO TEM DATA" TO WS-MSG
MOVE FS-PSMOV TO WS-FS
GO TO 9000-ERRO
END-IF
.

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
.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 7 27
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
1600-LER-PSMOV.
READ PSMOV INTO WS-REG-PSMOV
IF SUCESSO-M
ADD 1 TO WS-CTLIDO-M
IF WS-TIPO-REGISTRO-M = "T"
MOVE HIGH-VALUES TO WS-CODPS-M
END-IF
ELSE
IF FIM-ARQ-M
IF WS-CTLIDO-M > 0
MOVE "PSMOV SEM TRAILER"
TO WS-MSG
MOVE FS-PSMOV TO WS-FS
GO TO 9000-ERRO
END-IF
ELSE
MOVE "ERRO LEITURA PSMOV" TO WS-MSG
MOVE FS-PSMOV TO WS-FS
GO TO 9000-ERRO
END-IF
END-IF
.
2000-PROCESSAR.
IF WS-CODPS-O < WS-CODPS-M
PERFORM 2100-MANTER
PERFORM 1500-LER-PSOLD
ELSE
IF WS-CODPS-O > WS-CODPS-M
PERFORM 2200-INCLUIR

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
.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


28 Parte 7
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
2500-GRAVA-O.
MOVE WS-CODPS-O TO WS-CODPS-N
MOVE WS-DESCPS-O TO WS-DESCPS-N
MOVE WS-VALORPS-O TO WS-VALORPS-N
WRITE REG-PSNEW FROM WS-REG-PSNEW
IF NOT SUCESSO-N
MOVE "ERRO GRAVACAO PSNEW" TO WS-MSG
MOVE FS-PSNEW TO WS-FS
GO TO 9000-ERRO
ELSE
ADD 1 TO WS-CTGRAV
END-IF
.
2600-GRAVA-M.
MOVE WS-CODPS-M TO WS-CODPS-N

IF WS-DESCPS-M NOT = SPACES


MOVE WS-DESCPS-M TO WS-DESCPS-N
ELSE
MOVE WS-DESCPS-O TO WS-DESCPS-N
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

WRITE REG-PSNEW FROM WS-REG-PSNEW


IF NOT SUCESSO-N
MOVE "ERRO GRAVACAO PSNEW" TO WS-MSG
MOVE FS-PSNEW TO WS-FS
GO TO 9000-ERRO
ELSE
ADD 1 TO WS-CTGRAV
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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 7 29
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8

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
.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


30 Parte 7

JOB de Execução

Os arquivos de entrada PSOLD e PSMOV estão com o prefixo do seu instrutor,


já o arquivo de saída PSNEW está com o prefixo de seu usuário.

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)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 7 31

Practice

Atividade Revisão aos pares

1) Considere os seguintes trechos de determinado


programa. Que valor será exibido pelo comando
DISPLAY? Preencha a tabela de variáveis (adiante) com

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.

Valores assumidos por cada variável:

Variáveis Valores
COD-ENT-CD
COD-EMP-CD
IND
QUO-EMP-CD
RES-EMP-CD

O valor exibido no comando DISPLAY é:

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


32 Parte 7
2) Utilizando os comandos aritméticos ADD, SUBTRACT, MULTIPLY e DIVIDE,
escreva a expressão aritmética equivalente a cada um dos COMPUTE abaixo:

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

3) Dada as expressões aritméticas abaixo, escreva o comando COMPUTE equivalente.

5
a) 𝑇 = 9 (𝐹 − 32)

𝐻
𝑀
b) 𝐶 = 745.6999 𝑇

𝐴+𝐵+𝐶
c) 𝑆=
2

d) 𝐴 = √𝑆(𝑆 − 𝐴)(𝑆 − 𝐵)(𝑆 − 𝐶)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 7 33

Atividade Trabalho em dupla

3) Monte nomes de condições (nível 88 – flags)


para o a variável WS-GRAU-DE-INSTRUCAO que é
numérica PIC 9(01) e pode assumir os seguintes valores:

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


34 Parte 7

Performance

Atividade Projeto 6

Objetivo do Programa

A Paraguay Express, empresa de cartões de crédito, precisa de um programa


para atualizar o arquivo que contém os clientes devedores CLIOLD com base na
movimentação do período gravada no arquivo CLIMOV, gerando um cadastro de
clientes devedores atualizada CLINEW.

Será usado o programa auxiliar PGMAUX02 para atualizar o saldo da dívida


quando necessário.

No final exibir uma estatística do processamento, datas e tempo gasto


conforme layout da SYSOUT.

Macro-Fluxo

CLIOLD CLIMOV

GPXXNN06 PGMAUX02

CLINEW

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 7 35

Observação

Para cada registro de CLIOLD deve ter um registro de movimento em CLIMOV.


Trata-se então de um BALANCE LINE 1:1 (leia-se um para um).

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.

Execute os passos abaixo (Lembre-se de que XXNN é o seu prefixo de

7
usuário):

1) Pela TSO, opção P.2 (Edit Entry Panel), crie o programa GPXXNN06 em
sua COBLIB.

2) Digite o programa COBOL conforme orientação para processamento. Utilize


flags (nível 88) para verificar o FILE STATUS dos arquivos.

3) Compile com o job COMPCOB e elimine os erros até obter MAXCC = 0

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.

5) Execute o programa com o job EXECOB06. Compare o resultado com os


dos colegas.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


36 Parte 7

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

Layout da Mensagem passada a PGMAUX02

Nome do Registro WS-DADOS-ENVIADOS


Nome do Campo Tipo e Tamanho Descrição
WS-TOTALDIVIDA 9(08)V99 Divida atual
WS-RESP X(01) Resposta
WS-DIVIDACALC 9(08)V99 Divida com juros

Chamar o programa PGMAUX02 de forma DINÂMICA, ou seja, carregar o


nome do programa na variável WS-PROGRAMA PIC X(08).

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 7 37

Layout dos Arquivos

Nome do Registro REG-CLIOLD


Nome do Campo Tipo e Tamanho Descrição
TIPO-REGISTRO-O X(01) Tipo do registro
FILLER X(79)

Nome do Registro REG-CLIOLD-HEADER


Nome do Campo Tipo e Tamanho Descrição
FILLER X(01) Header “H”
SIGLA-SYS-O X(05) Sigla do Sistema
ANO-MES-REF-O X(06) Ano e mês de referência
FILLER X(68)

Nome do Registro REG-CLIOLD-DATA


Nome do Campo Tipo e Tamanho Descrição
FILLER X(01) Data “D”
CODCLI-O X(04) Código do Cliente
NOMECLI-O X(25) Nome do Cliente
ENDCLI-O X(30) Endereço do Cliente
FONECLI-O X(10) Telefone do Cliente com DDD

7
TOTALDIVIDA-O 9(08)V99 Valor total da dívida

Nome do Registro REG-CLIOLD-TRAILER


Nome do Campo Tipo e Tamanho Descrição
FILLER X(01) Trailer “T”
QTD-REG-O 9(05) Quantidade de registros
FILLER X(74)

Nome do Registro REG-CLIMOV


Nome do Campo Tipo e Tamanho Descrição
TIPO-REGISTRO-M X(01) Tipo do registro
FILLER X(80)

Nome do Registro REG-CLIMOV-HEADER


Nome do Campo Tipo e Tamanho Descrição
FILLER X(01) Header “H”
SIGLA-SYS-M X(05) Sigla do Sistema
ANO-MES-REF-M X(06) Ano e mês de referência
FILLER X(69)

Nome do Registro REG-CLIMOV-DATA


Nome do Campo Tipo e Tamanho Descrição
FILLER X(01) Data “D”
CODCLI-M X(04) Código do Cliente
NOMECLI-M X(25) Nome do Cliente
ENDCLI-M X(30) Endereço do Cliente
FONECLI-M X(10) Telefone do Cliente com DDD
TOTALDIVIDA-M 9(08)V99 Valor total da dívida
TIPOMOV-M X(1) Tipo do movimento (I / E / A)

Nome do Registro REG-CLIMOV-TRAILER


Nome do Campo Tipo e Tamanho Descrição
FILLER X(01) Trailer “T”
QTD-REGISTRO-M 9(05) Quantidade de registros
FILLER X(75)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


38 Parte 7

Nome do Registro REG-CLINEW


Nome do Campo Tipo e Tamanho Descrição
CODCLI-N X(04) Código do Cliente
NOMECLI-N X(25) Nome do Cliente
ENDCLI-N X(30) Endereço do Cliente
FONECLI-N X(10) Telefone do Cliente com DDD
TOTALDIVIDA-N 9(08)V99 Valor total da dívida

Orientação para processamento

Parágrafo Principal (0000-GPAZNN06)


Executar o parágrafo 1000-INICIALIZAR
Executar o parágrafo 2000-PROCESSAR
até que WS-TIPO-REGISTRO-O = “T” E
WS-TIPO-REGISTRO-M = “T”
Executar o parágrafo 3000-TERMINO

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

Abrir para leitura o arquivo CLIOLD


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 CLIMOV


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 CLINEW


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)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 7 39

Ler o primeiro registro do arquivo CLIOLD (1100-LER-CLIOLD)


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)

Se o primeiro registro não for Header (H)


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)

Ler o segundo registro do arquivo CLIOLD (1100-LER-CLIOLD)


Se chegou no fim do arquivo (file status = “10”) OU
o segundo registro não for Data (D)
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)

Ler o primeiro registro do arquivo CLIMOV (1200-LER-CLIMOV)

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)

Se o primeiro registro não for Header (H)


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)

Ler o segundo registro do arquivo CLIMOV (1200-LER-CLIMOV)


Se chegou no fim do arquivo (file status = “10”) OU
o segundo registro não for Data (D)
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)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


40 Parte 7
Parágrafo 1100-LER-CLIOLD
Ler registro do arquivo CLIOLD carregando variável espelho
Se file status for igual a “00” (sucesso)
Somar 1 ao contador de cadastros lidos CLIOLD
Se o tipo de registro for Trailer (T)
Mover HIGH-VALUES para o código do cliente
Senão
Se file status for igual a “10” (fim de arquivo)
Se WS-CTLIDO-O > 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 1200-LER-CLIMOV
Ler registro do arquivo CLIMOV carregando variável espelho
Se file status for igual a “00” (sucesso)
Somar 1 ao contador de cadastros lidos CLIMOV
Se o tipo de registro for Trailer (T)
Mover HIGH-VALUES para o código do cliente
Senão
Se file status for igual a “10” (fim de arquivo)
Se WS-CTLIDO-M > 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 código do cliente em CLIOLD for menor que o de MOVCLI
Somar 1 ao contador de cadastros inválidos
Ler o próximo registro de CLIOLD (1100-LER-CLIOLD)
Senão
Se o código do cliente em CLIOLD for maior que o de MOVCLI
Executar o parágrafo 2100-INCLUIR
Ler o próximo registro de CLIMOV (1200-LER-CLIMOV)
Senão
(o código do cliente em CLIOLD é igual ao de MOVCLI)
Executar o parágrafo 2200-ALT-EXC
Ler o próximo registro de CLIOLD (1100-LER-CLIOLD)
Ler o próximo registro de CLIMOV (1200-LER-CLIMOV)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 7 41

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

Se o nome do cliente em CLIMOV for diferentes de espaços


Mover o nome do CLIMOV para o nome do NEWCLI
Senão
Mover o nome do CLIOLD para o nome do NEWCLI

Se o endereço do cliente em CLIMOV for diferentes de espaços


Mover o endereço do CLIMOV para o endereço do NEWCLI
Senão
Mover o endereço do OLDCLI para o endereço do NEWCLI

Se o telefone do cliente em CLIMOV for diferentes de espaços


Mover o telefone do CLIMOV para o telefone do NEWCLI
Senão
Mover o telefone do OLDCLI para o telefone do NEWCLI

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


42 Parte 7
Se o total da dívida em CLIMOV for numérico (IS NUMERIC)
Mover esse valor de CLIMOV para o total da dívida do NEWCLI
Senão
Se WS-RESP NOT = “0”
Mover esse valor de CLIMOV para o total da dívida do NEWCLI

Gravar o registro do NEWCLI a partir da variável espelho

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)

Somar 1 ao contador de cadastros gravados CLINEW

Parágrafo 3000-TERMINO
Executar rotina 9000-IMPRIME-DATA

Fechar o arquivo CLIOLD


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 CLIMOV


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 CLINEW


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
Mover contadores para as variáveis formatadas
Exibir 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

Exibir o tempo total de processamento

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 7 43

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


44 Parte 7

Avaliação Então...Como foi ?!?

Estou fera!

Fiz Certo!

 Muito Bom  Bom  regular  ruim  Muito ruim

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte

Caracteres de controle de impressão ASA

As impressoras de Mainframe usam


alguns caracteres de controle muito simples no
começo de cada linha para controlar o
movimento do papel em uma impressora de
linha. “ASA” é a sigla de American Standards
Association, o antigo nome da American
National Standards Institute (ANSI), que se
acredita ter sancionado esses caracteres de
controle.
Versão 2.3.5
Parte 8 3

Preparation

Trocando Ideias É agora que você fala !!

Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na


capa desta parte. Isso é importante para que seu instrutor e seus colegas
saibam como está seu conhecimento sobre o assunto e se você precisa ou
pode fornecer ajuda aos colegas e instrutor.

 O que você já sabe ?


 O que você não sabe ?
 Porque é importante conhecer estes tópicos ?
 Quais são os seus temores ?

8
 O que você considera difícil ?

Reflexão É aqui que você se compromete !!

Depois de falar sobre o assunto com seus colegas e instrutor, escreva,


desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses
tópicos. Comprometa-se!

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


4 Parte 8

Presentation

História Relatórios ... finalmente

Relatórios...Finalmente, nós sabemos que você não via a hora de começar a


fazer o seu. Fazer relatórios é uma arte, pois além da preocupação com a lógica de
impressão dos cabeçalhos, linha de detalhe e rodapé, há também a preocupação
estética. Em um bom relatório é fácil encontrar o que se procura, bonito de se ler, e
sempre tem o comentário do usuário: “dava para colocar esse título um pouquinho
mais para a esquerda?”.

É 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.

A XPTO Consultoria em Desenvolvimento de Software é reconhecida pela


qualidade de seus relatórios, então vamos trabalhar para que esse legado perdure.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 8 5

Teoria Tratamento de relatório

Para o COBOL, um relatório é um arquivo. As linhas que compõem um relatório,


tais como cabeçalhos, detalhes, totais e rodapés são todos registros deste arquivo.
Portanto é muito similar ao processamento de arquivos sequenciais. Porém, como
todos os registros gravados no relatório são diferentes, eles precisam ser definidos
como variáveis na WORKING-STORAGE SECTION.

Para que um programa COBOL possa manipular relatório é necessário cumprir


quatro etapas:

1ª – Especificação do Relatório

Um relatório precisa ser especificado na ENVIRONMENT DIVISION, Seção


INPUT-OUTPUT SECTION, parágrafo FILE-CONTROL. A cláusula SELECT faz essa
especificação, como mostra o exemplo abaixo:

----+-*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

Na FILE SECTION da DATA DIVISION, descrevemos o relatório e seu registro.


Vale observar que um relatório não possui campos. O registro é definido com a sua
largura total. No exemplo abaixo 80 caracteres.
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXDATAXXXXXXXXXXXX XXXXXXXDIVISION.
XXXXXXXFILEXXXXXXXXXXXXXX XXXXXSECTION.
0,XXXXXFDxxRELPROD
XXXXXXXXXXXLABEL RECORD OMITTED
XXXXXXXXXXXRECORDING MODE IS F
XXXXXXXXXXXRECORD CONTAINS 80 CHARACTERS
XXXXXXXXXXXDATA RECORD IS REG-RELPROD
XXXXXXXXXXX.
XXXXXXX01XXREG-RELPROD PIC X(80).

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


6 Parte 8
3ª – Especificação do layout do relatório

O layout do relatório precisa ser especificado em termos de linhas. As primeiras


linhas são chamadas de CABEÇALHOS e sempre aparecem no início de cada página.
As linhas com os dados impressos são chamadas de DETALHES e as últimas linhas
são os RODAPÉS e estão presentes no final de todas as páginas.

A seguir temos um exemplo de lay-out do relatório RELPROD e a


especificação na WORKING-STORAGE SECTION.de seus CABEÇALHOS, DETALHE
e RODAPE.
01 12345678911234567892123456789312345678941234567895123456789612345678971234567898
02 12345678901234567890123456789012345678901234567890123456789012345678901234567890
01 DD/MM/20AA HH:MM:SS RELACAO DE PRODUTOS PARA REPOSICAO DO ESTOQUE PAG. Z9
02 -------------------------------------------------------------------------------- CABEÇALHO
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
46 99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
DETALHE
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 RODAPÉ

----+-*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.

01 WS-CABEC2 PIC X(80)


VALUE ALL "-".
Cabeçalhos 01 WS-CABEC3.
05 FILLER PIC X(40)
VALUE ** OBSERVE ATENTAMENTE **
" CODIGO DESCRICAO Q".
05 FILLER PIC X(40) Os cabeçalhos, linha de detalhe e
VALUE rodapé são construídos com
"T.EST. QT.MIN. QT.REP. ULT.PRECO ".
constantes e variáveis, seguindo o
01 WS-CABEC4. layout do relatório.
05 FILLER PIC X(40)
VALUE
Os espaços entre os dados devem
" ------ ------------------------- -".
05 FILLER PIC X(40) ser declarados como SPACES.
VALUE
"------ ------- ------- --------- ". FILLER é uma constante e pode
assumir qualquer valor especificado
por VALUES.

“Desenhar” o relatório no COBOL


requer atenção aos detalhes, caso
contrário, ele ficará “desalinhado”.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 8 7
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
01 WS-LINDET.
05 FILLER PIC X(02)
VALUE SPACES.
05 LD-CODPROD PIC 99.999.
05 FILLER PIC X(03)
VALUE SPACES.
05 LD-DESCRICAO PIC X(25).
05 FILLER PIC X(05)
VALUE SPACES.
Linha de 05 LD-QTDEST PIC 999.
05 FILLER PIC X(07)
Detalhe VALUE SPACES.
05 LD-QTDMIN PIC 999.
05 FILLER PIC X(07)
VALUE SPACES.
05 LD-QTDREP PIC 999.
05 FILLER PIC X(06)
VALUE SPACES.
05 LD-PRECO PIC Z.ZZ9,99.
05 FILLER PIC X(02)
VALUE SPACES.

01 WS-RODAPE1 PIC X(80)


VALUE ALL "-".
01 WS-RODAPE2.
05 FILLER PIC X(40)
Rodapé VALUE
" INDUSTRIAS SEU NOME LTDA. ".
05 FILLER PIC X(40)
VALUE
" SERVIMOS BEM PARA SERVIR SEMPRE ".

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

XxxxxxxxxxxIF FS-RELPROD NOT = “00”


XXXXXXXXXXXXXXMOVE “ERRO ABERTURA RELPROD” TO WS-MSG
XXXXXXXXXXXXXXMOVE FS-RELPROD TO WS-FS
XXXXXXXXXXXXXXGO TO 999-ERRO
XXXXXXXXXXXEND-IF

O programa precisa controlar a mudança de página. Para isto o programa deve


criar uma variável para contar linhas, que deve ser incrementada a cada comando
WRITE do relatório. Quando esta variável atinge o número de linhas disponíveis na
folha, o programa deve comandar o salto para a nova folha e imprimir as linhas de
cabeçalho. As variáveis de controle são exemplificadas abaixo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXxX77 WS-CTLIN PIC 9(02).
XXXXXxX77 WS-CTIMP PIC 9(03).
XXXXxXX77 WS-CTPAG PIC 9(02).
XXXXxXX77 WS-PULA PIC 9(02).

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


8 Parte 8
O WRITE sempre grava o registro do arquivo, neste exemplo o REG-
RELPROD. Mas os dados devem vir dos cabeçalhos, detalhe ou rodapé. A cláusula
FROM determina de onde os dados são carregados. Abaixo temos um exemplo de
impressão do cabeçalho:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
040-IMPRIME-CABECALHO.
MOVE WS-DATA-FORMATADA TO WS-DATA-CABEC1
MOVE WS-HORA-FORMATADA TO WS-HORA-CABEC1

ADD 1 TO WS-CTPAG

MOVE WS-CTPAG TO WS-PAG-CABEC1

WRITE REG-RELATO FROM WS-CABEC1 AFTER PAGE


WRITE REG-RELATO FROM WS-CABEC2
WRITE REG-RELATO FROM WS-CABEC3
WRITE REG-RELATO FROM WS-CABEC4

MOVE 4 TO WS-CTLIN
.

Neste exemplo foi suprimido o teste do FILE STATUS, para melhor


visualização do WRITE.

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.

Observe que a data está sendo atualizada e o número da página foi


incrementado de 1. No final, como foram gravadas 4 linhas, devendo então mover
esse valor para o contador de linha WS-CTLIN.

Abaixo temos um exemplo da impressão da linha de detalhe.


----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
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

WRITE REG-RELATO FROM WS-LINDET

IF FS-RELATO NOT = "00"


MOVE "ERRO IMPRESSAO LINDET" TO WS-MSG
MOVE FS-RELATO TO WS-FS
GO TO 999-ERRO
END-IF

ADD 1 TO WS-CTIMP
ADD 1 TO WS-CTLIN
.

Observe que os dados foram movidos, na verdade copiados, dos campos do


arquivo de entrada para as variáveis da WS-LINDET, para depois serem gravadas no
relatório. A variável contador de linhas (WS-CTLIN) e contador de linhas de detalhe
impressas (WS-CTIMP) são incrementadas.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 8 9

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

WRITE REG-RELATO FROM WS-RODAPE1 AFTER WS-PULA LINES


WRITE REG-RELATO FROM WS-RODAPE2

MOVE 50 TO WS-CTLIN
.

Neste exemplo foi suprimido o teste do FILE STATUS, para melhor


visualização do WRITE.

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.

A figura abaixo mostra que qualquer informação gravada no relatório


(cabeçalhos, detalhe e rodapé) deve obrigatoriamente passar pelo registro do relatório

8
(REG-RELPROD), pela opção FROM.

REG-RELPROD

RELPROD

É comum haver totalizações em vários níveis (sub-totais, totais gerais, etc).


Estes totais são emitidos quando muda a identificação de grupo dentro dos registros
lidos. Por exemplo, em um relatório de vendas com totais por mês, o programa deve
comparar o mês do registro lido com o mês do registro anterior para verificar se são
diferentes. Nestas mudanças de identificador de grupo (geralmente conhecidos como
QUEBRA), o programa deve emitir uma linha de total, e acertar convenientemente as
variáveis de totalização.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


10 Parte 8
As formas de escrever WRITE em relatórios são:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXWRITE REG-RELATORIO FROM WS-LINHA
XXXXXXXXXXXWRITE REG-RELATORIO FROM WS-LINHA AFTER PAGE
XXXXXXXXXXXWRITE REG-RELATORIO FROM WS-LINHA AFTER LINE
XXXXXXXXXXXWRITE REG-RELATORIO FROM WS-LINHA AFTER 5 LINES
XXXXXXXXXXXWRITE REG-RELATORIO FROM WS-LINHA BEFORE PAGE
XXXXXXXXXXXWRITE REG-RELATORIO FROM WS-LINHA BEFORE LINE
XXXXXXXXXXXWRITE REG-RELATORIO FROM WS-LINHA BEFORE N LINES

Quando a opção AFTER for utilizada, o COBOL primeiro executa o AFTER,


pulando N páginas ou N linhas e depois grava o registro no relatório. Quando N for
omitido, o valor default (padrão) é 1.

Quando a opção BEFORE for utilizada, o COBOL primeiro grava o registro no


relatório e depois pula N páginas ou N linhas. Também quando N for omitido, o valor
default é 1.

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.

TIPOS DE FORMULÁRIO CONTÍNUO

ZEBRADO PRÉ-IMPRESSO BRANCO

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 8 11

Caracteres de controle de impressão – ASA


A maioria das impressoras de Mainframe são configuradas para imprimir uma
largura fixa de 132 caracteres. Os arquivos passados à impressora têm um registro
com comprimento de 133 caracteres. A razão para essa diferença de um caractere é
que as impressoras de Mainframe esperam que todas as linhas sejam precedidas por
um caractere de controle.
Existem dois tipos diferentes de caracteres de controle que podem ser usados,
MACHINE e ASA, mas ASA é o caractere de controle mais comumente usado. ASA
significa American Standard Association, hoje conhecida como ANSI American
National Standard Institute. Os caracteres de controle ASA controlam o movimento do
papel pela impressora a fim de determinar onde cada linha será impressa no papel.

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.

Caractere ASA Ação Siginificado


Blank Next line Avança para próxima linha
0 Skip one line Pula uma linha
- Skyp two lines Pula duas linhas
+ Overtype previous line Sobrepõe última linha impressa
1 Page feed Pula 1 página

----+-*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

* SKIP ONE LINE (PULA UMA LINHA)


XXXXXXXXXXXWRITE REG-RELATORIO FROM WS-LINHA AFTER 2 LINES

* SKIP TWO LINES (PULA DUAS LINHA)


XXXXXXXXXXXWRITE REG-RELATORIO FROM WS-LINHA AFTER 3 LINES

* OVERTIPE PREVIOUS LINE (SOBREPOEM ULTIMA LINHA IMPRESSA)


XXXXXXXXXXXWRITE REG-RELATORIO FROM WS-LINHA AFTER 0 LINE

* PAGE FEED (PULA 1 PAGINA)


XXXXXXXXXXXWRITE REG-RELATORIO FROM WS-LINHA AFTER PAGE

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


12 Parte 8
BLANK WHEN ZERO

Esta cláusula, usada após a máscara de edição da PICTURE, exibe espaços


em branco quando a variável numérica tem valor zero, independente do formato da
máscara. Exemplo:

05 LD-VALOR PIC ZZ.ZZ9,99 BLANK WHEN ZERO.

Quando um relatório possui muitas colunas numéricas com alta probabilidade


de zero, essa cláusula deixa o relatório mais limpo.

Exemplo sem o uso de BLANK WHEN ZERO.


15/02/2012XXXXX XXRESUMOXDEXPRODUTOS A PARTIR DE FEVEREIRO/12XXXXXXXXXPAG.X01
--------------------------------------------------------------------------------
CODIGO DESCRICAO PRECO LUCRO ESTOQUE REPOSICAO
--------------------------------------------------------------------------------
0001 PARAFUSO SEXTAVADO R$ 1,00 0,00 0 0
0010 PORCA SEXTAVADA R$ 2,10 1,00 10 100
0015 PORTA DE MOGNO R$ 300,50 10,15 200 0
0025 CAIXA DE FERRAMENTAS R$ 125,00 0,00 0 0
0150 COMPRESSOR 35 LITROS R$ 1.250,15 0,00 0 0
--------------------------------------------------------------------------------
INDUSTRIAS SEUNOME S/A. SERVIMOS BEM PARA SERVIR SEMPRE.

Exemplo com uso de BLANK WHEN ZERO.

15/02/2012XXXXX XXRESUMOXDEXPRODUTOS A PARTIR DE FEVEREIRO/12XXXXXXXXXPAG.X01


--------------------------------------------------------------------------------
CODIGO DESCRICAO PRECO LUCRO ESTOQUE REPOSICAO
--------------------------------------------------------------------------------
0001 PARAFUSO SEXTAVADO R$ 1,00
0010 PORCA SEXTAVADA R$ 2,10 1,00 10 100
0015 PORTA DE MOGNO R$ 300,50 10,15 200
0025 CAIXA DE FERRAMENTAS R$ 125,00
0150 COMPRESSOR 35 LITROS R$ 1.250,15
--------------------------------------------------------------------------------
INDUSTRIAS SEUNOME S/A. SERVIMOS BEM PARA SERVIR SEMPRE.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 8 13

EXEMPLO RELATÓRIO

Objetivo do Programa

Imprimir um relatório com a quantidade de produtos para repor o estoque em


sua quantidade máxima. Os produtos estão gravados no arquivo ESTOQUE, em
ordem crescente de código de produto e o relatório terá sua imagem gravada no
arquivo RELATO.

Macro-Fluxo

8
ESTOQUE

EEXXNN07

RELATO

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


14 Parte 8
Layout dos Arquivos

Nome do Arquivo ESTOQUE


Nome do Registro REG-ESTOQUE
Nome do Campo Tipo e Tamanho Descrição
CODPROD-E 9(05) Código do produto
DESCRICAO-E X(25) Descrição
QTDEST-E 9(03) Qtde. em estoque
QTDMIN-E 9(03) Qtde. Mínima
QTDMAX-E 9(03) Qtde. Máxima
PRECO-E 9(04)V99 Preço

Nome do Arquivo RELATO


Nome do Registro Tipo e Tamanho Descrição
REG-RELATO X(80) Relatório de 80 colunas

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

Nem todos os registros do arquivo ESTOQUE serão impressos, apenas


aqueles cuja quantidade em estoque esteja abaixo do limite mínimo, sendo necessário
comprar a quantidade suficiente para atingir o limite máximo.

O relatório RELATO possui 80 colunas e 50 linhas por página. São 4 linhas de


cabeçalho, 44 linhas de detalhe e 2 linhas de rodapé.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 8 15

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


16 Parte 8
----+-*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(45)
VALUE
"RELACAO DE PRODUTOS PARA REPOSICAO DE ESTOQUE".
05 FILLER PIC X(11)
VALUE
" PAG. ".
05 WS-PAG-CABEC1 PIC Z9.
01 WS-CABEC2 PIC X(80)
Cabeçalhos VALUE ALL "-".
01 WS-CABEC3.
05 FILLER PIC X(40)
VALUE
" CODIGO DESCRICAO Q".
05 FILLER PIC X(40)
VALUE
"T.EST. QT.MIN. QT.REP. ULT.PRECO ".
01 WS-CABEC4.
05 FILLER PIC X(40)
VALUE
" ------ ------------------------- -".
05 FILLER PIC X(40)
VALUE
"------ ------- ------- --------- ".
01 WS-LINDET.
05 FILLER PIC X(02)
VALUE SPACES.
05 LD-CODPROD PIC 99.999.
05 FILLER PIC X(03)
VALUE SPACES.
05 LD-DESCRICAO PIC X(25).
05 FILLER PIC X(05)
VALUE SPACES.
Linha de 05 LD-QTDEST PIC 999.
05 FILLER PIC X(07)
detalhe VALUE SPACES.
05 LD-QTDMIN PIC 999.
05 FILLER PIC X(07)
VALUE SPACES.
05 LD-QTDREP PIC 999.
05 FILLER PIC X(06)
VALUE SPACES.
05 LD-PRECO PIC Z.ZZ9,99.
05 FILLER PIC X(02)
VALUE SPACES.
01 WS-RODAPE1 PIC X(80)
VALUE ALL "-".
01 WS-RODAPE2.
05 FILLER PIC X(40)
VALUE
Rodapé " INDUSTRIAS SEU NOME LTDA. ".
05 FILLER PIC X(40)
VALUE
" SERVIMOS BEM PARA SERVIR SEMPRE ".

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 8 17
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
01 WS-REG-ESTOQUE.
05 WS-CODPROD-E PIC 9(05).
05 WS-DESCRICAO-E PIC X(25).
05 WS-QTDEST-E PIC 9(03).
05 WS-QTDMIN-E PIC 9(03).
05 WS-QTDMAX-E PIC 9(03).
05 WS-PRECO-E PIC 9(04)V99.

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.

77 FS-ESTOQUE PIC X(02).


77 FS-RELATO PIC X(02).
77 WS-CTLIDO PIC 9(03).
77 WS-CTDESP PIC 9(03).
77 WS-CTIMP PIC 9(03).
77 WS-CTLIN PIC 9(02).
77 WS-CTPAG PIC 9(02).
77 WS-PULA PIC 9(02).
77 WS-MSG PIC X(60).
77 WS-FS PIC X(02).
77 WS-QTDREP PIC 9(03).

*----------------------------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------------------------*
000-EEXXNN07.
PERFORM 010-INICIALIZAR
PERFORM 030-PROCESSAR
UNTIL FS-ESTOQUE = "10"
PERFORM 070-TERMINO
STOP RUN
.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


18 Parte 8
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
010-INICIALIZAR.
MOVE 0 TO WS-CTLIDO
MOVE 0 TO WS-CTDESP
MOVE 0 TO WS-CTIMP
MOVE 99 TO WS-CTLIN
MOVE 0 TO WS-CTPAG

OPEN INPUT ESTOQUE

IF FS-ESTOQUE NOT = "00"


MOVE "ERRO ABERTURA ESTOQUE" TO WS-MSG
MOVE FS-ESTOQUE TO WS-FS
GO TO 999-ERRO
END-IF

OPEN OUTPUT RELATO

IF FS-RELATO NOT = "00"


MOVE "ERRO ABERTURA ESTOQUE" TO WS-MSG
MOVE FS-RELATO TO WS-FS
GO TO 999-ERRO
END-IF

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
.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 8 19
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
040-IMPRIME-CABECALHO.
MOVE WS-DATA-FORMATADA TO WS-DATA-CABEC1
MOVE WS-HORA-FORMATADA TO WS-HORA-CABEC1

ADD 1 TO WS-CTPAG

MOVE WS-CTPAG TO WS-PAG-CABEC1


WRITE REG-RELATO FROM WS-CABEC1 AFTER PAGE

IF FS-RELATO NOT = "00"


MOVE "ERRO IMPRESSAO WS-CABEC1" TO WS-MSG
MOVE FS-RELATO TO WS-FS
GO TO 999-ERRO
END-IF

WRITE REG-RELATO FROM WS-CABEC2

IF FS-RELATO NOT = "00"


MOVE "ERRO IMPRESSAO WS-CABEC2" TO WS-MSG
MOVE FS-RELATO TO WS-FS
GO TO 999-ERRO
END-IF

WRITE REG-RELATO FROM WS-CABEC3

IF FS-RELATO NOT = "00"


MOVE "ERRO IMPRESSAO WS-CABEC3" TO WS-MSG
MOVE FS-RELATO TO WS-FS
GO TO 999-ERRO

8
END-IF

WRITE REG-RELATO FROM WS-CABEC4

IF FS-RELATO NOT = "00"


MOVE "ERRO IMPRESSAO WS-CABEC4" TO WS-MSG
MOVE FS-RELATO TO WS-FS
GO TO 999-ERRO
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

WRITE REG-RELATO FROM WS-LINDET

IF FS-RELATO NOT = "00"


MOVE "ERRO IMPRESSAO LINDET" TO WS-MSG
MOVE FS-RELATO TO WS-FS
GO TO 999-ERRO
END-IF

ADD 1 TO WS-CTIMP
ADD 1 TO WS-CTLIN
.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


20 Parte 8
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
060-IMPRIME-RODAPE.
COMPUTE WS-PULA = 49 – WS-CTLINHA

WRITE REG-RELATO FROM WS-RODAPE1 AFTER WS-PULA LINES


IF FS-RELATO NOT = "00"
MOVE "ERRO IMPRESSAO WS-RODAPE1" TO WS-MSG
MOVE FS-RELATO TO WS-FS
GO TO 999-ERRO
END-IF

WRITE REG-RELATO FROM WS-RODAPE2


IF FS-RELATO NOT = "00"
MOVE "ERRO IMPRESSAO WS-RODAPE2" TO WS-MSG
MOVE FS-RELATO TO WS-FS
GO TO 999-ERRO
END-IF

MOVE 50 TO WS-CTLIN
.

070-TERMINO.
IF WS-CTLIN < 50
PERFORM 060-IMPRIME-RODAPE
END-IF

DISPLAY "TOTAL DE REGISTROS LIDOS = " WS-CTLIDO


DISPLAY "TOTAL DE REGISTROS IMPRESSOS = " WS-CTIMP
DISPLAY "TOTAL DE REGISTROS DESPREZADOS = " WS-CTDESP

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 "*------------------------------------------*"
.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 8 21
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
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 " `(C "
DISPLAY " DEU ERRO!!! "
DISPLAY "*------------------------------------------*"
DISPLAY " TERMINO ANORMAL DO EEXXNN07 "
DISPLAY "*------------------------------------------*"
STOP RUN
.

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
.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


22 Parte 8

Anatomia de um

com escala em sextos (linhas) e décimos (colunas) de polegadas


Formulário contínuo

serrilha ou Régua para formulário contínuo


micro serrilha
de 1/6 de polegada
66 linhas

remalina

80 ou 132 colunas
de 1/10 de polegada

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 8 23

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 !

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


24 Parte 8

Practice

Atividade Revisão aos pares

1) O relatório abaixo possui 50 linhas por página.


Associe os componentes indicados no relatório com a
coluna da direita.

DD/MM/20AA HH:MM:SS RELACAO DE PRODUTOS PARA REPOSICAO DO ESTOQUE PAG. Z9


--------------------------------------------------------------------------------
CODIGO DESCRICAO QT.EST. QT.MIN. QT.REP. ULT.PRECO
1
4 ------ ------------------------- ------- ------- ------- ---------
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999
99.999
99.999
XXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXX
999
999
999
999
999
999
999
999
999
Z.ZZ9,99
Z.ZZ9,99
Z.ZZ9,99
( ) – Microserrilha
99.999
99.999
XXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXX
999
999
999
999
999
999
Z.ZZ9,99
Z.ZZ9,99 ( ) – Rodapé
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999
99.999
XXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXX
999
999
999
999
999
999
Z.ZZ9,99
Z.ZZ9,99 ( ) – Remalina
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999
99.999
XXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXX
999
999
999
999
999
999
Z.ZZ9,99
Z.ZZ9,99
( ) – Cabeçalho
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999
99.999
XXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXX
999
999
999
999
999
999
Z.ZZ9,99
Z.ZZ9,99
( ) – Detalhe
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999
99.999
XXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXX
999
999
999
999
999
999
Z.ZZ9,99
Z.ZZ9,99 2
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
99.999 XXXXXXXXXXXXXXXXXXXXXXXXX 999 999 999 Z.ZZ9,99
--------------------------------------------------------------------------------
INDUSTRIAS SEU NOME LTDA. SERVIMOS BEM PARA SERVIR SEMPRE 3
5

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 8 25

Atividade Trabalho em dupla

1) Com base na imagem do relatório da atividade


anterior, determine o que fazer com as variáveis?

a) Variável WS-CTPAG na rotina de Cabeçalho.

8
b) Variável WS-CTLINHA na rotina de impressão de Cabeçalho.

c) Variável WS-CTLINHA na rotina de impressão de Linha de Detalhe.

d) Variável WS-CTLINHA na rotina de impressão de Rodapé.

e) Variável WS-PULA na rotina de impressão de Rodapé.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


26 Parte 8

Performance

Atividade Projeto 7

Objetivo do Programa

A Box Company do Brasil precisa de um programa para imprimir um relatório


com a movimentação de estoque.

Os registros da movimentação do estoque estão gravados no arquivo


sequencial MOVTOEST, com Header, Data e Trailer. A imagem do relatório será
gravada no arquivo RELMOV01.

Macro-Fluxo

MOVTOEST

GPXXNN07

RELMOV01

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 8 27

Layout dos Arquivos

Nome do Arquivo MOVTOEST


Nome do Registro REG-MOVTOEST
Nome do Campo Tipo e Tamanho Descrição
TIPO-REG-MOVTO X(01) H=HEADER, D=DATA, T=TRAILER
FILLER X(32)

Nome do Registro REG-MOVTOEST-HEADER


Nome do Campo Tipo e Tamanho Descrição
FILLER X(01) H=HEADER
SIGLA-SYS-CAD X(05) Sigla do Sistema
ANO-MES-REF-CAD X(06) Ano e mês de referência AAAAMM
FILLER X(21)

Nome do Registro REG-MOVTOEST-DATA


Nome do Campo Tipo e Tamanho Descrição
FILLER X(01) D=DATA
NUMMOVTO 9(08) Número do movimento
DATAMOVTO 9(08) Data do movimento AAAAMMDD
HORAMOVTO 9(06) Hora do movimento HHMMSS
CODPRODMOVTO 9(04) Código do produto

8
TIPOMOVTO X(01) Tipo do movimento E=entrada S=saída
QTDMOVTO 9(08) COMP-3 Quantidade movimentada

Nome do Registro REG-MOVTOEST-TRAILER


Nome do Campo Tipo e Tamanho Descrição
FILLER X(01) Trailer “T”
QTDREG-MOVTO 9(05) Quantidade de registros no arquivo
FILLER X(27)

Nome do Arquivo RELMOV01


Nome do Registro Tipo e Tamanho Descrição
REG-RELMOV01 X(80) Relatório de 80 colunas

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


28 Parte 8
Layout do Relatório

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 8 29

Observação

O mês de referencia do Header (H) será usado para a montagem do cabeçalho.


Todas as linhas de Data (D) serão impressas nas linhas de detalhe. A quantidade de
registros apontados no Trailer (T) deve bater com a quantidade de linhas de detalhe
impressas, caso contrário, ABENDAR o programa com RETURN CODE 12.

O relatório RELMOV01 possui 80 colunas e 50 linhas por página. São 5 linhas


de cabeçalho, 43 linhas de detalhe e 2 linhas de rodapé.

O RELMOV01 tem 5 linhas de cabeçalho, a saber:

WS-CABEC1, que contém as variáveis

WS-DATA-CABEC1 WS-HORA-CABEC1

DD/MM/20AA ** BOX COMPANY DO BRASIL ** HH:MM:SS

WS-CABEC2, que contém as variáveis 8


WS-REF-CABEC2 WS-PAG-CABEC2

RELATORIO DE MOVIMENTACAO DE ESTOQUE (REFERENCIA 9999/99) PAG. Z.ZZ9

WS-CABEC3, que contém 80 traços “-“


WS-CABEC4, que contém os títulos das colunas
WS-CABEC5, que contém traços “-“ sobre as colunas

Vou fazer
direito.
Eu
prometo!

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


30 Parte 8
Tem também 1 linha de detalhe, WS-LINDET, com as variáveis:

LD-NUMMOVTO
LD-DATAMOVTO
LD-HORAMOVTO

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

LD-CODPRODMOVTO
LD-QTDMOVTO

Finalmente tem 2 linhas de rodapé

59 WS-RODAPE1, que contém 80 traços


60 WS-RODAPE2, Que contém uma frase

Ao carregar data e hora pela rotina de inicialização, garantimos que em todas


as páginas do relatório teremos a mesma data e hora. Isso é crítico quando os
relatórios são longos e impressos próximos à meia-noite.

Execute os passos abaixo (Lembre-se de que XXNN é o seu prefixo de


usuário):

1) Pela TSO, opção P.2 (Edit Entry Panel), crie o programa GPXXNN07 em
sua COBLIB.

2) Digite o programa COBOL conforme orientação para processamento. Utilize


flags (nível 88) para verificar o FILE STATUS dos arquivos.

3) Compile com o job COMPCOB e elimine os erros até obter MAXCC = 0

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.

5) Execute o programa com o job EXECOB07. Compare o resultado com os


dos colegas.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 8 31

Orientação para processamento

Parágrafo Principal (0000-GPAZNN07)


Executar o parágrafo 1000-INICIALIZAR
Executar o parágrafo 2000-PROCESSAR
até que WS-TIPO-REG-MOVTO = “T”
Executar o parágrafo 3000-TERMINO
Encerrar o programa

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

Abrir para leitura o arquivo MOVTOEST


Se file status for diferente de “00”

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)

Ler o primeiro registro do MOVTOEST (1100-LER-MOVTOEST)


Se file status for igual a “10” (fim do 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)

Se WS-TIPO-REG-MOVTO não for H (Header)


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)

Salvar em variável o ano e mês de referencia do registro de Header

Abrir para gravação o arquivo RELMOV01


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)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


32 Parte 8
Ler o segundo registro do MOVTOEST (1100-LER-MOVTOEST)
Se WS-TIPO-REG-MOVTO não for D (Data)
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 9100-FORMATA-DATA-HORA

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

Executar o parágrafo 2200-IMPRIME-DETALHE

Se o contador de linha for igual a 48


Executar o parágrafo 2300-IMPRIME-RODAPE

Executar o parágrafo 1100-LER-MOVTOEST

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

Lembre que o 1º cabeçalho deve ser AFTER PAGE

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 8 33

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

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)

Somar 1 ao contador de linha


Somar 1 ao contador de registros impressos

Parágrafo 2300-IMPRIME-RODAPE

8
Calcular WS-PULA = 48 – WS-CTLINHA

gravar as 2 linhas de rodapé 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 50 para o contador de linha

Lembre que o 1º rodapé deve ser AFTER WS-PULA LINES

Parágrafo 3000-TERMINO
Executar rotina 9000-IMPRIME-DATA

Se o contador de linha for menor que 50


Executar o parágrafo 2300-IMPRIME-RODAPE

Fechar o arquivo MOVTOEST


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)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


34 Parte 8

Fechar o arquivo RELMOV01


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)

Se WS-QTDREG-MOVTO (do trailer) for diferente do contador de impressos


Mover 12 para RETURN-CODE
Parar o programa

Receber o horário final de processamento


Calcular o tempo de processamento
Mover contadores para as variáveis formatadas
Exibir os contadores:
registros lidos
linhas impressas
páginas impressas

Exibir o tempo total de processamento

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 8 35

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


36 Parte 8

Avaliação Então...Como foi ?!?

Estou fera!

Fiz Certo!

 Muito Bom  Bom  regular  ruim  Muito ruim

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte

VSAM (Virtual Storage Access Method) é


um sistema de gerenciamento de arquivos
introduzido pela IBM nos anos de 1970 como
parte dos sistemas operacionais da época. Embora
atualmente existam outros métodos de acesso
(não-VSAM), VSAM é o principal componente dos
sistemas operacionais IBM.
Versão 2.3.5
Parte 9 3

Preparation

Trocando Ideias É agora que você fala !!

Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na


capa desta parte. Isso é importante para que seu instrutor e seus colegas
saibam como está seu conhecimento sobre o assunto e se você precisa ou
pode fornecer ajuda aos colegas e instrutor.

 O que você já sabe ?


 O que você não sabe ?
 Porque é importante conhecer estes tópicos ?
 Quais são os seus temores ?
 O que você considera difícil ?

9
Reflexão É aqui que você se compromete !!

Depois de falar sobre o assunto com seus colegas e instrutor, escreva,


desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses
tópicos. Comprometa-se!

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


4 Parte 9

Presentation

História OUTROS TIPOS DE ARQUIVOS?

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.

Mas existem outras formas de organizar os registros em um arquivo. É isso que


vamos aprender nesta parte. VSAM é uma dessas formas, onde os registros podem
ser organizados em arquivos de forma sequencial, indexada ou relativa.

Apesar dos novos sistemas de informação desenvolvidos em mainframe terem


seus dados armazenados em sistemas gerenciadores de bancos de dados (SGBD),
tais como o DB2, ainda há muitos sistemas legados que utilizam arquivos VSAM. Por
isso é importante conhecer essa forma de armazenar registros.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 9 5

Teoria Arquivos vsam

VSAM é um acrônimo para Virtual Storage Access Method. É um método de


acesso para arquivos armazenados em disco. No Mainframe, os discos são
conhecidos pelo acrônimo DASD, que significa Direct Access Storage Device. A
organização física dos arquivos VSAM difere consideravelmente das outras usadas
por outros métodos de acesso. Existem três principais tipos de organização física para
os arquivos VSAM:

VSAM – ESDS (Entry Sequenced Data Set) – Os registros do arquivo são


armazenados na ordem em que foram gravados, em uma sequência, um após o outro.
0600FECHADURA
0100PARAFUSO

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


6 Parte 9
VSAM – RRDS (Relative Record Data Set) – Os registros estão alocados em
células (slots) de tamanho fixo. A chave é a posição do registro dentro do arquivo. Por
exemplo, para ler o centésimo registro do arquivo, fornecemos o valor 100 como chave.
Nos arquivos VSAM RRDS é necessário um algoritmo de Hash para associar um
determinado registro com sua posição no arquivo. Apesar dos arquivos VSAM RRDS
serem mais eficientes no processamento, a exigência de se criar este algoritmo de
Hash restringe muito seu uso.

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

O uso de Arquivos VSAM exige sintaxe especializada em algumas partes do


COBOL que descreveremos em seguida.

Teoria Vsam KSDS via IDCAMS

O utilitário IDCAMS (Intergrated Data Control Access Method Service) é usado


para criar, excluir, alterar e imprimir arquivos VSAM. Ao executar o IDCAMS devemos
informar via SYSIN comandos AMS, tais como DEFINE, DELETE, REPRO, PRINT, etc.
O JOB abaixo cria o arquivo VSAM KSDS chamado GP.GPXXNN.VCADPRD, que
será usado nos próximos programas deste módulo.
12345678911234567892123456789312345678941234567895123456789612345678971234567898
12345678901234567890123456789012345678901234567890123456789012345678901234567890
//GPXXNN11xxJOBxxSEUNOME,CLASS=A,MSGCLASS=X,NOTIFY=GPXXNN,TIME=(0,20)
//*********************************************************************
//STEP001xxxEXECxPGM=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))
/*
observe que há apenas 1 espaço em branco no início de cada linha da SYSIN

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 9 7

Na SYSIN é passado as instruções para o IDCAMS executar suas ações. A


instrução:

DELETE GP.GPXXNN.VCADPRD PURGE CLUSTER

vai tentar excluir o arquivo VSAM GP.GPXXNN.VCADPRD, pois não é possível


criar um arquivo VSAM se ele já existir. Mas a tentativa de excluir um arquivo que não
exista dá erro MAXCC=8, assim a instrução:

IF MAXCC = 8 THEN SET MAXCC=0

volta o MAXCC para zero. Na sequência temos a definição do arquivo DEFINE


CLUSTER que possui os seguintes parâmetros:

NAME (GP.GPXXNN.VCADPRD) nome do arquivo VSAM


VOL (PR39T7) nome do volume (disco) onde o VSAM será criado
TRK (1,1) tamanho do arquivo, no caso 1 trilha na alocação
primária e 1 na secundária
RECORDSIZE (69,69) tamanho mínimo e máximo do registro. Quando
são iguais, significa que o registro tem tamanho
fixo.
KEYS (04,0) os quatro primeiros bytes definem a chave do
arquivo. O primeiro parâmetro é o tamanho da
chave e o segundo a posição inicial no registro,
começando pela posição zero (primeira posição).
SHAREOPTIONS (2,3) define o compartilhamento do arquivo.

O shareoptions pode assumir os seguintes valores:


9
primeiro parâmetro: 1 = arquivo não compartilhado
2 = arquivo compartilhado

Segundo parâmetro: 1 = registro não compartilhado


2 = registro compartilhado (READ)
3 = registro compartilhado (READ/WRITE)

depois temos a definição do nome dos dois componentes do arquivo VSAM


KSDS, o arquivo de índice e o arquivo de dados.

DATA(NAME(GP.GPXXNN.VCADPRD.DATA)) – nome do arquivo de dados


INDEX(NAME(GP.GPXXNN.VCADPRD.INDEX)) – nome do arquivo de índice

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


8 Parte 9

Teoria Vsam KSDS na file-control

Na FILE-CONTROL, declaramos o arquivo VSAM KSDS da seguinte da forma:


----+-*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 VCADPRD ASSIGN TO DA-I-VCADPRD
ORGANIZATION IS INDEXED
ACCESS MODE IS SEQUENTIAL
RECORD KEY IS CODPROD-V
ALTERNATE KEY IS DESCPROD-V WITH DUPLICATES
FILE STATUS IS FS-VCADPRD.

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

Mesmo assim, é necessário colocar ORGANIZATION IS INDEXED. Quanto ao


modo de acesso, temos três possibilidades:

 ACCESS MODE IS SEQUENCIAL – para ler ou gravar


sequencialmente desde o início do arquivo. É a opção utilizada para
programas de CARGA e de impressão a partir do início do arquivo.

 ACCESS MODE IS RANDOM – para ler ou gravar aleatoriamente os


registros do arquivo.

 ACCESS MODE IS DYNAMIC – para ler sequencialmente a partir de


um determinado registro do arquivo. Implica primeiro em localizar esse
registro desejado e depois ler a partir dele.

RECORD KEY IS CODPROD-V – indica qual campo do registro é a chave


principal do arquivo. Deve ser exatamente o informado para o IDCAMS no parâmetro
KEYS(04,0).

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 9 9

ALTERNATE KEY IS DESCPROD-V WITH DUPLICATES – Qualquer outro


campo do registro pode ser usado para pesquisa de registros, sendo uma chave
alternada. Pode-se acrescentar a esta cláusula a declaração WITH DUPLICATES,
indicando que a pesquisa por esta chave pode conduzir a mais de um registro. O
arquivo pode ter várias ALTERNATE KEY. Elas devem ser usada com cuidado,
porque aumentam o processamento nas atualizações das diversas chaves do arquivo.

FILE STATUS IS FS-VCADPRD – é a variável de FILE STATUS. Para


arquivos VSAM KSDS, os FILE STATUS mais importantes são:

FILE STATUS SIGNIFICADO


'00' SUCCESSFUL COMPLETION
'10' END OF FILE
'21' SEQUENCE ERROR ON WRITE OR CHANGING KEY ON
'22' DUPLICATE
REWRITE KEY
'23' RECORD OR FILE NOT FOUND

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


10 Parte 9

Teoria Vsam KSDS na file SECTION

Na FILE SECTION, declaramos o arquivo, registro e campos da


seguinte maneira:

----+-*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.

RECORD CONTAINS 69 CHARACTERS indica o tamanho do registro em


caracteres. Para se chegar a esse tamanho, é preciso somar os campos que formam o
registro. Não se soma o V (vírgula implícita). É uma cláusula opcional.

DATA RECORD IS REG-VCADPRD indica o nome do registro. É uma cláusula


opcional.

01 REG-VCADPRD. especifica o registro. 01 é o número do nível do registro.

05 CODPROD-V PIC X(04). especifica o campo. 05 é o número do nível do


campo, que pode ser de 02 a 49.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 9 11

Teoria Vsam KSDS na


PROCEDURE DIVISION

OPEN

Abre o arquivo para leitura ou gravação. Há 3 modos de abrir arquivos VSAM


KSDS:

----+-*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

 OUTPUT indica que o arquivo será gravado e está vazio no momento


da abertura. Não é possível ler um arquivo aberto como OUTPUT.

 I-O indica que o arquivo será lido e gravado aleatoriamente (ACCESS


MODE IS RANDOM)

READ 9
Lê um registro do arquivo. Há três formas de ler um arquivo VSAM KSDS,
dependendo do ACCESS MODE utilizado.

1ª. Forma: ACCESS MODE IS SEQUENTIAL (LEITURA SEQUENCIAL)

É 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”

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


12 Parte 9
2ª. Forma: ACCESS MODE IS RANDOM (LEITURA DIRETA)

Antes do READ, é necessário mover para o RECORD KEY a chave do registro


que você deseja ler. Depois é só fazer o READ para ler esse registro, se existir. Se o
registro desejado não existir, o FILE STATUS será “23”. Nesta segunda forma, o
READ possui a sentença INVALID KEY, com instruções que serão executadas quando
o registro não for localizado, bem como a sentença NOT INVALID KEY, com
instruções para quando o registro for encontrado. Recomenda-se o teste do FILE
STATUS no lugar do uso do INVALID KEY. Exemplo:

----+-*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”

No último exemplo foi utilizado a sentença KEY IS CODPROD-V. Quando for


feita a leitura direta pela chave principal, essa sentença não é obrigatória, mas quando
for utilizada qualquer outra chave alternada, é necessário informar por qual campo
chave será feita a leitura.

3ª. Forma: ACCESS MODE IS DYNAMIC (POSICIONA E LÊ SEQUENCIALMENTE)

É quando a leitura será feita sequencialmente, mas a partir de um determinado


registro. O posicionamento é feito com o comando START, como mostra o exemplo
abaixo.

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXMOVEx“0100”x TOxCODPROD-V
XXXXXXXXXXXSTART VCADPRD KEY IS NOT LESS CODPROD-V

Neste exemplo, posiciona-se para leitura no registro cujo campo CODPROD-V


é maior ou igual (NOT LESS) à “0100”. Pode-se também utilizar EQUAL (igual) ou
GREATER. As sentenças INVALID KEY e NOT INVALID KEY também são possíveis,
mas é preferível utilizar a variável de FILE STATUS.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 9 13

Na sequência, se FILE STATUS = “00” é feita a leitura, porém a sentença


NEXT é utilizada para a primeira e demais leituras sequenciais. Exemplo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXREADXVCADPRDXNEXTXINTOXWS-REG-VCADPRD

START

Como visto acima, o START posiciona a leitura no registro especificado pela


chave. Só pode ser utilizado em arquivo VSAM-KSDS aberto como INPUT ou I-O.
Quando a sentença KEY IS não for usada, o posicionamento será feito pela chave
principal e a condição será sempre EQUAL. Exemplo:

----+-*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*----------------------------------------------------------------*

XXXXXXXXXXXSTART VCADPRD KEY IS EQUAL CODPROD-V

Se a comparação desejada não for EQUAL ou a chave não for a principal,


deve-se usar a sentença KEY IS seguida da comparação e do campo chave. As
sentenças INVALID KEY e NOT INVALID KEY também são permitidas, caso o
posicionamento encontre ou não o registro pesquisado. Exemplo:

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”

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


14 Parte 9
WRITE

Insere um registro no arquivo. As sentenças INVALID KEY e NOT INVALID


KEY também são permitidas. FROM indica de onde vêm os dados que serão inseridos
no registro. Exemplo:

----+-*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

Atualiza um registro, porém não é permitido alterar o valor da RECORD KEY


(Chave do arquivo). Exemplo:

----+-*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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 9 15

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

Fecha o arquivo especificado. É importante fechar os arquivos abertos e testar


seu sucesso com FILE STATUS. Exemplo:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
XXXXXXXXXXXCLOSE VCADPRD

IF FS-VCADPRD NOT = “00”


MOVE “ERRO ABERTURA VCADPRD” TO WS-MSG
MOVE FS-VCADPRD
GO TO 999-ERRO
TO WS-FS 9
END-IF

Modo de Acesso Comando Permitido

OPEN INPUT
OPEN OUTPUT
SEQUENTIAL READ
WRITE
CLOSE

OPEN I-O
READ
WRITE
RANDOM
REWRITE
DELETE
CLOSE

OPEN INPUT
START
DYNAMIC
READ NEXT
CLOSE

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


16 Parte 9

EXEMPLO Carga vsam ksds

Objetivo do Programa

Carregar o arquivo VSAM VCADPRD com os registros do arquivo sequencial


CADPRD.

Macro-Fluxo

CADPRD

EEXXNN08

VCADPRD

Observação

Os registros do arquivo CADPRD estão em ordem crescente de CODPROD,


porém, para fins de exercício, alguns registros estão:

fora de sequência (FILE STATUS = ‘21’) ou


duplicados (FILE STATUS = ‘22’)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 9 17

JOB de Execução

O STEP001 cria arquivo VSAM KSDS VCADPRD usando o utilitário IDCAMS e


o STEP002 executa o programa EEXXNN08 para dar carga no VCADPRD usando os
dados do CADPRD.

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

Layout dos Arquivos

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

Nome do Arquivo VCADPRD


Nome do Registro REG-VCADPRD
Nome do Campo Tipo e Tamanho Descrição
CODPROD-V X(04) Código (Chave)
DESCPROD-V X(20) Descrição
UNIDPROD-V X(05) Unidade (caixa, litro, Kg, etc)
LOCALPROD-V X(05) Localização no estoque
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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


18 Parte 9

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
.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 9 19
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
01 REG-CADPRD.
05 CODPRD 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.

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


20 Parte 9
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
01 WS-DATE-FORMATADA.
05 WS-DIA-FORMATADA PIC 99.
05 FILLER PIC X VALUE "/".
05 WS-MES-FORMATADA PIC 99.
05 FILLER PIC X(03)
VALUE "/20".
05 WS-ANO-FORMATADA PIC 99.

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.

*--------------------------------------------------------------*

77 FS-CADPRD PIC X(02).


77 FS-VCADPRD PIC X(02).
77 WS-CTLIDO PIC 9(03).
77 WS-CTGRAV PIC 9(03).
77 WS-CTDUP PIC 9(03).
77 WS-CTFORASEQ PIC 9(03).
77 WS-MSG PIC X(60).
77 WS-FS PIC X(02).

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

OPEN INPUT CADPRD

IF FS-CADPRD NOT = "00"


MOVE "ERRO ABERTURA CADPRD" TO WS-MSG
MOVE FS-CADPRD TO WS-FS
PERFORM 999-ERRO
END-IF

OPEN OUTPUT VCADPRD

IF FS-VCADPRD NOT = "00"


MOVE "ERRO ABERTURA VCADPRD" TO WS-MSG
MOVE FS-VCADPRD TO WS-FS
PERFORM 999-ERRO
END-IF

PERFORM 020-LERCADPRD
.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 9 21
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
020-LERCADPRD.
READ CADPRD INTO WS-REG-CADPRD
IF FS-CADPRD = "00"
ADD 1 TO WS-CTLIDO
ELSE
IF FS-CADPRD NOT = "10"
MOVE "ERRO LEITURA CADPRD" TO WS-MSG
MOVE FS-CADPRD TO WS-FS
PERFORM 999-ERRO
END-IF
END-IF
.

030-PROCESSAR.
MOVE WS-REG-CADPRD TO WS-REG-VCADPRD

WRITE REG-VCADPRD FROM 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

IF FS-CADPRD NOT = "00"


MOVE "ERRO FECHAMENTO CADPRD" TO WS-MSG
MOVE FS-CADPRD TO WS-FS
PERFORM 999-ERRO
END-IF

CLOSE VCADPRD

IF FS-VCADPRD NOT = "00"


MOVE "ERRO FECHAMENTO VCADPRD" TO WS-MSG
MOVE FS-VCADPRD TO WS-FS
PERFORM 999-ERRO
END-IF

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


22 Parte 9
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
DISPLAY " "
DISPLAY "*------------------------------------------*"
DISPLAY " "
DISPLAY " EH O BICHO !!! )/_ "
DISPLAY " _.--..---'-,--O_ "
DISPLAY " \|..' ._O__)_ "
DISPLAY " ,-. _./ _ \..--( / "
DISPLAY " `\.-''__.-' \ ( \_ "
DISPLAY " `''' `\__ /\ "
DISPLAY " /) "
DISPLAY "*------------------------------------------*"
DISPLAY " "
DISPLAY "*------------------------------------------*"
DISPLAY " TERMINO NORMAL DO EEXXXNN08 "
DISPLAY "*------------------------------------------*"
.

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

MOVE WS-ANO-SYS TO WS-ANO-FORMATADA


MOVE WS-MES-SYS TO WS-MES-FORMATADA
MOVE WS-DIA-SYS TO WS-DIA-FORMATADA

ACCEPT WS-TIME-SYS FROM TIME

MOVE WS-HORA-SYS TO WS-HORA-FORMATADA


MOVE WS-MIN-SYS TO WS-MIN-FORMATADA
MOVE WS-SEG-SYS TO WS-SEG-FORMATADA

DISPLAY "*------------------------------------------*"
DISPLAY " DATA : "
WS-DATE-FORMATADA
" HORA : "
WS-TIME-FORMATADA
DISPLAY "*------------------------------------------*"
.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 9 23

Atividade Revisão aos pares

Responda as questões abaixo, retiradas de


entrevistas, sobre arquivos VSAM.

1 ) Qual a diferença entre os arquivos sequenciais QSAM e VSAM ESDS ?

9
2) O que acontece quando um arquivo VSAM vazio é aberto como INPUT no COBOL?

3) O que é IDCAMS?

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


24 Parte 9
4) Para que serve o SHAREOPTIONS do IDCAMS?

5) Quais são os tipos de arquivos VSAM?

6) Como definir um arquivos VSAM KSDS?

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 9 25

Atividade Trabalho em dupla

Na definição do arquivo PRODUTO via IDCAMS,


do tipo VSAM KSDS, existem 7 erros. Quais são eles?

//GPXXNNKS JOB SEUNOME, 01


// CLASS=A, 02
// MSGCLASS=X, 03
// NOTIFY=GPXXNN, 04
// TIME=(0,20) 05
//*---------------------------------------------- 06

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


26 Parte 9

Atividade Projeto 8

Objetivo do Programa

A Guitar in a Box Industries precisa de um programa para atualizar seu


cadastro de produtos com base em um arquivo de movimento, gerando um relatório
com as ocorrências dessa atualização. Os arquivos envolvidos são:

VCADPRD Cadastro de Produtos (VSAM KSDS)


MOVPRD Movimentação de produtos
RELOCOR Arquivo com a imagem do relatório de ocorrências

Macro-Fluxo

MOVPRD

GPXXNN08 VCADPRD

RELOCOR

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 9 27

Layout dos Arquivos

Nome do Arquivo MOVPRD


Nome do Registro REG-MOVPRD
Nome do Campo Tipo e Tamanho Descrição
CODPROD-M X(04) Código
DESCPROD-M X(20) Descrição
UNIDPROD-M X(05) Unidade (caixa, litro, Kg, etc)
LOCALPROD-M X(05) Localização no estoque
QTDEST-M 9(05) Quantidade em estoque
QTDMAX-M 9(05) Quantidade máxima em estoque
QTDMIN-M 9(05) Quantidade mínima em estoque
PRECOCOMPRA-M 9(06)V99 Preço de Compra
PRECOVENDA-M 9(06)V99 Preço de Venda
PERCOMIS-M 9(02)V99 Percentual de comissão
TIPOMOVTO-M X(01) Tipo de movimento

Nome do Arquivo VCADPRD


Nome do Registro REG-VCADPRD
Nome do Campo Tipo e Tamanho Descrição
CODPROD-V X(04) Código (Chave)
DESCPROD-V X(20) Descrição
UNIDPROD-V X(05) Unidade (caixa, litro, Kg, etc)
LOCALPROD-V X(05) Localização no estoque

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

Nome do Arquivo RELOCOR


Nome do Registro Tipo e Tamanho Descrição
REG-RELOCOR X(132) Relatório de 132 colunas

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


28

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

60 INDUSTRIAS SEUNOME S/A. SERVIMOS BEM PARA SERVIR SEMPRE.

 (11) 4427-4579 (11) 9 9903-3218


LD-IMAGEM
Ocorrências
LD-OCORRENCIA

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


30 Parte 9

Observação

Atualizar o arquivo VCADPRD (VSAM KSDS) com base nos registros do


arquivo sequencial MOVPRD. Os registros do arquivo MOVPRD possuem um campo
TIPOMOVTO-M que indicam se é uma inclusão (I), exclusão (E) ou alteração (A).

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.

O relatório RELOCOR é gerado com as ocorrências do processamento. É


preciso saber os produtos que foram incluídos, excluídos e os que foram alterados
deverá ser impresso antes e após a alteração. Também serão impressos os
movimentos inválidos.

Execute os passos abaixo (Lembre-se de que XXNN é o seu prefixo de


usuário):

1) Pelo TSO, opção P.2 (Edit Entry Panel), crie o membro GPXXNN08 e digite
o programa COBOL.

2) Compile com o job COMPCOB e elimine os erros até obter MAXCC = 0

3) Copie o job EXECOB08 da JOBLIB de seu instrutor e altere XXNN pelo


prefixo de seu usuário.

4) Execute o programa com o job EXECOB08. Compare o resultado com os


dos colegas.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 9 31

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
//*

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


32 Parte 9

Orientação para processamento

Parágrafo Principal (0000-GPXXNN08)


Executa o parágrafo 1000-INICIALIZAR
Executa o parágrafo 2000-PROCESSAR
até que o file status do arquivo MOVPRD seja “10”
Executar o parágrafo 3000-TERMINO
Encerrar o programa

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

Abrir para leitura o arquivo MOVPRD


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 RELOCOR


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 e gravação o arquivo VCADPRD


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)

Ler o 1º registro do arquivo MOVPRD (1100-LER-MOVPRD)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 9 33

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

Ler o próximo registro do arquivo MOVPRD (1100-LER-MOVPRD)

Acho que
podemos
9
usar o
evaluate
hehehehhe

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


34 Parte 9
Parágrafo 2100-INCLUSAO
Mover WS-CODPROD-M para CODPROD-V (campo chave)

Ler VCADPRD carregando a variável espelho WS-REG-VCADPRD

Se FILE STATUS = “00”


ERRO - O produto que se deseja incluir já existe
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 movimento inválidos

Se FILE STATUS = “23”


OK - O produto que se deseja incluir não existe
Mover a variável WS-REG-MOVPRD para WS-REG-VCADPRD
Gravar REG-VCADPRD com base na WS-REG-VCADPRD

Se FILE STATUS = “00”


OK - Inclusão ocorreu com sucesso
Mover WS-REG-VCADPRD para LD-IMAGEM
Mover “INCLUSAO EFETUADA” para LD-OCORRENCIA
Executar o parágrafo 2400-IMPRIME-RELOCOR
Somar 1 ao contador de incluído

Se FILE STATUS = “22”


ERRO - Outro programa incluiu o mesmo produto
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 movimento inválido

Se FILE STATUS NOT = “00” AND NOT = “22”


ERRO – File Status não esperado
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)

Se FILE STATUS NOT = “23” AND NOT = “00”


ERRO – File Status não esperado
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)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 9 35

Parágrafo 2200-EXCLUSAO
Mover WS-CODPROD-M para CODPROD-V (campo chave)

Ler VCADPRD carregando a variável espelho WS-REG-VCADPRD

Se FILE STATUS = “00”


OK - O produto que se deseja excluir existe
Excluir o registro (DELETE)

Se FILE STATUS = “00”


OK - A exclusão foi feita com sucesso
Mover WS-REG-VCADPRD para LD-IMAGEM
Mover “EXCLUSAO EFETUADA” para LD-OCORRENCIA
Executar o parágrafo 2400-IMPRIME-RELOCOR
Somar 1 ao contador de excluido

Se FILE STATUS = “23”


ERRO - Outro programa excluiu o mesmo produto
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 movimento inválido

Se FILE STATUS NOT = “23” AND NOT = “00”


ERRO – File Status não esperado

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)

Se FILE STATUS = “23”


ERRO - O produto que se deseja excluir não existe
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 movimento inválido

Se FILE STATUS NOT = “23” AND NOT = “00”


ERRO – File Status não esperado
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)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


36 Parte 9
Parágrafo 2300-ALTERACAO
Mover WS-CODPROD-M para CODPROD-V (campo chave)

Ler VCADPRD carregando a variável espelho WS-REG-VCADPRD

Se FILE STATUS = “00”


OK - O produto que se deseja alterar existe
Mover WS-REG-VCADPRD para LD-IMAGEM
Mover “ANTES ALTERACAO” para LD-OCORRENCIA
Executar o parágrafo 2400-IMPRIME-RELOCOR

Mover os campos da WS-REG-MOVPRD


para WS-REG-VCADPRD, observando que:
Se campo for numérico:
mover apenas se tiver conteúdo numérico
Se campo for alfanumérico
mover apenas se for diferente de espaços

Alterar o registro com base no WS-REG-VCADPRD (REWRITE)

Se FILE STATUS = “00”


OK - a alteração foi feita com sucesso
Mover WS-REG-VCADPRD para LD-IMAGEM
Mover “APOS ALTERACAO” para LD-OCORRENCIA
Executar o parágrafo 2400-IMPRIME-RELOCOR
Somar 1 ao contador de alterado

Se FILE STATUS = “23”


ERRO - Outro programa excluiu o mesmo produto
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 movimento inválido

Se FILE STATUS NOT = “23” AND NOT = “00”


ERRO – File Status não esperado
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)

Se FILE STATUS = “23”


ERRO - O produto que se deseja alterar não existe
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 movimento inválido

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 9 37

Se FILE STATUS NOT = “23” AND NOT = “00” (else)


ERRO – File Status não esperado
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

Executar o parágrafo 2600-IMPRIME-DETALHE

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

Lembre que o 1º cabeçalho deve ser AFTER PAGE

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)

Somar 1 ao contador de linha


Somar 1 ao contador de registros impressos

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


38 Parte 9
Parágrafo 2700-IMPRIME-RODAPE
Calcular WS-PULA = 58 – WS-CTLINHA

gravar as 2 linhas de rodapé 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 60 ao contador de linha

Lembre que o 1º rodapé deve ser AFTER WS-PULA LINES

Parágrafo 3000-TERMINO
Se WS-CTLINHA < 60
Executar o parágrafo 2700-IMPRIME-RODAPE

Executar o parágrafo 9000-IMPRIME-DATA

Fechar o arquivo MOVPRD


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 VCADPRD


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 RELOCOR


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
Mover contadores para as variáveis formatadas
Exibir os contadores:
Movimentos Lidos
Produtos Incluído
Produtos Excluído
Produtos Alterado
Movimento Inválido
Linhas de Detalhe Impresso
Página
Exibir o tempo total de processamento

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 9 39

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


40 Parte 9

Avaliação Então...Como foi ?!?

Estou fera!

Fiz Certo!

 Muito Bom  Bom  regular  ruim  Muito ruim

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte

Quantas dimensões
uma variável pode ter
na linguagem COBOL?

7
Versão 2.3.5
Parte 10 3

Preparation

Trocando Ideias É agora que você fala !!

Antes de iniciarmos, vamos conversar sobre os tópicos apresentados na


capa desta parte. Isso é importante para que seu instrutor e seus colegas
saibam como está seu conhecimento sobre o assunto e se você precisa ou
pode fornecer ajuda aos colegas e instrutor.

 O que você já sabe ?


 O que você não sabe ?
 Porque é importante conhecer estes tópicos ?
 Quais são os seus temores ?
 O que você considera difícil ?

Reflexão É aqui que você se compromete !!

Depois de falar sobre o assunto com seus colegas e instrutor, escreva,


10
desenhe, rabisque, diga algo sobre o que você vai fazer para dominar esses
tópicos. Comprometa-se!

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


4 Parte 10

Presentation

Teoria Comandos complementares

INITIALIZE

Efetua a inicialização (atribuição de valores) de uma variável (ou um conjunto


de variáveis).

Como default variáveis numéricas são inicializadas com zeros e variáveis


alfanuméricas são inicializadas com espaços.

Se a variável especificada for um item de grupo, todos os seus subitens serão


inicializados de acordo com seu formato: os que forem numéricos serão inicializados
com zero e os que forem alfanumérica ou alfabética serão inicializados com espaços.

Pode-se especificar um conteúdo alternativo para a inicialização, através da


cláusula REPLACING. Exemplos:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
xxxxxxxxxxxINITIALIZExxWS-CTLIDO WS-CTGRAVA WS-CTDESP WS-MENSAGEM

xxxxxxxxxxxINITIALIZExxWS-CTLIDO WS-CTGRAVA WS-CTDESP WS-MENSAGEM


xxxxxxxxxxxxxxxxxxxxxxxREPLACING ALPHANUMERIC BY SPACES
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxNUMERIC BY ZEROS

xxxxxxxxxxxINITIALIZExxWS-CTLIDO WS-CTGRAVA WS-CTDESP WS-MENSAGEM


xxxxxxxxxxxxxxxxxxxxxxxREPLACING ALPHANUMERIC BY “BANANA”
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxNUMERIC BY 2012

xxxxxxxxxxxINITIALIZExxWS-CTLIDO WS-CTGRAVA WS-CTDESP WS-MENSAGEM


xxxxxxxxxxxxxxxxxxxxxxxREPLACING ALPHANUMERIC BY ALL “X”
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxNUMERIC BY ALL 9

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 10 5

Teoria Tabela interna (occurs)

Alguns algoritmos mais avançados exigem a definição de uma mesma variável


várias vezes, aumentando o trabalho de codificação do programa correspondente,
tanto na DATA DIVISION, como também as instruções resultantes na PROCEDURE
DIVISION. Por exemplo, em um algoritmo para acumular a vendas do ano separadas
por mês, precisamos definir 12 variáveis de totais na DATA DIVISION e a
PROCEDURE DIVISION deverá ter 12 testes de mês da venda para decidir em que
total deve ser feito a soma. Exemplo:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
01 WS-TOTAL-VENDAS.
05 WS-TOTAL-01 PIC 9(06)V99.
05 WS-TOTAL-02 PIC 9(06)V99.
05 WS-TOTAL-03 PIC 9(06)V99.
05 WS-TOTAL-04 PIC 9(06)V99.
05 WS-TOTAL-05 PIC 9(06)V99.
05 WS-TOTAL-06 PIC 9(06)V99.
05 WS-TOTAL-07 PIC 9(06)V99.
05 WS-TOTAL-08 PIC 9(06)V99.
05 WS-TOTAL-09 PIC 9(06)V99.
05 WS-TOTAL-10 PIC 9(06)V99.
05 WS-TOTAL-11 PIC 9(06)V99.
05 WS-TOTAL-12 PIC 9(06)V99.

Na PROCEDURE DIVISION usaríamos o EVALUATE, para evitar uma longa

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:

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


6 Parte 10
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
01 WS-TOTAL-VENDAS.
05 WS-TOTAL PIC 9(06)V99 OCCURS 12 TIMES.

Visualmente, a variável WS-TOTAL-VENDAS tem o seguinte aspecto:

WS-TOTAL-VENDAS

01 02 03 04 05 06 07 08 09 10 11 12

WS-TOTAL

06

A variável WS-TOTAL-VENDAS é formado por 12 ocorrências da variável WS-


TOTAL. É preciso informar qual delas estamos nos referindo através de um indexador
(subscrito). Esse subscrito deve estar dentro de parênteses e pode ser uma constante
ou variável numérica, com valores inteiros. O subscrito começa pelo número 1 e vai
até o valor informado por OCCURS. Agora a PROCEDURE DIVISION do exemplo
acima fica:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------------------------*
060-TOTALIZA-VENDAS.
ADD WS-VALOR-VENDA TO WS-TOTAL (WS-MES)
.

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 10 7

Essa tabela de uma dimensão pode ser representada graficamente da seguinte


forma:

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.

Essa tabela de duas dimensões pode ser representada graficamente da


seguinte forma:

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


8 Parte 10
Essa tabela de três dimensões pode ser representada graficamente da seguinte forma:
WS-DISCIPLINA (01,02)
WS-NOMEALUNO (01)
WS-NOTAS-DISCIPLINA (01,04)
WS-DADOS-DISCIPLINA (01,01)

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)

É possível criar tabelas internas indexadas, por exemplo:


----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
01 WS-TOTAL-VENDAS.
05 WS-TOTAL PIC 9(06)V99
OCCURS 12 TIMES
INDEXED BY WS-IDX-MES.

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

As variáveis de índice não são declaradas na WORKING-STORAGE SECTION


e tem seus valores definidos da seguinte forma:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*--> INICIANDO O INDICE COM 1

SET WS-IDX-MES TO 1

*--> INCREMENTANDO O INDICE 1 UNIDADE

SET WS-IDX-MES UP BY 1

*--> DECREMENTANDO O INDICE 1 UNIDADE

SET WS-IDX-MES DOWN BY 1

Tabelas indexadas podem ter seu conteúdo pesquisado pelo comando


SEARCH.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 10 9

Pesquisa em
Teoria tabela interna (search)

A instrução SEARCH é usada para realizar uma pesquisa linear, ou seja, o


algoritmo percorre a tabela a partir do primeiro elemento, até localizar o item desejado
ou chegar no fim da tabela.

A seguir temos um exemplo de busca linear:


----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
01 WS-PRODUTOS.
XXXX 05 FILLER PIC X(19)
VALUE
“001CADERNO 001200”.
05 FILLER PIC X(19)
VALUE
“002LAPIS 000200”.
XXXX 05 FILLER PIC X(19)
VALUE
“003BORRACHA 000350”.
05 FILLER PIC X(19)
VALUE
“004REGUA 000500”.
05 FILLER PIC X(19)
VALUE
“005GRAMPEADOR001500”.

01 WS-TAB-PRODUTOS REDEFINES WS-PRODUTOS.


XXXX 05 WS-REG-PRODUTOS OCCURS 5 TIMES INDEXED BY IDX-PROD.
10 WS-CODPROD PIC X(03).
10 WS-DESCPROD PIC X(10).
10 WS-PRECOPROD PIC 9(04)V99.

01 WS-CP PIC X(04).


*----------------------------------------------------------------*
PROCEDURE DIVISION.
*----------------------------------------------------------------*
10
MOVE “004” TO WS-CP

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

Cabe ao programador, segundo a especificação do projeto, determinar o que


fazer quando encontrar ou não o item na tabela.

Já a instrução SEARCH ALL é usada para realizar uma pesquisa binária. A


tabela deve ser ordenada em ordem ascendente (crescente) ou descendente
(decrescente) para que a busca binária tenha êxito.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


10 Parte 10
A pesquisa ou busca binária é um algoritmo de busca em tabela que requer
acesso aleatório aos elementos da mesma. Ela parte do pressuposto de que a tabela
está ordenada e realiza sucessivas divisões do espaço de busca (divisão e conquista)
comparando o elemento buscado (chave) com o elemento no meio da tabela. Se o
elemento do meio da tabela for a chave, a busca termina com sucesso. Caso contrário,
se o elemento do meio vier antes do elemento buscado, então a busca continua na
metade posterior da tabela. E finalmente, se o elemento do meio vier depois da chave,
a busca continua na metade anterior da tabela.
A seguir temos um exemplo de busca binária:
----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7--|-+----8
*----------------------------------------------------------------*
WORKING-STORAGE SECTION.
*----------------------------------------------------------------*
01 WS-LISTA-MESES.
05 FILLER PIC X(11)
VALUE “01JANEIRO ”.
XXXX 05 FILLER PIC X(11)
VALUE “02FEVEREIRO”.
XXXX 05 FILLER PIC X(11)
VALUE “03MARCO ”.
XXXX 05 FILLER PIC X(11)
VALUE “04ABRIL ”.
XXXX 05 FILLER PIC X(11)
VALUE “05MAIO ”.
XXXX 05 FILLER PIC X(11)
VALUE “06JUNHO ”.
XXXX 05 FILLER PIC X(11)
VALUE “07JULHO ”.
XXXX 05 FILLER PIC X(11)
VALUE “08AGOSTO ”.
XXXX 05 FILLER PIC X(11)
VALUE “09SETEMBRO ”.
XXXX 05 FILLER PIC X(11)
VALUE “10OUTUBRO ”.
XXXX 05 FILLER PIC X(11)
VALUE “11NOVEMBRO ”.
XXXX 05 FILLER PIC X(11)
VALUE “12DEZEMBRO ”.

01 WS-TABELA-MESES REDEFINES WS-LISTA-MESES.


XXXX 05 WS-TAB-MES PIC X(11) OCCURS 12 TIMES
ASCENDING KEY WS-NUM-MES
INDEXED BY IDX-MES.
10 WS-NUM-MES PIC 9(02).
10 WS-TEXTO-MES PIC X(09).

01 WS-MES PIC 9(2).


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

MOVE 7 TO WS-MES

SEARCH ALL WS-TAB-MES


AT END
DISPLAY “MES INVALIDO”
WHEN WS-NUM-MES(IDX-MES) = WS-MES
DISPLAY “MES LOCALIZADO.....: ” WS-TEXTO-MES (IDX-MES)
END-SEARCH

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 10 11

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


12 Parte 10

Atividade Revisão aos pares

Dada as especificações das tabelas abaixo,


codifique-as na WORKING-STORAGE SECTION.

1 ) Criar a tabela WS-TAB-TAXAS para armazenar 10 taxas no formato PIC 9(02)V99

WORKING-STORAGE SECTION.

2) Criar a tabela WS-NOTAS-ALUNO para armazenar 3 notas no formato PIC 9(02)V9


para 50 alunos.

WORKING-STORAGE SECTION.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 10 13

Atividade Trabalho em dupla

Explique o que o fragmento de programa COBOL


abaixo está fazendo.

----+-*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)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


14 Parte 10

Atividade Projeto 9

Objetivo do Programa

A Box Company do Brasil precisa de algumas alterações em seu projeto de


impressão de relatório com a movimentação de estoque:

1 - Só devem ser impressos os produtos que tiverem uma data de


movimentação a partir de uma data que deverá ser fornecida como parâmetro ao
programa (via PARM do JCL).

2 - O programa GPXXNN09 que utilizará os serviços do programa PGMAUX03


para classificar essa movimentação (alta prioridade [1] ou baixa prioridade [0]). Só
devem ser impressos os produtos com data de movimentação maior ou igual a
informada no PARM GO do JCL com classificação de alta prioridade.

Macro-Fluxo

MOVTOEST TABCADPROD CADPROD

PARM=AAAAMMDD GPXXNN09 PGMAUX03

RELMOV01

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 10 15

Layout dos Arquivos

Nome do Arquivo MOVTOEST


Nome do Registro REG-MOVTOEST
Nome do Campo Tipo e Tamanho Descrição
TIPO-REG-MOVTO X(01) H=HEADER, D=DATA, T=TRAILER
FILLER X(32)

Nome do Registro REG-MOVTOEST-HEADER


Nome do Campo Tipo e Tamanho Descrição
FILLER X(01) H=HEADER
SIGLA-SYS-CAD X(05) Sigla do Sistema
ANO-MES-REF-CAD X(06) Ano e mês de referência AAAAMM
FILLER X(21)

Nome do Registro REG-MOVTOEST-DATA


Nome do Campo Tipo e Tamanho Descrição
FILLER X(01) D=DATA
NUMMOVTO 9(08) Número do movimento
DATAMOVTO 9(08) Data do movimento AAAAMMDD
HORAMOVTO 9(06) Hora do movimento HHMMSS
CODPRODMOVTO 9(04) Código do produto
TIPOMOVTO X(01) Tipo do movimento E=entrada S=saída
QTDMOVTO 9(08) COM-3 Quantidade movimentada

Nome do Registro REG-MOVTOEST-TRAILER


Nome do Campo Tipo e Tamanho Descrição
FILLER X(01) Trailer “T”
QTDREG-MOVTO 9(05) Quantidade de registros no arquivo
FILLER X(75)

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


16 Parte 10
Layout da Mensagem

Nome do Registro WS-MSG-COMUNICACAO


Nome do Campo Tipo e Tamanho Descrição
WS-MENS-CODPROD 9(04) Código do produto
WS-MENS-TIPOMOVTO X(01) Tipo de movimentação E=entrada S=saída
WS-MENS-QTDE 9(08) COMP-3 Quantidade movimentada
WS-MENS-CLASSIF X(01) Classificação do Movimento (0 ou 1)

Novo Layout do Relató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

A nova WS-LINDET tem as seguintes variáveis:

LD-NUMMOVTO
LD-DATAMOVTO
LD-HORAMOVTO

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

LD-CODPRODMOVTO
LD-DESCPRODMOVTO
LD-QTDMOVTO

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 10 17

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

Para obter a descrição do produto, armazenaremos em tabela interna o


conteúdo do arquivo CADPROD, indexando pelo código do produto, permitindo assim
10
a busca (SEARCH ALL) da descrição pelo código do produto.

Execute os passos abaixo (Lembre-se de que XXNN é o seu prefixo de


usuário):

1) Copie o programa GPXXNN07 para GPXXNN09 em sua COBLIB. As


alterações serão feitas nessa cópia.

2) Copie o membro EXECOB07 para EXECOB09 em sua JOBLIB. Altere o


nome do programa no parâmetro PGM= para GPXXNN09.

3) Digite as manutenções solicitadas

4) Compile com o job COMPCOB e elimine os erros até obter MAXCC = 0

5) Execute o programa com o job EXECOB09. Compare o resultado com os


dos colegas.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


18 Parte 10
Orientação para processamento

Na WORKING-STORAGE SECTION, definir a tabela WS-TAB-CADPROD para


armazenar o código e a descrição do produto, a variável WS-INDICE para ajudar na
carga da tabela e a variável WS-FLAG para ajudar na seleção do movimento correto.

----+-*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)

após executar o parágrafo 9100-FORMATA-DATA-HORA:


Inicializar WS-INDICE com zero
Executar o parágrafo 1500-CARREGA-TABELA
até que FILE STATUS = “10” no arquivo CADPROD
Preencher as linhas restantes da tabela com 9999 para o código

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)

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 10 19

Alterar o parágrafo 2000-PROCESSAR conforme abaixo:

Parágrafo 2000-PROCESSAR
Mover “N” para WS-FLAG

Se WS-DATAMOVTO >= LS-DATAREF


Mover “S” 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

Executar o parágrafo 2200-IMPRIME-DETALHE

Se o contador de linha for igual a 48


Executar o parágrafo 2300-IMPRIME-RODAPE
Senão

10
Somar 1 ao contador de desprezado

Executar o parágrafo 1100-LER-MOVTOEST

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


20 Parte 10
Fazer Busca Binária na tabela WS-REG-TAB-CADPROD
Se for fim (não achou nada)
Mover “NAO LOCALIZADO” para a LINDET
Se WS-TAB-CODPROD(IDX1) = WS-CODPRODMOVTO
Mover WS-TAB-DESCPROD(IDX1) para a LINDET

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)

Somar 1 ao contador de linha


Somar 1 ao contador de registros impressos

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.

após o fechamento de todos os outros arquivos:


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

após exibir os contadorores:


Exibir também o contador de desprezados

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 10 21

10

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


22 Parte 10

Avaliação Então...Como foi ?!?

Estou fera!

Fiz Certo!

 Muito Bom  Bom  regular  ruim  Muito ruim

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte

ANEXOS
Versão 2.3.5
Parte 11 3

Teoria MVS abend code

Os ABENDs com a letra S são do sistema e os com a letra U são de usuários.


Os mais comuns estão em destaque.

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.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


4 Parte 11
S722 Too many lines of print.
S804 Region too small for the program.
S806 Program not on the library. May need a JOBLIB or STEPLIB.
S80A Region too small for the program.
S813 Right tape volume, wrong dataset name.
Right dataset name, wrong tape volume.
S913 Security violation.
SA13 Label=n states the wrong number.
SB14 No space in a library directory for this member's name.
SB37 Insufficient disk space.
SD37 Insufficient disk space.
SE37 Insufficient disk space. An E37 on tape datasets is most often caused when the number of requested volumes is
exceeded. The default is 5, therefore a request for the sixth volume will fail with a E37.
S0C1 (Operation Exception)
Executing a program with an unresolved external reference.
Calling a program and the program was not included during link edit.
An uncontrolled loop moved data on top of instructions.
Reading a file that is not open
Your SORTIN DCB was not correct
Mixing compile options RES and NORES in different modules
S0C2 Privileged Operation. Read/write to unopened file. An uncontrolled loop moved data on top of instructions.
S0C4 Protection. An uncontrolled loop moved data on top of instructions. referencing a field in a record of a closed file
referencing an item in Linkage-Section when there was no PARM= in the JCL.
Calling/called programs have different length for items passed in Linkage Section
with COBOL Sort, doing a STOP RUN or GOBACK while an input or output procedure is still running
S0C5 Addressing. Same reasons as for 0C4. Falling through into an ENTRY statement
Transferring control into the middle of a SORT procedure.
S0C6 Specification. Bad boundary alignment for binary data. See reasons for 0C4
S0C7 Data Exception. Program attempting to do math on illegal data. Data is not numeric, but should be.
Moving ZEROS to group item whose subordinate items are packed-decimal. Uninitialized packed-decimal
fields. Record description is wrong. Field starts or ends in the wrong place in the record.
Find record description of creating program.
S0CB Attempting to divide by 0 and not using ON SIZE ERROR
U1002 Conflicting file attributes. See S013.
U1005 Executing with modules compiled both with RES and NORES
U1006 Subscript out of range
U1017 Missing DD statement in JCL for DISPLAY or ACCEPT verb
U1020 Problem opening or processing a file.
Check the file status.
U1026 COBOL sort failed.
U1034 Same as SB37
U1035 Conflicting DCB parameters. Same as S013.
U1037 Program control falls through the last physical statement in program, which is not GOBACK/STOP RUN.
U1056 Program didn’t close a file before ending
U1066, Conflicting DCB information for file defined as EXTERNAL
U1075
U1072, Illegal numbers in reference modification
U1073,
U1074
U3000 COBOL LE intercepted the ABEND. Messages in SYSDBOUT.
U4038 COBOL LE intercepted the ABEND. Messages in CEEDUMP.

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 11 5

Teoria Tabela de File status

FILE STATUS SIGNIFICADO


'00' SUCCESSFUL COMPLETION
'02' DUPLICATE KEY, NON UNIQ. ALT INDX
'04' READ, WRONG LENGTH RECORD
'05' OPEN, FILE NOT PRESENT
'07' CLOSE OPTION INCOMPAT FILE DEVICE OPEN IMPLIES TAPE; TAPE NOT USED
'10' END OF FILE
'14' RRN > RELATIVE KEY DATA
'20' INVALID KEY VSAM KSDS OR RRDS
'21' SEQUENCE ERROR ON WRITE OR CHANGING KEY ON REWRITE'
'22' DUPLICATE KEY
'23' RECORD OR FILE NOT FOUND
'24' BOUNDARY VIOLATION. WRITE PAST END OF KSDS RECORD. COBOL 370: REL: REC#
TOO BIG. OUT OF SPACE ON KSDS/RRDS FILE
'30' PERMANENT DATA ERROR. DATA CHECK, PARITY CHK, HARDW
'34' BOUNDARY VIOLATION. WRITE PAST END OF ESDS RECORD OR NO SPACE TO ADD
KSDS/RRDS RECORD. OUT OF SPACE ON SEQUENTIAL FILE
'35' OPEN, FILE NOT PRESENT
'37' OPEN MODE INCOMPAT WITH DEVICE
'38' OPENING FILE CLOSED WITH LOCK
'39' OPEN, FILE ATTRIB CONFLICTING
'41' OPEN, FILE IS OPEN
'42' CLOSE, FILE IS CLOSED
'43' DELETE OR REWRITE & NO GOOD READ FIRST
'44' BOUNDARY VIOLATION/REWRITE REC TOO BIG
'46' SEQUENTIAL READ WITHOUT POSITIONING
'47' READING FILE NOT OPEN AS INPUT/IO/EXTEND
'48' WRITE WITHOUT OPEN IO
'49' DELETE OR REWRITE WITHOUT OPEN IO
'90' UNKNOWN
'91' VSAM - PASSWORD FAILURE
'92' LOGIC ERROR/OPENING AN OPEN FILE OR READING OUTPUT FILE OR WRITE INPUT
FILE OR DEL/REW BUT NO PRIOR READ
'93' VSAM - VIRTSTOR. RESOURCE NOT AVAILABLE
'94' VSAM - SEQUENTIAL READ AFTER END OF FILE OR NO CURRENT REC POINTER FOR
SEQ
'95' VSAM - INVALID FILE INFORMATION OR OPEN OUTPUT (LOAD) WITH FILE THAT NEVER
CONTAINED DATA
'96' VSAM - MISSING DD STATEMENT IN JCL
'97' VSAM - OPEN OK, FILE INTEGRITY VERIFIED FILE SHOULD BE OK
OTHER UNKNOWN REASON

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


6 Parte 11

Teoria Tabela ascII

ASCII e a sigla para American Standard Code for Information Interchange. Os


computadores só podem entender números, então o código ASCII é a representação
numérica de caracteres tais como @ A X $, que é usado quando se deseja colocar
dados em ordem. É utilizada nos micro computadores.
Dec Hex char Dec Hex Char Dec Hex Char Dec Hex Char
0 0 NUL (null) 64 40 @ 128 80 Ç 192 C0 └
1 1 ☺ SOH (start of heading) 65 41 A 129 81 ü 193 C1 ┴
2 2 ☻ STX (start of text) 66 42 B 130 82 é 194 C2 ┬
3 3 ♥ ETX (end of text) 67 43 C 131 83 â 195 C3 ├
4 4 ♦ EOT (end of transmission) 68 44 D 132 84 ä 196 C4 ─
5 5 ♣ ENQ (enquiry) 69 45 E 133 85 à 197 C5 ┼
6 6 ♠ ACK (acknowledge) 70 46 F 134 86 å 198 C6
7 7 • BEL (bell) 71 47 G 135 87 ç 199 C7
8 8 ◘ BS (backspace) 72 48 H 136 88 ê 200 C8 ╚
9 9 ○ TAB (horizontal tab) 73 49 I 137 89 ë 201 C9 ╔
10 A ◙ LF (line feed) 74 4A J 138 8A è 202 CA ╩
11 B ♂ VT (vertical Tab) 75 4B K 139 8B ï 203 CB ╦
12 C ♀ FF (form feed) 76 4C L 140 8C î 204 CC ╠
13 D ♪ CR (carriage return) 77 4D M 141 8D ì 205 CD ═
14 E ♫ SO (shift out) 78 4E N 142 8E Ä 206 CE ╬
15 F ☼ SI (shift in) 79 4F O 143 8F Å 207 CF
16 10 ► DLE (data link escape) 80 50 P 144 90 É 208 D0
17 11 ◄ DC1 (device control 1) 81 51 Q 145 91 æ 209 D1
18 12 ↕ DC2 (device control 2) 82 52 R 146 92 Æ 210 D2
19 13 ‼ DC3 (device control 3) 83 53 S 147 93 ô 211 D3
20 14 ¶ DC4 (device control 4) 84 54 T 148 94 ö 212 D4
21 15 § NAK (negative acknowledge) 85 55 U 149 95 ò 213 D5
22 16 ▬ SYN (synchronous idle) 86 56 V 150 96 û 214 D6
23 17 ↨ ETB (end of transmission block) 87 57 W 151 97 ù 215 D7
24 18 ↑ CAN (cancel) 88 58 X 152 98 ÿ 216 D8
25 19 ↓ EM (end of medium) 89 59 Y 153 99 Ö 217 D9 ┘
26 1A → SUB (substitute) 90 5A Z 154 9A Ü 218 DA ┌
27 1B ← ESC (escape) 91 5B [ 155 9B ø 219 DB █
28 1C ∟ FS (file separator) 92 5C \ 156 9C £ 220 DC ▄
29 1D ↔ GS (group separator) 93 5D ] 157 9D ¥ 221 DD
30 1E ▲ RS (record separator) 94 5E ^ 158 9E × 222 DE
31 1F ▼ US (unit separator) 95 5F _ 159 9F ƒ 223 DF ▀
32 20 Space 96 60 ` 160 A0 á 224 E0 a
33 21 ! 97 61 a 161 A1 í 225 E1 b
34 22 " 98 62 b 162 A2 ó 226 E2 G
35 23 # 99 63 c 163 A3 ú 227 E3 p
36 24 $ 100 64 d 164 A4 ñ 228 E4 S
37 25 % 101 65 e 165 A5 Ñ 229 E5 s
38 26 & 102 66 f 166 A6 ª 230 E6 µ
39 27 ' 103 67 g 167 A7 º 231 E7 t
40 28 ( 104 68 h 168 A8 ¿ 232 E8 f
41 29 ) 105 69 i 169 A9 ® 233 E9 q
42 2A * 106 6A j 170 AA ¬ 234 EA W
43 2B + 107 6B k 171 AB ½ 235 EB d
44 2C , 108 6C l 172 AC ¼ 236 EC 
45 2D - 109 6D m 173 AD ¡ 237 ED 
46 2E . 110 6E n 174 AE « 238 EE 
47 2F / 111 6F o 175 AF » 239 EF 
48 30 0 112 70 p 176 B0 ░ 240 F0 
49 31 1 113 71 q 177 B1 ▒ 241 F1 ±
50 32 2 114 72 r 178 B2 ▓ 242 F2 
51 33 3 115 73 s 179 B3 │ 243 F3 
52 34 4 116 74 t 180 B4 ┤ 244 F4 
53 35 5 117 75 u 181 B5 245 F5 
54 36 6 118 76 v 182 B6 246 F6 
55 37 7 119 77 w 183 B7 247 F7 
56 38 8 120 78 x 184 B8 248 F8 
57 39 9 121 79 y 185 B9 ╣ 249 F9 
58 3A : 122 7A z 186 BA ║ 250 FA 
59 3B ; 123 7B { 187 BB ╗ 251 FB 
60 3C < 124 7C | 188 BC ╝ 252 FC h
2
61 3D = 125 7D } 189 BD 253 FD
62 3E > 126 7E ~ 190 BE 254 FE þ
63 3F ? 127 7F del 191 BF ┐ 255 FF

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


Parte 11 7

Teoria Tabela EBCDIC

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

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218


8 Parte 11

Teoria POTÊNCIA DE 2

1 Byte

2 Bytes

3 Bytes

4 Bytes

www.grandeporte.com.br  (11) 4427-4579 (11) 9 9903-3218

Você também pode gostar