404

Click here to load reader

Grande porte cobol level 1 - versão 2.3.5

Embed Size (px)

Citation preview

Page 1: Grande porte   cobol level 1 - versão 2.3.5

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

COBOL Level 1

Page 2: Grande porte   cobol level 1 - versão 2.3.5

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

Fique atento para novas versões em nosso site.

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

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

,

, ,

,

,

[email protected]

Page 3: Grande porte   cobol level 1 - versão 2.3.5

Parte

A Almirante Grace Murray Hopper (1906 – 1992) foiuma das primeiras programadoras do sistema Haward Mark Ie foi a criadora do primeiro compilador para uma linguagem deprogramação de computadores. Criou a Linguagem de

programação FLOW-MATIC, que serviu como base para acriação da linguagem COBOL, participando ativamente davalidação da primeira versão desta linguagem.

Page 4: Grande porte   cobol level 1 - versão 2.3.5

Versão 2.3.5

Page 5: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

3

1

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 ?

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!

Trocando Ideias É agora que você fala !!

Preparation

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

Page 6: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

4

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.

Presentation

Consultoriaem

Desenvolvimento

deSoftware

História Conheca a xpto !!,

Page 7: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

5

1

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.

TeoriaIntrodução à

linguagem cobol

Page 8: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

6

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.

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

Almirante Grace Murray Hopper 1906 – 1992

1º bug (inseto = erro) de computador

Page 9: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

7

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

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.

Page 10: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

8

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

Page 11: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

9

1

É 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

Teoria PROCESSAMENTO BATCH == EM LOTES ==

Page 12: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

10

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)

Page 13: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

11

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

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

EXEMPLO PROCESSAMENTO BATCH

SYSIN

SYSOUT

EEXXNN01

Page 14: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

12

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

0025

0090

0125

0070

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.

Sentinela.

e

Page 15: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

13

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

*--------------------------------------------------------------*

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

.

Page 16: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

14

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.

Teoria Comandos básicos

Page 17: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

15

1DISPLAY

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

dispositivo cujo DDNAME é SYSOUT. Exemplo:

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

Page 18: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

16

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

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

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

G R A C E H O P P E R

WS-NOME

0 0 0 0 0 0 7 0 1 0 5 0

WS-VALOR

Page 19: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

17

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

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

LOW-VALUES

....

HIGH-VALUES

Page 20: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

18

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

Page 21: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

19

1Foram feitos vários MOVEs de variáveis de um tipo para todos os outros tipo,

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!

Page 22: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

20

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.

Page 23: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

21

1IF 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.

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 COBOL

Significado

= 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

Teste de Sinal

IS POSITIVE

IS NEGATIVE

IS ZERO

Teste de Classe

IS NUMERIC

IS ALPHABETIC

Page 24: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

22

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

Page 25: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

23

1 PERFORM Básico

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

Exemplos:

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

Page 26: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

24

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

Teoria MACRO-FLUXO

Page 27: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

25

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

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.

Arquivo de entrada

(leitura) INPUT

Arquivo de saída

(gravação) OUPUT

vendas

GeraComi

Comissao

Page 28: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

26

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.

Practice

Atividade Revisão aos pares

Page 29: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

27

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

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

Page 30: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

28

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

Page 31: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

29

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.

Atividade Flip chart

Page 32: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

30

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”

Trabalhe em duplas TEXTO COBOL

Page 33: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

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.

.

Page 34: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

32

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"

.

Trabalhe em duplas COBOL TEXTO

Page 35: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

33

1Parágrafo 0000-EEXXNN03.

Executar o parágrafo 1000-inicializar

Executar o parágrafo 2000-processar até que WS-FIM seja “S”

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.

Page 36: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

34

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

Performance

Todos Juntos PROJETO 1

SYSIN

SYSOUT

GPXXNN01

Page 37: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

35

1Layout da SYSIN

Nome do Registro WS-REG-SYSIN

Nome da Variável

Tipo e

Tamanho

do Dado

Descrição 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 *

**************************************************

Page 38: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

36

Observação

O parágrafo principal chama os parágrafos inicializar, processar e término, formando a seguinte hierarquia de parágrafos:

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

//*

0000-PRINCIPAL

1000-INICIALIZAR 2000-PROCESSAR 3000-TERMINO

1500-LER-SYSIN 1500-LER-SYSIN

ACCEPT

0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0

WS-REG-SYSIN

Page 39: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

37

1

Orientação para processamento

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.

Page 40: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

38

Page 41: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

39

1

Page 42: Grande porte   cobol level 1 - versão 2.3.5

Parte 1

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

40

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

Estou fera!

Fiz Certo!

Muito Bom Bom regular ruim Muito ruim

Page 43: Grande porte   cobol level 1 - versão 2.3.5

Parte

O que é um Mainframe?

É um computador de Grande Porte. Nos anos70 e 80 quando quase todos os computadores eram

grandes, o termo Mainframe era usado para sereferir a diferentes sistemas de computadores. Hojea maioria desses sistemas se foram, e o termoMainframe quase sempre se refere aoscomputadores IBM zSeries. De agora em diante

quando falarmos sobre Mainframes, estaremosfalando da zSeries.

David Stephens What on earth is a Mainframe?

IBM System Z10

Page 44: Grande porte   cobol level 1 - versão 2.3.5

Versão 2.3.5

Page 45: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

3

2

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 ?

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!

Trocando Ideias É agora que você fala !!

Preparation

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

Page 46: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

4

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.

Presentation

História O acesso ao Mainframe

Page 47: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

5

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.

Teoria finalidade

Page 48: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

6

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:

Teoria Login e logoff

IP

PORTSOCKET

Page 49: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

7

2

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

Page 50: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

8

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.

Page 51: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

9

2

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

do TSO será encerrada.

Page 52: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

10

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.

Atividade Prática de laboratório

Page 53: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

11

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.

TeoriaNavegação por

menus e painéis

Page 54: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

12

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.

Program Function (PF)

PF1 (Help) Exibe ajuda contextualizada

PF2 (Split) Divide a Janela do TSO no Cursor

PF3 Voltar ou sair salvando

PF5 Repete o último comando

PF7 Retrocede uma página

PF8 Avança uma página

PF9 Navega entre 2 janelas abertas com PF2

PF10 Desloca tela à esquerda

PF11 Desloca tela à direita

PF12 Cancela ação em curso ou sair sem salvar

Program Attention (PA)

PA1 Encerra um comando iniciado com

erro ou Esc pressionado por engano

no PC usar tecla Page Up

PA2 Desfaz o que foi digitado

No PC usar tecla Page Down

Outras Teclas

Tab Salta o cursor para o próximo campo

CLR Limpa a tela

no PC usar ESC ou Ctrl+C

Enter Executa a ação solicitada

Reset desbloqueia o teclado

no PC usar Ctrl esquerdo

Ctrl direitoCtrl esquerdo

PF7

PF8

PF10 PF11

Page 55: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

13

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.

Teoria

Modificando as

configurações

Page 56: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

14

Page 57: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

15

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

Atividade Prática de laboratório

Page 58: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

16

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.

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

Qualificador_1

Qualificador_2

Qualificador_3

Qualificador_n

de 1 a 8 caracteres

máximo de 44 caracteres

TeoriaAlocação de

data set (arquivo)

Page 59: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

17

2

PO – Partitioned Organization (Particionado) ou

PDS – Partitioned Data Set

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

IRG

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

IRG

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

IRG

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

IRG

REG

ISTR

O

IRG

REG

ISTR

O

IRG

REG

ISTR

O

IRG

REG

ISTR

O

IRG

REG

ISTR

O

IRG

REG

ISTR

O

IRG

REG

ISTR

O

IRGIRG

BUFFER

FIFO

PROGRAMA

Page 60: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

18

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

Page 61: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

19

2

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

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

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.

Page 62: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

20

Page 63: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

21

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.

Atividade Prática de laboratório

