Vous êtes sur la page 1sur 50

Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

Abril/2016

1
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

ÍNDICE

1. INTRODUÇÃO .............................................................................................................................. 6

COBOL II.................................................................................................................................................... 6
INTERPRETAÇÃO DOS FORMATOS NESTA APOSTILA ............................................................... 7
IDENTAÇÃO.............................................................................................................................................. 7

2. FORMATO DO FONTE COBOL .............................................................................................. 9

ÁREA DE NUMERAÇÃO SEQÜENCIAL (COLUNAS DE 1 A 6) ....................................................... 9


ÁREA DE INDICAÇÃO (COLUNA 7) ..................................................................................................... 9
ÁREA A – ÁREA B (COLUNAS DE 8 A 72) .......................................................................................... 10

3. DIVISÕES DO COBOL ............................................................................................................ 11

IDENTIFICATION DIVISION............................................................................................................... 11
ENVIRONMENT DIVISION .................................................................................................................. 12
CONFIGURATION SECTION .............................................................................................................. 12
INPUT-OUTPUT SECTION .................................................................................................................. 12
DATA DIVISION ..................................................................................................................................... 13
FILE SECTION. ...................................................................................................................................... 13
WORKING-STORAGE SECTION. ...................................................................................................... 13
ESPECIFICAÇÃO PARA DADOS DE ARQUIVOS OU VÁRIAVEIS ............................................ 13
PROCEDURE DIVISION ....................................................................................................................... 18

4. COMANDOS DE REPETIÇÃO – PROGRAMAÇÃO ESTRUTURADA .................... 19

PERFORM ................................................................................................................................................ 19
PERFORM PARÁGRAFO [THRU] PARÁGRAFO-FIM ................................................................................ 19
PERFORM PARÁGRAFO N TIMES .......................................................................................................... 19
PERFORM PARÁGRAFO [WITH TEST {BEFORE | AFTER}] UNTIL ............................................. 19
CONDIÇÃO .................................................................................................................................................. 19
PERFORM PARÁGRAFO [WITH TEST {BEFORE|AFTER}] VARYING ......................................... 20
CAMPO FROM N BY M .............................................................................................................................. 20

COMANDOS BASICOS .................................................................................................................... 21

ACCEPT ................................................................................................................................................... 21
DISPLAY .................................................................................................................................................. 22
MOVE ....................................................................................................................................................... 22
INITIALIZE ............................................................................................................................................. 23
EXIT .......................................................................................................................................................... 24
STOP RUN ................................................................................................................................................ 24

5. COMANDOS ARITMÉTICOS ................................................................................................ 25

2
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

ADD ........................................................................................................................................................... 25
SUBTRACT .............................................................................................................................................. 26
DIVIDE ..................................................................................................................................................... 27
MULTIPLY .............................................................................................................................................. 28
COMPUTE................................................................................................................................................ 28

6. COMANDOS DE DECISÃO .................................................................................................... 30

IF ................................................................................................................................................................ 30
EVALUATE .............................................................................................................................................. 32
CONTINUE .............................................................................................................................................. 33
NEXT SENTENCE ................................................................................................................................... 33

7. COMANDOS PARA PROCESSAMENTO DE ARQUIVOS SEQUENCIAIS ......... 34

ENVIRONMENT DIVISION - INPUT-OUTPUT SECTION ........................................................... 34


DATA DIVISION - FILE SECTION. ................................................................................................... 36
PROCEDURE DIVISION ....................................................................................................................... 37
OPEN ......................................................................................................................................................... 37
READ......................................................................................................................................................... 37
WRITE ...................................................................................................................................................... 38
CLOSE ...................................................................................................................................................... 38
PROGRAMA MODELO - BALANCE-LINE – ESPECIFICAÇÃO ................................................... 39
PROGRAMA MODELO - BALANCE-LINE – CODIFICAÇÃO COBOL ........................................ 40

8. COMANDOS PARA PROCESSAMENTO DE RELATÓRIOS .. ERROR! BOOKMARK


NOT DEFINED.

WRITE {BEFORE | AFTER} .......................................................... ERROR! BOOKMARK NOT DEFINED.


MÁSCARAS DE EDIÇÃO ................................................................ ERROR! BOOKMARK NOT DEFINED.
BLANK WHEN ZERO ....................................................................... ERROR! BOOKMARK NOT DEFINED.

9. COBOL AVANÇADO – ARQUIVOS VSAM ...... ERROR! BOOKMARK NOT DEFINED.

ARQUIVOS INDEXADOS – VSAM KSDS ........................................ ERROR! BOOKMARK NOT DEFINED.


ENVIRONMENT DIVISION - INPUT-OUTPUT SECTION ..... ERROR! BOOKMARK NOT DEFINED.
FILE STATUS .................................................................................... ERROR! BOOKMARK NOT DEFINED.
DATA DIVISION - FILE SECTION – FD(FILE DESCRIPTION) ........... ERROR! BOOKMARK NOT
DEFINED.
PROCEDURE DIVISION .................................................................... ERROR! BOOKMARK NOT DEFINED.
OPEN ...................................................................................................... ERROR! BOOKMARK NOT DEFINED.
READ...................................................................................................... ERROR! BOOKMARK NOT DEFINED.
WRITE ................................................................................................... ERROR! BOOKMARK NOT DEFINED.
REWRITE .............................................................................................. ERROR! BOOKMARK NOT DEFINED.
START.................................................................................................... ERROR! BOOKMARK NOT DEFINED.
DELETE ................................................................................................. ERROR! BOOKMARK NOT DEFINED.
CLOSE ................................................................................................... ERROR! BOOKMARK NOT DEFINED.

10. COBOL AVANÇADO – COMANDOS, TABELAS E DADOS ................................... 44

3
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

COPY......................................................................................................................................................... 44
CALL E LINKAGE SECTION ............................................................................................................... 44
CANCEL ................................................................................................................................................... 45
EXIT PROGRAM .................................................................................................................................... 45
GOBACK .................................................................................................................................................. 45
STRING..................................................................................................................................................... 46
TABELAS ................................................................................................................................................. 46
CLAUSULA OCCURS ................................................................................................................................ 46
NÍVEIS DE TABELAS ............................................................................................................................ 47
FORMATO ESPECIAIS DE DADOS .................................................................................................... 48
FORMATOS BINÁRIOS ........................................................................................................................ 48
CLÁUSULA USAGE................................................................................................................................ 49
USAGE COMP. ........................................................................................................................................ 50
USAGE COMP-3. ..................................................................................................................................... 50
RECOMENDAÇÕES E BOAS PRÁTICAS ....................................... ERROR! BOOKMARK NOT DEFINED.

ANEXO A: CADERNO DE EXERCÍCIOS.................... ERROR! BOOKMARK NOT DEFINED.

AGENCIA-S COD-S NOME-S SALDOM-S ............................. ERROR! BOOKMARK NOT DEFINED.

ENTRADA – CADAGE ............................................................ ERROR! BOOKMARK NOT DEFINED.

ENTRADA – CADAGE ............................................................ ERROR! BOOKMARK NOT DEFINED.

./

4
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

Revisões
Versão Data Responsável Comentário
1.0 Out/2006 Edinelson Pacci Versão inicial
2.0 Nov/2006 Edinelson Pacci Recomendações e Boas práticas
3.0 Fev/2008 Edinelson Pacci Caderno de Exercícios

5
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

1. INTRODUÇÃO
O Cobol é uma linguagem de alto nível criada no ano de 1959. A palavra
Cobol é uma abreviação de:
COmmon
Business
Oriented
Language.
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, parágrafos e frases em inglês.
Depois de escrito o programa Cobol (ou programa fonte), é necessário
traduzi-lo para a linguagem interna do computador (linguagem de máquina),
convertendo-se então em um programa objeto. Esta conversão é feita pelo
próprio computador, usando o programa compilador de Cobol.
Teremos em seguida a definição de alguns termos importantes para o
desenvolvimento do curso:
• Byte: Conjunto de 8 bits (pontos magnéticos) que formam uma
posição de memória.
• ASCII : tabela usada em micros para conversão do valor binário dos
bits de um byte em um caracter.
• EBCDIC : tabela da IBM para conversão do valor binário dos bits de
um byte em um caracter.
• Programa fonte: Texto de um programa escrito em uma linguagem de
alto nível (ex.: Cobol).
• Programa objeto: Programa convertido para a linguagem interna do
computador (linguagem de máquina).
• Compilador: Conversor de programa fonte em programa objeto.

COBOL II
O COBOL II, foi liberado pela IBM no inicio dos anos 90. É uma linguagem
poderosa e flexível para as aplicações comerciais atuais e introduziu a
codificação da programação estruturada projeto TOP-DOWN e MODULAR.
No COBOL II foram incluídos comandos para “COPY’S”, “PERFORM INLINE”,
DELIMITADORES DE ESCOPO” e os comandos “EVALUATE” e “INITIALIZE”
entre outros.
O modulo objeto gerado ficou mais potente, podendo utilizar todas as
facilidades do MVS e OS/390.
Pode-se rodar um programa acima da linha dos 16-MBYTES e com 31-BIT de
endereçamento de memória tornando mais fácil o desenvolvimento de
grandes aplicações.
No COBOL II o retorno de FILE-STATUS de arquivo VSAM é mais detalhado,
com a opção de acesso ao VSA-CODE.
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 BATH e novo formato das listagens de compilação.

6
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

INTERPRETAÇÃO DOS FORMATOS NESTA APOSTILA


1. Palavras sublinhadas são obrigatórias.
2. O símbolo | (pipe) indica que apenas uma das palavras é obrigatória.
3. Palavras em letras maiúsculas são palavras reservadas do COBOL.
4. A palavra “identificador” significa um campo ou registro definido na DATA
DIVISION.
5. As Chaves {} significam que uma das palavras em seu interior, separadas
ou não pelo símbolo | (pipe), é obrigatória.
6. As reticências ou pontos (...) indicam que dois ou mais campos ou literais
podem ser especificados.
7. A palavra “literal” significa uma constante numérica ou alfanumérica.
8. As palavras entre [ ] significam que são palavras reservadas do COBOL, mas
sua utilização é opcional para o comando.

IDENTAÇÃO
O processo de identação consiste em 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 identação
coloca-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 condição
bloco para condição satisfeita
ELSE
bloco para condição não satisfeita
END-IF

Visualmente facilita-se bastante se deslocar os blocos algumas posições à


direita (duas ou três posições são suficientes), para que fique destacado o ELSE
e o END-IF, facilitando a análise do 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 identação:


IF condição
COMPUTE A = (B * C ) ** 4
ELSE
COMPUTE A = (B * C ) ** 5
COMPUTE C = A / 0.015
END-IF

