Você está na página 1de 31

Gennari & Peartree Projetos e Sistemas

Programa de Treinamento – Linguagem de Programação COBOL

1. INTRODUÇÃO................................................................................................................................................2
2. ESTRUTURA DA LINGUAGEM.................................................................................................................2
2.1. DIVISÕES....................................................................................................................................................2
2.2. SEÇÕES.......................................................................................................................................................2
2.3. PARÁGRAFOS..............................................................................................................................................2
2.4. SENTENÇAS.................................................................................................................................................2
2.5. PONTUAÇÃO E CODIFICAÇÃO......................................................................................................................2
2.6. FOLHA DE CODIFICAÇÃO COBOL................................................................................................................3
3. COMPONENTES DA LINGUAGEM...........................................................................................................3
3.1. PALAVRAS..................................................................................................................................................3
3.2. NOMES........................................................................................................................................................4
3.3. LITERAIS.....................................................................................................................................................4
3.4. COMENTÁRIOS............................................................................................................................................4
3.5. PALAVRAS UTILIZADAS JUNTO A COMANDOS............................................................................................5
3.6. REGISTRADORES ESPECIAIS........................................................................................................................5
4. IDENTIFICATION DIVISION.....................................................................................................................6
5. ENVIRONMENT DIVISION.........................................................................................................................6
6. DATA DIVISION............................................................................................................................................6
6.1. WORKING-STORAGE SECTION....................................................................................................................7
6.2. FILE SECTION.............................................................................................................................................7
6.3. LINKAGE SECTION......................................................................................................................................8
6.4. NÚMEROS DE NÍVEL...................................................................................................................................8
6.4.1. Nível 01 – itens de grupo...................................................................................................................8
6.4.2. Níveis de 02 a 49 – itens elementares................................................................................................8
6.4.3. Nível 77 – itens independentes..........................................................................................................8
6.4.4. Nível 66 – Cláusula RENAMES.........................................................................................................8
6.4.5. Nível 88 – nomes de condições..........................................................................................................8
6.5. TRATAMENTO DE SAÍDAS...........................................................................................................................9
6.6. CLÁUSULAS..............................................................................................................................................10
7. PROCEDURE DIVISION............................................................................................................................12
7.1. INSTRUÇÕES ARITMÉTICAS.......................................................................................................................12
7.2. INSTRUÇÃO IF..........................................................................................................................................13
7.3. INSTRUÇÃO PERFORM...............................................................................................................................14
7.4. TERMINANDO UM PROGRAMA..................................................................................................................14
7.5. INSTRUÇÃO MOVE..................................................................................................................................14
7.6. INSTRUÇÃO GO TO..................................................................................................................................15
7.7. INSTRUÇÃO EXIT.....................................................................................................................................16
7.8. USAGE....................................................................................................................................................16
8. TABELAS.......................................................................................................................................................17
8.1.1. Cláusula OCCURS..........................................................................................................................17
8.1.2. Manipulando um índice de tabela...................................................................................................18
8.1.3. Cláusula REDEFINES.....................................................................................................................19
8.1.4. Zerando uma tabela por expansão..................................................................................................19
9. MANIPULAÇÃO DE ARQUIVOS.............................................................................................................20
9.1.1. Instrução OPEN...............................................................................................................................20
9.1.2. Instrução CLOSE.............................................................................................................................20
9.1.3. Instrução WRITE.............................................................................................................................20
9.1.4. Instrução READ...............................................................................................................................21
9.1.5. Instrução REWRITE........................................................................................................................21
9.1.6. Instrução DELETE..........................................................................................................................22
9.1.7. Tabela de valores de file status.......................................................................................................22
9.2. INSTRUÇÃO START.................................................................................................................................22
10. COMUNICAÇÃO ENTRE PROGRAMAS..............................................................................................23
10.1. INSTRUÇÃO CALL..................................................................................................................................23
10.2. PROCEDURE DIVISION PARA PROGRAMAS CHAMADOS POR OUTROS..............................................23
10.3. LINKAGE SECTION............................................................................................................................24
11. EXERCÍCIOS..............................................................................................................................................25
Por Luiz Roberto de Souza Página 1 de 31
Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

1. INTRODUÇÃO
A linguagem COBOL (COmmon Business Oriented Language – Linguagem Comum
Orientada aos Negócios) foi desenvolvida no ano de 1959, por um grupo chamado Comitê CODASl
(COference on DAta SYstem Languages). Esse grupo era formado por fabricantes e grupos de
usuários, cujo objetivo era a criação de uma linguagem comum de programação, visando o uso em
aplicações comerciais.
O COBOL For MVS & VM (versão mais recente do COBOL IBM) foi projetado de acordo
com as especificações do padrão da instituição ANSI (American National Standards Institute –
Instituto Nacional Americano de Padronizações) de 1985.

2. ESTRUTURA DA LINGUAGEM
A Linguagem COBOL é estruturada em :
 Divisões
 Seções
 Parágrafos
 Sentenças
* Cláusulas (nas três primeiras divisões)
* Comandos (na Procedure Division)

2.1. Divisões
Um programa Cobol é estruturado em quatro divisões de codificação obrigatória. Mesmo
que uma delas não se faça necessário, pelo menos o seu nome deverá ser digitado.
 IDENTIFICATION DIVISION Informações sobre o programa
 ENVIRONMENT DIVISION  Definição do ambiente físico
 DATA DIVISION  Definição da estrutura lógica dos arquivos e áreas de trabalho
 PROCEDURE DIVISION  Procedimentos a serem executados

2.2. Seções
 Definidas na ENVIRONMENT DIVISION e DATA DIVISION conforme requeridas.
 Definidas na PROCEDURE DIVISION para especificar a segmentação do programa.

2.3. Parágrafos
Na PROCEDURE DIVISION são utilizados para agrupar sentenças, permitindo a alteração
do fluxo lógico. Devem terminar com um ponto.

2.4. Sentenças
Formadas por uma ou mais cláusulas ou comandos. São terminadas por um ponto.

2.5. Pontuação e codificação


Um programa Cobol segue algumas regras que devem ser respeitadas durante a codificação
dos programas:
 Ao final de cada nome de divisão, seção parágrafo deve ser colocado um ponto;
 Deve haver pelo menos um espaço entre cada palavra do programa.
 Quando na mesma linha, deve ser deixado pelo menos um espaço entre o ponto e o
início da próxima sentença.
 Todas as palavras (instruções, cláusulas, etc.) devem ser digitadas em letras maiúsculas.
Por Luiz Roberto de Souza Página 2 de 31
Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

2.6. Folha de codificação Cobol


Ao se digitar um programa Cobol, devemos observar alguns aspectos relativos a disposição
das informações nas linhas. Observe o exemplo abaixo:
1... 7 8... 12... ...72... ...80

IDENTIFICATION DIVISION.
...

DISPLAY ‘Gennari & Peartree Projetos e Sistemas’ UPON CONSOLE.

Codificação das colunas:


 1 a 6  Utilizadas para numerar as linhas. Será de uso opcional.
 Coluna 7  Pode conter um hífen (-) para indicar que a linha é continuação da anterior,
um asterisco (*) para indicar uma linha de comentário ou uma barra (/) para indicar um
salto de página na listagem de compilação.
 8 a 11  Representam a margem A, onde começam os nomes de divisão, seção e
parágrafos.
 12 a 72  Representam a margem B, onde estarão todos os comandos.
 73 a 80  Pode ser utilizada para comentários quaisquer, pois são ignoradas pelo
compilador.

3. COMPONENTES DA LINGUAGEM
3.1. Palavras
Uma palavra em COBOL é um conjunto de caracteres de até 30 bytes de comprimento.
Pode ser definida pelo programador ou ser um nome do sistema. Os identificadores e verbos de
comando também são considerados palavras.
As palavras que tem um significado específico para o compilador COBOL são chamadas
reservadas, não podendo dessa forma ser utilizadas para outros fins pelo programador. Exemplos de
palavras reservadas: IDENTIFICATION, LABEL, RECORD, READ, WRITE.
As palavras reservadas podem ser dividias em constantes figurativas, palavras opcionais e
palavras-chave, conforme descrição a seguir:

