Click here to load reader
Upload
jeison-barros
View
213
Download
90
Embed Size (px)
Citation preview
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
COBOL Level 1
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.”
,
, ,
,
,
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.
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 !!
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 !!,
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
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
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.
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
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 ==
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)
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
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
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 "*-------------------------------------------------*"
.
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
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))))
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
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
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
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!
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.
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
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
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
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
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
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
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
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
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
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
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.
.
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
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.
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
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 *
**************************************************
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
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.
Parte 1
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
38
Parte 1
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
39
1
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
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
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 !!
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
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
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
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
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.
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.
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
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
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
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
Parte 2
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
14
Parte 2
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
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
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)
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
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).
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.
Parte 2
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
20
Parte 2
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
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
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
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
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
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
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.
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
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
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
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.
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
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
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
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
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
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.
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
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
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.
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
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
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.
Parte 2
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
43
2
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
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
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
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
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
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.
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
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
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 !!
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
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
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
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.
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
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.
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).
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
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
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.
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 ‘*-#-’.
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
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"
.
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
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
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
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.
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,
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
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
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,
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
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
,
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
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
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
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
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
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.
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
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
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
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,
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
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
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
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.
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
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
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.
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 _____________________________________
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
Parte 3
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
46
c)
FILE-CONTROL.
RELOCOR
PGM0003
OLDCLI MOVCLI
NEWCLI
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
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!?
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
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).
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
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
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
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 !!
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.
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
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"
.
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)
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
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
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
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
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
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
==================================================
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
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
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
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
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.
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 !!
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
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
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.
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.
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.
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.
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 é:
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
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
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
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)
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
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
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
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
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).
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-==.
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”.
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
.
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
.
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
.
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
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.
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.
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.
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
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
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
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.
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)
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)
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)
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
Parte 5
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
37
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
Parte
O que é JCL?
Para cada JOB que você submete, você precisa dizer ao sistema
operacional onde encontrar a apropriada entrada, como processar essa
entrada, e o que fazer com a saída resultante.Você usa a JCL (Job Control
Language - Linguagem de Controle de Serviços) para levar essas informações
ao sistema operacional através de um conjunto de comandos conhecidos como
comandos de controle de job.
site publib.boulder.ibm.com da IBM.
Versão 2.3.5
Parte 6
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 !!
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
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
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
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
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.
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.
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
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
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
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
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
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.
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)
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.
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
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
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.
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
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
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)
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=*
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
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
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
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
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)?
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.
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)
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
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
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
==================================================
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).
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
.
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
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
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.
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 !!
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
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
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
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
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
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
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
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)
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
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).
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
.
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
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
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
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
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
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)
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
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.
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).
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".
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
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
.
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
.
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
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
.
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)
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
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) 𝐴 = √𝑆(𝑆 − 𝐴)(𝑆 − 𝐵)(𝑆 − 𝐶)
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
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
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.
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
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)
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
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)
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)
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
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
Parte 7
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
43
7
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
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.
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 !!
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
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
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”.
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
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.
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
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
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
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.
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
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
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).
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
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
.
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
.
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
.
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 "*------------------------------------------*"
.
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
.
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
Ré
gua
par
a fo
rmu
lári
o c
on
tín
uo
com
esc
ala
em
se
xto
s (l
inh
as) e
dé
cim
os
(co
lun
as) d
e p
ole
gad
as
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 !
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
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
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
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
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
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!
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+
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)
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
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)
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
Parte 8
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
35
8
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
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.
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 !!
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?
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
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
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.
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
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
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
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”
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”
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”
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”
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”
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
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
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
.
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.
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
.
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
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 "*------------------------------------------*"
.
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
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?
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
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
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
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
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
==================================================
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.
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
//*
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)
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
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)
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)
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
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
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
Parte 9
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
39
9
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
Parte
Quantas dimensões uma variável pode ter
na linguagem COBOL?
7
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 !!
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
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)
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
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)
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)
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)
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.
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.
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
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
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
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
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+
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.
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)
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
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
Parte 10
www.grandeporte.com.br (11) 4427-4579 (11) 9 9903-3218
21
10
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
Parte
ANEXOS
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
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.
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
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
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.
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