Page 64: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

22

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

TeoriaVisualização dos

arquivos alocados

Page 65: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

23

2

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

INITIAL VIEW 2

INITIAL VIEW 3

INITIAL VIEW 4

Page 66: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

24

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?

Atividade Prática de laboratório

Page 67: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

25

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.

Teoria

manipulação dos

arquivos alocados

Page 68: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

26

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.

Page 69: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

27

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.

Atividade Prática de laboratório

Page 70: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

28

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.

Teoria Edição de membros

Page 71: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

29

2

Na linha Command podemos usar os seguintes comandos:

CANCEL sai da edição do membro sem salvar

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

Page 72: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

30

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.

Page 73: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

31

2

Crie o membro TESTE dentro do particionado

GP.GPXXNN.COBLIB e digite trechos do texto abaixo.

Atividade Prática de laboratório

Page 74: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

32

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.

Teoria cópia de membros

Page 75: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

33

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?

Atividade Prática de laboratório

Page 76: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

34

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:

Teoria Compilando programa cobol

1º. Passo

PRE-COMPILE

2º. Passo

COMPILE

3º. Passo

LINKAGE EDITOR

LOAD

MODULE

Programa Fonte

COBOL

LIBRARY

BOOKs

SPOOL

A

s

d

p

GP.GPXXNN.COBLIB(GPXXNN04)

GP.GPXXNN.BOOKLIB(CLISP)

GP.GERAL.LOADLIB(GPXXNN04)

GP.GPXXNN.JOBLIB(COMPCOB)

SD.ST? JOBIDS SYSPRINT

Programa Fonte

COBOL

+

BOOKs

PROGRAMA

OBJETO

Page 77: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

35

2

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

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

Page 78: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

36

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.

Page 79: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

37

2

Compile o programa EEXXNN01. Anote o

procedimento abaixo. Qual foi o MAXCC de retorno?

Atividade Prática de laboratório

Page 80: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

38

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.

Teoria

Tirando erros detectados

na compilação

Page 81: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

39

2

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.

Page 82: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

40

Encontre e elimine os erros do programa

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

procedimento abaixo.

Atividade Prática de laboratório

Page 83: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

41

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.

Teoria Executando cobol

Page 84: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

42

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.

Page 85: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

43

2

Page 86: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

44

Execute o programa EEXXNN01 utilizando o job

CCXXNN01 e compare seus resultados com os dos

outros colegas. Anote o procedimento abaixo.

Atividade Prática de laboratório

Page 87: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

45

2

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

Practice

Atividade Revisão aos pares

Page 88: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

46

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

Page 89: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

47

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!

Dinâmica Pense rápido !

P.2

SD.ST

Menu / Painel

Page 90: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

48

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.

Performance

Atividade Para casa

Page 91: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

49

2

Embora existam outros emuladores de mainframe que desempenhem uma

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

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.

Page 92: Grande porte   cobol level 1 - versão 2.3.5

Parte 2

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

50

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

Estou fera!

Fiz Certo!

Muito Bom Bom regular ruim Muito ruim

Page 93: Grande porte   cobol level 1 - versão 2.3.5

Parte

Teste de Turing - Um computador pode ser chamado"inteligente" se conseguir enganar uma pessoa fazendo-sepassar por um ser humano.

O logo da Apple é atribuído erroneamente como umtributo a Alan Turing, com a marca de mordida fazendoreferencia ao seu método de suicídio.

Alan Turing1912 – 1954

Page 94: Grande porte   cobol level 1 - versão 2.3.5

Versão 2.3.5

Page 95: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

3

3

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 ?

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!

Trocando Ideias É agora que você fala !!

Preparation

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

Page 96: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

4

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.

Presentation

História Ficando íntimo do cobol

Page 97: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

5

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.

TeoriaFormato do programa fonte cobol

Page 98: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

6

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

Page 99: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

7

3

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.

Page 100: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

8

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.

Teoria As 4 divisões

Page 101: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

9

3

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.

*----------------------------------------------------------------*

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.

Page 102: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

10

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

Page 103: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

11

3

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

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.

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.

15 15 15 15 15 15 15 15

101010101010

05 05 05

01

Page 104: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

12

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

WS-MESWS-ANO WS-DIA

WS-DATA-SISTEMA

Page 105: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

13

3

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

Page 106: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

14

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 ‘*-#-’.

Page 107: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

15

3

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

*----------------------------------------------------------------*

* 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

Page 108: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

16

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"

.

Page 109: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

17

3

INDENTAÇÃO

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

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

Teoria

Boas práticas

de programação

Page 110: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

18

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

Page 111: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

19

3

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.

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

Page 112: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

20

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.

Page 113: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

21

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.

67 345 012

BYTE

NIBBLEBIT

Teoria Medida de informacão,

Page 114: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

22

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

Megabyte MB 1006 = 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)

Kibibyte KiB 210 = 1.024

Mebibyte MiB 220 = 1.048.576

Gibibyte GiB 230 = 1.073.741.824

Tebibyte TiB 240 = 1.099.511.627.776

Pebibyte PiB 250 = 1.125.899.906.842.624

Exbibyte EiB 260 = 1.152.921.504.606.846.976

Zebibyte ZiB 270 = 1.180.591.620.717.411.303.424

Yobibyte YiB 280 = 1.208.925.819.614.629.174.706.176

em uso

Kilobyte

Megabyte

Gigabyte

Terabyte

Petabyte

Exabyte

Zettabyte

Yottabyte

Page 115: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

23

3“NOOOOOOSSA!!!”

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

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

BKiBMiBGiBTiBPiBEiBZiBYiB

1024

1024

1024

1024

1024

1024

1024

1024

1024

1024

1024

1024

1024

1024

1024

1024

BkBMBGBTBPBEBZBYB

1000

1000

1000

1000

1000

1000

1000

1000

1000

1000

1000

1000

1000

1000

1000

1000

Page 116: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

24

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.

Exemplo:

Binário

Utiliza 2 símbolos: 0 e 1.

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

posição à direita.

Exemplo:

103 102 101 100

23 22 21 20

7 4 1 8

100 . 8 = 1 . 8 = 8

101 . 1 = 10 . 1 = 10

102 . 4 = 100 . 4 = 400

103 . 7 = 1000 . 7 = 7000

7418

+

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

Teoria Sistemas de numeracão,

Page 117: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

25

3

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

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

posição à direita.

Exemplo:

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.

163 162 161 160

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

Hexadecimal Binário

0 0000

1 0001

2 0010

3 0011

4 0100

5 0101

6 0110

7 0111

8 1000

9 1001

A 1010

B 1011

C 1100

D 1101

E 1110

F 1111

4

8

4

Page 118: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

26

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:

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:

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

F 7 F 4 F 1 F 8

F 7 F 4 F 1 C 8

TeoriaRepresentacão de números no cobol

,

Page 119: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

27

3

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

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

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

F 7 F 4 F 1 D 8

Page 120: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

28

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.

d) Converter cada nibble para hexadecimal.

00 F5(16)

0000 0000 1111 0101

Page 121: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

29

3

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.

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

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

zeros os bits à esquerda.

bit do sinal

0

000 0000 1111 0101

bit do sinal

0

00F5

DISPLAY WRITE

F0F2F4F5 00F5

0245 5b

Page 122: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

30

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.

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

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

bit do sinal

1

000 0000 1111 0101

bit do sinal

1

00F5

DISPLAY WRITE

F0F2F4C5 00F5

024E 5b

Page 123: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

31

3

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