Constantes Figurativas
São palavras associadas a um valor em particular.
 ALL 'literal'  uma ou mais ocorrências de literal
 ZERO, ZEROS, ZEROES  valor zero
 SPACE, SPACES  brancos
 QUOTE, QUOTES  apóstrofe
 HIGH-VALUE, HIGH-VALUES  maior valor (HEXA FF)
 LOW-VALUE, LOW-VALUES  menor valor (HEXA 00)

Por Luiz Roberto de Souza Página 3 de 31


Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

Palavras opcionais
O uso destas palavras é opcional.
Exemplo
IF WS-CAMPO IS GREATER THAN 10 = IF WS-CAMPO GREATER 10
Logo, IS e THAN são opcionais.

Palavras-chave
Determinam a função da cláusula ou comando.
Exemplo
ADD, READ, IF

Regras para formação de nomes de palavras


 Pode conter apenas caracteres alfabéticos (A-Z), numéricos (0-9) e hifen.
 Devem começar com um caracter alfabético. Isso implica na existência de pelo menus
um caractere alfabético na palavra.
 Não podem terminar com hífen.
 Deve haver pelo menos um espaço em branco entre as palavras.
 O tamanho máximo para palavras no COBOL é de 30 caracteres.

3.2. Nomes
São atribuídos pelo programador. Palavras reservadas não podem ser usadas como nomes.
Tipos :
 Nomes de dados
 Nomes de registro
 Nomes de arquivo
 Nomes de parágrafo
 Nomes de seção

3.3. Literais
Conjuntos de caracteres cujo valor é especificado. Existem dois tipos: as literais numéricas e
as alfanuméricas.
Numéricas  são compostas por dígitos de 0 a 9 e/ou um sinal (+ ou -) e/ou um ponto
decimal (vírgula), contém no máximo 18 dígitos.
Alfanuméricas  Contém todo tipo de caractere EBCDIC, num tamanho máximo de 120
caracteres, devendo estar entre apóstrofes. Um hífen deve ser colocado na coluna 7 para a
continuação da literal na linha seguinte.

3.4. Comentários
Não são considerados pelo compilador, servindo somente para documentação.
REMARKS Parágrafo da IDENTIFICATION DIVISION
* na coluna 7 Linha toda como comentário
/ na coluna 7  Salta uma página considerando o comentário
Pode-se ainda utilizar o recurso de comentários para informações que auxiliem na
compreensão do programa. Para auxiliar na estética do programa, podemos utilizar as instruções
SKIP e EJECT na coluna 12.
EJECT  Salta página
SKIP1  Salta 1 linha
SKIP2  Salta duas linhas
Por Luiz Roberto de Souza Página 4 de 31
Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

SKIP3  Salta três linhas


Tais instruções serão executadas diretamente pelo compilador, refletindo seus resultados na
listagem de compilação.

3.5. Palavras utilizadas junto a comandos


Condição
 NUMERIC
 ALPHABETIC
 POSITIVE
 NEGATIVE
 ZERO(ES)

Relação
 GREATER (>)
 LESS (<)
 EQUAL (=)
 NOT GREATER (<=)
 NOT LESS (>=)

Conecção
 AND
 OR

Negação
 NOT

Operadores
 +  Adição
 -  Subtração
 *  Multiplicação
 / Divisão
 **  Exponenciação

3.6. Registradores Especiais


CURRENT-DATE
Campo de 8 bytes alfanuméricos
Formato : MM/DD/AA
Acesso : MOVE

TIME-OF-DAY
Campo de 6 bytes zonados
Formato : HHMMSS
Acesso : MOVE

DATE
Campo de 6 bytes zonados
Formato : AAMMDD
Acesso : ACCEPT
Por Luiz Roberto de Souza Página 5 de 31
Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

DAY
Campo de 5 bytes zonados
Formato : AADDD
Acesso : ACCEPT

TIME
Campo de 8 bytes zonados
Formato : HHMMSSCC
Acesso : ACCEPT

4. IDENTIFICATION DIVISION
Divisão de identificação do programa. Segue o formato:

IDENTIFICATION DIVISION.
PROGRAM-ID. <NOME-DO-PROGRAMA>.
AUTHOR. <NOME-DO-PROGRAMADOR>.
DATE-WRITTEN. <DATA QUE O PROGRAMA FOI CRIADO OU ALTERADO>.
DATE-COMPILED. <DATA DE COMPILAÇÃO DO PROGRAMA (não digitar)>.
REMARKS. <COMENTÁRIOS – OBJETIVO DO PROGRAMA>.
SECURITY. <COMENTÁRIOS SOBRE SEGURANÇA>.

5. ENVIRONMENT DIVISION
É a divisão onde configuramos o ambiente de trabalho do programa. Encontra-se dividida
em duas seções. A configuration section (seção de configuração), onde configuramos parâmetros de
ambiente do programa e a input-output section (seção de entrada e saída), onde selecionamos os
arquivos que serão utilizados pelo programa. A estrutura é:

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
C01 IS <NOME>.

INPUT-OUTPUT SECTION.
SELECT <NOME-ARQUIVO> ASSIGN TO <DISK|TAPE|PRINTER>
ORGANIZATION IS
<SEQUENTIAL|LINE SEQUENTIAL|INDEXED|RANDOM>
ACCESS MODE IS <SEQUENTIAL|RANDOM|DYNAMIC>
RECORD KEY IS <NOME-DE-CAMPO>
ALTERNATE RECORD KEY IS <NOME-DE-CAMPO>
FILE STATUS IS <VARIÁVEL>

6. DATA DIVISION
Seção na qual definimos todos os dados com os quais trabalharemos no programa. Não é
possível utilizar qualquer variável, campo, registro ou arquivo sem que os mesmos não sejam
primeiramente definidos nesta divisão.
Por Luiz Roberto de Souza Página 6 de 31
Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

6.1. Working-Storage Section


Na seção de armazenamento e trabalho, iremos definir as variáveis que serão utilizadas pelo
nosso programa. Todas, sem exceção devem ser declaradas. A cláusula VALUE poderá inicializar
uma variável já em sua criação.
Estrutura
DATA DIVISION.

WORKING-STORAGE SECTION.
NÍVEIS (01, 02-49, 77) <IDENTIFICADOR> PICTURE VALUE <VALOR>

6.2. File Section


É necessário que os arquivos selecionados na divisão de ambiente sejam declarados nesta
seção.
Forma geral
FILE SECTION.
FD <NOME-ARQUIVO>
BLOCK CONTAIS <N> <CHARACTERS|RECORDS>
RECORD CONTAINS <N> CHARACTERS
LABEL RECORD IS <STANDARD|OMITTED>
DATA RECORD IS <NOME-REGISTRO>
RECORDING MODE IS <F|U|V|S> (fix or variable)
VALUE OF FILE-ID IS <NOME-ARQUIVO NO DISCO> (amb. micro)
NOME-REGISTRO
<DEFINIÇÕES DOS CAMPOS>
Onde:
 NOME-ARQUIVO  é o definido na cláusula SELECT da ENVIRONMENT
DIVISION;
 BLOCK  determina o tamanho do bloco (registro físico) do arquivo, em número de
registros ou caracteres. O bloco pode ter tamanho variável. Caso esta cláusula seja
omitida, o arquivo será considerado desblocado;
 RECORD  determina o tamanho do registro (registro lógico) do arquivo;
 LABEL RECORD  é padrão (standard) no caso de arquivos em disco ou tape e
omitido (omitted) no caso de arquivos de impressão ou em cartões que não possuem
label;
 DATA RECORD  nome de dado de nível 01 utilizado posteriormente para identificar