7
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

Ficaria mais difícil analisar do que se houvesse sido especificado com


identação:
IF condição
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:

Sem identação :
IF condição
IF condição
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 conical
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

Com identação:
IF condição
IF condição
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 condição
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.

8
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

2. FORMATO DO FONTE COBOL


Todo programa escrito na linguagem Cobol possui algumas regras a serem seguidas.
Uma destas regras se refere ao formato das linhas de comando (instruções) dentro
do seu editor de fonte. Uma linha de comando Cobol pode ter até 80 caracteres,
conforme o formato abaixo:

Seqüência I Área A Área B Não utilizado


1 6 7 8 11 12 72 73 80
Colunas de 1 a 6: Área de numeração seqüencial (ou comentário)
Coluna 7: Área de indicação
Colunas de 8 a 11: Área A
Colunas de 12 a 72: Área B

ÁREA DE NUMERAÇÃO SEQÜENCIAL (COLUNAS DE 1 A 6)


Normalmente consiste em seis dígitos em ordem crescente que são
utilizados para numerar as linhas do fonte. Segundo as regras no
ANS85 pode-se também colocar comentários nesta área. Além disso
podemos colocar um asterisco na coluna 7 (sete) ou qualquer outro
caractere com valor ASCII menor do que 20 (ESPAÇO), fazendo com
que a linha inteira seja considerada uma linha de comentário.
Normalmente esta área é deixada em branco.

ÁREA DE INDICAÇÃO (COLUNA 7)

HÍFEN(-)
Se o hífen estiver nesta posição indica que existe uma continuação de
uma cadeia de caracteres, (uma palavra ou frase), que foi iniciada na
linha anterior. Uma literal que não caiba numa linha, para que seja
continuada na próxima linha, 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, um apóstrofe indicando o início da continuação.
1A6 7 A AREA B
DISPLAY “RELATORIO MENSAL DE VEN
- “DAS POR AGENCIA”

ASTERISCO(*)
Nesta posição indica, para o compilador COBOL, que toda a linha
deve ser tratada como uma linha de comentário.
1A6 7 A AREA B
* ESTA ROTINA CONFERE A DATA DGITADA
VERIFICAR-DATA.

9
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

ÁREA A – ÁREA B (COLUNAS DE 8 A 72)


Área A: Posição a partir da qual se escreve nome de Division,
Sections, parágrafos e nível 01 de grupo de dados.
Área B: Posição a partir da qual se escrevem as instruções Cobol.
Veja o exemplo de código fonte a seguir:
Num. I A AREA B
000110 * ESTE E UM COMENTARIO
PARAGRAFO-1.
ADD VALOR TO LUCRO.

10
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

3. DIVISÕES DO COBOL
De maneira semelhante a um livro com seus capítulos, parágrafos e
itens, um programa Cobol é formado por uma hierarquia de Divisions,
Sections, parágrafos e instruções. Uma regra importante em Cobol é que
toda declaração (Instrução, Nome de parágrafo, Division ou Section),
deve ser terminada por ponto final (.).
O código Cobol possui quatro divisões que devem ser utilizadas nesta
ordem:
• IDENTIFICATION DIVISION.
• ENVIRONMENT DIVISION.
• DATA DIVISION.
• PROCEDURE DIVISION.

Como foi explicado no item anterior (Formato do fonte Cobol) a


declaração das DIVISÕES devem se iniciar na área A do texto (coluna
8).

IDENTIFICATION DIVISION
Esta é a divisão 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 (Nome do programa). O
nome do programa deve ser uma palavra com até 8 caracteres (letras
ou números), começando por uma letra.

Esta divisão possui a seguinte estrutura:


IDENTIFICATION DIVISION.
PROGRAM-ID. nome-programa.
AUTHOR. EDINELSON PACCI.
DATE-WRITTEN. comentário.
DATE-COMPILED. comentário.
SECURITY. comentário.

Todos os comandos que possuem a palavra comentário na frente, não


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

11
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

ENVIRONMENT DIVISION
Esta divisão descreve o equipamento envolvido no programa. Possui
duas SECTION e sua estrutura é a seguinte:

ENVIRONMENT DIVISION.
*
CONFIGURATION SECTION.
SOURCE-COMPUTER. Comentário.
OBJECT-COMPUTER. Comentário.
SPECIAL-NAMES.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
I-O CONTROL.

CONFIGURATION SECTION
Esta seção 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 identifica o computador onde foi
confeccionado o programa (opcional).
OBJECT-COMPUTER identifica o computador do ambiente de
produção (opcional).

SPECIAL-NAMES
Têm comandos pré-definidos em Cobol, para especificar
alfabeto, moeda, ou separador de decimal (vírgula ou
ponto), mas todos os comandos são opcionais. O
separador de decimais é usado mais freqüentemente.

Formato:
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.

Esta instrução informa que a vírgula (COMMA) será


usada como separador de decimais.

INPUT-OUTPUT SECTION
Esta seção destina-se a configuração dos arquivos e será
tratada no item 8.

12
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

DATA DIVISION
A DATA DIVISION é a divisão do programa onde são definidos os
dados, incluindo todas as variáveis e constantes necessárias, assim
como o conteúdo dos registros dos arquivos. A DATA DIVISION é
composta habitualmente por duas Sections: FILE SECTION e
WORKING-STORAGE SECTION. Também existe a LINKAGE SECTION
que será tratada no COBOL AVANÇADO.

FILE SECTION.
A FILE SECTION é a Section usada para detalhar o conteúdo dos
registros dos arquivos e será tratada no item 8.

WORKING-STORAGE SECTION.
NA WORKING-STORAGE SECTION devemos definir todas as variáveis
que o programa precisa para seu completo funcionamento. Não há
parágrafos nesta Section, e os dados podem ser definidos como
grupos hierárquicos (níveis 01 a 49), ou dados independentes (nível
77) em qualquer ordem, desde que não se crie um nível 77 no meio
de uma hierarquia causando seu rompimento. Exemplo:

WORKING-STORAGE SECTION.
77 CONTADOR PIC 999.
77 SOMA PIC 9(6)V99.
01 DATA-VENCIMENTO.
03 DIA PIC 99.
03 MÊS PIC 99.
03 ANO PIC 99.

ESPECIFICAÇÃO PARA DADOS DE ARQUIVOS OU VÁRIAVEIS


A definição de um dado em Cobol é feito com o seguinte formato:

Nível identificador-1 Formato Valor-inicial

NÍVEL
O nível é um número variando de 01 a 99 que define a hierarquia do
dado em relação aos outros dados. Em Cobol pode-se agrupar os
dados e concatená-los formando hierarquias como no exemplo
abaixo:

DATA-NASCIMENTO
DIA-NASCIMENTO
MES-NASCIMENTO
ANO-NASCIMENTO

Neste exemplo, DIA MÊS E ANO de NASCIMENTO são partes


integrantes da DATA-NASCIMENTO. 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:

13
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

03 DATA-NASCIMENTO
05 DIA-NASCIMENTO
05 MES-NASCIMENTO
05 ANO-NASCIMENTO

Os níveis de 50 a 99 têm uso específico, reservado para futuras


expansões do Cobol. Atualmente usam-se dois níveis nesta faixa:
Nível 77- usado quando o dado não tem hierarquia (item
independente).
Nível 88 – usado para nomes condicionais. Será explicado no Cobol
Avançado

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). 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 3 todos os itens do segundo
nível devem ter nível 03, e se para o terceiro nível for escolhido o
numero 10, todos os itens do terceiro nível devem ser especificado
com o nível 10.

NOME-DO-DADO
Qualquer palavra, pode ter no máximo 30 caracteres, incluindo
letras, números e hífen, sendo que pelo menos um dos caracteres
deve ser letra. Quando um campo criado na DATA DIVISION não for
referenciado em nenhum comando do programa, não será necessário
criar um nome-do-dado para este campo, e neste caso usa-se a
palavra FILLER como nome-do-dado deste campo.

A palavra FILLER é o nome padrão para identificar campos


anônimos.

FORMATO DO DADO
O formato dos dados em Cobol é especificado pela palavra reservada
PICTURE, ou pela sua abreviação PIC. Os formatos são descritos
usando uma das 3 letras seguintes:
9 – O dado é numérico.
X – O dado é alfa-numérico, e pode conter letras, números e
outros caracteres.
A – O dado é alfabético, e contem somente letras e espaços.

A quantidade de caracteres contidos no dado é especificado no


Formato repetindo-se as letras acima. Por exemplo, se o item
QUANT-PROD tem 5 algarismos, seu formato será:

77 QUANT-PROD PIC 99999.

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


entre parênteses:

77 QUANT-PROD PIC 9(5).

14
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

Representando a letra do formato (A, X, ou 9) pela letra F, e o


numero de caracteres da variável no campo por n, a sintaxe do
formato será a seguinte:

PIC F(n).

Quando um item numérico tiver casas decimais, não se carrega na


memória do computador o separador decimal (vírgula), porque os
circuitos de calculo do computador não foram projetados para operar
com a vírgula. Se o item VALOR-PROD tiver por exemplo o valor de
2,35, seu valor fica na memória como 235. 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, como abaixo:

77 VALOR-PROD PIC 99999V99.


Ou
77 VALOR-PROD PIC 9(5)V99.

Em um grupo de itens contidos em uma hierarquia (com níveis de 01


a 49) só podem ter a cláusula PIC os itens no nível mais baixo da
hierarquia (itens elementares). Ex.:

01 FUNC.
03 NASCIMENTO.
05 MÊS PIC 99.
05 ANO PIC 99.
03 ENDERECO.
05 RUA PIC X(20).
05 NUMERO PIC 9999.

A linguagem Cobol suporta itens numéricos com até 18 algarismos, e


itens alfanuméricos até 32.768 caracteres (dependendo do sistema
operacional).
Existem ainda formatos especiais da PIC para itens a serem
impressos, que serão vistos mais adiante.

VALOR-INICIAL
Esta cláusula é opcional em Cobol. Seu objetivo é definir um valor
para o item quando o programa se inicia. Se ela for omitida, o item
correspondente terá valores imprevisíveis. No caso de um item que
irá conter uma totalização, por exemplo, é conveniente que ele
comece com o valor zero. O valor-inicial é definido em Cobol pelo
formato:

VALUE literal.

Em Cobol existem 2 tipos de literal: numérico e alfa-numérico.


Os literais numéricos são escritos colocando-se diretamente o valor
na instrução. Ex.:

77 IDADE-MINIMA PIC 99 VALUE 18.

15
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

Os literais alfas-numéricos devem ser colocados entre aspas simples


(‘) ou aspas duplas (“). Ex:

77 NOME-RUA PIC X(20) VALUE ‘RUA FIDALGA’.

Não se pode misturar em um programa Cobol o uso de aspas simples


com aspas duplas, ou seja, se um programa começou a ser escrito
com aspas simples, deve-se usar aspas simples em todo o programa.
Os literais alfas-numéricos em Cobol podem ter no máximo 120
caracteres.

Pode-se usar ainda como valor-inicial as CONSTANTES


FIGURATIVAS, como por exemplo ZEROS, SPACES, LOW-VALUES
ou HIGH-VALUES.
ZEROS – O item (deve ser numérico) será preenchido com
algarismos 0 (zero).
SPACES – O item (deve ser alfabético ou alfa-numérico) será
preenchido com espaços.
LOW-VALUES – (menor valor) Indica que este item na memória
deve ter todos os seus bytes com todos os bits desligados.
HIGH-VALUES - (maior valor) Indica que este item na memória
deve ter todos os seus bytes com todos os bits ligados.

MÁSCARAS DE EDIÇÃO
A cláusula PICTURE (ou PIC) tem alguns formatos próprios para fazer
edição de variáveis numéricas no momento de uma impressão que
são mostrados na tabela abaixo:

PICTURE VALUE IMPRESSÃO


$ZZZZ9,99 2 $ 2,00
$$$$$9,99 2 $2,00
R$****9,99 2 $*****2,00
+ZZZZ9,99 -2 - 2,00
--------9,99 -2 -2,00
++++9,99 -2 -2,00
++++9,99 +2 +2,00
ZZ.ZZ9,99+ -2002 2.002,00-
99/99/99 020304 02/03/04
99B99B99 020304 02 03 04

BLANK WHEN ZERO


Esta cláusula, usada após a máscara de edição da PICTURE, envia
espaços em branco para a impressora quando a variável numérica a
ser impressa tem valor zero, independente do formato da máscara.

Exemplo:
03 VALOR PIC ZZ.ZZ9,99 BLANK WHEN ZERO.

16
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

IMPORTANTE :
1. Para campos numéricos (PIC 9) pode-se opcionalmente colocar a
indicação de sinal : PIC 9(03) ou PIC S9(03).

2. Se não for especificado sinal, o campo será SEMPRE tratado como se


tivesse número positivo. Exemplo : se a variável WCALC for definida
com PIC 9(03) e contiver zero, se subtrairmos 1, ela passará a ter o
número 1 positivo (é sempre forçado sinal positivo após uma
operação aritmética)

3. Se for especificado sinal, o campo será SEMPRE tratado conforme os


números relativos. Exemplo : se a variável WCALC for definida com
PIC S9(03) e contiver zero, se subtrairmos 1, ela passará a ter o
número 1 negativo

4. Máximo de 18 algarismos num campo numérico, incluindo parte


inteira e decimal

17
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

PROCEDURE DIVISION
Esta divisão controla a execução do programa, e é onde colocamos os
comandos oriundos do algoritmo planejado pelo programador
(lógica). 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:
******* INICIO PROCEDIMENTOS DO PROGRAMA **********
PROCEDURE DIVISION.
ROTINA-PRINCIPAL SECTION.
PERFORM INICIALIZAR.
PERFORM PROCESSAR.
PERFORM FINALIZAR.
FIM-ROTINA-INICIAL.
STOP RUN.

***************** SEÇÃO INICIALIZAR ***************


INICIALIZAR SECTION.
...
...
INICIALIZAR-FIM.
EXIT.

***************** SEÇÃO PROCESSAR ***************


PROCESSAR SECTION.
...
...
PROCESSAR-FIM.
EXIT.

***************** SEÇÃO FINALIZAR ***************


FINALIZAR SECTION.
...
...
FINALIZAR-FIM.
EXIT.

18
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

4. COMANDOS DE REPETIÇÃO – PROGRAMAÇÃO ESTRUTURADA


Como vimos em Lógica de programação, os programas devem ser
Estruturados. Programas bem projetados e estruturados são aqueles que
possuem uma série de construções lógicas, em que a ordem na qual as
instruções são executadas é padronizada. Em programas estruturados, cada
conjunto de instruções que realiza uma função específica é definido em uma
rotina ou, em COBOL, um parágrafo. Ele consiste em uma série de
instruções relacionadas entre si, em programação estruturada, os parágrafos
são executados por meio da instrução PERFORM.

PERFORM
A instrução PERFORM permite que o controle passe temporariamente para
um parágrafo diferente e depois retorne para o parágrafo original do qual a
instrução PERFORM foi executada.
Há dois tipos de instrução PERFORM.
1. PERFORM OUT–LINE: PROCEDURE-NAME é especificado, ou seja, é
dado um PERFORM em um PARÁGRAFO ou SECTION.
2. PERFORM IN–LINE: As instruções estão logo abaixo do comando
PERFORM. Deve ser delimitado pela frase END- PERFORM.

• Há 4 Formatos de PERFORM.
1. PERFORM básico
2. PERFORM com opção TIMES
3. PERFORM com opção UNTIL
4. PERFORM com opção VARYING UNTIL

Formato 1:
PERFORM parágrafo [THRU] parágrafo-fim
A opção THRU é opcional e pode também ser utilizado nos demais
formatos.

Exemplo 1.1:
PERFORM INICIALIZAR.
PERFORM PROCESSAR THRU PROCESSAR-FIM.

Formato 2:
PERFORM parágrafo N TIMES
O parágrafo referido é executado N TIMES, onde N pode ser uma
constante ou variável numérica.

Exemplo 2.1: PERFORM com opção TIMES (OUT-LINE)


20-00-CALCULA-TOTAL.
MOVE ZEROS TO WS-TOTAL
PERFORM 25-00-CALCULO 3 TIMES.
20-99-EXIT. EXIT.

Formato 3:
PERFORM parágrafo [WITH TEST {BEFORE | AFTER}] UNTIL
condição
O parágrafo referido é executado até que a condição especificada pela
opção UNTIL seja verdadeira.

19
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

• Tipo de teste que é efetuado no comando PERFORM UNTIL:

o WITH TESTE BEFORE (omitido assume como padrão).


Caracteriza um DO WHILE. É realizado inicialmente o teste da
condição UNTIL declarada, antes mesmo da seqüência de
instruções ser executada.

o WITH TEST AFTER (somente assume se declarado).


Caracterizando um REPEAT UNTIL. Isso assegura que a seqüência
de instruções declaradas é executada pelo menos uma vez.

Exemplo 3.1. PERFORM com opção UNTIL (OUT-LINE)


00-00-MAIN-LINE.
PERFORM INICIALIZAR
PERFORM 10-00-PROCESSAR UNTIL WS-FIM = “S”
PERFORM FINALIZAR.
00-00-EXIT. EXIT.

Exemplo 3.2. PERFORM com opção UNTIL (IN-LINE)


00-00-MAIN-LINE.
PERFORM INICIALIZAR
PERFORM LER-ARQUIVO
PERFORM UNTIL WS-FIM = “S”
IF WS-LIN > 50
PERFORM ROT-CABECALHO
END-IF
PERFORM ROT-DETALHE
PERFORM LER-ARQUIVO
END-PERFORM.
PERFORM FINALIZAR.
00-00-EXIT. EXIT.

Formato 4:
PERFORM parágrafo [WITH TEST {BEFORE|AFTER}] VARYING
campo FROM n BY m
UNTIL condição
Executa o parágrafo especificado, até que a condição especificada
seja satisfeita. Antes de executar o bloco de instruções pela primeira
vez, atribui o valor N a variável CAMPO. Após cada execução do
bloco, antes de voltar a executá-lo, incrementa M à variável CAMPO.

Opção WITH TESTE {BEFORE | AFTER} segue a mesma regra do


formato 3.

Exemplo 4.1. PERFORM com opção VARYING (OUT-LINE)


10-00-PROCESSAR.
PERFORM ROT-CABECALHO.
PERFORM ROT-DETALHE VARYING WS-LIN
FROM 1 BY 1 UNTIL WS-LIN = 60
...
ROT-DETALHE.
PERFORM IMPRIMIR-DETALHE.
PERFORM LER-ARQUIVO.

20
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

Exemplo 4.2. PERFORM com opção VARYING (IN-LINE)


00-00-MAIN-LINE.
PERFORM INICIALIZAR
PERFORM LER-ARQUIVO
PERFORM UNTIL WS-FIM = “S”
PERFORM ROT-CABECALHO
PERFORM VARYING WS-LIN
FROM 1 BY 1 UNTIL WS-LIN = 60
PERFORM IMPRIMIR-DETALHE
PERFORM LER-ARQUIVO
END-PERFORM
END-PERFORM.
PERFORM FINALIZAR.

COMANDOS BASICOS