e) Somar 1 ao número invertido (não mexer no 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.

111 1111 0000 1010

bit do sinal

1

111 1111 0000 1011

bit do sinal

1

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

E o COMP-4 ?

FF0B

DISPLAY WRITE

F0F2F4D5 FF0B

024N b b

Page 124: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

32

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.

Page 125: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

33

3

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

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

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.

0 2 0 1 2 F

02012F

DISPLAY WRITE

F2F0F1F2 02012F

2012 b b b

Page 126: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

34

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.

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.

0 2 0 1 2 C

02012C

DISPLAY WRITE

F2F0F1C2 02012C

201B b b b

Page 127: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

35

3

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

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

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.

0 2 0 1 2 D

02012D

DISPLAY WRITE

F2F0F1D2 02012D

201K b b b

Page 128: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

36

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.

A tabela a seguir explica cada um desses símbolos e como eles são usados

para montar máscaras.

Os símbolos usados

para fazer qualquer

máscara são:

+ - *9 0 B

Z $ .

CR DB ,

Som na caixa

cara de pau !

mais, menos, vezesnove, zero, bê

zê, cifrão, pontinhoCR e DB,

junto com a vírguladevemos aprender

Teoria MÁSCARA DE EDICÃO,

Page 129: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

37

3

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

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 B

Insere um algarismo zero ou espaço em branco na posição indicada pelo símbolo 0 ou 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 DB

Representam Crédito ou Débito e devem ser usados na posição mais à direita do PICTURE. Se o 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

Page 130: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

38

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.

Teoria Comandos complementares

Page 131: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

39

3

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

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-MESWS-DIA WS-ANO

WS-DATA-FORMATADA

/ /20

WS-MESWS-ANO WS-DIA

WS-DATA-SISTEMA

Page 132: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

40

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)

DISPLAY "*----------------------*"

DISPLAY "A = " A

DISPLAY "B = " B

DISPLAY "C = " C

DISPLAY "*----------------------*"

STOP RUN

.

Na SYSOUT, será exibido o seguinte texto:

*----------------------*

A = 1234567890

B = 34

C = 6789012345

*----------------------*

variável (posição inicial : comprimento)

Observação: variáveis alfanuméricas possuem cadeias de caracteres, também conhecidas como STRINGs. Quando movemos pedaços de uma STRING, dizemos que movemos uma SUBSTRING.

Page 133: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

41

3

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

Practice

Atividade Revisão aos pares

Page 134: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

42

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

Page 135: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

43

3

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

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.

Page 136: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

44

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 _____________________________________

Page 137: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

45

3

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

a)

FILE-CONTROL.

b)

FILE-CONTROL.

PGM0001

SYSIN

PRDSEQM

PGM0002

PRDSEQM

PRDSEQV

Page 138: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

46

c)

FILE-CONTROL.

RELOCOR

PGM0003

OLDCLI MOVCLI

NEWCLI

Page 139: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

47

3

Vamos colocar para funcionar o programa escrito

no PROJETO 1. Execute os passos abaixo:

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.

Atividade Prática de laboratório

Page 140: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

48

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 *

**************************************************

Atividade Prática de laboratório

E o calendárioASTECA!?

Page 141: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

49

3

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

==================================================

Todos Juntos PROJETO 2

Page 142: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

50

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

Page 143: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

51

3

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

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

Page 144: Grande porte   cobol level 1 - versão 2.3.5

Parte 3

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

52

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

Estou fera!

Fiz Certo!

Muito Bom Bom regular ruim Muito ruim

Page 145: Grande porte   cobol level 1 - versão 2.3.5

Parte

O pequeno cartucho retangular usado no sub-sistema defita magnética IBM 3480 é aproximadamente 1/4 do tamanho deum rolo de fita magnética padrão de 10,5 polegadas, mesmoassim ele armazena 20% mais dados - um total de 200 milhões

de caracteres. A taxa ao qual os dados podem ser armazenadosou recuperados nos cartuchos de fita de dióxido de cromo de 1/2polegada, foi o resultado do uso de 18 trilhas de gravação,alcançando uma densidade de aproximadamente 30.000 bytes porpolegada - seis vezes a densidade das unidades de fita IBM

usadas anteriormente.Fonte: IBM

Page 146: Grande porte   cobol level 1 - versão 2.3.5

Versão 2.3.5

Page 147: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

3

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 ?

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!

Trocando Ideias É agora que você fala !!

Preparation

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

Page 148: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

4

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.

História Arquivos sem fim...

Presentation

Page 149: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

5

4

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

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.

Arquivo sequencial não blocado

BOF

RE

GIS

TR

O

RE

GIS

TR

O

RE

GIS

TR

O

RE

GIS

TR

O

RE

GIS

TR

O

IRG

RE

GIS

TR

O

RE

GIS

TR

O

RE

GIS

TR

O

RE

GIS

TR

O

RE

GIS

TR

O

IRG

RE

GIS

TR

O

RE

GIS

TR

O

RE

GIS

TR

O

RE

GIS

TR

O

RE

GIS

TR

O

EOF

BOF

REG

ISTR

O

REG

ISTR

O

IRG EOFIRG

REG

ISTR

O

REG

ISTR

O

IRGIRG

REG

ISTR

O

REG

ISTR

O

IRGIRG

REG

ISTR

O

TeoriaTipos de arquivos:Sequencial e indexado

Page 150: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

6

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.

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.

Teoria Elementos de um arquivo

CAMPO REGISTRO

ARQUIVO

Page 151: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

7

4

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

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

Teoria Layout do arquivo

Page 152: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

8

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

TeoriaTratamento de arquivo sequencial

Page 153: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

9

4

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:

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

Teoria Especificação do arquivo

Page 154: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

10

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

INPUT/IO/EXTEND '48' WRITE WITHOUT OPEN IO

'9x' PERMISSION NOT OK

Page 155: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

11

4

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

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.

BOF

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

IRG

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

IRG

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

EOF

Teoria Detalhamento do arquivo

Page 156: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

12

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.

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.

Teoria Variável espelho

Page 157: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

13

4

Na PROCEDURE DIVISION utilizamos as diversas instruções para manipular os arquivos, tais como OPEN, CLOSE, READ e WRITE.

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.

É 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

Teoria Manipulação do arquivo

CADCLI RELCLIPROGRAMA

OPEN INPUT CADCLI OPEN OUTPUT RELCLI

Page 158: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

14

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

XXXXXXXXXX 05 NOMECLI PIC X(30).

XXXXXXXXXX 05 CPFCLI PIC X(11).

XXXXXXXXXX 05 RGCLI PIC X(09).

0100

ANA PAULA DOS SANTOS SILVA

36525415488

451547859

XXXXXXX01XXWS-REG-CADCLI.

XXXXXXXXXX 05 WS-CODCLI PIC X(04).

XXXXXXXXXX 05 WS-NOMECLI PIC X(30).

XXXXXXXXXX 05 WS-CPFCLI PIC X(11).

XXXXXXXXXX 05 WS-RGCLI PIC X(09).

0100

ANA PAULA DOS SANTOS SILVA

36525415488

451547859

0050ANA M7355 0100ANA PAULA DOS SANTOS SILVAXXXX36525415488451547859

REA

D C

AD

CLI

CADCLI

variável

espelho

lay-out

do arquivo

Page 159: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

15

4

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

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

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

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

= “10”

NOT = “10”

BOF EOF

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

REG

ISTR

O

REG

ISTR

OOPEN READ

00 00 00 00 4600 00 00 00 00 10FILE STATUS

Page 160: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

16

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

XXXXXXXXXX 05 NOMECLI-N PIC X(30).

XXXXXXXXXX 05 CPFCLI-N PIC X(11).

XXXXXXXXXX 05 RGCLI-N PIC X(09).

0100

ANA PAULA DOS SANTOS SILVA

36525415488

451547859

XXXXXXX01XXWS-REG-NEWCLI.

XXXXXXXXXX 05 WS-CODCLI-N PIC X(04).

XXXXXXXXXX 05 WS-NOMECLI-N PIC X(30).

XXXXXXXXXX 05 WS-CPFCLI-N PIC X(11).

XXXXXXXXXX 05 WS-RGCLI-N PIC X(09).

0100

ANA PAULA DOS SANTOS SILVA

36525415488

451547859

0050ANA M

WR

ITE