o registro 
 RECORDING  determina o formato de registro que o arquivo possui. Basicamente,
podemos declarar os seguintes formatos
F  todos os registros do arquivo são do mesmo tamanho e cada um está inteiramente
contido em um bloco;
U  os registros podem ser fixos ou variáveis. Contudo, existe apenas um registro por
bloco. Não existem campos de descrições de comprimento de registro ou bloco;
V  os registros podem ser fixos ou variáveis, inteiramente contidos em um bloco. Os
blocos podem conter mais de um registro. Cada registro inclui a descrição dos
campos de comprimento do registro e cada bloco inclui a descrição do tamanho do

Por Luiz Roberto de Souza Página 7 de 31


Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

bloco. Este campos não são descritos na DATA DIVISION. Sua previsão é feita
automaticamente e não estão disponíveis para o programador;
S  os registros podem ser fixos ou variáveis, podendo até mesmo ser maiores que o
bloco. Sem um registro for maior que o espaço disponível em um bloco
(SPANNED), um segmento do registro será escrito de modo a preencher o bloco. O
resto é armazenado no próximo bloco (se necessário, será usado mais de um).

6.3. Linkage Section


É utilizada para definir as áreas de comunicação (commom area) entre programas. Tem
formato parecido com a WORKING-STORAGE section com a diferença que os dados definidos
serão utilizados por mais de um programa. Será vista com maiores detalhes no item comunicação
entre programas.

6.4. Números de nível


6.4.1. Nível 01 – itens de grupo
São identificadores que agrupam variáveis. Podem ser utilizados para simplesmente
melhorar o entendimento do programa ou para fins específicos, como grupo de valores que podem
ser acessados individualmente ou de uma só vez. São indicados pelo número de nível 01.
Exemplo:

WORKING-STORAGE SECTION.
01 DATA-SISTEMA.

6.4.2. Níveis de 02 a 49 – itens elementares


São aqueles que estarão dentro dos itens de grupo, representados pelos números de nível de
02 a 49. São as variáveis simples. Pode-se utilizar o recurso de quebra de nível para dividir essas
variáveis em outras e utilizar individualmente seus valores.
Exemplo:

WORKING-STORAGE SECTION.
DATA-SISTEMA.
05 WS-DIA PIC 99 VALUE 0.
05 WS-MES PIC 99 VALUE 0.
05 WS-ANO PIC 99 VALUE 0.

6.4.3. Nível 77 – itens independentes


São idênticos aos itens elementares porém, não aceitam quebra de nível e estão fora de um
grupo de variáveis.

6.4.4. Nível 66 – Cláusula RENAMES


Esse nível identifica que os itens devem conter a cláusula RENAMES.

6.4.5. Nível 88 – nomes de condições


São definidos no nível 88 e representam uma determinada condição conforme o valor de
uma variável.

Por Luiz Roberto de Souza Página 8 de 31


Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

Exemplo:

02 CONFIRMACAO PIC X VALUE ‘ ‘.


88 CONFIRMADO VALUE ‘S’.

6.5. Tratamento de saídas


Os dados em Cobol podem ser tratados como informações que serão processadas apenas em
memória ou que serão destinadas única e exclusivamente para exibição ao usuário. Para fazer tal
configurações, faremos uso de PICTURES, que são características dos itens elementares e definem
seu tipo de dado, tamanho e a maneira como serão apresentados em um dispositivo de saída.
Para valores numéricos, em pictures de exibição, utilizaremos principalmente os caracteres
Z (que suprime a exibição de zeros não significativos) e , (vírgula, que exibe uma vírgula decimal –
requer também a declaração DECIMAL-POINT IS COMMA).

Símbolos para PICTURES


X ...................................... Caractere alfanumérico do conjunto ASCII.
9 ....................................... Algarismo de um número (máx. 18 por número).
0 ....................................... Insere zero na posição indicada.
S ...................................... Sinal aritmético do número.
V ...................................... Posição da vírgula (ou ponto) decimal.
Z ...................................... Supressão de zeros não significativos.
B ...................................... Insere espaço(s) em branco na posição desejada.
A ...................................... Caractere alfabético ou espaço em branco.
, ........................................ Insere vírgula na posição indicada, podendo
haver apenas uma vírgula no caso de DECIMAL-
POINT IS COMMA.
. ........................................ Insere ponto na posição indicada, podendo haver
mais de um ponto no caso de DECIMAL-POINT
IS COMMA.
/ ........................................ Insere uma barra na posição indicada.
- ........................................ Colocado à direita da PICTURE, insere um sinal
de menos após o número, se este for negativo.
Colocado à esquerda, adquire características
flutuantes, sendo o sinal impresso antes do
número, se este for negativo.
+........................................ Colocado à direita da PICTURE, insere um sinal
de mais após o número, se este for positivo.
Colocado à esquerda, adquire características
flutuantes, sendo o sinal impresso antes do
número, se este for positivo.
* ....................................... Substitui zeros não significativos por asteriscos.
$ ....................................... Insere um cifrão antes do primeiro algarismo
significativo e supre os zeros não significativos.
CR .................................... Colocado à esquerda, nas duas últimas
posições, imprime um sinal de crédito (CR) à
direita do número, se este for positivo.
DB .................................... Colocado à esquerda, nas duas últimas
posições, imprime um sinal de débito (DB) à
Por Luiz Roberto de Souza Página 9 de 31
Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

direita do número, se este for negativo.


P ....................................... Fator de escala para especificar a posição do
ponto decimal, representando uma ou mais
posições, inteiras ou fracionárias, às quais não é
reservado espaço em memória e cujo valor será
sempre assumido zero. É contado na
determinação do tamanho máximo da PICTURE
em itens numéricos ou numérico-editados.

Exemplos
PIC X(01) ........................ Alfanumérico de 1 byte
PIC 9(02) ........................ Numérico sem sinal de 2 bytes e 2 dígitos
PIC S9(05) ...................... Numérico com sinal de 5 bytes e 5 dígitos
PIC S9(09) COMP .......... Binário com sinal de 4 bytes e 9 ou 10 dígitos
PIC S9(03) COMP-3 ....... Compactado com sinal de 2 bytes e 3 dígitos

MEMÓRIA PICTURE VALOR REAL


503 9(3) ou 999 503
125 9V(2) 1,25
-245 S9V9(2) -2,41
ALBA123 X(7) ALBA123
BABA52 BBX(6) b b BABA52
ZIL15A X(2)BX(4) Zi b L15A
BOZZANO X(5) BOZZA
1234 9(2) 34

OBSERVAÇÕES IMPORTANTES
1) Sempre que forem exibidos valores numéricos, fazer com que seja exibido ao menos um
zero (ex: zz9,99 para 0,00)

2) Todos os dados alfanuméricos serão alinhados à esquerda, ao passo que os dados


numéricos serão alinhados à direita, tendo as posições livres preenchidas com zeros.
PIC X(10) para “LUIZ”
L U I Z

PIC 9(8)V99 para 12,34


0 0 0 0 0 0 1 2 3 4

6.6. Cláusulas
Serão citadas apenas as mais utilizadas. São elas:
VALUE  Utilizada para atribuir valores iniciais aos campos ou para uso no nível 88 com
valor de condição. Não utilizar na FILE SECTION, LINKAGE SECTION (exceto para itens de
nível 88), nem para itens relacionados com OCCURS ou REDEFINES.

Por Luiz Roberto de Souza Página 10 de 31


Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

Exemplos

03 AC-LIDOS PIC S9(17) COMP-3 VALUE 0.

Neste exemplo o acumulador está sendo inicializado com zeros.

03 CH-ACHOU PIC X(01) VALUE 'N'.


88 ACHOU-REG VALUE 'S'.

Neste exemplo a palavra chave ACHOU-REG é um nome de condição que estará validado
quando o campo CH-ACHOU tiver o conteúdo 'S'.