ACCEPT
O Cobol foi desenvolvido originalmente para processar arquivos de dados e
ainda é usado, com esta finalidade. Entretanto, em muitas vezes existe a
necessidade de interação com o operador. Usamos o comando (verbo)
ACCEPT para fornecer os dados de entrada por meio de um cartão DD do
JCL (tratado no programa Cobol como SYSIN).
O comando ACCEPT recebe do dispositivo de entrada padrão SYSIN (cartão
//DDSYSIN DD *) ou informações do sistema contidas em um registrador
especial (DATE, DAY, DAY-OF-WEEK ou TIME).

Formato:
[SYSIN ]
[DATE ]
ACCEPT identificador-1 [FROM [DAY ]]
[DAY-OF-WEEK ]
[TIME ]
Obs: Quando a opção FROM é omitida o padrão FROM SYSIN é
assumido.

Regras:
▪ SYSIN
Cada vez que o programa Cobol passa pela instrução ACCEPT, uma
linha da SYSIN do JCL é carregada na variável CAMPO. É necessário
prever com cuidado quantas linhas terá a SYSIN do JCL, porque se o
comando ACCEPT não encontrar uma linha para carregar na sua
variável, o sistema operacional emitirá uma mensagem de erro para
o operador e o programa ficará suspenso até a intervenção do
operador.

▪ DATE Tem implícito PIC 9(06)


Formato YYMMDD- data gregoriana
20/12/2005 será expresso como 051220

▪ DAY Tem implícito PIC 9(05)


Formato YYDDD- data Juliana

21
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

04/07/1981 será expresso como 81185

▪ DAY-OF-WEEK
Tem implícito 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.

▪ TIME Tem implícito PIC 9(08)


Formato HHMMSSCC – Hora, minuto, segundo, centésimos.
2:41 da tarde será expresso como 14410000

Exemplos:
ACCEPT RESPOSTA FROM SYSIN
• Lê um registro lógico em SYSIN e coloca-o na variável
denominada RESPOSTA

WORKING-STORAGE SECTION.
05 WS-DATE PIC 9(06).
05 WS-TIME PIC 9(08).
...
ACCEPT WS-DATE FROM DATE.
ACCEPT WS-TIME FROM TIME.

DISPLAY
Exibe conteúdo de campo(s) num dispositivo de saída. Normalmente é o
dispositivo cujo DDNAME é SYSOUT.

Formato:
DISPLAY [identificador-1 | literal-1] ...

Exemplos:
DISPLAY "PROGRAMA INICIANDO............. "
DISPLAY "TOTAL REGISTROS LIDOS.........: " WS-REGLIDOS
DISPLAY "TOTAL REGISTROS GRAVADOS..: " WS-REGGRAV
DISPLAY WS-SQLCODE
DISPLAY WS-DIA ‘/’ WS-MES ‘/’ WS-ANO

MOVE
A instrução MOVE transfere dados de uma área de memória para uma ou
mais áreas.
• Alinhamento alfabético/alfa-numérico
Os dados são acomodados no campo receptor alinhando-se da esquerda
para a direita. Se o campo emissor for maior que o receptor, os BYTES
mais a direita, em excesso, serão truncados no campo receptor. Se o
emissor for menor que o receptor os BYTES faltantes para preencher o
campo receptor serão preenchidos com SPACES.
• Alinhamento Numérico
Os dados são acomodados no campo receptor alinhando-se da direita
para a esquerda. Se o campo emissor for maior que o receptor os BYTES
mais a direita do campo emissor serão truncados.
• Os campos: EMISSOR e RECEPTOR podem ser itens de grupo ou
elementares.

22
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

Formato:
MOVE ALL {identificador-1 | literal-1} TO {identificador-2 ...}

Exemplos:
MOVE WS-NUM-PAG TO NUM-PAG-REL.
MOVE WS-CODCLI-ARQ TO WS-CODCLI-AUX, COD-CLI-REL.
MOVE ZEROS TO WS-ACUM-VALOR,
WS-TOT-PAG,
WS-ACUM-COMISSAO.
MOVE “N” TO WS-FIM-ARQ.
MOVE “S” TO WS-FIM-ARQ.

Exemplos de MOVE’s com constantes figurativas

Comando Campo Campo Conteúdo do campo receptor


emissor receptor após o MOVE
(constante formato
figurativa)
MOVE ZERO TO TOTSAL ZERO PIC 9(5) 00000
MOVE ZEROS TO TOTSAL ZEROS PIC 9(5) 00000
MOVE ZEROES TO TOTSAL ZEROES PIC 9(5) 00000
MOVE SPACE TO SIGLA SPACE PIC X(02) 4040 (em Hexa decimal)
MOVE SPACES TO SIGLA SPACES PIC X(02) 4040 (em Hexa decimal)
MOVE HIGH-VALUE TO HIGH-VALUE PIC X(03) FFFFFF (em Hexa decimal)
CHAVE-ARQUIVO
MOVE LOW-VALUE TO LOW-VALUE PIC X(03) 000000 (em Hexa decimal)
CHAVE-ARQUIVO
MOVE ALL ‘*’ TO WS-MSG ALL ‘*’ PIC X(05) *****
MOVE ALL ‘*A’ TO ALL ‘*A’ PIC X(05) *A*A*
WS_MSG

 ZEROS – O item (deve ser numérico) será preenchido com


algarismos 0 (zero).
 SPACES – O item (deve ser alfabético ou alfa-numérico) será
preenchido com espaços.
 LOW-VALUES - indica que este item na memória deve ter todos
os seus bytes com todos os bits desligados. Um item nestas
condições terá o menor valor possível em todas as comparações.
 HIGH-VALUES - indica que este item na memória deve ter todos
os seus bytes com todos os bits ligados. Um item nestas
condições terá o maior valor possível em todas as comparações.

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 alfas-numéricas são inicializadas com espaços.
• Se a variável especificada for um item de grupo, todos os seus sub-itens
serão inicializados de acordo com seu formato: os que forem numéricos,
serão inicializados com zero (respeitando-se seu formato : zonado,
compactado ou binário) ; se a variável for alfa-numérica ou alfabética,
ela será inicializada com espaços.
• Da mesma forma, se a variável tiver a cláusula OCCURS, todas as suas
ocorrências serão inicializadas.

23
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

• Pode-se especificar um conteúdo alternativo para a inicialização,


através da cláusula REPLACING.

Formato:
INITIALIZE variável
[ REPLACING [NUMERIC | ALPHABETIC]
DATA BY literal/variável]

Exemplos:
INITIALIZE AREA-DE-VALORES, WS-ACUM-VALOR
EXIT
A instrução EXIT provê um ponto de encerramento comum para uma serie
de parágrafos. A instrução EXIT não tem efeito na compilação nem na
execução do programa, é portanto, usado com a finalidade de documentar o
programa.

Formato:
EXIT

Exemplo:
PROCEDURE DIVISION
00-00-MAIN-LINE.
PERFORM INICIALIZAR.
PERFORM PROCESSAR.
PERFORM FINALIZAR.
00-99-FIM. EXIT.

STOP RUN
A instrução STOP RUN encerra a execução do programa.

Formato:
STOP RUN

Exemplo:
PROCEDURE DIVISION
00-00-MAIN-LINE.
PERFORM INICIALIZAR.
PERFORM PROCESSAR.
PERFORM FINALIZAR.

00-99-FIM. EXIT.
STOP RUN.

24
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

5. COMANDOS ARITMÉTICOS
As instruções para efetuar cálculos aritméticos em Cobol são: ADD(somar),
SUBTRACT(subtrair), MULTIPLY(multiplicar), DIVIDE(dividir) e
COMPUTE(calcular).

Formato básico para instruções aritméticas:


Instrução aritmética
[ ROUNDED ]
[ [NOT] ON SIZE ERROR instrução imperativa … ]
[END-...]

 Opção 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 de dados resultante. 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: ADD WS-VALOR1 TO WS-VALOR2 ROUNDED

 Opção 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:
ADD VALOR-1 TO VALOR-2
ON SIZE ERROR
DISPLAY ‘ESTOUROU O CAMPO DE RESULTADO’
MOVE “S” TO WS-FLAG-ESTOURO.

 Opção END-… (Terminador de escopo)


Visando permitir uma programação estrutura, todas as instruções
aritméticas do Cobol permitem terminador de escopo.

ADD
Acumula dois ou mais operandos numéricos e armazena resultados.

Formato:
ADD { identificador-1 ... literal-1 ...} TO | GIVING
{ identificador-de-resultado ... }
Regras:
1. Todos os literais e campos que são parte da adição devem ser
numéricos. Após a palavra GIVING, contudo, o campo pode ser um
item de relatório.
2. O campo identificador-de-resultado, após TO ou GIVING, deve ser um
nome de dados, e não um literal.
3. Pelo menos dois operandos deverão anteceder a palavra GIVING.

25
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

4. Ao usar TO, o conteúdo inicial do identificador-de-resultado, que deve


ser numérico, é somado junto ao dos outros campos (identificador-1
... literal-1...).
5. Ao usar o formato GIVING, o campo identificador-de-resultado
receberá a soma, mas seu conteúdo inicial não será parte da
instrução ADD. Ele pode ser tanto um campo numérico como um item
de relatório.

Exemplos:
ADD WS-VALOR TO WS-AC-TOTAL.
• Efetua: WS-AC-TOTAL = WS-AC-TOTAL + WS-VALOR.

ADD WS-VALOR TO WS-AC-TOTAL1


WS-AC-TOTAL2.
• Efetua: WS-AC-TOTAL1 = WS-AC-TOTAL1 + WS-VALOR.
• Efetua: WS-AC-TOTAL2 = WS-AC-TOTAL2 + WS-VALOR.

ADD WS-AC-TOTAL1,
WS-AC-TOTAL2,
WS-AC-TOTAL3 TO WS-AC-TOTGERAL.
• Efetua: WS-AC-TOTGERAL = WS-AC-TOTGERAL +
WS-AC-TOTAL1 + WS-AC-TOTAL2 + WS-AC-TOTAL3.

ADD WS-VALOR1 WS-VALOR2 GIVING WS-AC-VALOR.


• Efetua: WS-AC-VALOR = WS-VALOR1 + WS-VALOR2.

SUBTRACT
Subtrai um ou mais operandos numéricos e armazena resultados.

Formato 1:
SUBTRACT { identificador-1 ... literal-1 ...}
FROM identificador-de-resultado …

Formato 2:
SUBTRACT { identificador-1 ... literal-1 ...}
FROM identificador-2 literal-2
GIVING identificador-de-resultado ...

Regras:
1. Observe a colocação das reticências (...) no Formato 1. O primeiro
conjunto depois do identificador-1 significa que dois ou mais
operandos podem ser subtraídos do identificador-2. Além disso, os
operandos podem ser subtraídos do identificador-de-resultado-1, do
identificador-resultado-2, e assim por diante.
2. Com o Formato 2, pode vir qualquer número ou identificadores
imediatamente após a palavra SUBTRACT ou a palavra GIVING, mas
depois da palavra FROM é permitido um único identificador ou literal.
3. Todos os literais e campos 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.
4. O campo identificador-de-resultado, após FROM ou GIVING, deve ser
um nome de dados, e não um literal.

26
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

5. Ao usar o formato GIVING, o campo identificador-de-resultado


receberá o resultado da subtração, mas seu conteúdo inicial não será
parte da instrução SUBTRACT. Ele pode ser tanto um campo
numérico como um item de relatório.

Exemplos:
SUBTRACT VL-CHEQUE FROM SALDO.
• Efetua: SALDO = SALDO – VL-CHEQUE.

SUBTRACT VL-CHEQUE FROM SALDO GIVING SALDO-ATUAL


• Efetua: SALDO-ATUAL = SALDO – VL-CHEQUE.

DIVIDE
Efetua uma divisão, disponibilizando o quociente e, se indicado, o resto.

Formato 1:
DIVIDE {(divisor)identificador-1 literal-1} INTO
{(dividendo)identificador-2 literal-2}
GIVING identificador-de-resultado …
[ REMAINDER identificador-de-resto ]

Formato 2:
DIVIDE {(dividendo)identificador-1 literal-1} BY
{(divisor)identificador-2 literal-2}
GIVING identificador-de-resultado ...
[ REMAINDER identificador-de-resto ]

Regras:
1. Observar que GIVING é opcional com INTO, mas obrigatório com
BY.
2. No formato 1, quando a opção GIVING não é utilizada o resultado
da divisão é colocado dentro do indentificador logo após a palavra
INTO.
3. A opção REMAINDER é utilizada quando se faz necessário guardar
o resto da divisão em outro identificador.

Exemplos:
DIVIDE 2 INTO WS-NUMERO
• Efetua WS-NUMERO = WS-NUMERO / 2

DIVIDE WS-VL-DOLAR INTO WS-VL-REAIS


GIVING WS-RESULT
• Efetua WS-RESULT = WS-VL-REAIS / WS-VL-DOLAR

DIVIDE WS-NUM BY 2
GIVING WS-RESULT
REMAINDER WS-RESTO
• Efetua WS-RESULT = WS-NUM / 2 (resto em WS-RESTO)

27
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

MULTIPLY
Efetua a multiplicação entre variáveis

Formato:
MULTIPLY {identificador-1 literal-1} BY
{identificador-2 literal-2}
GIVING identificador-de-resultado ...
[END-MULTIPLY] ]