REG

-NE

WC

LI

NEWCLI

Após o FROM, mas

antes do WRITE

variável

espelho

lay-out

do arquivo

Page 161: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

17

4

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:

READ nome-lógico-arquivo

O READ é seguido pelo nome lógico do arquivo para ler um registro.

WRITE nome-registro

O WRITE é seguido pelo nome do registro a ser gravado.

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

XXXXXXXXXX 05 NOMECLI-N PIC X(30).

XXXXXXXXXX 05 CPFCLI-N PIC X(11).

XXXXXXXXXX 05 RGCLI-N PIC X(09).

XXXXXXX01XXWS-REG-NEWCLI.

XXXXXXXXXX 05 WS-CODCLI-N PIC X(04).

XXXXXXXXXX 05 WS-NOMECLI-N PIC X(30).

XXXXXXXXXX 05 WS-CPFCLI-N PIC X(11).

XXXXXXXXXX 05 WS-RGCLI-N PIC X(09).

0100

ANA PAULA DOS SANTOS SILVA

36525415488

451547859

0050ANA M0100ANA PAULA DOS SANTOS SILVAXXXX36525415488451547859

WR

ITE

REG

-NE

WC

LI

NEWCLI

APÓS O

WRITE

variável

espelho

lay-out

do arquivo

Page 162: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

18

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

Page 163: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

19

4

EEXXNN04

CADFUNC

FOLHAPAG

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

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.

EXEMPLO USO DE ARQUIVO

Page 164: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

20

Layout dos Arquivos

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)

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

Page 165: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

21

4

Programa COBOL

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

*----------------------------------------------------------------*

IDENTIFICATION DIVISION.

*----------------------------------------------------------------*

PROGRAM-ID. EEXXNN04.

AUTHOR. SEUNOME.

*----------------------------------------------------------------*

ENVIRONMENT DIVISION.

*----------------------------------------------------------------*

CONFIGURATION SECTION.

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.

Page 166: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

22

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

Page 167: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

23

4

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

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"

.

Page 168: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

24

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

Page 169: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

25

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)

FILE SECTION.

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

Atividade Trabalho em dupla

Page 170: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

26

b)

FILE SECTION.

c)

FILE SECTION.

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

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

Page 171: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

27

4

d)

FILE SECTION.

2) Monte as variáveis espelho dos layouts de arquivos abaixo

a)

WORKING-STORAGE SECTION.

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

SEXOCLI-SP X(01) Sexo – M / F

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

Page 172: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

28

b)

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”

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

Page 173: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

29

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

Performance

Todos Juntos PROJETO 3

GPXXNN03

SIMUEMP

EMPAPROV

Page 174: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

30

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

==================================================

Page 175: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

31

4

Layout dos Arquivos

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

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

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

Page 176: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

32

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

Page 177: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

33

4

Parágrafo 9000-ERRO

Exibir mensagem de erro

Exibir FILE STATUS

Mover +16 para a variável do RETURN-CODE

Encerrar o programa

Page 178: Grande porte   cobol level 1 - versão 2.3.5

Parte 4

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

34

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

Estou fera!

Fiz Certo!

Muito Bom Bom regular ruim Muito ruim

Page 179: Grande porte   cobol level 1 - versão 2.3.5

Parte

É frequentemente útil combinar dois oumais arquivos em um único arquivo maior. Se osarquivos não estão ordenados, isso é fácil deconseguir porque nós podemos simplesmente

anexar os registros de um arquivo no final dooutro. Mas se os arquivos estão ordenados, atarefa é 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 MERGEpermite juntar dois ou mais arquivos,preservando a ordenação.

Page 180: Grande porte   cobol level 1 - versão 2.3.5

Versão 2.3.5

Page 181: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

3

5

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 ?

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!

Trocando Ideias É agora que você fala !!

Preparation

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

Page 182: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

4

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

Presentation

História COBOL a fundo

Page 183: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

5

5

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:

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

Teoria Comandos complementares

Page 184: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

6

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

XXXXXXXXXXX DISPLAY A “ EH MENOR OU IGUAL A “ B

XXXXXXXXXXXEND-IF

XXXXXXXXXXXDISPLAY “COMPARACAO EFETUADA”

.

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.

Ponto obrigatório, obrigando o fluxo de processamento seguir do NEXT SENTENCE para, neste exemplo, o comando DISPLAY.

Page 185: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

7

5

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 *

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

Page 186: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

8

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.

Page 187: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

9

5

A seguir algumas imagens do resultado do comando COPY após a execução

do pré-compilador.

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.

Page 188: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

10

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

Page 189: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

11

5

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

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

Page 190: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

12

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

Page 191: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

13

5

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

PERFORM 080-CALCULA-JUROS WITH TEST AFTER

UNTIL WS-MES > 12

PERFORM 010-INICIO THRU 080-FIM UNTIL WS-CTMES > 12

É 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

PERFORM WITH TEST BEFORE = while (cond)

Corpo do Laço

Teste

Próximo Comando

sim

não

PERFORM WITH TEST AFTER =

do {} while (cond)

Corpo do Laço

Teste

Próximo Comando

não

sim

Page 192: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

14

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

sim

não

início

fim

inicializa variável com ovalor inicial (FROM)

(WS-CONT = 1)

condição(CONT > 100)

executa os comandos(PERFORM 999-ROTINA)

Incrementar variável como valor do incremento (BY)

(CONT = CONT + 1)

Page 193: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

15

5

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

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

Page 194: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

16

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

.

O que será exibido na SYSOUT após a execução da

PROCEDURE DIVISION acima?

Atividade CORRENDO CONTRA O TEMPO

1 minuto

Page 195: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

17

5

EEXXNN05

FUNCANT

FUNCCAD

FUNCNOVO

Objetivo do Programa

Unificar o Cadastro de Funcionários, que está dividido em dois arquivos

FUNCANT e FUNCNOVO, utilizando o algoritmo de merge, gerando o arquivo

FUNCCAD.

Macro-Fluxo

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

EXEMPLO MERGE

Page 196: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

18

Layout dos Arquivos

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)

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

Page 197: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

19

5

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

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

Page 198: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

20

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

Page 199: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

21

5

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

*----------------------------------------------------------------*

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

Page 200: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

22

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

.

Page 201: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

23

5

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

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

.

Page 202: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

24

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

.

Page 203: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

25

5

1) Codifique um EVALUATE para testar o conteúdo da

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.

Practice

Atividade Revisão aos pares

Page 204: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

26

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.

Page 205: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

27

5

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.

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.

Page 206: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

28

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.

Page 207: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

29

5

Monte o comando perform para as seguintes situações:

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.

Atividade Trabalho em dupla

Page 208: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

30

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

Performance

GPXXNN04

CLISP

CLIUNIF

CLIRJ CLIMG

Atividade PROJETO 4

Page 209: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

31

5

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

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

Page 210: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

32

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.

Page 211: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

33

5

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

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

Page 212: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

34

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)

Page 213: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

35

5

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)

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)

Page 214: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

36

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

Page 215: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

37

5

Page 216: Grande porte   cobol level 1 - versão 2.3.5

Parte 5

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

38

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

Estou fera!

Fiz Certo!

Muito Bom Bom regular ruim Muito ruim

Page 217: Grande porte   cobol level 1 - versão 2.3.5

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.

Page 218: Grande porte   cobol level 1 - versão 2.3.5

Versão 2.3.5

Page 219: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

3

6

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 ?

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!

Trocando Ideias É agora que você fala !!

Preparation

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

Page 220: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

4

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.

Presentation

História O ambiente mainframe

Page 221: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

5

6

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

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.

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.

Teoria Chamada a outros programas

JOB PGM001 VERCPF

VERSPCCONFDATA

CALL

GOBACK

Page 222: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

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.

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

Sub-programachamado

item de dado

Endereço do

Direção doFluxo de dados

CALL .. BYCONTENT

Sub-programachamado