REDEFINES  Utilizada para redefinir um campo com uma configuração diferente da


original. Veremos este conceito em tabelas.

OCCURS  Utilizada para especificar tabelas cujos elementos podem ser referenciados
pela indexação ou subscrição. Cria uma tabela.

USING  Utilizada para indicar os campos definidos em um programa chamador que serão
passados para um programa chamado como parâmetros.

C01  Utilizada na SPECIAL-NAMES. Permite que seja definido um nome a ser utilizado
quando for necessário saltar uma página. Observe o exemplo:

SPECIAL-NAMES.
DECIMAL-POINT IS COMMA
C01 IS SALTO.

FILLER  Indica um item elementar cuja informação nunca será referenciada durante a
execução do programa. Sempre será definido pela picture X.

Por Luiz Roberto de Souza Página 11 de 31


Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

7. PROCEDURE DIVISION
Quando aplicarmos a lógica de programação para resolver um problema em um programa
Cobol, deixaremos nossa divisão de procedimentos com três partes a saber:

IN IC IA L IZ A Ç Ã O
Abertura de arquivos, etc

C O R P O D O P R O G R A M A
Rotinas a serem executadas, que poderão ser repetidas de acordo
com a lógica utilizada

F IN A L IZ A Ç Ã O
Encerramento do programa, fechamento do arquivo,
STOP RUN

7.1. Instruções aritméticas


COMPUTE
Calcula uma expressão armazenando seu resultado em uma variável numérica.
Sintaxe:

COMPUTE <VARIÁVEL> = <EXPRESSÃO>

Exemplos:

COMPUTE D = B ** 2 – 4 * A * C
COMPUTE R = (B * (-1) + D ** 0.5) / (2 * A)

ADD

ADD B A TO C.( C = C + B + A).


ADD B A GIVING C.( C = B + A).

Por Luiz Roberto de Souza Página 12 de 31


Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

SUBTRACT

SUBTRACT B FROM A.(A = A – B)


SUBTRACT B FROM A GIVING C.(C = A – B)

MULTIPLY

MULTIPLY A BY B.(B = B * A)
MULTIPLY A BY B GIVING C.(C = A * B)

DIVIDE

DIVIDE A INTO B. (B = B / A)
DIVIDE A INTO B GIVING C. (C = B / A, B = B / A)
DIVIDE A BY B GIVING C. (C = B / A)
DIVIDE A BY B GIVING C REMAINDER RESTO.

7.2. Instrução IF
Executa um bloco de instruções dependendo de uma determinada expressão lógica.
Sintaxe:

IF <condição>
<sentença 1 | NEXT SENTENCE>
ELSE
<sentença 2 | NEXT SENTENCE>.

Obs:
 ponto final indica o final da estrutura lógica.
 No caso de IFs aninhados, os IFs internos não possuem ponto.
 A instrução NEXT SENTENCE pode ser usada para saltar para a próxima sentença
(instrução) imediatamente posterior ao IF.

Teste de condição de classe

IF <identificador> IS [NOT] <NUMERIC | ALPHABETIC>

Operadores Relacionais

IF <identificador 1> IS [NOT] GREATER (>) <identificador 2>


IF <identificador 1> IS [NOT] LESS (<) <identificador 2>
IF <identificador 1> IS [NOT] EQUAL (=)<identificador 2>

Teste de condição de sinal

IF <identificador> IS [NOT] <POSITIVE | NEGATIVE | ZERO>

Por Luiz Roberto de Souza Página 13 de 31


Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

7.3. Instrução Perform


Determina a execução de um ou mais parágrafos localizados em pontos diversos da
PROCEDURE DIVISION. Após a execução do(s) procedimento(s) o fluxo de execução do
programa volta para a instrução imediatamente posterior a linha do perform.
SINTAXES:

PERFORM <PARÁGRAFO>
PERFORM <PARÁGRAFO1> THRU <PARÁGRAFO2>
PERFORM <PARÁGRAFO> <N> TIMES
PERFORM <PARÁGRAFO> UNTIL <CONDIÇÃO>
PERFORM <PARÁGRAFO> VARYING <VARIÁVEL>
FROM <VL.INICIAL> BY <INCREMENTO>
UNTIL <CONDIÇÃO>

É possível utilizar elementos das várias sintaxes em uma única linha de comando, conforme
se tornar necessário.

EXEMPLOS

PERFORM PROCESSA.
PERFORM LE-ARQUIVO THRU ATUALIZA-ARQUIVO.
PERFORM LE-ARQUIVO UNTIL FIM-ARQUIVO.
PERFORM LE-MOV THRU ATUALIZA-MOV
UNTIL WS-PROCESSO IS EQUAL “OK”.
PERFORM CALC-SALARIO 10 TIMES.

OBSERVAÇÕES IMPORTANTES
Atentar sempre para a lógica do programa. Deve ser utilizada a maneira mais eficiente e
procurar deixar o arquivo no menor tamanho possível.
Procurar sempre fazer documentações. Por exemplo, em um relatório, exibir o total de
registros impressos e/ou processados. Isso ajuda inclusive na manutenção do sistema. O usuário não
poderá contestar uma falha de sistema em uma determinada situação que necessite manutenção.

7.4. Terminando um programa


 Instrução STOP RUN  Termina a execução de um programa retornando o controle ao
sistema operacional.
 Instrução GOBACK  Termina a execução de um programa retornando o controle ao
chamador ou ao sistema operacional.

7.5. Instrução MOVE.


Atribui um valor a uma ou mais variáveis de memória ou campo de arquivos.
Sintaxe:

MOVE <VALOR> TO <VARIÁVEIS>

Por Luiz Roberto de Souza Página 14 de 31


Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

Exemplos

MOVE 0 TO NUMERO.
MOVE ‘LUIZ’ TO NOME.
MOVE ‘SÃO PAULO’ TO TIME MELHOR CAMPEAO BOM.
MOVE 0 TO TOTAL SUBTOTAL CONTADOR.

7.6. Instrução GO TO
Desvia o fluxo de execução do programa para um parágrafo ou seção, sem retornar para o
chamador. É um comando que deve ser utilizado com extremo cuidado para evitar que a lógica de
programação torne-se desestruturada. Utilizaremos o comando GO TO apenas dentro de um laço
(de mais de um parágrafo ou seção) de forma a quebrá-lo sem contudo desviar o fluxo para fora.
Sintaxe:

GO TO <PARÁGRAFO(S)|SEÇÃO(ÕES)> DEPENDING ON <NOME-DADO>

O NOME-DADO:
 deve conter entre 1 e n e deve haver n PARÁGRAFOS|SEÇÕES;
 deve ser um item número elementar.

Exemplos:
O exemplo abaixo desvia o fluxo de execução do programa para um parágrafo ou seção
chamado LEITURA –ARQUIVO-FIM:

GO TO LEITURA-ARQUIVO-FIM.

No próximo exemplo, é acessada da console uma variável chamada CASO. E o fluxo de


execução do programa é desviado para um parágrafo ou seção dependendo do valor dessa variável.
Se ela valer 1 é desviado para CASO-1, se valer 2 para CASO-2, se 3 para CASO-3 e, se 4 é
desviado para CASO-4.

ACCEPT CASO FROM CONSOLE.


GO TO CASO-1 CASO-2 CASO-3 CASO-4 DEPENDING ON CASO.
...
CASO-1.
...
GOTO SEGUE.
CASO-2.
...
GOTO SEGUE.
CASO-3.
...
GOTO SEGUE.
CASO-4.
...
SEGUE.
...
Por Luiz Roberto de Souza Página 15 de 31
Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

7.7. Instrução EXIT