Regras:
1. Observe a colocação das reticências (...). O resultado será
armazenado em todos os identificadores-de-resultado após
GIVING.

Exemplos:
MULTIPLY 2 BY VALOR ROUNDED
• Efetua VALOR = 2 * VALOR (com arredondamento)

MULTIPLY VALOR BY 2 GIVING DOBRO


• Efetua DOBRO = VALOR * 2

MULTIPLY 2 BY VALOR GIVING DOBRO


• Efetua DOBRO = 2 * VALOR

COMPUTE
Com a instrução COMPUTE, as operações aritméticas podem ser combinadas
sem as restrições impostas para o campo receptor quando é usado ADD,
SUBTRACT, MULTIPLY e DIVIDE. Quando as operações aritméticas são
combinadas, a instrução compute é mais eficiente que as instruções
aritméticas escritas em serie.

Formato:
COMPUTE identificador-de-resultado [ROUNDED] =
Intrução-aritmética
[ [NOT] ON SIZE ERROR instrução-imperativa]

Regras:
1. A opção ROUNDED e ON SIZE ERROR segue a mesma regra
utilizada para expressões aritméticas.
2. Os símbolos que podem ser utilizados em uma instrução
COMPUTE, conforme sua ordem de prioridade de execução,
são:
( ) Parênteses
** Exponenciação
* Multiplicação
/ Divisão
+ Adição
- Subtração
3. O sinal de igual, assim como os símbolos aritméticos devem ser
precedidos e seguidos de um espaço. Assim, para calcular
B+C+D**2 e colocar o resultado em A, use a seguinte instrução:

28
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

COMPUTE A = B + C + D ** 2. O parêntese não é obrigatório ser


seguido de espaço.
4. A ordem em que são executadas as operações em uma expressão
aritmética que contenha mais de um operador segue a seguinte
prioridade de hierarquia.
1 º ( ) Expressões dentro de parênteses
2º Exponenciação
3º Multiplicação, divisão
4º Adições e Subtrações
☺ Quando houver operadores de mesma hierarquia,
eles serão executados da esquerda para a direita.

Exemplos:
COMPUTE WS-RESULT ROUDEND = (AA + BB) / CC
COMPUTE WS-RESULT = (((AA + BB) / CC) / DD) * (EE ** 2)

A fórmula A = B² + C²
ficará em Cobol da seguinte forma:
COMPUTE A = (B ** 2 + C ** 2) ** (0,5).

29
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

6. COMANDOS DE DECISÃO

IF
Efetua teste de condições especificadas, e efetua os desvios necessários de
acordo com o resultado.
• A base para identificar os pontos de desvio é o PONTO, o ELSE ou o END-
IF.
• PONTO e END-IF indicam o fim da especificação da instrução; as
instruções que estão após o PONTO e o END-IF, portanto, são
executadas tanto para os casos de condição satisfeita quanto para os
casos de condição não satisfeita.

Formato:
IF CONDIÇÃO
instruções (para condição verdadeira)
[ELSE
instruções (para condição não verdadeira)
END –IF]

 CONDIÇÃO
Pode ser uma condição simples ou complexa. A Tabela de
operadores lógicos e relacionais abaixo, pode ser utilizada para
combinar a condição a ser testada.
Descrição Símbolo Em COBOL
Igual = EQUAL

Diferente NOT = NOT EQUAL

Maior que > GREATER

Menor que < LESS

Maior ou
NOT < NOT LESS
igual a

Menor ou
NOT > NOT GREATER
igual a

OPERADOR DESCRIÇÃO
"NÃO": Inverte o valor de um
operando. Se o operando é verdadeiro o
Not resultado será falso. Se o operando é
falso o resultado será verdadeiro.
"E": Se os dois operandos são
verdadeiros, o resultado será
And verdadeiro. Se um dos dois operandos é
falso, o resultado será falso.
"OU": Se os dois operandos são falsos,
o resultado será falso. Se um dos dois
Or operandos é verdadeiro, o resultado
será verdadeiro.
Categorias Símbolo Notação alternativa

30
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

Teste de sinal IS POSITIVE


IS NEGATIVE
IS ZERO
Teste de classe IS NUMERIC
IS ALPHABETIC

 INSTRUÇÕES
Podem ser uma das seguintes condições:
- Uma instrução imperativa
- Uma instrução condicional
- Uma instrução imperativa seguida pôr uma instrução condicional.

 ELSE
Se a avaliação da condição for verdadeira, será executado a instrução
antes do ELSE. Se a avaliação testada for falsa, será executada a
instrução entre o ELSE e o END-IF.

 IF sem ELSE
Se a avaliação da condição for verdadeira, será executada a instrução
entre o IF e o END-IF.

Exemplo 1: (IF SEM ELSE)


IF WS-CAMPO1 EQUAL WS-CAMPO-2
PERFORM 10-00-PESQUISA
END-IF

Exemplo 2: (IF COM ELSE)


IF WS-CAMPO1 < WS-CAMPO-2
ADD 1 TO WAC-CAMPO3
ELSE
COMPUTE WS-TOTAL = WS-VALOR1+ WS-VALOR2
END-IF

Exemplo 3: (IF COM NEXT SENTENCE)


IF WS-CAMPO1 > WS-CAMPO-2
NEXT SENTENCE
ELSE
ADD WS-CAMPO4 TO WS-TOTAL
END-IF

Exemplo 4: (NINHOS DE IF)


IF WS-CAMPO1 = WS-CAMPO-2
MOVE “N” TO WS-CAMPO3
IF WS-CAMPO < WRK-CAMPO4
ADD 1 TO WS-CAMPO
PERFORM 15-00-SITUAÇÃO1
END-IF
IF WS-CAMPO5 > WS-CAMPO6
PERFORM 15-00-SITUAÇÃO2

31
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

ELSE
IF WS-CAMPO7 EQUAL “H”
NEXT SENTENCE
ELSE
PERFORM 20-00-SITUAÇÃO3
END-IF
END-IF
END-IF

EVALUATE
Faz a comparação de uma variável contra os valores indicados, efetuando as
instruções correspondentes. A instrução EVALUATE é uma notação abreviada
para ninho de IF’S em série, que permite codificar a estrutura CASE, da
programação estruturada.

Formato:
EVALUATE variável
WHEN identificador-1 THRU identificador-2 …
Instrução-imperativa-1 …
[WHEN OTHER
instrução-imperativa-2]
END-EVALUATE

Exemplo:
EVALUATE SIGLA-UF
WHEN 'SP' DISPLAY 'SÃO PAULO'
WHEN 'PR' DISPLAY 'PARANA'
WHEN 'SC' DISPLAY 'SANTA CATARINA'
WHEN 'RS' DISPLAY 'RIO GRANDE DO SUL'
WHEN OTHER DISPLAY
'OUTRO ESTADO'
END-EVALUATE.

EVALUATE WS-SALDO
WHEN ZEROS THRU 10000
DISPLAY “CLIENTE COMUM”
WHEN 10001 THRU 20000
DISPLAY “CLIENTE ESPECIAL”
WHEN > 20000
DISPLAY “CLIENTE SUPER-ESPECIAL”
END-EVALUATE.

32
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

CONTINUE
A instrução CONTINUE permite que seja especificado um desvio de um bloco
nulo. Esta instrução indica que nenhuma instrução executável condicional ou
imperativa pode ser usada.

Formato:
CONTINUE

Exemplo:
IF A > B
CONTINUE
ELSE
DISPLAY ‘A MENOR OU = B’
END-IF.
DISPLAY “COMPARAÇÃO EFETUADA”.

NEXT SENTENCE
Efetua um desvio para a próxima sentença (o início dela é identificado pelo
próximo ponto ou END-comando )

Formato:
NEXT SENTENCE

Exemplos:
IF A = B
NEXT SENTENCE
ELSE
DISPLAY ‘A DIFERENTE B’
END-IF.
DISPLAY “COMPARAÇÃO EFETUADA”.

33
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

7. COMANDOS PARA PROCESSAMENTO DE ARQUIVOS SEQUENCIAIS


Todas as instruções que vimos até aqui manipulavam as variáveis na
memória do computador. Mas a memória é volátil (quando se desliga o
computador, perde-se todo seu conteúdo). Alem disso, é um recurso
limitado, e quando nosso programa termina, ele precisa ser apagado para
que outros programas possam ser executados. Todos os dados que estão na
memória e que não queremos perder quando o programa terminar devem
ser gravados em ARQUIVOS, como discos magnéticos, fitas magnéticas etc.
Um programa Cobol trata todos os tipos de arquivos basicamente da mesma
maneira:

 Os arquivos devem ser declarados na INPUT-OUTPUT SECTION


(ENVIRONMENT DIVISION), com a instrução SELECT.

 Os conteúdo do arquivo deve ser descrito na FILE SECTION (DATA


DIVISION) com a instrução FD.

 Na PROCEDURE DIVISION é necessário programar as instruções para


gravar ou ler estes arquivos.

ENVIRONMENT DIVISION - INPUT-OUTPUT SECTION


Esta seção destina-se a configuração dos arquivos que o programa
usa.
• FILE-CONTROL – Cláusula SELECT
Neste parágrafo devemos especificar cada um dos arquivos que o
programa irá acessar.

No parágrafo FILE-CONTROL, usado para definir arquivos, usamos


uma instrução SELECT para cadastrar no programa cada um dos
arquivos usados pelo programa. O formato da instrução SELECT é o
seguinte:

Formato:
SELECT nome-arquivo-lógico ASSIGN TO nome-arquivo-fisico
ORGANIZATION IS tipo-de-organização
ACCESS MODE IS tipo-de-acesso
[FILE STATUS IS identificador-1]

Regras:
• Nome-arquivo-lógico: Nome que será tratado internamente
pelo progrrama.
• Nome-arquivo-fisico: Deve especificar o nome do arquivo que
será grafado fisicamente no sistema operacional. No caso de
programação Mainframe, deve-se usar a mesma palavra que será
empregada no JCL (comandos de execução do programa), para
especificar o arquivo quando o programa for executado.