Direção doFluxo de dados

Cópia doitem de dado

Valor doitem de dado

Endereçoda cópia

Page 223: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

7

6

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.

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

CALL “SUBPROG” USING VAR1 VAR2 VAR2

LINKAGE SECTION.

77 DADO1 PIC X(10).

77 DADO2 PIC X(10).

77 DADO3 PIC X(10).

PROCEDURE DIVISION USING DADO1 DADO2 DADO3.

PROGRAMA PRINCIPAL

SUB-PROGRAMA

Page 224: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

8

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.

Page 225: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

9

6

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.

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.

Page 226: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

10

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

Teoria Finalidade do jcl

Page 227: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

11

6

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,

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

Teoria Elementos de jcl

Page 228: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

12

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.

Teoria Estrutura básica de um job

Page 229: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

13

6

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

Teoria Posicionamento de um job

Page 230: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

14

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.

Teoria O cartão job

Page 231: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

15

6

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.

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.

Page 232: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

16

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

COND=((CODIGO,OPERADOR,STEPNAME),EVEN/ONLY)

onde:

CODIGO qualquer valor numérico entre 0 e 4095

Teoria O cartão exec

PASSO2

sim

PASSO03

não

COND=(0,NE,PASSO2)

Page 233: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

17

6

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.

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.

Page 234: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

18

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.

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

Teoria Joblib e steplib

Page 235: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

19

6

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

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

Teoria O cartão dd

Page 236: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

20

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.

Page 237: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

21

6

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.

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

RLSE = Libera o espaço não utilizado.

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

Disco IBM 350

Apresentado em 13/09/1956

Pilha de 40 discos de 24 polegadas

Capacidade 4,4 Megabytes

Aluguel anual de US$ 35.000,00

Page 238: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

22

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

Page 239: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

23

6

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

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)

Page 240: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

24

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

Page 241: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

25

6

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:

Máximo de 255 arquivos sequenciais.

Máximo de 16 arquivos particionados.

Teoria Fluxo de ações de um job

Determina a

Tarefa

Digita o

JCL

Submete o

JCL

JES interpreta

o JCL e passa

p/ S.O.

S.O. executa o

serviço

JES agrupa as

saídas e

informações

sobre o JOB

Usuário

consulta a

saída

JOB ENTRY

SUBSYSTEMTSO

SISTEMA

OPERACIONALPROGRAMADOR

sub

SDST?S

JOBID

MAXCC

P.2

Page 242: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

26

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)

TeoriaClassificação externa

de um arquivo

Page 243: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

27

6

1) Verifique o fragmento de programa abaixo e indique se a

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.

Practice

Atividade Revisão aos pares

Page 244: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

28

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

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?

Atividade Trabalho em dupla

Page 245: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

29

6

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?

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

Page 246: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

30

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.

Page 247: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

31

6

5) Com base no macro-fluxo abaixo escreva os comandos de JCL para incluir um novo

step (STEP0002).

ARQENT20

ARQSAI20

PROG030

DSN=XPTO.PRODUTO.TABPRECO

DSN=XPTO.PRODUTO.LSTPRECOLRECL=200BLKSIZE=4800se o step terminar normalmente catalogar o arquivosenão excluir o arquivo

Local onde se encontra o programa:XPTO.MODULOS.LOADPRODCodificar no comando EXEC o parâmetro COND para que esse passoexecute somente se o passo anterior (STEP0001) terminar normalmente(return code = 0)

Page 248: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

32

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

Performance

Atividade Projeto 5

GPXXNN05

CLISP CLIRJ

CLIUNIF

CLIMG

PGMAUX01

Page 249: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

33

6

Layout da Mensagem

Observação

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.

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

Page 250: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

34

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

==================================================

Page 251: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

35

6

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

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

Page 252: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

36

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

.

Page 253: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

37

6

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)

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

Page 254: Grande porte   cobol level 1 - versão 2.3.5

Parte 6

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

38

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

Estou fera!

Fiz Certo!

Muito Bom Bom regular ruim Muito ruim

Page 255: Grande porte   cobol level 1 - versão 2.3.5

Parte

Algoritmo de Balance Line

A origem do simpático nomedesse algoritmo parece não ser documentada,

mas provavelmente deriva do"balanceamento" dos valores chaves unscontra os outros que forma o coração dessealgoritmo. Vale notar que o Balance Line émais do que um algoritmo, é uma abordagem

de projeto e muitas rotinas customizadaspodem ser desenvolvidas com base nela.

Page 256: Grande porte   cobol level 1 - versão 2.3.5

Versão 2.3.5

Page 257: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

3

7

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 ?

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!

Trocando Ideias É agora que você fala !!

Preparation

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

Page 258: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

4

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

História O Algoritmo mais usado

Presentation

Page 259: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

5

7

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

Teoria Operadores aritméticos

Page 260: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

6

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

Page 261: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

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

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

Page 262: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

8

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

Page 263: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

9

7

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

COMPUTE C = A * B

MULTIPLY A BY B GIVING C D E

COMPUTE C = A * B

COMPUTE D = A * B

COMPUTE E = A * B

Page 264: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

10

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:

(√1296 − √138243

). 17,5 − √19080297614

(36 − 24). 17,5 − 209

12.17,5 − 209 = 210 − 109 = 1

Page 265: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

11

7

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

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

Teoria Uso de flags (nivel 88)

Page 266: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

12

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

Page 267: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

13

7

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.

*--------------------------------------------------------------*

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

Page 268: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

14

*--------------------------------------------------------------*

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

.

Page 269: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

15

7

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

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.

TeoriaArquivos com múltiplos layouts

A - IDENTIFICAÇÃO

B - TRATAMENTO

C - PAGAMENTO

C - PAGAMENTO

C - PAGAMENTO

B - TRATAMENTO

B - TRATAMENTO

B - TRATAMENTO

B - TRATAMENTO

A - IDENTIFICAÇÃO

B - TRATAMENTO

C - PAGAMENTO

A - IDENTIFICAÇÃO

B - TRATAMENTO

C - PAGAMENTO

A - IDENTIFICAÇÃO

B - TRATAMENTO

C - PAGAMENTO

Page 270: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

16

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.

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.

Um arquivo médico em COBOL pode conter ambos desses conceitos. Ele pode

começar com um registro de cabeçalho (H), seguido por um grupo de registros A, B, C

(um grupo para cada paciente), e terminar com um registro de reboque (T). Isso dá um

arquivo com 5 tipos de registros.

A - IDENTIFICAÇÃO

B - TRATAMENTO

C - PAGAMENTO

FILLER

FILLER

A - IDENTIFICAÇÃO

B - TRATAMENTO

C - PAGAMENTO

A - IDENTIFICAÇÃO

B - TRATAMENTO

C - PAGAMENTO

FILLER

FILLER

FILLER

FILLER

H - HEADER

D - DATA

T - TRAILER

FILLER

FILLER

D - DATA

D - DATA

D - DATA

D - DATA

D - DATA

D - DATA

Page 271: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

17

7

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

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

Page 272: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

18

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.

EXEMPLO BALANCE LINE

HEADER

DATA

DATA

DATA

DATA

TRAILER

DATA

WS-REG-CADALUNO

READ CADALUNO

INTO WS-REG-CADALUNO

WS-REG-CADALUNO-HEADER

WS-REG-CADALUNO-DATA

WS-REG-CADALUNO-TRAILER

Page 273: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

19

7

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

Layout dos Arquivos

EEXXNN06

PSOLD PSMOV

PSNEW

Page 274: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

20

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

==================================================

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)

Page 275: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

21

7

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”

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

Page 276: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

22

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.

Page 277: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

23

7

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

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

Page 278: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

24

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

Page 279: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

25

7

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

*--------------------------------------------------------------*

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

Page 280: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

26

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

.

Page 281: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

27

7

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

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

.

Page 282: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

28

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

Page 283: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

29

7

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

.

Page 284: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