Dentro de um laço com vários parágrafos ou seções, poderá haver um momento em que se
faz necessário ignorar uma parte das instruções. Neste caso, podemos encerrar a iteração de vez ou
fazer novamente um teste.
A instrução EXIT cria um ponto de fim em uma seqüência deste tipo. Ela deve ser colocada
isoladamente em um parágrafo ou seção, para o qual o fluxo de execução do programa será
desviado.

Exemplo

LOGICA-PRINCIPAL.
...
PERFORM LE-MOV THRU LE-MOV-EXIT.
...
LE-MOV.
READ LE-MOV AT END GOTO LE-MOV-EXIT.
PERFORM LE-CONTA UNTIL CC-CONTA EQUAL MO-CONTA.
IF MO-TIPOLANC EQUAL ‘D’
SUBTRACT MO-VALOR FROM CC-SALDO
ELSE
ADD MO-VALOR TO CC-SALDO.
REWRITE REG-CONTA.
GOTO LE-MOV.
LE-MOV-EXIT.
EXIT.

7.8. USAGE
Em muitos sistemas, em que a quantidade de informações armazenadas é muito grande,
podemos fazer uma considerável economia de espaço no dispositivo de armazenamento ao
utilizarmos do recurso de compactação de dados numéricos disponível pelo Cobol.

COMPUTATIONAL
O campo binário oferece uma maior capacidade de representação dentro de um byte. Será
definido dessa forma através do uso da cláusula COMP. Em um campo de quatro casas o valor 6859
é armazenado em dois bytes e com representação hexadecimal X‘1ACB’. A definição do campo por
exemplo ficaria na seguinte forma:

05 CPO-BINARIO PIC 9(04) USAGE COMPUTATIONAL.

A linha anterior pode ser abreviada para:

05 CPO-BINARIO PIC 9(04) COMP.

O uso deste campo tem aplicação prática para representar valores até 9.999, embora os dois
bytes binários represente um valor máximo de 32.768.

Por Luiz Roberto de Souza Página 16 de 31


Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

A definição PIC 9(09) COMP, tem sua aplicação para valores até 999.999.999, embora os
quatro bytes binários possam também representar um valor máximo de 2.147.483.648.

COMPUTATIONAL-3
Trata-se de um campo decimal compactado, onde cada algarismo é representado em meio
byte e o meu byte mais à direita contém o sinal do campo.

COMPUTATIONAL-1
Especificado para item de ponto flutuante de precisão simples, 4 bytes de comprimento.

COMPUTATIONAL-2
Especificado para item de ponto flutuante de precisão dupla, 8 bytes de comprimento.

8. TABELAS
Uma tabela é uma região da memória que pode conter diversos valores e é referenciada por
um único nome. A tabela possui o chamado subscrito ou índice que identifica a posição do
elemento desejado na lista de valores. Uma variável poderá ser utilizada para acessar um
determinado valor em uma tabela. Nesta caso, ela será chamada de indexador.
Na PROCEDURE DIVISION o número correspondente ao subscrito da tabela será passado
para o COBOL entre parênteses logo após o nome do dado.
Por exemplo,

DISPLAY MESES(4)

exibe o elemento que está na quarta posição de uma tabela chamada MESES.

8.1.1. Cláusula OCCURS


Especifica que um dado será repetido n vezes. Não é permitida para os níveis 01 e 77.
Sintaxe:

<número de nível> nome-de-dado OCCURS <n> TIMES


INDEXED BY <nome-do-índice>.

Onde:
 nome-de-dado  é o nome da variável ou campo que será repetido;
 n  é um número inteiro maior que zero indicando quantas vezes o dado será repetido;
 nome-do-índice  é um dado que será utilizado como índice da tabela na PROCEDURE
DIVISION.

Por Luiz Roberto de Souza Página 17 de 31


Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

Exemplo
No exemplo a seguir temos os 12 últimos saldos médios de um determinado cliente :

01 WS-GRUPO.
03 WS-CIF PIC 9(011).
03 WS-SALDO-MEDIO-1 PIC S9(013)V99 COMP-3.
03 WS-SALDO-MEDIO-2 PIC S9(013)V99 COMP-3.
03 WS-SALDO-MEDIO-3 PIC S9(013)V99 COMP-3.
03 WS-SALDO-MEDIO-4 PIC S9(013)V99 COMP-3.
03 WS-SALDO-MEDIO-5 PIC S9(013)V99 COMP-3.
03 WS-SALDO-MEDIO-6 PIC S9(013)V99 COMP-3.
03 WS-SALDO-MEDIO-7 PIC S9(013)V99 COMP-3.
03 WS-SALDO-MEDIO-8 PIC S9(013)V99 COMP-3.
03 WS-SALDO-MEDIO-9 PIC S9(013)V99 COMP-3.
03 WS-SALDO-MEDIO-10 PIC S9(013)V99 COMP-3.
03 WS-SALDO-MEDIO-11 PIC S9(013)V99 COMP-3.
03 WS-SALDO-MEDIO-12 PIC S9(013)V99 COMP-3.

Com o uso de tabela, o código seria simplificado para :

01 TB-GRUPO.
03 TB-CIF PIC 9(011).
03 TB-SALDO-MEDIO OCCURS 12
PIC S9(013)V99 COMP-3.

TB-SALDO-MEDIO (1) equivale, então, a WS-SALDO-MEDIO-1,


TB-SALDO-MEDIO(2) equivale a WS-SALDO-MEDIO-2 e assim por diante.

8.1.2. Manipulando um índice de tabela


Setando seu valor

SET <NOME-ÍNDICE> TO <VALOR>

Incrementando de N

SET <NOME-ÍNDICE> UP BY <N>

Decrementando de N

SET <NOME-ÍNDICE> DOWN BY <N>

Por Luiz Roberto de Souza Página 18 de 31


Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

O exemplo a seguir cria uma tabela e zera todos os seus elementos na PROCEDURE
DIVISION.

WORKING-STORAGE SECTION.
01 VARIAVEIS.
05 SALDOS PIC S9(7)V99 OCCURS 50 TIMES
INDEXED BY IND.
...
PROCEDURE DIVISION.
...
SET IND TO 0.
PERFORM ZERA-TAB 50 TIMES.
...
ZERA-TAB.
SET IND UP BY 1.
MOVE ZERO TO SALDOS(IND).

8.1.3. Cláusula REDEFINES


É utilizada para redefinir um campo com uma configuração diferente da original. O campo
redefinido não pode ser maior que o original. Ambos devem ter o mesmo número de nível. Entre
eles não pode haver a definição de outro campo com número de nível menor ou igual ao deles.
 No campo redefinido não é permitido o uso da cláusula VALUE ou OCCURS.
 Não é permitido redefinir um campo de nível 77 ou 88.
 São permitidas múltiplas redefinições de um mesmo campo.
 Campos subordinados a um campo redefinido podem ter a cláusula OCCURS.

Exemplo

03 WS-ANO PIC X(36) VALUE


‘JANFEVMARABRMAIJUNJULAGOSETOUTNOVDEZ’.
03 FILLER REDEFINES WS-ANO.
05 WS-MESES PIC X(03) OCCURS 12 TIMES.

8.1.4. Zerando uma tabela por expansão


Uma maneira diferente de zerar uma tabela sem a necessidade de utilizar um contador é a
expansão da tabela. O exemplo abaixo cria uma tabela de 100 elementos e inicializa todos eles:
Na DATA DIVISION:

03 TAB-ZERA.
05 FILLER PIC 9(04) VALUE ZERO.
05 FILLER PIC X(50) VALUE SPACES.
05 FILLER PIC S9(5) COMP-3 VALUE ZEROS.
05 TB-AGE.
07 FILLER OCCURS 100 TIMES.
09 TB-COD PIC 9(04).
09 TB-NOME PIC X(50).
09 TB-VALOR PIC S9(5)V99 COMP-3.
Por Luiz Roberto de Souza Página 19 de 31
Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

Na PROCEDURE DIVISION, a linha

MOVE TAB-ZERA TO TB-AGE.