• ORGANIZATION:
LINE-SEQUENTIAL: Arquivo do tipo texto sequencial
• ACCESS MODE:
SEQUENTIAL: O arquivo será gravado e lido sequencialmente

34
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

Exemplo:
No exemplo abaixo mostramos uma ENVIRONMENT DIVISION
de um programa que irá acessar um arquivo CLIENTES.
*
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CLIENTES ASSIGN TO DA-S-CLIENTES
ORGANIZATION IS LINE-SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
FILE STATUS IS WS-STATUS.
*
Neste exemplo escolhemos como nome-arquivo-lógico
dentro da instrução SELECT a palavra CLIENTES. O
programador pode usar qualquer palavra com até 30
caracteres para definir este nome, mas uma vez definido um
nome-arquivo-lógico na instrução SELECT, deverá usar
sempre este nome no programa quando se referir a este
arquivo.

FILE STATUS PARA ARQUIVO SEQUENCIAL


A boa prática de programação sugere que todos os comandos para
processamento de arquivos na PROCEDURE DIVISION devem ser
seguidos de um teste na variável FILE STATUS para verificar
possíveis erros. A variável FILE STATUS pode retornar um dos valores
abaixo:

STATUS SIGNIFICADO
'00' Comando realizado com sucesso
'10' Fim de arquivo
'34' Leitura em arquivo que já foi lido até o Final
'35' Open em arquivo que não existe (Ver SELECT ASSIGN TO ....)
'39' Conflito de atribu.tos (tamanho da FD x tamanho fisico do
arquivo
'41' Open em Arquivo já aberto
'42' Close em arquivo já fechado
'46' Gravação em Arquivo que já está sem espaço para gravar
(normalmente é loop)
'47' Read em arquivo não aberto com INPUT, IO ou EXTEND
'48' Write em arquivo não aberto com OUTPUT ou IO
'9x' Permissão / acesso ao arquivo não ok
Depende da letra/número mostrado no x

35
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

DATA DIVISION - FILE SECTION.


A FILE SECTION é a Section usada para detalhar o conteúdo dos
registros dos arquivos que o programa irá ler/gravar. Vimos
anteriormente, na INPUT-OUTPUT SECTION (ENVIRONMENT
DIVISION), que para cada arquivo a ser tratado no programa havia
uma instrução SELECT especificando e definindo um nome para o
arquivo. Na FILE SECTION precisamos agora detalhar cada um destes
arquivos. Isto é feito usando o parágrafo padrão FD – FILE
DESCRIPTION.

FD (FILE DESCRIPTION)

FD nome-do-arquivo
LABEL RECORD [STANDARD | OMITTED]
BLOCK CONTAIS O RECORDS
RECORDING MODE IS F
RECORD CONTAIS n CHARACTERS
DATA-RECORD IS nome-registro-do-arquivo.
01 nome-do-registro. ...
[03 nome-de-campo ...]

Regras:
1. As clausulas RECORDING MODE, RECORD CONTAINS e DATA-
RECORD são todas opcionais, e servem só como documentação.
2. A clausula LABEL RECORD com a opção STANDARD é utilizada
para a definição de arquivo SEQUENCIAL. A opção OMITTED
deve ser utilizada em arquivo para RELATÓRIOS.
3. É necessário observar com atenção o uso correto do
ponto final na FILE SECTION, como está demonstrado no
exemplo abaixo.

Exemplo:
O arquivo CLIENTES definido na INPUT-OUTPUT SECTION seria
detalhado aqui como:

DATA DIVISION.
FILE SECTION.
FD CLIENTES
RECORDING MODE IS F
RECORD CONTAINS 80 CHARACTERS.
01 REG-CLIENTES.
03 COD-CLIENTE PIC 9(8).
03 NOME-CLIENTE PIC X(20).
03 ENDER-CLIENTE PIC X(40).
03 VALOR-CLIENTE PIC 9(10)V99.

36
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

PROCEDURE DIVISION

OPEN
Todo arquivo antes de ser manipulado deve ter seu acesso aberto pelo
comando OPEN. Este comando abre o contato com o dispositivo físico do
arquivo e reserva, na memória (WORKING-STORAGE SECTION), áreas
necessárias para a troca de dados entre o computador e o dispositivo
externo. Indica quais arquivos serão de entrada e quais serão de saída.

Formato:
OPEN [INPUT | OUTPUT | EXTEND] Nome-arquivo1 ...

Regras:
1. INPUT: Permite abrir o arquivo apenas para operações de leitura.
2. OUTPUT: Permite abrir o arquivo para operações de gravação /
impressão. Esta operação pode ser especificada quando o arquivo
estiver sendo criado. Esta opção não permite comandos de leitura no
arquivo.
3. EXTEND: Permite abrir um arquivo para operações de OUTPUT. Esta
opção deve ser utilizada apenas para arquivo LINE-SEQUENTIAL.
4. NOME-Arquivo1 ... : Nome lógico do(s) arquivo(s) definido(s) na
clausula SELECT e na FD-File Description.

Exemplos:
OPEN INPUT CADAGENCIA.
OPEN I-O CADBANCOS, CADFILIAIS.

READ
Para acesso seqüencial, a instrução READ obtém o próximo registro lógico de
um arquivo disponível ao programa objeto.
Para acesso RANDOMICO, a instrução READ obtém um registro especificado
de um arquivo de acesso direto disponível ao programa objeto. Quando a
instrução READ for executada, o arquivo associado deve estar aberto no
modo INPUT ou I-O

Formato: Leitura Sequencial


READ nome-arquivo
[INTO nome-area-working]
[AT END instrução-imperativa]
[END-READ]

Regras:
1. INTO: O registro corrente é movido de uma área de INPUT para
nome-area-working, de acordo com as regras da instrução MOVE.
2. AT END: Se a condição AT END for especificada, a instrução-
imperativa do após o AT END será executada.

37
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

Exemplo: Leitura em arquivo ORGANIZATION SEQUENTIAL


ENVIRONMENT DIVISON.
INPUT-OUTPUT SECTION.
FILE CONTROL.
SELECT SEQENT01 ASSIGN TO SYS-SEQENT01
ORGANIZATION SEQUENTIAL
FILE STATUS IS WS-STATUS.

...
PROCEDURE DIVISION.
...
LER-ARQ-SEQENT.
READ SEQENT01 INTO WS-REGISTRO-SEQENT01
AT END MOVE “N” TO WS-FIM
END-READ.

WRITE
A instrução WRITE regrava logicamente um dado registro num arquivo de
acesso direto.

Formato:
WRITE nome-de-registro-1 [FROM identificador-1].

Regras:
1. O arquivo de acesso direto associado à instrução WRITE deve ser
aberto no modo OUTPUT ou EXTEND.

2. NOME-DE-REGISTRO-1: Deve ser o nome de um registro lógico


na entrada da FD na DATA DIVISION.

3. FROM identificador-1: O conteúdo do identificador-1 é copiado


para o nome-de-registro-1 antes de ocorrer a gravação. Depois da
execução com sucesso da instrução WRITE, o registro continua
disponível no identificador-1.

Exemplo:
WRITE REGISTRO-ARQUIVO FROM REGISTRO-AUXILIAR.

CLOSE
Efetua o fechamento de arquivos. A boa prática de programação é fechar
todos os arquivos abertos através do comando OPEN

Formato:
CLOSE nome-de-arquivo ...

Exemplos:
CLOSE ARQBANCO.
CLOSE ARQAGENCIA.
CLOSE ARQBANCO, ARQAGENCIA.
CLOSE ARQBANCO
ARQAGENCIA.

38
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

PROGRAMA MODELO - BALANCE-LINE – ESPECIFICAÇÃO

Objetivo: Atualizar SALDO do CADASTRO DE CLIENTES(CADCLIN) com


movimentação do arquivo MOVCLI.

Macro-Fluxo:

CADCLI MOVCLI
(1) (N)

ACAENNnn

CADCLIN

LAYOUTS:
01 WS-REGISTRO-CADCLI.
03 CHAVE-CADCLI.
05 AGENCIA-CADCLI PIC 9(10).
05 NUM-CONTA-CADCLI PIC 9(10).
03 NOME-CADCLI PIC X(40).
03 SALDO-CADCLI PIC 9(11)V99.
03 FILLER PIC X(07).

01 WS-REGISTRO-MOVCLI.
03 CHAVE-MOVCLI.
05 AGENCIA-MOVCLI PIC 9(10).
05 NUM-CONTA-MOVCLI PIC 9(10).
03 NOME-MOVCLI PIC X(40).
03 VALOR-DEB-MOVCLI PIC 9(08)V99.
03 VALOR-CRE-MOVCLI PIC 9(08)V99.

01 WS-REGISTRO-CADCLIN.
03 CHAVE-CADCLIN.
05 AGENCIA-CADCLIN PIC 9(10).
05 NUM-CONTA-CADCLIN PIC 9(10).
03 NOME-CADCLIN PIC X(40).
03 SALDO-CADCLIN PIC S9(11)V99.
03 FILLER PIC X(07).

39
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

Procedimento: Atualizar arquivo CADCLIN


Se CHAVE-CADCLI < CHAVE-MOVCLI
GRAVAR CADCLIN COM REGISTRO IGUAL CADCLI
LER PROXIMO CADCLI

Se CHAVE-CADCLI = CHAVE-MOVCLI
Atualizar CADCLIN (com dados do CADCLI e MOVCLI)
Obs.: Calcular o novo saldo do cliente com todos os registros do
movimento pertencente ao mesmo cliente
Se VALOR-DEB-MOVCLI NOT = ZEROS
SALDO-CADCLIN = SALDO-CADCLI - VALOR-DEB-MOVCLI
SENAO
SALDO-CADCLIN = SALDO-CADCLI + VALOR-CRE-MOVCLI
GRAVAR CADCLIN
LER PROXIMO CADCLI
LER PROCIMO MOVCLI

Se CHAVE-CADCLI > CHAVE-MOVCLI


GRAVAR CADCLIN COM DADOS DO ARQUIVO MOVCLI
CONSIDERANDO QUE O SALDO-CADCLIN = VALOR-CRED-MOVCLI
LER PROXIMO MOVCLI

PROGRAMA MODELO - BALANCE-LINE – CODIFICAÇÃO COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. ACAENNnn.
AUTHOR. EDINELSON PACCI.

******************************************************
* PROGRAMA DE BALANCE-LINE. *
******************************************************

******************************************************
* ENVIRONMENT DIVISION *
******************************************************
ENVIRONMENT DIVISION.

CONFIGURATION SECTION.

SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.

INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CADCLI ASSIGN TO SYSDA-CADCLI
FILE STATUS IS WS-STATUS.

SELECT CADCLIN ASSIGN TO SYSDA-CADCLIN


FILE STATUS IS WS-STATUS.

SELECT MOVCLI ASSIGN TO SYSDA-MOVCLI


FILE STATUS IS WS-STATUS.

40
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

**********************************************************
* DATA DIVISION *
**********************************************************
DATA DIVISION.

***************************************
* FILE DESCRIPTION: CADCLI *
***************************************
FILE SECTION.
FD CADCLI
LABEL RECORD STANDARD
BLOCK CONTAINS 0 RECORDS.

01 REGISTRO-CADCLI PIC X(80).

***************************************
* FILE DESCRIPTION: CADCLIN *
***************************************
FD CADCLIN
LABEL RECORD STANDARD
BLOCK CONTAINS 0 RECORDS.

01 REGISTRO-CADCLIN PIC X(80).

***************************************
* FILE DESCRIPTION: MOVCLI *
***************************************
FD MOVCLI
LABEL RECORD STANDARD
BLOCK CONTAINS 0 RECORDS.

01 REGISTRO-MOVCLI PIC X(80).

**********************************************************
* WORKING-STORAGE SECTION *
**********************************************************
WORKING-STORAGE SECTION.
77 WS-STATUS PIC X(02).

**********************************************************
* BOOKS DE ARQUIVOS *
**********************************************************
01 WS-REGISTRO-CADCLI.
03 CHAVE-CADCLI.
05 AGENCIA-CADCLI PIC 9(10).
05 NUM-CONTA-CADCLI PIC 9(10).
03 NOME-CADCLI PIC X(40).
03 SALDO-CADCLI PIC 9(11)V99.
03 FILLER PIC X(07).

01 WS-REGISTRO-MOVCLI.
03 CHAVE-MOVCLI.
05 AGENCIA-MOVCLI PIC 9(10).
05 NUM-CONTA-MOVCLI PIC 9(10).
03 NOME-MOVCLI PIC X(40).
03 VALOR-DEB-MOVCLI PIC 9(08)V99.
03 VALOR-CRE-MOVCLI PIC 9(08)V99.

41
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

01 WS-REGISTRO-CADCLIN.
03 CHAVE-CADCLIN.
05 AGENCIA-CADCLIN PIC 9(10).
05 NUM-CONTA-CADCLIN PIC 9(10).
03 NOME-CADCLIN PIC X(40).
03 SALDO-CADCLIN PIC S9(11)V99.
03 FILLER PIC X(07).

**********************************************************
* PROCEDURE DIVISION *
**********************************************************
PROCEDURE DIVISION.
********************* ROTINA PRINCIPAL *******************
MAIN-LINE SECTION.
ROTINA-PRINCIPAL.
PERFORM INICIALIZAR.
PERFORM PROCESSAR UNTIL CHAVE-CADCLI = ALL "9" AND
CHAVE-MOVCLI = ALL "9".
PERFORM FINALIZAR.

ROTINA-PRINCIPAL-FIM.
STOP RUN.

************* PROCESSAMENTO PRINCIPAL ******************


PROCESSAR SECTION.
IF CHAVE-CADCLI < CHAVE-MOVCLI
PERFORM GRAVAR-CADCLIN
PERFORM LER-CADCLI
ELSE
IF CHAVE-CADCLI = CHAVE-MOVCLI
MOVE WS-REGISTRO-CADCLI TO WS-REGISTRO-CADCLIN
PERFORM UNTIL CHAVE-CADCLI NOT = CHAVE-MOVCLI
IF VALOR-DEB-MOVCLI NOT = ZEROS
COMPUTE SALDO-CADCLIN = SALDO-CADCLIN -
VALOR-DEB-MOVCLI
ELSE
COMPUTE SALDO-CADCLIN = SALDO-CADCLIN +
VALOR-CRE-MOVCLI
END-IF
PERFORM LER-MOVCLI
END-PERFORM
PERFORM ATUALIZAR-CADCLIN
PERFORM LER-CADCLI
ELSE
IF CHAVE-CADCLI > CHAVE-MOVCLI
PERFORM INCLUIR-CADCLIN
PERFORM LER-MOVCLI
END-IF.
PROCESSAR-FIM. EXIT.

******************** INICIALIZAR **************************


INICIALIZAR SECTION.
OPEN INPUT CADCLI.
IF WS-STATUS NOT = ZEROS
DISPLAY "ERRO AO ABRIR CADCLI:" WS-STATUS
PERFORM ABENDAR-PROGRAMA.

42
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

OPEN INPUT MOVCLI.


IF WS-STATUS NOT = ZEROS
DISPLAY "ERRO AO ABRIR MOVCLI: " WS-STATUS
PERFORM ABENDAR-PROGRAMA.

OPEN OUTPUT CADCLIN.


IF WS-STATUS NOT = ZEROS
DISPLAY "ERRO AO ABRIR CADCLIN: " WS-STATUS
PERFORM ABENDAR-PROGRAMA.

PERFORM LER-CADCLI.
PERFORM LER-MOVCLI.
FIM-INICIALIZAR. EXIT.

******************** SECTION LER-CADCLI ******************


LER-CADCLI SECTION.
READ CADCLI INTO WS-REGISTRO-CADCLI
AT END MOVE ALL "9" TO CHAVE-CADCLI.

FIM-LER-CADCLI. EXIT.

********************* LER-MOVCLI ****************************


LER-MOVCLI SECTION.
READ MOVCLI INTO WS-REGISTRO-MOVCLI
AT END MOVE ALL "9" TO CHAVE-MOVCLI.

FIM-LER-MOVCLI. EXIT.

********** GRAVAR CADCLIN COM CADCLI SEM ALTERACAO **********


GRAVAR-CADCLIN SECTION.
WRITE REGISTRO-CADCLIN FROM WS-REGISTRO-CADCLI.

FIM-COPIAR. EXIT.

******* ATUALIZAR CADCLIN COM ALTERACAO DE SALDO ************


ATUALIZAR-CADCLIN SECTION.
WRITE REGISTRO-CADCLIN FROM WS-REGISTRO-CADCLIN.

FIM-ATUALIZAR. EXIT.
************ INCLUIR NOVO CLIENTE EM CADCLIN ****************
INCLUIR-CADCLIN SECTION.
MOVE CHAVE-MOVCLI TO CHAVE-CADCLIN.
MOVE NOME-MOVCLI TO NOME-CADCLIN.
MOVE VALOR-CRE-MOVCLI TO SALDO-CADCLIN.
WRITE REGISTRO-CADCLIN FROM WS-REGISTRO-CADCLIN.
FIM-INCLUIR. EXIT.

********************* FINALIZAR *****************************


FINALIZAR SECTION.
CLOSE CADCLI MOVCLI CADCLIN.

FIM-FINALIZAR. EXIT.
******************** ABENDAR PROGRAMA ***********************
ABENDAR-PROGRAMA.
DISPLAY ”ERRO DE ABEND DO PROGRAMA”.
STOP-RUN.

43
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

INSTRUÇÕES FREQUENTEMENTE UTILIZADAS,


TABELAS INTERNAS E FORMATOS DE DADOS

COPY
O comando COPY é usado para copiar trechos de programa fonte que estão
armazenados em bibliotecas (BOOKS) para dentro dos programas Cobol.
Esses trechos de programa podem conter descrições de registros de
arquivos, rotinas padronizadas que devem ser repetidas em muitos
programas etc. No local conveniente do programa onde deverá ser copiado o
BOOK basta codificar:

Formato:
COPY nome-do-book.

Importante:
O comando COPY pode ser utilizado em qualquer divisão do
COBOL.

CALL E LINKAGE SECTION

A instrução CALL transfere o controle de um programa objeto a outro,


retornando a próxima instrução do programa chamador.
• Com a instrução CALL, podemos passar parâmetros de um programa
para outro. O programa chamado deve definir as variáveis na LINKAGE
SECTION e especificar na PROCEDURE DIVISION as variáveis através da
cláusula USING.

Formato:
CALL nome-programa [USING parametro-1
[parametro-2 ... parametro-n] ]

Exemplos:
*PROGRAMA CHAMADOR ******************************
ID DIVISION.
PROGRAM-ID. “PGM001”.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WRK-PROGNAME PIC X(07).
01 WRK-AREA1.
05 WRK-PGTO PIC S9(05)V99
05 WRK-VLR-HORA PIC S9(01)V99
05 WRK-HORAS PIC S9(02)V99
01 WRK-AREA-2 PIC X(01).
PROCEDURE DIVISION.
MOVE ‘SUBPGM1’ TO WRK-PROGNAME
CALL 'WRK-PROGNAME USING WRK-AREA-1 WRK-AREA-2.
CANCEL WRK-PROGNAME.

...

*PROGRAMA CHAMADO ******************************


ID DIVISION.

44
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

PROGRAM-ID. “SUBPGM1”.
DATA DIVISION.
LINKAGE SECTION.
01 WRK-AREA1.
05 WRK-PGTO PIC S9(05)V99
05 WRK-VLR-HORA PIC S9(01)V99
05 WRK-HORAS PIC S9(02)V99
01 WRK-AREA-2 PIC X(01).
PROCEDURE DIVISION USING WRK-AREA1 WRK-AREA2.
ROTINA-PRINCIPAL.
IF WRK-PGTO > 1000,00
PERFORM PROCESSAR.
...
GOBACK.

CANCEL
A instrução CANCEL libera a área de memória ocupada por um sub-
programa chamado.

Formato:
CANCEL nome-programa

Exemplo:
CALL ‘SUBPGM1’ USING WRK-AREA-1 WRK-AREA-2.
CANCEL ‘SUBPGM1’.

EXIT PROGRAM
A instrução EXIT PROGRAM especifica o final de um programa chamado e
retorna o controle ao programa chamador.
• Se o fluxo de execução do programa chamado atingir a instrução EXIT
PROGRAM enquanto estiver operando sob o controle de uma instrução
CALL o controle retornara ao programa chamador na próxima instrução
após o comando CALL.
• Se o fluxo de execução atingir a instrução EXIT PROGRAM e não estiver
sob o controle de uma instrução CALL, a instrução EXIT PROGRAM será
ignorada, sendo executada a próxima instrução após a instrução EXIT
PROGRAM.

Formato:
EXIT PROGRAM.

Exemplo:
...
99-99-EXIT.
EXIT PROGRAM.

GOBACK
Finaliza o programa e volta para o programa chamador. Tem a mesma
funcionalidade do EXIT PROGRAM.

Formato:

45
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

GOBACK

Exemplo:
...
PERFORM PROCESSAR THRU PROCESSAR-FIM.
GOBACK
...

STRING
A instrução STRING concatena o conteúdo de vários campos em um campo
receptor. Seu formato é:

Formato:
STRING identificador-1 ... literal-1 ... DELIMITED BY SIZE
INTO identificador-2

Exemplo:
STRING “QUANTIDADE RE REGISTROS PROCESSADOS: “ WS-LIDOS
DELIMITED BY SIZE INTO WS-MENSAGEM.

TABELAS INTERNAS
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 as vendas do ano separadas por mês, precisamos definir 12
campos de total na DATA DIVISION, e a PROCEDURE DIVISION deverá ter
12 testes do mês da venda para decidir em que total deve ser feito a soma.
Ex.:
DATA DIVISION.
...
03 TOTAL-01 PIC 9(8)V99.
03 TOTAL-02 PIC 9(8)V99.
...
03 TOTAL-12 PIC 9(8)V99.
PROCEDURE DIVISION.

IF MÊS = 01
ADD VENDAS TO TOTAL-01
ELSE
IF MÊS = 02
ADD VENDAS TO TOTAL-02
ELSE
...
IF MÊS = 12
ADD VENDAS TO TOTAL-12.

Clausula OCCURS
A linguagem Cobol possui um recurso para resolver este problema.
Na DATA DIVISION a variável será definida somente uma vez,
acompanhada da cláusula OCCURS que definirá quantas vezes a
variável deve ser repetida. A sintaxe da definição do item com
OCCURS é:

46
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

Formato:
NÍVEL identificador-1 PIC ____ OCCURS n TIMES.

Regras:
1. A cláusula OCCURS só pode ser usada em variáveis de nível 02 a 49.
2. Quando uma variável de uma tabela (definida com OCCURS) for usada
na PROCEDURE DIVISION, ela precisa ser acompanhada de um
indexador (subscrito) que definirá qual ocorrência da tabela está
sendo referido. Este subscrito deve estar dentro de parênteses e pode
ser um literal numérico ou uma variável numérica com valores
inteiros. Por ex: ADD VENDAS TO TOTAL-MENSAL(5).Neste caso a
soma esta sendo feita no quinto mês (Maio).

Exemplo:
A codificação do algoritmo do exemplo acima ficará reduzido agora a:

DATA DIVISION.
01 TOTAIS-GERAIS.
03 TOTAL-MENSAL PIC 9(8)V99 OCCURS 12 TIMES.
...
PROCEDURE DIVISION.
...
ADD VENDAS TO TOTAL-MENSAL (MES-VENDA).

NÍVEIS DE TABELAS
Em Cobol podemos definir um item de uma tabela como uma nova
tabela, e assim sucessivamente até um nível de 3 tabelas. Por
exemplo, para obter o total de vendas separado por estado, e em
cada estado por tipo de produto, e para cada produto por mês de
venda, montaremos a DATA DIVISION como abaixo:

DATA DIVISION.
01 TOTAIS-VENDA.
03 VENDAS-ESTADO OCCURS 27 TIMES.
05 VENDAS-PRODUTO OCCURS 5 TIMES.
07 VENDAS-MÊS PIC 9(8)V99 OCCURS 12 TIMES.

Este código montará na memória uma tabela com 3 níveis de 1620


totais (27 estados X 5 produtos X 12 meses). Para acessar um total
desta tabela será necessário um conjunto de 3 indexadores:

PROCEDURE DIVISION.
....
ADD VENDAS TO
VENDAS-MÊS (CD-ESTADO, CD-PRODUTO, MÊS-VENDA).

Importante:
Os indexadores dentro do parênteses devem estar na
mesma seqüência da definição das tabelas (mesma
hierarquia).

47
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

FORMATO ESPECIAIS DE DADOS

REDEFINES
A cláusula REDEFINES é usada quando alguma informação da DATA
DIVISION precisa ser definida em dois ou mais formatos diferentes. Por
exemplo, em um campo de data podemos ter o formato dia/mês/ano ou
ano/mês/dia:

01 WS-DATA PIC 9(06).


01 WS-DATA-R REDEFINES WS-DATA.
03 ANO-D PIC 99.
03 MÊS-D PIC 99.
03 DIA-D PIC 99.

01 WS-DATA-INV PIC 9(08).


01 WS-DATA-INV-R REDEFINES WS-DATA-INV.
03 DIA-INV PIC 9(02).
03 Mês-INV PIC 9(02).
03 SEC-INV PIC 9(02).
03 ANO-INV PIC 9(02).

01 WS-DATA-MASC PIC 99/99/9999.

PROCEDURE DIVISION.
ACEITAR-DATA-SISTEMA.
ACCEPT WS-DATA FROM DATE.
MOVE ANO-D TO ANO-INV.
MOVE Mês-D TO MÊS-INV.
MOVE DIA-D TO DIA-INV.
IF ANO-D > 50
MOVE 19 TO SEC-INV
ELSE
MOVE 20 TO SEC-INV.

MOVE WS-DATA-INV TO WS-DATA-MASC.

Os campos redefinidos ocupam o mesmo lugar na memória. No exemplo


acima, o valor colocado no campo ANO-I aparece também em DIA-D. Os
campos da área redefinida não guardam nenhuma relação com o formato e
posição dos campos da primeira definição da área, e a única condição é que
o total de bytes das duas áreas seja igual. Outro ex.:
01 VALORES-PEQUENOS.
03 VALOR-1 PIC 9(6).
03 FILLER PIC X(4).
01 VALORES-GRANDES REDEFINES VALORES-PEQUENOS.
03 VALOR-2 PIC 9(8).
03 FILLER PIC XX.

FORMATOS BINÁRIOS
Quando usamos os formatos descritos nos parágrafos anteriores para
descrever variáveis na DATA DIVISION, o Cobol armazena cada caracter das
variáveis definidas em 1 byte da memória. Um byte é um conjunto de 8 bits.
O computador associa cada combinação de bits ligado/desligado destes 8

48
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

bits com uma letra (ou caracter) do nosso alfabeto. Assim, no caso do
mainframe IBM, que usa o padrão EBCDIC, podemos representar estes 2
exemplos:

Caracter bits na memória valor decimal valor hexadecimal


A 1 1 0 0 0 0 0 1 191 C1
5 1 1 1 1 0 1 0 1 245 F5

Acontece porem que o computador não foi projetado para fazer cálculos com
este formato. Ele usa o valor binário puro dos bits para cálculos, onde cada
bit da direita para a esquerda tem o valor da potencia de 2 correspondente,
como no esquema:

Bits 8 7 6 5 4 3 2 1
Valor 128 64 32 16 8 4 2 1

Assim o caracter 5 do formato EBCDIC acima seria interpretado pelo


computador nas operações de calculo como 245 (veja valor decimal da
representação do caracter 5 no exemplo anterior).
Os programadores Cobol não precisariam se preocupar com este detalhe,
porque o compilador Cobol coloca no programa objeto gerado instruções
adicionais para, na hora do calculo, converter todas as variáveis do formato
EBCDIC para binário, fazer o cálculo, e converter o resultado do formato
binário para EBCDIC, e devolver o resultado convertido para a memória. Os
inconvenientes de se trabalhar com variáveis numéricas em EBCDIC são:
- A ineficiência causada pelas conversões de formato.
- O formato EBCDIC ocupa espaço maior na memória.

CLÁUSULA USAGE

A linguagem Cobol usa a cláusula USAGE na especificação das variáveis para


definir seu formato na memória. Existem os seguintes formatos:

✓ [USAGE] DISPLAY = dados numéricos em zonado. Cada algarismo ocupa


um byte. Máximo de 18 caracteres/algarismos.

✓ [USAGE] COMP = dados numéricos no formato binário ponto fixo


(valor expresso em decimal) ; os valores limite (menor e maior)
são os que podem ser representados com a quantidade de
algarismos (decimais) indicada.

✓ [USAGE] COMP-1 = dados numéricos no formato binário ponto flutuante


curto. Não colocar PIC (ele é estabelecido automaticamente pelo
compilador). Valor expresso em notação científica (mantissa e
expoente).

✓ [USAGE] COMP-2 = dados numéricos no formato binário ponto flutuante


longo. Não colocar PIC (ele é estabelecido automaticamente pelo
compilador). Valor expresso em notação científica (mantissa e
expoente).

49
Apostila: LINGUAGEM PROGRAMAÇÃO COBOL

✓ [USAGE] COMP-3 = dados numéricos no formato decimal


compactado. Neste caso a quantidade de “noves” especificada no
PIC indica a quantidade de algarismos do maior número que
poderá estar contido nesta variável; cada algarismo ocupa meio
byte. Para determinar o tamanho total do campo, acrescentar
mais meio byte para o sinal (último meio byte à direita;
independentemente de o campo ter sido definido com SINAL (PIC
S) ou não).

✓ [USAGE] COMP-4 = dados numéricos no formato binário ponto fixo.


Valor expresso em decimal.

✓ [USAGE] COMP-5 = dados numéricos no formato binário ponto fixo


(valor expresso em decimal) ; os valores limite (menor e maior) são os
que podem ser representados no campo no formato binário ponto fixo.

USAGE COMP.
Usado para especificar que a variável deve ter formato binário. Só é usado
para variáveis numéricas. A sintaxe para definir VAR como variável binária
é:
77 VAR PIC 9(6) USAGE COMP.
Ou
77 VAR PIC 9(6) COMP.

O Cobol formata números com USAGE COMP somente em 3 formatos


binários que são os formatos disponíveis na CPU do mainframe para
cálculos: Um formato com 2 bytes, ou 16 bits (1 bit de sinal e 15 bits de
valores binários), um formato de 4 bytes, ou 32 bits (1 bit de sinal e 33 bits
de valores binários), e um formato com 8 bytes, ou 64 bits (1 bit de sinal e
63 bits de valores). A escolha destes formatos é feita de acordo com o
tamanho do campo especificado pelo programador, segundo a tabela abaixo:

DE ATE BYTES
S9(1)COMP S9(4) COMP 2
S9(5)COMP S9(9) COMP 4
S9(10)COMP S9(18)COMP 8

USAGE COMP-3.
Neste formato usa-se grupos de 4 bits para representar 1 numero, e por isso
1 byte consegue armazenar 2 números.
Para calcular o tamanho fisico do campo deve-se utilizar a seguinte formula:
• Dividir o tamanho do Campo por 2
• Desprezar a casa decimal
• Soma 1 no resultado

Exemplo:
01 WS-SALDO-CONTA PIC S9(15)V99
17 / 2 = 8,5
8+1=9
O tamanho fisíco desse campo é 8 digitos

50

Vous aimerez peut-être aussi