30

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)

Page 285: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

31

7

1) Considere os seguintes trechos de determinado

programa. Que valor será exibido pelo comando

DISPLAY? Preencha a tabela de variáveis (adiante) com

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

Practice

Atividade Revisão aos pares

Page 286: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

32

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.

a) 𝑇 =5

9 (𝐹 − 32)

b) 𝐶 =𝑀

𝐻

𝑇

745.6999

c) 𝑆 =𝐴+𝐵+𝐶

2

d) 𝐴 = √𝑆(𝑆 − 𝐴)(𝑆 − 𝐵)(𝑆 − 𝐶)

Page 287: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

33

7

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

6 – Mestrado

7 – Doutorado

8 – Pós-Doutorado

WORKING-STORAGE SECTION.

Atividade Trabalho em dupla

Page 288: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

34

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

Performance

Atividade Projeto 6

GPXXNN06

CLIOLD CLIMOV

CLINEW

PGMAUX02

Page 289: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

35

7

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

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.

Page 290: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

36

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

Chamar o programa PGMAUX02 de forma DINÂMICA, ou seja, carregar o

nome do programa na variável WS-PROGRAMA PIC X(08).

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

Page 291: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

37

7

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

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)

Page 292: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

38

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)

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

Page 293: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

39

7

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)

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)

Page 294: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

40

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)

Page 295: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

41

7

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

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

Page 296: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

42

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

Page 297: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

43

7

Page 298: Grande porte   cobol level 1 - versão 2.3.5

Parte 7

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

44

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

Estou fera!

Fiz Certo!

Muito Bom Bom regular ruim Muito ruim

Page 299: Grande porte   cobol level 1 - versão 2.3.5

Parte

Caracteres de controle de impressão ASA

As impressoras de Mainframe usamalguns caracteres de controle muito simples no

começo de cada linha para controlar omovimento do papel em uma impressora delinha. “ASA” é a sigla de American StandardsAssociation, o antigo nome da AmericanNational Standards Institute (ANSI), que se

acredita ter sancionado esses caracteres decontrole.

Page 300: Grande porte   cobol level 1 - versão 2.3.5

Versão 2.3.5

Page 301: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

3

8

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 ?

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!

Trocando Ideias É agora que você fala !!

Preparation

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

Page 302: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

4

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.

Presentation

História Relatórios ... finalmente

Page 303: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

5

8

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

*----------------------------------------------------------------*

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

Teoria Tratamento de relatório

Page 304: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

6

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.

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

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

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

CABEÇALHO

DETALHE

RODAPÉ

Cabeçalhos

** OBSERVE ATENTAMENTE **

Os cabeçalhos, linha de detalhe e

rodapé são construídos com

constantes e variáveis, seguindo o

layout do relatório.

Os espaços entre os dados devem

ser declarados como SPACES.

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

Page 305: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

7

8

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

05 LD-QTDEST PIC 999.

05 FILLER PIC X(07)

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

" INDUSTRIAS SEU NOME LTDA. ".

05 FILLER PIC X(40)

VALUE

" SERVIMOS BEM PARA SERVIR SEMPRE ".

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

Rodapé

Linha de

Detalhe

Page 306: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

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.

Page 307: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

9

8

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

(REG-RELPROD), pela opção FROM.

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

REG-RELPROD

RELPROD

Page 308: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

10

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

Page 309: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

11

8

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

* 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

Page 310: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

12

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.

Page 311: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

13

8

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

EXEMPLO RELATÓRIO

EEXXNN07

ESTOQUE

RELATO

Page 312: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

14

Layout dos Arquivos

Layout do Relatório

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

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

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

Page 313: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

15

8

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.

*----------------------------------------------------------------*

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

Page 314: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

16

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

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.

05 LD-QTDEST PIC 999.

05 FILLER PIC X(07)

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

" INDUSTRIAS SEU NOME LTDA. ".

05 FILLER PIC X(40)

VALUE

" SERVIMOS BEM PARA SERVIR SEMPRE ".

Cabeçalhos

Rodapé

Linha de

detalhe

Page 315: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

17

8

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

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

.

Page 316: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

18

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

.

Page 317: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

19

8

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

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

.

Page 318: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

20

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

.

Page 319: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

21

8

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

MOVE CORRESPONDING WS-DATA-SYS TO WS-DATA-FORMATADA

MOVE CORRESPONDING WS-HORA-SYS TO WS-HORA-FORMATADA

.

Page 320: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

22

80 ou 132 colunasde 1/10 de polegada

66 li

nh

asd

e 1 /

6d

e p

ole

gad

a

serrilha oumicro serrilha

remalina

Anatomia de umFormulário contínuo

gua

par

a fo

rmu

lári

o c

on

tín

uo

com

esc

ala

em

se

xto

s (l

inh

as) e

cim

os

(co

lun

as) d

e p

ole

gad

as

Page 321: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

23

8

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 !

Page 322: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

24

1) O relatório abaixo possui 50 linhas por página.

Associe os componentes indicados no relatório com a

coluna da direita.

( ) – Microserrilha

( ) – Rodapé

( ) – Remalina

( ) – Cabeçalho

( ) – Detalhe

Practice

Atividade Revisão aos pares

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

------ ------------------------- ------- ------- ------- ---------

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

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

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

14

5

2

3

Page 323: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

25

8

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.

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

Atividade Trabalho em dupla

Page 324: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

26

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

Performance

Atividade Projeto 7

MOVTOEST

GPXXNN07

RELMOV01

Page 325: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

27

8

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

Page 326: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

28

Layout do Relatório

Layout da SYSOUT

1 2 3 4 5

12345678901234567890123456789012345678901234567890

**************************************************

* DATA GREGORIANA 1 - 99/99/2099 *

* DATA GREGORIANA 2 - 99 DE XXXXXXXXX DE 2099 *

* DATA JULIANA – 999 DE 2099 *

* DIA DA SEMANA – XXXXXXXXXXXXX *

**************************************************

1 2 3 4 5

12345678901234567890123456789012345678901234567890

=======================================================

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

=======================================================

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

Page 327: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

29

8

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

WS-CABEC2, que contém as variáveis

WS-REF-CABEC2 WS-PAG-CABEC2

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

DD/MM/20AA ** BOX COMPANY DO BRASIL ** HH:MM:SS

RELATORIO DE MOVIMENTACAO DE ESTOQUE (REFERENCIA 9999/99) PAG. Z.ZZ9

Vou fazer

direito.

Eu

prometo!

Page 328: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

30

Tem também 1 linha de detalhe, WS-LINDET, com as variáveis:

LD-NUMMOVTO

LD-DATAMOVTO

LD-HORAMOVTO

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.

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+

Page 329: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

31

8

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”

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)

Page 330: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

32

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

Page 331: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

33

8

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

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)

Page 332: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

34

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

Page 333: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

35

8

Page 334: Grande porte   cobol level 1 - versão 2.3.5

Parte 8

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

36

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

Estou fera!

Fiz Certo!

Muito Bom Bom regular ruim Muito ruim

Page 335: Grande porte   cobol level 1 - versão 2.3.5

Parte

VSAM (Virtual Storage Access Method) éum sistema de gerenciamento de arquivosintroduzido pela IBM nos anos de 1970 comoparte dos sistemas operacionais da época. Emboraatualmente existam outros métodos de acesso(não-VSAM), VSAM é o principal componente dossistemas operacionais IBM.

Page 336: Grande porte   cobol level 1 - versão 2.3.5

Versão 2.3.5

Page 337: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

3

9

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 ?

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!

Trocando Ideias É agora que você fala !!

Preparation

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

Page 338: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

4

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.

Presentation

História OUTROS TIPOS DE ARQUIVOS?

Page 339: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

5

9

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.

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.

BO

F

01

00

PA

RA

FUSO

02

00

PO

RCA

03

00

AR

RU

ELA

04

00

JAN

ELA

05

00

PO

RTA

06

00