inicializa todos elementos de TB-AGE com os valores definidos em TAB-ZERA.


A declaração comum seria:

05 TB-AGE OCCURS 100 TIMES.


09 TB-COD PIC 9(04).
09 TB-NOME PIC X(50).
09 TB-VALOR PIC S9(5)V99 COMP-3.

9. MANIPULAÇÃO DE ARQUIVOS
Como sabemos, os arquivos são as estruturas utilizadas pelo sistema operacional para
armazenar informações em um dispositivo externo. Este dispositivo pode ser um disco ou uma fita.
Em COBOL, a manipulação dos arquivos dependerá também de meios externos. Os
chamados métodos de acesso. Para a utilização dos comandos abaixo, supomos que no computador
haja uma partição com o VSAM (Virtual Storage Access Metod) que dá suporte ao trabalho com
arquivos de organização indexada. Todos os arquivos VSAM só podem ser armazenados em disco,
por se tratarem de arquivos de acesso direto. Apenas os arquivos seqüenciais poderão ser gravados
em fitas magnéticas

9.1.1. Instrução OPEN


Abre um arquivo para utilização.
Sintaxe

OPEN <INPUT|OUTPUT|EXTEND> <NOME-DO-ARQUIVO>

Modos de abertura:
 INPUT  só permite leitura do arquivo
 OUTPUT  só permite gravação no arquivo, criando o arquivo se o mesmo já existir.
Se o mesmo já existir, todos os registros serão destruídos.
 I-O  permite tanto leitura quanto gravação no arquivo.
 EXTEND  abre um arquivo que já exista para permitir apenas gravações, criando o
arquivo se o mesmo não existir.

9.1.2. Instrução CLOSE


Fecha o arquivo, finalizando gravações que possam estar pendentes.
Sintaxe

CLOSE <NOME-DO-ARQUIVO>

9.1.3. Instrução WRITE


Sintaxe para arquivos seqüenciais:

Por Luiz Roberto de Souza Página 20 de 31


Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

WRITE <NOME-REGISTRO> FROM <NOME-DADO>

Sintaxe para arquivos VSAM:

WRITE <NOME-REGISTRO> FROM <NOME-DADO>


INVALID KEY <COMANDO IMPERATIVO>

Obs: a condição INVALID KEY será atingida quando a gravação não for bem sucedida.
Iremos optar pela utilização desta cláusula ou pelo teste da variável de file status.

Sintaxe para impressora

WRITE <NOME-REGISTRO> FROM <NOME-DADO1>


<BEFORE|AFTER> <N>LINES | PAGE

EXEMPLOS

MOVE CABEC TO LINHA.


WRITE LINHA AFTER 1.

WRITE LINHA FROM CABEC AFTER 1.

MOVE REG-FITA TO REG-DISCO.


WRITE REG-DISCO.

WRITE REG-DISCO FROM REG-FITA

9.1.4. Instrução READ


Leitura seqüencial

READ <NOME-ARQUIVO> NEXT RECORD INTO <NOME-DADO>


AT END <COMANDO IMPERATIVO>

Leitura aleatória (arquivos VSAM)

READ <NOME-ARQUIVO> KEY IS <NOME-DADO1> RECORD


INTO <NOME-DADO2> INVALID KEY <COMANDO IMPERATIVO>

9.1.5. Instrução REWRITE


Regrava o registro atual.
Sintaxe:

REWRITE <NOME-REGISTRO> FROM <NOME-DADO>


INVALID KEY <COMANDO IMPERATIVO>

Por Luiz Roberto de Souza Página 21 de 31


Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

Lembre-se que a cláusula INVALID KEY só pode ser utilizada para arquivos de
organização indexada.

9.1.6. Instrução DELETE


Remove o registro atual do arquivo indexado (VSAM). Não possível a utilização deste
comando em arquivos seqüenciais.

DELETE <NOME-ARQUIVO> RECORD


INVALID KEY <COMANDO IMPERATIVO>

9.1.7. Tabela de valores de file status


A FILE STATUS (situação do arquivo) é uma variável de duas posições que deve ser
referenciada no SELECT do arquivo na ENVIRONMENT DIVISION e declarda como qualquer
outra na WORKING-STORAGE SECTION.
No ambiente de microcomputador, a FILE STATUS deve ser obrigatoriamente declarada
como alfanumérica de duas posições (PIC XX). No ambiente de grande porte, essa declaração pode
também ser numérica (PIC 99).
A cláusula VALUE não deve ser utilizada para inicializar a variável, pois a mesma terá seu
valor automaticamente atualizado a cada operação que for realizada com o arquivo VSAM.

Código Significado
00 Operação completada com sucesso
10 Fim do arquivo (AT END)
21 Erro na estrutura do arquivo
22 Chave duplicada
23 Registro não encontrado
24 Sem espaço no dispositivo para gravação
30 Erro permanente
91 Erro na estrutura do arquivo

Observações
 Código 21  quando em um acesso seqüencial a gravação não obedece uma seqüência
ascendente de chave, no arquivo indexado.
 Código 30  nas operações de OPEN INPUT e OPEN I-O, representa que o arquivo
não foi encontrado no dispositivo.
 Código 91 nas operações OPEN INPUT e OPEN I-O ocorre quando a estrutura do
arquivo está destruída. No caso de OPEN INPUT, o arquivo continua aberto e a
instrução READ pode funcionar “normalmente”. No caso de OPEN I-O o arquivo não é
considerado aberto.
 Códigos 21, 22, 23 e 24  detectados pela função INVALID KEY.

9.2. Instrução START


Posiciona um registro indexado para início de uma leitura seqüencial a partir de um valor de
chave especificado. Só pode ser utilizado nos modos de acesso seqüencial ou dinâmico.

Por Luiz Roberto de Souza Página 22 de 31


Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

Sintaxe

START NOME-ARQUIVO KEY IS <GREATER | NOT LESS | EQUAL>


NOME-DADO

Onde:
 NOME-DADO deve ser a RECORD KEY declarada e o valor a ser procurado no
arquivos deve ser armazenado previamente ali.
 Se a frase KEY IS ... for omitida, será procurado o primeiro registro no arquivo em que
a chave tenha valor igual ao armazenado no identificador definido como RECORD
KEY.
A utilização deste comando pressupõe que o arquivo tenha sido aberto com INPUT ou I-O.
Observação: o comando START apenas posiciona no registro desejado, não
disponibilizando os dados deste registro. É necessário utilizar o comando READ (no formato
seqüencial) para poder obter as informações desejadas.

10. COMUNICAÇÃO ENTRE PROGRAMAS


10.1. Instrução CALL
A instrução CALL chama um outro programa compilado para execução. Após o término do
programa chamado, o fluxo de execução retorna para a linha imediatamente posterior a da
instrução.
Podem haver áreas de memória que serão utilizadas para o envio de instruções do programa
chamador ao chamado em outras que receberão o resultado do processamento das informações.
Todas as variáveis que mandamos para um programa externo, serão chamadas de
parâmetros ou argumentos.
Sintaxe

CALL PROGRAMA USING P1 P2 P3 ... Pn


ON OVERFLOW <comando-imperativo>

Onde:
 P1 até Pn são os parâmetros que estão sendo enviados para o programa. Alguns dos
identificadores da lista já possuem valores que serão utilizados no processamento.
Outros não possuem valores nenhum ou se possuírem serão ignorados, pois tratam-se
dos identificadores que serão formatados pelo programa chamado.
 O comando-imperativo especificado na cláusula ON OVERFLOW será executado caso
a memória seja insuficiente para acomodar o programa chamado. Neste caso não haverá
a transferência de controle. Se esta situação acontecer e não houver o tratamento ON
OVERFLOW, acontecerá um ABEND do programa.

10.2. PROCEDURE DIVISION para programas chamados por outros


Quando um programa recebe parâmetros de outro, é necessário declarar os identificadores
que receberão esses valores.
Sintaxe