FEC

HA

DU

RA

07

00

CA

DEA

DO

08

00

PR

EGO

09

00

MA

RTE

LO

EOF

0600

0500

0400

0300

0200

0100

0400CHAPAXXX000200030004

0300BUCHAXXX111122223333

0200PORCAXXX001000300040

0100PREGOXXX120015003200

0600ARRUELAX030005001200

0500PARAFUSO010003001000

INDEX DATA

Teoria Arquivos vsam

Page 340: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

6

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.

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

Teoria Vsam KSDS via IDCAMS

Page 341: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

7

9

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:

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.

Page 342: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

8

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

Teoria Vsam KSDS na file-control

Page 343: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

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

REWRITE '22' DUPLICATE KEY

'23' RECORD OR FILE NOT FOUND

Page 344: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

10

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.

Teoria Vsam KSDS na file SECTION

Page 345: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

11

9

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

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

XXXXXXXXXXXREADXVCADPRDXINTOXWS-REG-VCADPRD

XXXXXXXXXXXREADXVCADPRDXINTOXWS-REG-VCADPRD

XXXXXXXXXXXXXXXXAT ENDXXXXXXXMOVE ‘S’ TO WS-FIMARQ

XXXXXXXXXXXXXXXXNOT AT ENDXXXADD 1 TO WS-CTLIDO

XXXXXXXXXXXEND-READ

Teoria Vsam KSDS na PROCEDURE DIVISION

= “10”

NOT = “10”

Page 346: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

12

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

XXXXXXXXXXXMOVEx“0100”x TOxCODPROD-V

XXXXXXXXXXXREADXVCADPRDXINTOXWS-REG-VCADPRD

XXXXXXXXXXXXXXXXINVALIDXKEYXXXXXDISPLAYX“REGISTROXNAOXLOCALIZADO”

XXXXXXXXXXXXXXXXNOTXINVALIDXKEYXADD 1 TO WS-CTLIDO

XXXXXXXXXXXEND-READ

XXXXXX*----------------------------------------------------------------*

XXXXXXXXXXXMOVEx“0100”x TOxCODPROD-V

XXXXXXXXXXXREADXVCADPRDXINTOXWS-REG-VCADPRD KEY IS CODPROD-V

XXXXXXXXXXXXXXXXINVALIDXKEYXXXXXDISPLAYX“REGISTROXNAOXLOCALIZADO”

XXXXXXXXXXXXXXXXNOTXINVALIDXKEYXADD 1 TO WS-CTLIDO

XXXXXXXXXXXEND-READ

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.

= “23”

NOT = “23”

= “23”

NOT = “23”

Page 347: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

13

9

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:

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

XXXXXXXXXXXMOVEx“0100”x TOxCODPROD-V

XXXXXXXXXXXSTART VCADPRD KEY IS NOT LESS CODPROD-V

XXXXXX*----------------------------------------------------------------*

XXXXXXXXXXXMOVEx“0100”xTOxCODPROD-V

XXXXXXXXXXXSTARTXVCADPRDXKEYXISXEQUALXCODPROD-V

XXXXXXXXXXXXXXINVALIDXKEYXXXXXDISPLAYX “ERRO NO POCISIONAMENTO”

XXXXXXXXXXXXXXNOTXINVALIDXKEYXDISPLAYX “PODE PROSSEGUIR COM A CONSULTA”

XXXXXXXXXXXEND-START

= “23”

NOT = “23”

Page 348: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

14

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

XXXXXX*----------------------------------------------------------------*

XXXXXXXXXXXWRITEXREG-VCADPRDXFROMXWS-REG-VCADPRD

XXXXXXXXXXXXXXINVALID KEYXXXXXDISPLAYX“REGISTRO DUPLICADO”

XXXXXXXXXXXXXXNOTXINVALIDXKEYXADD 1 TO WS-CTGRAV

XXXXXXXXXXXEND-WRITE

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

XXXXXXXXXXXREAD VCADPRDX

XXXXXXXXXXX

XXXXXXXXXXXREWRITEXREG-VCADPRDXFROMXWS-REG-VCADPRD

XXXXXXXXXXXXXXINVALID KEYXXXXXDISPLAYX“REGISTRO NAO ALTERADO”

XXXXXXXXXXXXXXNOTXINVALIDXKEYXADD 1 TO WS-CTALT

XXXXXXXXXXXEND-REWRITE

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.

= “22”

NOT = “22”

= “23”

NOT = “23”

Page 349: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

15

9

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

XXXXXXXXXXXREAD VCADPRD

XXXXXXXXXXX

XXXXXXXXXXXDELETE VCADPRD

XXXXXXXXXXXXXXINVALID KEYXXXXXDISPLAYX“REGISTRO NAO LOCALIZADO”

XXXXXXXXXXXXXXNOTXINVALIDXKEYXADD 1 TO WS-CTEXC

XXXXXXXXXXXEND-DELETE

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 TO WS-FS

GO TO 999-ERRO

END-IF

Modo de Acesso Comando Permitido

SEQUENTIAL

OPEN INPUT

OPEN OUTPUT

READ

WRITE

CLOSE

RANDOM

OPEN I-O

READ

WRITE

REWRITE

DELETE

CLOSE

DYNAMIC

OPEN INPUT

START

READ NEXT

CLOSE

= “23”

NOT = “23”

Page 350: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

16

Objetivo do Programa

Carregar o arquivo VSAM VCADPRD com os registros do arquivo sequencial

CADPRD.

Macro-Fluxo

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

EXEMPLO Carga vsam ksds

EEXXNN08

CADPRD

VCADPRD

Page 351: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

17

9

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

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

Page 352: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

18

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

.

Page 353: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

19

9

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

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.

Page 354: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

20

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

.

Page 355: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

21

9

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

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

Page 356: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

22

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

.

Page 357: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

23

9

Responda as questões abaixo, retiradas de

entrevistas, sobre arquivos VSAM.

1 ) Qual a diferença entre os arquivos sequenciais QSAM e VSAM ESDS ?

2) O que acontece quando um arquivo VSAM vazio é aberto como INPUT no COBOL?

3) O que é IDCAMS?

Atividade Revisão aos pares

Page 358: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

24

4) Para que serve o SHAREOPTIONS do IDCAMS?

5) Quais são os tipos de arquivos VSAM?

6) Como definir um arquivos VSAM KSDS?

Page 359: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

25

9

Na definição do arquivo PRODUTO via IDCAMS,

do tipo VSAM KSDS, existem 7 erros. Quais são eles?

Atividade Trabalho em dupla

//GPXXNNKS JOB SEUNOME,

// CLASS=A,

// MSGCLASS=X,

// NOTIFY=GPXXNN,

// TIME=(0,20)

//*----------------------------------------------

//STEP001 EXEC PGM=IDCAMS

//SYSPRINT DD SYSOUT=*

//SYSIN DD *

DELETE GP.GPXXNN.PRODUTO PARGE CLASTER

IF MAXCC = 8 THEN SET MAXCC=12

DEFINE CLASTER -

(NAME (GP.GPXXNN.PRODUTO) -

VOL (PR39T7) -

TRK (1,1)

RECORDSIZE (20,20) -

KEYS (10,0) -

SHAREOPTIONS (2,3) -

DATA(NAME(GP.GPXXNN.PRODUTO.DATA)) -

INDICE(NAME(GP.GPXXNN.PRODUTO.INDEX))

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

Page 360: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

26

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

Atividade Projeto 8

GPXXNN08

MOVPRD

RELOCOR

VCADPRD

Page 361: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

27

9

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

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

Page 362: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

28

Layout do Relatório

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

08 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX

09 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX

.. XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX

57 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX

58 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXX

59 ------------------------------------------------------------------------------------------------------------------------------------

60 INDUSTRIAS SEUNOME S/A. SERVIMOS BEM PARA SERVIR SEMPRE.

LD-OCORRENCIA

Ocorrências

INCLUSAO EFETUADA

EXCLUSAO EFETUADA

ANTES ALTERACAO

APOS ALTERACAO

MOVIMENTO INVALIDO

WS-DATA-CABEC1

WS-HORA-CABEC1

WS-PAG-CABEC1

LD-IMAGEM

Page 363: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

29

9

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

==================================================

Page 364: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

30

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.

Page 365: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

31

9

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

//*********************************************************************

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

//*

Page 366: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

32

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)