PROCEDURE DIVISION USING P1 P2 P3 ... Pn

Por Luiz Roberto de Souza Página 23 de 31


Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

Onde P1 a Pn são os parâmetros recebidos de 1 a n que serão processados ou formatados por


este programa.

10.3. LINKAGE SECTION


Como comentamos anteriormente, trata-se de uma seção da DATA DIVISION onde
definiremos a área de dados que será utilizada por mais de um programa. Assemelha-se com a
WORKING-STORAGE SECTION, porém com algumas características próprias:
 somente será permitido o uso de identificadores em nível 01 e 77;
 não será permitido o uso da cláusula VALUE.
Quando se deseja ter acesso a um campo de dados descrito na LINKAGE SECTION, o
nome de dados no cabeçalho PROCEDURE DIVISION é tornado igual ao nome de dados
correspondente na instrução CALL, sendo assim determinado o endereço do campo no programa
que chama.

Exemplo
Suponha o programa:

IDENTIFICATION DIVISION.
PROGRAM-ID. CHAMA.

ENVIRONMENT DIVISION.

DATA DIVISION.
77 N1 PIC 99 VALUE 1.
77 N2 PIC 99 VALUE 1.
77 SOMA PIC 999 VALUE 0.

PROCEDURE DIVISION.
INICIO.
DISPLAY ‘NO PROGRAMA CHAMADOR’ UPON CONSOLE.
CALL CHAMADO USING N1, N2, SOMA
ON OVERFLOW PERFORM ERRO.
DISPLAY ‘RESULTADO : ’ SOMA.
STOP RUN.
ERRO.
DISPLAY ‘MEMORIA INSUFICIENTE PARA CARREGAR O PROGRAMA’
UPON CONSOLE.

Por Luiz Roberto de Souza Página 24 de 31


Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

Agora suponha o segundo programa que será chamado pelo primeiro

IDENTIFICATION DIVISION.
PROGRAM-ID. CHAMADO.

ENVIRONMENT DIVISION.

DATA DIVISION.
LINKAGE SECTION.
77 A1 PIC 99.
77 A2 PIC 99.
77 RES PIC 9999.

PROCEDURE DIVISION USING A1 A2 RES.


INICIO.
DISPLAY ‘NO PROGRAMA CHAMADO’ UPON CONSOLE.
COMPUTE RES = A1 + A2.
GOBACK.

Agora note:
 Os parâmetros enviados pelo comando CALL devem ser recebidos por identificadores
correspondentes na mesma ordem na PROCEDURE DIVISION através da cláusula
USING.
 Observe que mesmo as variáveis que são utilizadas para receber os resultados do
processamento precisam obrigatoriamente ser enviadas pelo comando CALL.
 O programa chamado usa o comando GOBACK para retornar ao chamador. Se fosse
utilizado o comando STOP RUN, o controle retornaria para o sistema operacional,
quebrando desta forma a estrutura de processamento.

11. SORT
Os arquivos indexados foram criados no ano de 1974. Até então, o único modo de
organização existente era o seqüencial. Até hoje, muitos arquivos são armazenados
seqüencialmente, seja por não terem sidos convertidos ou por alguma razão particular do sistema
em si.
A principal desvantagem dos arquivos seqüenciais está na velocidade de recuperação dos
dados, uma vez que não existe uma maneira de fazer um acesso direto ao registro desejado, havendo
necessidade de uma pesquisa registro a registro, na ordem de gravação e comparação do valor de
um campo com o valor procurado pelo programa. Assim, vemos que uma leitura em um arquivo
desse tipo nunca pode ter como ordem um campo diferente.
Porém, para relatórios ou mesmo outros tipos de processamento (principalmente batch),
haverá a necessidade de uma ordenação por um ou mais campos do registro. O comando SORT será
então utilizado para fazer a leitura do arquivo seqüencial, na ordem da gravação e gerar um outro
arquivo, em uma ordem definida pelo programador.
A ordenação dos registros seguirá os passos:
ARQUIVO DE ARQUIVO ARQUIVO DE
ENTRADA TEMPORÁRIO SAÍDA

Por Luiz Roberto de Souza Página 25 de 31


Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

12. EXERCÍCIOS
O COBOL não é capaz de acessar “sozinho” os arquivos de organização indexada. Para
tanto, é necessário a utilização de um método de acesso chamado VSAM. No entanto, detalhes
maiores sobre este software que fornece as informações dos arquivos serão vistos em outro curso;
sendo assim, basta codificar os programas ignorando meios externos. Doravante, todas as vezes que
um arquivo for de organização indexada será simplesmente chamado de arquivo VSAM.
1) Codificar um programa para acessar via console um número inteiro no intervalo de 01 a
20 e exibir o resultado do fatorial deste número:
n! = n * (n – 1) * (n – 2) * (n – 3) * ... * 1

2) Acessar 2 números N e K e submetê-los à formula da permutação:


N!
PN , K 
K !( N  K )!

3) Codificar um programa para acessar via console um número inteiro no intervalo de 01 a


99 e dizer se ele é par ou impar.

4) Codificar um programa para exibir todos os números primos menores que 100,
lembrando que um número, para ser primo, deve ser divisível apenas por ele mesmo e
por 1.

5) Codificar um programa Cobol que receba via console uma variável no formato
999999999-99, representando o CPF. Consistir a validade do CPF através dos
procedimentos:
DV1 = (D1 x 1 + D2 x 2 + D3 x 3 + D4 x 4 + D5 x 5 + D6 x 6 + D7 x 7 + D8 x 8 + D9 x 9) / 11
DV2 = (D2 x 1 + D3 x 2 + D4 x 3 + D5 x 4 + D6 x 5 + D7 x 6 + D8 x 7 + D9x 8 + DV1 x 9) / 11

D1 D2 D3 D4 D5 D6 D7 D8 D9 - DV1 DV2
x1 x2 x3 x4 x5 x6 x7 x8 x9
x1 x2 x3 x4 x5 x6 x7 x8 x9

O cálculo do segundo dígito verificador só é executado se o primeiro estiver correto.


Ao final dos testes, se o CPF existir, exibir a mensagem ‘CPF Correto’, do contrário ‘CPF
Incorreto’.

6) Acessar uma variável no formato 9(9). Através da fórmula aplicada no exercício


anterior, calcular os dois dígitos verificadores de CPF, “construir” e exibir uma variável
no formato 999999999-99.

7) Codificar as duas primeiras divisões de um programa COBOL que irá ler o arquivo de
movimentação e o arquivo de contas correntes, atualizando o arquivo de saldo final. Os
dois primeiros são indexados e o último é seqüencial. No final do processamento o
programa irá mandar para a impressora um resumo da movimentação.

8) Refaça o exercício anterior até a DATA DIVISION. Suponha o uso de formulários de


132 colunas na impressora.

Por Luiz Roberto de Souza Página 26 de 31


Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

ARQUIVO DE MOVIMENTO:
*MOVIMENTOS*
CODAGE 9(4)  CHAVE DE ÍNDICE
CONTA 9(8)  CHAVE DE ÍNDICE
DATAMOV 9(8) (AAAAMMDD)
VALOR S9(12)V99

ARQUIVO DE CONTAS CORRENTES:


*CONTAS*
CODAAGE 9(4)  CHAVE DE ÍNDICE
NUMCONTA 9(8)  CHAVE DE ÍNDICE
TITULAR X(40)

ARQUIVO DE SALDO FINAL:


*SLDFN*
AGENCIA 9(4)
VLFINAL S9(17)V99

Por Luiz Roberto de Souza Página 27 de 31


Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

9) É dado o arquivo indexado CLIENTES com a estrutura abaixo descrita:


CAMPO PICTURE CONSISTÊNCIA
CODIGO 9(04)
NOME X(35)
ENDERECO X(45)
FONE 9(12)
CIDADE X(20)
ESTADO A(02)
CEP 9(08)
SEXO X(01) ‘M’ ou ‘F’
LIMITE 9(04)V9(02) Entre 100 e 3000 inclusive

Codifique os seguintes programas:


 Inclusão de registros;
 Alteração de registros (com pesquisa seqüencial);
 Alteração de registros (com pesquisa aleatória);
 Exclusão de registros (com leitura aleatória);

Observações para codificar os programas:


 Todos os valores, enquanto estiverem sendo digitados, serão armazenados em área de
trabalho na memória (variáveis definidas na WORKING). Serão transferidos para os
campos do arquivo apenas no momento de sua gravação.
 Todas as consistências para os valores deverão ser realizadas em tempo de digitação
para evitar a gravação de valores inválidos no arquivo.
 Para qualquer operação com o arquivo, solicite primeiro a confirmação por parte do
usuário.
 Na inclusão de registros, não permita a gravação de chave duplicada.
 Na alteração de registros, não permita a alteração da chave de acesso.
 Na exclusão de registros, exiba as informações na tela antes de apagar o registro (não
esquecer de solicitar a confirmação).
 Teste os valores de FILE STATUS para cada operação realizada no arquivo.

10) O arquivo VSAM CLIENTE será convertido pelo banco JURO ALTO S/A e possui o
seguinte layout:
CODIGO 9(04)
NOME X(30)
ENDER X(45)
DTCAD X(06) – no formato (AAMMDD)
FONE 9(08)

Por Luiz Roberto de Souza Página 28 de 31


Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

O programa deverá gerar o arquivo CLITMP de layout abaixo:

CODIGO 9(04)
NOME X(30)
ENDER X(45)
DTCAD X(08) – no formato (AAAAMMDD)
FONE 9(08)
STATUS X(01)

INSTRUÇÕES
 Ler seqüencialmente o arquivo CLIENTES copiando todos os seus registros para
CLITMP;
 A data de cadastro poderá ou não ter sido digitada. Se não tiver, gravar ZEROS no
arquivo de saída e ‘E’special no campo STATUS. Se tiver (testar IS NUMERIC), gravar
a data conforme explicação no próximo item e ‘C’onvertida no campo STATUS.
 Se o ano na data de cadastro do cliente for igualo ou posterior a 50, gravar no arquivo de
saída 19 para o século. Por exemplo, 500429  19500429. Do contrário, gravar 20 para
o século, como por exemplo, 100429  20100429.

OS PASSOS PARA EFETIVAR A CONVERSÃO SERIAM:


 Rodar o programa que gera o arquivo temporário;
 Verificar a consistência do arquivo temporário;
 Apagar o arquivo antigo;
 Renomear o arquivo temporário para o mesmo nome do anterior;
 Verificar os programas que acessam o arquivo e mudar o tamanho da área de memória
necessária para armazenamento do registro.

11) São dados os arquivos


MOVIM (SEQÜENCIAL)
DATAMOV X(06)
HORAMOV 9(06)
AGENCIA 9(04)
CONTA 9(07)
VALOR-MOV S9(07)V9(02) COMP-3

MOVIM2 (VSAM)
DATAMOV X(08) *
HORAMOV 9(06) *
AGENCIA 9(04) *
CONTA 9(07) *
VALOR-MOV

S9(07)V9(02) COMP-3

LOG001 (SEQÜENCIAL), arquivo de log:


DATA-OCOR X(08)
HORA-OCOR X(06)
ARQUIVO X(08)
Por Luiz Roberto de Souza Página 29 de 31
Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

REGISTRO 9(06) COMP-3


OCORRENCIA X(30)
TIPO X(01) [C=Cabeçalho, D=Detallhe, R=Rodapé)

INSTRUÇÕES
 Gravar um registro cabeçalho no arquivo de log, com a ocorrência ‘INÍCIO
PROCESSAMENTO MOVIM’;
 Ler todo o arquivo MOVIM (de entrada), gerando o arquivo MOVIM2 (de saída), ao
qual se supõe estar vazio ou ter todos os seus dados destruídos se assim não estiver;
 Ao século de todas as datas do arquivo de saída (MOVIM2) será adicionado 19;
 Gravar os registros ordenados por DATAMOV, HORAMOV, AGENCIA e CONTA;
 Testar sucesso na formatação do arquivo temporário (SORT STATUS), gravando
arquivo de log se não for bem sucedida com a ocorrência ‘ERRO NO ARQUIVO
TEMPORARIO’;
 Testar a gravação de chave duplicada no arquivo de saída, gravando o arquivo de log, na
seção detalhe, com a ocorrência ‘CHAVE DUPLICADA’;
 A data da ocorrência no arquivo de log será formatada com 19 no século se o ano for
posterior a 90, do contrário, será formatada como 20;
 O campo ARQUIVO do arquivo de log conterá o nome do arquivo onde aconteceu o
problema;
 O campo REGISTRO do arquivo de log conterá o número do registro do arquivo em que
aconteceu o problema;
 Ao final do processamento, gravar um registro rodapé no arquivo de log, com a
ocorrência ‘FINAL PROCESSAMENTO MOVIM’.

12) É dado o arquivo seqüencial MOVIM, com a estrutura:


DATAMOV X(08)
REGIAO 9(02)
AGENCIA 9(04)
CONTA 9(07)
VALOR 9(07)V9(02) COMP-3
TIPO X(01)

Codificar um programa para imprimir o relatório de layout a seguir:


1 2 3 4 5 6 7 8
12345678901234567890123456789012345678901234567890123456789012345678901234567890
================================================================================
GENNARI & PEARTREE PROJETOS E SISTEMAS 22/09/1998
RELATORIO DE MOVIMENTACAO MENSAL PAG.: 001
================================================================================
REGIAO: 99
AGENCIA CONTA DATA MOVIMENTO D/C
9999 9999999 DD/MM/AAAA Z.ZZZ.ZZ9,99 X
9999999 DD/MM/AAAA Z.ZZZ.ZZ9,99 X
9999999 DD/MM/AAAA Z.ZZZ.ZZ9,99 X
TOTAL AGENCIA....................................: ZZ.ZZZ.ZZZ.ZZ9,99
9999 9999999 DD/MM/AAAA Z.ZZZ.ZZ9,99 X
9999999 DD/MM/AAAA Z.ZZZ.ZZ9,99 X
TOTAL AGENCIA....................................: ZZ.ZZZ.ZZZ.ZZ9,99
TOTAL REGIAO..................................: Z.ZZZ.ZZZ.ZZZ.ZZ9,99
Por Luiz Roberto de Souza Página 30 de 31
Gennari & Peartree Projetos e Sistemas
Programa de Treinamento – Linguagem de Programação COBOL

**** ESTATISTICAS DE PROCESSAMENTO


TOTAL DE REGISTROS LIDOS...............: ZZZ.ZZZ.ZZ9
TOTAL DE REGIOES PROCESSADAS...........: Z9
TOTAL DE AGENCIAS......................: Z.ZZ9
TOTAL DE CONTAS........................: ZZZ.ZZZ.ZZ9

 Os movimentos foram gravados seqüencialmente, o que pressupõe uma ordem de data


de movimento para o arquivo.
 Para que o relatório possa funcionar corretamente, é necessário que haja uma ordenação
utilizando como chave REGIAO, AGENCIA, CONTA e DATAMOV.
 Observe que o valor movimentado não é gravado com sinal e o campo TIPO armazena
um caracter C para crédito ou D para débito.
 Haverá quebra de página a cada quebra em região.
 Ao final do relatório testar se há linhas suficientes para as estatísticas. Se não houver,
saltar página antes de imprimir.
 Condições de cancelamento do programa: Arquivo vazio.
Erro na geração do arquivo de SORT
Erro na leitura do arquivo de SORT

Por Luiz Roberto de Souza Página 31 de 31

Você também pode gostar