Page 367: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

33

9

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

usar o

evaluate

hehehehhe

Page 368: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

34

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)

Page 369: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

35

9

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

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)

Page 370: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

36

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

Page 371: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

37

9

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

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

Page 372: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

38

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

Page 373: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

39

9

Page 374: Grande porte   cobol level 1 - versão 2.3.5

Parte 9

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

40

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

Estou fera!

Fiz Certo!

Muito Bom Bom regular ruim Muito ruim

Page 375: Grande porte   cobol level 1 - versão 2.3.5

Parte

Quantas dimensões uma variável pode ter

na linguagem COBOL?

7

Page 376: Grande porte   cobol level 1 - versão 2.3.5

Versão 2.3.5

Page 377: Grande porte   cobol level 1 - versão 2.3.5

Parte 10

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

3

10

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 ?

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!

Preparation

Trocando Ideias É agora que você fala !!

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

Page 378: Grande porte   cobol level 1 - versão 2.3.5

Parte 10

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

4

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

Teoria Comandos complementares

Presentation

Page 379: Grande porte   cobol level 1 - versão 2.3.5

Parte 10

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

5

10

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

Teoria Tabela interna (occurs)

Page 380: Grande porte   cobol level 1 - versão 2.3.5

Parte 10

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

6

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

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.

01 02 03 04 05 06 07 08 09 10 11 12

06

WS-TOTAL

WS-TOTAL-VENDAS

Page 381: Grande porte   cobol level 1 - versão 2.3.5

Parte 10

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

7

10

Essa tabela de uma dimensão pode ser representada graficamente da seguinte forma:

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

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

WS-DADOS-DO-CLIENTE

WS-TELEFONES-CLI

WS-NOMECLI

WS-CODCLI

0504030201

WS-FONE (3)

WS-VENDEDOR (04)

WS-VENDAS (02,03)

030201

01

02

03

04

05

WS-CODVEND (01)WS-NOMEVEND (02)

Page 382: Grande porte   cobol level 1 - versão 2.3.5

Parte 10

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

8

Essa tabela de três dimensões pode ser representada graficamente da seguinte forma:

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

WS-DADOS-DOS-ALUNOS (05)

WS-NOTA (02,04,01)

WS-MATRICULA(02)

WS-NOMEALUNO (01)

01 02 03 04

01 321 321 321 321

02 321 321 321 321

03 321 321 321 321

04 321 321 321 321

05 321 321 321 321

WS-DISCIPLINA (01,02)

WS-NOTAS-DISCIPLINA (01,04)WS-DADOS-DISCIPLINA (01,01)

Page 383: Grande porte   cobol level 1 - versão 2.3.5

Parte 10

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

9

10

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.

*----------------------------------------------------------------*

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.

TeoriaPesquisa em tabela interna (search)

Page 384: Grande porte   cobol level 1 - versão 2.3.5

Parte 10

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

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.

Page 385: Grande porte   cobol level 1 - versão 2.3.5

Parte 10

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

11

10

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.

Page 386: Grande porte   cobol level 1 - versão 2.3.5

Parte 10

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

12

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.

Atividade Revisão aos pares

Page 387: Grande porte   cobol level 1 - versão 2.3.5

Parte 10

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

13

10

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”

WHEN WS-NOME = WS-NOME-CLIENTE (IDX1)

DISPLAY WS-NUMERO-CONTA (IDX1) " - "

WS-NOME-CLIENTE (IDX1) " - "

WS-SALDO-POUPANCA (IDX1)

Atividade Trabalho em dupla

Page 388: Grande porte   cobol level 1 - versão 2.3.5

Parte 10

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

14

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

Atividade Projeto 9

GPXXNN09 PGMAUX03

MOVTOEST

RELMOV01

PARM=AAAAMMDD

TABCADPROD CADPROD

Page 389: Grande porte   cobol level 1 - versão 2.3.5

Parte 10

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

15

10

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

Nome do Arquivo RELMOV01

Nome do Registro Tipo e Tamanho Descrição

REG-RELMOV01 X(80) Relatório de 80 colunas

Page 390: Grande porte   cobol level 1 - versão 2.3.5

Parte 10

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

16

Layout da Mensagem

Novo Layout do Relatório

A nova WS-LINDET tem as seguintes variáveis:

LD-NUMMOVTO

LD-DATAMOVTO

LD-HORAMOVTO

LD-CODPRODMOVTO

LD-DESCPRODMOVTO

LD-QTDMOVTO

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)

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

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+

Page 391: Grande porte   cobol level 1 - versão 2.3.5

Parte 10

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

17

10

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

Page 392: Grande porte   cobol level 1 - versão 2.3.5

Parte 10

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

18

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)

Page 393: Grande porte   cobol level 1 - versão 2.3.5

Parte 10

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

19

10

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

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

Page 394: Grande porte   cobol level 1 - versão 2.3.5

Parte 10

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

20

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

Page 395: Grande porte   cobol level 1 - versão 2.3.5

Parte 10

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

21

10

Page 396: Grande porte   cobol level 1 - versão 2.3.5

Parte 10

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

22

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

Estou fera!

Fiz Certo!

Muito Bom Bom regular ruim Muito ruim

Page 397: Grande porte   cobol level 1 - versão 2.3.5

Parte

ANEXOS

Page 398: Grande porte   cobol level 1 - versão 2.3.5

Versão 2.3.5

Page 399: Grande porte   cobol level 1 - versão 2.3.5

Parte 11

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

3

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.

Teoria MVS abend code

Page 400: Grande porte   cobol level 1 - versão 2.3.5

Parte 11

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

4

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,

U1075

Conflicting DCB information for file defined as EXTERNAL

U1072,

U1073,

U1074

Illegal numbers in reference modification

U3000 COBOL LE intercepted the ABEND. Messages in SYSDBOUT.

U4038 COBOL LE intercepted the ABEND. Messages in CEEDUMP.

Page 401: Grande porte   cobol level 1 - versão 2.3.5

Parte 11

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

5

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

Teoria Tabela de File status

Page 402: Grande porte   cobol level 1 - versão 2.3.5

Parte 11

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

6

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.

Teoria Tabela ascII

Dec Hex 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

61 3D = 125 7D } 189 BD 253 FD 2

62 3E > 126 7E ~ 190 BE 254 FE þ

63 3F ? 127 7F del 191 BF ┐ 255 FF

char

Page 403: Grande porte   cobol level 1 - versão 2.3.5

Parte 11

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

7

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

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

4 4 PF (punch off) 68 44 132 84 d 196 C4 D

5 5 HT (horizontal tab) 69 45 133 85 e 197 C5 E

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

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

19 13 TM (tape mark) 83 53 147 93 l 211 D3 L

20 14 RES (restore) 84 54 148 94 m 212 D4 M

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

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

52 34 PN (punch on) 116 74 180 B4 244 F4 4

53 35 RS (reader stop) 117 75 181 B5 245 F5 5

54 36 UC (upper case) 118 76 182 B6 246 F6 6

55 37 EOT (end of transmission) 119 77 183 B7 247 F7 7

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

Teoria Tabela EBCDIC

Usados para

representar

números

negativos.

Usados para

representar

números

positivos.

LOW-VALUES

HIGH-VALUES

Usados para

representar

números sem

sinal.

Page 404: Grande porte   cobol level 1 - versão 2.3.5

Parte 11

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

8

Teoria POTÊNCIA DE 2

1 Byte

2 Bytes

3 Bytes

4 Bytes