Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
-1-
1. Introduo
2. Formato do Fonte Cobol
2.1. rea de numerao seqencial
2.2. rea de indicao
2.3. rea A
2.4. rea B
3. Estrutura de um Programa Cobol
3.1. IDENTIFICATION DIVISION
3.2. ENVIRONMENT DIVISION
3.2.1. CONFIGURATION SECTION
3.2.2. INPUT-OUTPUT SECTION
3.3. DATA DIVISION
3.3.1.
3.3.2.
FILE SECTION
3.3.2.1.1. FILE DESCRIPTION (FD)
-2-
Condies concatenadas
3.4.3.6
Condies compostas
USAGE DISPLAY
6.3.2.
USAGE COMP
6.3.3.
USAGE COMP-3.
6.4. Tabelas
6.4.1.
7. Impresso
7.1. Opo AFTER POSITIONING
7.2. Mscaras de Edio de Campos
7.3. Supresso de zeros
7.4. Tipos de Mscaras de Edio - OUTRAS
7.5. BLANK WHEN ZERO
8. Ordenao de Arquivos
8.1. Sort intrnseco
8.2. Sort extrnseco
-3-
9.1.2.
FILE STATUS
9.1.3.
9.1.4.
Abertura do arquivo.
9.1.5.
READ
9.1.6.
READ NEXT
9.1.7.
READ PREVIOUS
9.1.8.
START
9.1.9.
WRITE.
9.1.10.
REWRITE
9.1.11.
DELETE
9.1.12.
Fechamento de arquivos
Pesquisa seqencial
11.6.2.2.
Pesquisa binria
11.7. ALTER
11.8. GO TO DEPENDING ON
11.9. Nomes condicionais
11.10. Copy
12. Diagrama de Bloco
12.1.
12.2.
Simbologias
-4-
1. INTRODUO
O Cobol uma linguagem de alto nvel criada no ano de 1959. A palavra Cobol
uma abreviao de: Common Business Oriented Language.
Como seu nome indica, o objetivo desta linguagem permitir o desenvolvimento de
aplicaes comerciais para pessoas sem conhecimento profundo de computadores. Por isso
a linguagem Cobol usa frases normais da lngua inglesa, e a estrutura de um programa
Cobol se assemelha a um texto com divises, pargrafos e frases em ingls.
Depois de escrito o programa Cobol (ou programa fonte), necessrio traduz-lo para a
linguagem interna do computador (linguagem de mquina), convertendo-se ento em um
programa objeto. Esta converso feita pelo prprio computador, usando o programa
compilador de Cobol.
Damos em seguida a definio de alguns termos importantes para o desenvolvimento do
curso:
ASCII: tabela usada em micros para converso do valor binrio dos bits de um
byte em um caracter.
EBCDIC: tabela da IBM para converso do valor binrio dos bits de um byte em
um caracter.
-5-
6 7
rea A
8
rea B
11 12
72
73
80
Colunas de 1 a 6:
Coluna 7:
rea de indicao
Colunas de 8 a 11:
rea A
Colunas de 12 a 72:
rea B
Colunas de 73 a 80:
Comentrio
Comentrios
-6-
2.3. rea A
Posio a partir do qual se escreve nome de pargrafos.
2.4. rea B
Posio a partir da qual se escrevem as instrues Cobol.
Veja o exemplo de cdigo fonte a seguir:
NUM
000110 *
000120
000130
AREA B
ESTE E UM PARAGRAFO
PARA GRAFO-1.
COMEN.
*PROG1*
*PROG1*
-7-
*PROG1*
DIVISION.
PROGRAM-ID.
nome-programa.
AUTHOR.
comentrio.
DATE-WRITTEN.
comentrio.
DATE-COMPILED.
comentrio.
SECURITY.
comentrio.
REMARKS.
comentrio.
-8-
DIVISION.
CONFIGURATION
SECTION.
SOURCE-COMPUTER.
comentrio.
OBJECT-COMPUTER.
comentrio.
SPECIAL-NAMES.
INPUT-OUTPUT
SECTION.
FILE-CONTROL.
I-O CONTROL.
-9-
IS COMMA.
- 10 -
.
ENVIRONMENT
CONFIGURATION
DIVISION.
SECTION.
SPECIAL-NAMES.
DECIMAL-POINT
INPUT-OUTPUT
IS COMMA.
SECTION.
FILE-CONTROL.
SELECT CLIENTES ASSIGN TO DA-S-CLIENTES.
....
O programador pode usar qualquer palavra com at 30 caracteres como nome-de
arquivo, mas uma vez definido, este dever ser usado igualmente em todos os pontos do
programa quando se referir a este arquivo nome interno.
O formato da clusula dispositivo-do-computador varia conforme o computador
(micro, mainframe, etc), mas no caso do mainframe usa-se o formato mostrado no
exemplo, composto de 3 segmentos, separados por hfen:
Tipo de dispositivo:
UR - para dispositivos de registro fixo (impressoras, carto).
UT - para dispositivos de registro varivel (fitas).
DA - para dispositivos de acesso aleatrio (discos).
Modo de acesso:
S Sequencial.
D Direto (Randmico).
I Indexado.
Nome externo do arquivo nome pelo qual o operador do computador reconhece
o arquivo. O nome externo geralmente est associado aos comandos JCL na execuo do
programa.
Para arquivos abertos para leitura (veja OPEN INPUT e OPEN I-O), pode-se
especificar a clusula OPTIONAL no SELECT. Com esta clausula, se ao tentarmos abrir o
arquivo e este no existir, ele automaticamente criado vazio.
Sintaxe do SELECT com OPTIONAL:
SELECT OPTIONAL nome-do-arquivo ASSIGN TO dispositivo.
- 11 -
formato
valor-inicial.
WRK-DATA-NASCIMENTO.
03
WRK-DIA-NASCIMENTO.
03
WRK-MES-NASCIMENTO.
03
WRK-ANO-NASCIMENTO.
IMPORTANTE:
De todos estes nveis, somente o nvel 01 e o nvel 77 podem der codificados na
- 12 -
margem A do programa (coluna 8). Os demais nveis devem ser codificados a partir da
margem B (coluna 12).
REGRA:
Na codificao de programa, exigido que toda a hierarquia de um item de grupo inicie com
um item de nvel 01. A partir dele, cada nvel subordinado deve ter o mesmo nmero, por
exemplo, se para o segundo nvel for escolhido o nmero 3 todos os itens do segundo nvel
devem ter nvel 03, e se o terceiro nvel tiver o numero 10, todos os itens do terceiro nvel
devem ter nvel 10, e assim sucessivamente.
3.3.1.2. NOMEAO DO DADO
Pode-se utilizar qualquer palavra de no mximo 30 caracteres -- incluindo letras,
nmeros e hfen, sendo que pelo menos uma deve ser letra.
Este nome dever ser usado em todos os pontos do programa a que se referir a este
dado. Se no for necessrio realizar uma referncia no programa deste dado, o nome
poder ser omitido. Porm, para o COBOL ele obrigatrio. Neste caso, usa-se ento a
palavra FILLER que identifica dados annimos.
Por exemplo:
01
FILLER
A clusula PICTURE usada para descrio de informaes sobre itens, tais como:
tamanho, sinal, tipo (numrico, alfanumrico ou alfabtico).
Tipos possveis:
ALFABTICO - representado por letras mais o espao, e o caractere usado a
letra A.
- 13 -
Por exemplo:
77 WRK-DADO1
PICTURE IS AAA
VALUE ABC.
77 WRK-DADO2
PIC
VALUE ABC.
77 WRK-DADO3
PIC A(3)
IS AAA
VALUE BCD.
WRK-DADO1
PIC XXX
VALUE ANO.
01
WRK-DADO2
PIC X(04)
VALUE KKKK.
WRK-QUANT-PROD
PIC 99999.
OU
77
WRK-QUANT-PROD
PIC 9(05).
- 14 -
WRK-VALOR-PROD
PIC 99999V99.
OU
77
WRK-VALOR-PROD
PIC 9(05)V99.
IMPORTANTE:
Em um item de grupo, o nvel principal no deve ser definido com a clusula PICTURE.
Somente os nveis pertencentes a ele devem ser definidos (itens elementares).
Por exemplo:
01
WRK-MES
PIC 99.
05
WRK-ANO
PIC 99.
WRK-QUANT-PROD
PIC 99999
- 15 -
VALUE literal.
WRK-IDADE-MINIMA
PIC 99
VALUE 18.
WRK-NOME-RUA
PIC X(20)
IMPORTANTE:
LOW-VALUES diferente de espaos -- indica que o contedo da varivel na memria
deve ter os seus bytes com todos os bits desligados.
- 16 -
TAMANHO
VARIAVEL
FORMATO
HEXADECIMAL
ZEROS
PIC 9(03)
FFF
000
SPACES
PIC X(03)
444
000
LOW-VALUES
PIC X(03)
000
000
HIGH-VALUES
PIC X(03)
FFF
FFF
SECTION.
WORKING-STORAGE
SECTION.
REPORT
SECTION.
LINKAGE
SECTION.
anteriormente,
que
na
INPUT-OUTPUT
SECTION
(ENVIRONMENT
DIVISION), que para cada arquivo a ser tratado no programa dever haver uma instruo
SELECT especificando e definindo um nome para o arquivo. Na FILE SECTION precisamos
definir a estrutura de cada um destes arquivos. Isto feito atravs do pargrafo FILE
DESCRIPTION (FD).
- 17 -
Se esta clusula for colocada, feita uma conferncia pelo compilador, somando a
quantidade de bytes da definio do registro.
RECORDING MODE Especifica o formato do arquivo
Ex.: RECORDING MODE IS X
Onde X poder ser definido com:
(F) -> comprimento fixo
(V) -> comprimento varivel
(U) -> indefinido
(S) -> estendido (spanned)
- 18 -
CLUSULA FILLER
usada para um item elementar ou um item de grupo, e nunca ser refenciado.
Pode ser usada na DATA DIVISION e suas SECTIONS.
Exemplo:
01
REGISTRO.
02
FILLER
PIC X(100).
CLUSULA VALUE
usada para definir um valor inicial para um item da WORKING-STORAGE
SECTION. No pode ser usada na FILE SECTION.
Exemplo:
01
CABEC01.
02
FILLER
PIC X(10)
VALUE SPACES.
02
FILLER
PIC X(06)
VALUE FOLHAS.
02
CB01-DATA
PIC X(10)
VALUE SPACES.
- 19 -
DIVISION.
FILE
SECTION.
FD
CLIENTE
RECORDING MODE
IS F
LABER RECORDING
IS STANDARD
BLOCK CONTAINS
0 RECORDS
RECORD CONTAINS
80 CHARACTERS
DATA-RECORD
IS REG-CLIENTES.
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.
- 20 -
UTILIZAO DO PARM
Para acessar dados informados atravs do PARM, declarar na LINKAGE SECTION uma
estrutura com:
Uma varivel PIC S9(04) COMP que recebe o tamanho dos dados.
LKG-DATA-VIA-PARM.
03
LKG-DATA-PARM-TAM
03
LKG-DATA-1
PIC X(10).
03
LKG-DATA-2
PIC X(08).
- 21 -
*====================================================*
PROCEDURE DIVISION
USING LKG-DATA-VIA-PARM.
*====================================================*
DISPLAY LKG-DATA-PARM-TAM.
DISPLAY LKG-DATA-1 '
' LKG-DATA-2.
- 22 -
*----------------------------------------------------------------------------------------------*
0000-ROTINA-PRINCIPAL
SECTION.
*----------------------------------------------------------------------------------------------*
PERFORM 1000-ENTRADA. SEGUNDA SEO DO PROGRAMA
PERFORM 2000- PROCESSAMENTO. TERCEIRA SEO DO PROGRAMA
PERFORM 3000-SAIDA. QUARTA SEO DO PROGRAMA
*----------------------------------------------------------------------------------------------*
0000-99-FIM.
EXIT.
*----------------------------------------------------------------------------------------------*
3.4.1. MOVIMENTAO DO DADO
Para copiar dados de uma varivel para outra se usa a instruo MOVE.
Sintaxe:
MOVE varivel-1
TO varivel-2.
REGRAS:
TO RUA DIREITA.
TO NOME-CLIENTE.
Quando a varivel receptora tiver um tamanho menor que a varivel emissora (de
origem) do dado, ocorre um TRUNCAMENTO do dado para que este possa se adaptar ao
novo item. No gerado nenhum aviso quando isto ocorre.
- 23 -
Quando a varivel receptora tiver um tamanho maior que a emissora (de origem), a
varivel receptora ir automaticamente ser preenchida com espaos se ela for alfanumrica,
ou com zeros esquerda se ela for numrica.
Se a varivel de origem movida for alfanumrica, o truncamento acontece na parte
direita do campo (os dados so movidos da esquerda para a direita).
Se a varivel de origem movida for numrica, o truncamento esquerda (os
nmeros so movidos da direita para a esquerda).
3.4.2. CLCULOS ARITMTICOS
As instrues para efetuar clculos aritmticos so: ADD, SUBTRACT, MULTIPLY,
DIVIDE e COMPUTE.
Quando o clculo envolver variveis/nmeros com casas decimais, preciso observar
que o Cobol adapta o resultado ao formato que foi definido para a varivel de resultado,
ocasionando truncamento ou surgimento de zeros adicionais na parte decimal do resultado.
Por exemplo, se tivermos na WORKING-STORAGE a definio das variveis abaixo:
77
WRK-QUANT
PIC 99V99
VALUE 35,12.
77
WRK-ENTRADA
PIC 99V9
VALUE 12,5.
77
WRK-SALDO
PIC 9999.
Se somarmos WRK-QUANT e WRK-ENTRADA e colocarmos o resultado em WRKSALDO, esta ficar com 47, pois esta varivel no est prevendo o uso de casas decimais.
3.4.2.1. ADIO
Para efetuarmos a soma de valores utilizamos o comando ADD.
Formato 1:
ADD valor-1 valor-2
Neste formato, a soma dos valores das variveis, valor-1 e valor-2, so acrescidos
aos valores j existentes nas variveis acum-1 e acum-2.
As variveis, valor-1 e valor-2, podem ser literais numricas. J as variveis, acum-1
e acum-2, s podero ser variveis numricas recebero o valor acumulado.
- 24 -
Por exemplo:
77
WRK-VAL-1
PIC 9(02)
VALUE 5.
77
WRK-VAL-2
PIC 9(02)
VALUE 10.
77
WRK-VAL-3
PIC 9(02)
VALUE 12.
TO WRK-VAL-3.
GIVING total.
GIVING WRK-VAL-3.
ON SIZE ERROR usado para os casos em que houver estouro do campo receptor do
resultado.
- 25 -
TO WRK-VAL-2
ON SIZE ERROR
DISPLAY ESTOUROU O CAMPO DE RESULTADO
STOP RUN.
3.4.2.2. SUBTRAO
As subtraes so efetuadas com o comando SUBTRACT. De maneira anloga ao
ADD, h dois formatos bsicos:
Formato 1:
SUBTRACT valor-1 valor-2
Neste formato, a soma dos valores das variveis, valor-1 e valor-2, so subtrados
aos valores j existentes nas variveis acum-1 e acum-2.
As variveis, valor-1 e valor-2, podem ser literais numricas. J as variveis, acum-1
e acum-2, s podero ser variveis numricas recebero o valor subtrado.
Formato 2:
SUBTRACT valor-1 valor-2
Neste formato a soma dos valores das variveis, valor-1 e valor-2, so subtrados de
acum, e o resultado colocado em total. Os valores das variveis, valor-1, valor-2 e acum,
no so alterados.
A varivel total zerada antes de receber o resultado.
Parmetros opcionais -- podem ser adicionados a qualquer dos formatos acima:
ROUNDED
ON SIZE ERROR
Estes parmetros tm funcionamento idntico aos do comando ADD.
- 26 -
3.4.2.3. MULTIPLICAO
O comando utilizado para operaes de multiplicao o MULTIPLY.
H tambm 2 (dois) formatos:
Formato 1:
MULTIPLY valor-1
BY valor-2.
Este formato multiplica a varivel valor-1 pela varivel valor-2, e o resultado fica em
valor-2.
IMPORTANTE:
Na multiplicao e diviso, o resultado fica sempre no ltimo operando.
BY WRK-QUANT.
BY 3.
Formato 2:
MULTIPLY valor-1
- 27 -
INTO valor-2.
Este formato divide a varivel valor-2 pela varivel valor-1 e o resultado movido
para valor-2. Assim como na multiplicao, o resultado da diviso fica sempre no ltimo
operando. Assim, se quisermos dividir a varivel WRK-QUANT por 3 (trs) devemos
executar a instruo:
DIVIDE 3
INTO WRK-QUANT.
BY 3.
Formato 2:
DIVIDE valor-1
- 28 -
BY valor-2
GIVING valor-3
REMAINDER valor-4.
= frmula.
Adicionar
Subtrair
Multiplicar
Dividir
**
Exponenciao
()
Parnteses
B + C
= (B ** 2 + C ** 2) ** (.5).
IMPORTANTE:
A exponenciao com expoentes decimais (no exemplo **(.5)) no funciona em todos
os sistemas operacionais.
- 29 -
Teste de sinal
Teste de classe
Smbolo
=
>
<
No
No
No
No
No
IS
IS
IS
IS
IS
IS
IS
IS
tem
tem
tem
tem
tem
Notao alternativa
EQUAL
GREATER THAN
LESS THAN
POSITIVE
NEGATIVE
ZERO
NUMERIC
ALPHABETIC
WRK-CODIGO
IS EQUAL 5
IF
WRK-VALOR
IF
WRK-SALDO
IS NEGATIVE
IF
WRK-CODIGO
IS NUMERIC
Pode-se associar a palavra NOT com qualquer tipos de teste, criando-se assim
testes de condio negativa. Por exemplo:
IF
WRK-CODIGO
IS NOT EQUAL 5
IF
WRK-VALOR
IF
WRK-SALDO
IS NOT NEGATIVE
IF
WRK-CODIGO
IS NOT NUMERIC
- 30 -
Formato 1:
IF
condio-1
Instrues-1
Instrues-2
END-IF.
Neste formato, se a condio condio-1 for satisfeita, todas as instrues definidas
internamente (instrues-1 e instrues-2) sero executadas.
Se condio-1 no for verdadeira, o programa no executa as instrues definidas
internamente e retoma a execuo a partir do ponto final (aps o END-IF).
Com respeito distribuio do texto do fonte, necessrio salientar os seguintes
aspectos:
WRK-VALOR
PIC 9(4)
VALUE 50.
WRK-VALOR
GREATER 100
.....
IF
TO WRK-VALOR
END-IF.
MOVE WRK-VALOR
TO WRK-SAIDA.
- 31 -
Formato 2:
IF
condio-1
Instrues-1
ELSE
Instrues-2
END-IF.
Instrues-3.
Neste formato, quando a condio-1 for satisfeita, as instrues-1 sero executadas,
caso contrrio, as instrues-2 sero executadas.
O ponto final marca o fim do comando condicional (IF/ELSE/END-IF).
As
instrues-3,
que
esto
aps
ponto
final,
sero
sempre
executadas
independente da condio-1.
Exemplo incorreto de comando condicional:
Finaliza o comando
IF
IF
WRK-VALOR
GREATER 1000
TO WRK-SAIDA.
A instruo ELSE ficar fora da influncia do IF, devido ao ponto final colocado aps
o primeiro comando MOVE. O compilador emitir uma mensagem de erro de sintaxe.
- 32 -
WRK-VALOR
GREATER 10
NEXT SENTENCE
ELSE
ADD 10
TO WRK-VALOR
END-IF.
O NEXT SENTENCE direciona a execuo para a primeira instruo aps o ponto
final.
3.4.3.3. CONTINUE
- 33 -
ELSE
IF SIGLA = "PR" CONTINUE
ELSE
IF SIGLA = "SC" CONTINUE
ELSE
IF SIGLA = "RS" CONTINUE
ELSE
PERFORM ERRO1 THRU SAI-ERRO1.
SIGLA-OK.
EXIT.
3.4.4.4. EXIT
um ponto comum de finalizao para uma srie de procedimento(s).
NOME-PARAGRAFO.
EXIT.
A clusula EXIT deve ser precedida por um nome de pargrafo e deve ser nica
clusula do pargrafo.
Em um programa poder ter vrios EXITs associados com PERFORMs.
3.4.4. INITIALIZE
Com este comando efetuamos a inicializao de um rea de trabalho, ele tem a
finalizade de
determinado arquivo, com um nico dado, prviamente determinado, sem ter que
usarmos o comando MOVE, usando apenas o comando INITIALIZE.
Por exemplo:
INITIALIZE AREA-TRABALHO
REPLACING NUMERIC DATA BY 7
DISPLAY 'TROCANDO OS CAMPO NUMERICOS POR 7 = ' AREA-TRABALHO.
INITIALIZE AREA-TRABALHO
REPLACING ALPHANUMERIC DATA BY '%'
DISPLAY 'TROCANDO OS CAMPO ALFA POR %
= ' AREA-TRABALHO.
INITIALIZE AREA-TRABALHO
DISPLAY 'LIMPANDO OS CAMPOS PELO DEFAULT
- 34 -
= ' AREA-TRABALHO.
WRK-DEBITO
GREATER WRK-CREDITO
IF
WRK-ANO
MOVE DEBITO OK
TO WRK-MENSAGEM
ELSE
MOVE CONTA EM ATRASO
TO WRK-MENSAGEM
END-IF
ELSE
MOVE CONTA SEM DEBITO
TO WRK-MENSAGEM
END-IF.
O fluxograma que representa a condio acima :
- 35 -
DEBITO >
CREDITO
S
DEBITO
004
ITOIT
O
ANO >=2
OK
CONTA SEM
CONTA EM
DEBITO
ATRASO
WRK-NOTA
GREATER 5 AND
WRK-FREQUENCIA
GREATER 80
WRK-IDADE
GREATER 18 OR
WRK-ACOMPANHANTE
GREATER ZEROS
- 36 -
Quando houver necessidade de se usar vrios testes de condio unida por clusulas
AND e OR misturados, aconselhvel o uso de parnteses para agrupar as condies. Sem
o uso de parnteses, as condies so resolvidas da esquerda para a direita, primeiro todas
as condies AND e depois as condies OR. Estas regras podem conduzir a erros se no
forem avaliadas com muito cuidado. o uso de parnteses direciona a seqncia de avaliao
das condies, simplificando a lgica.
Obs.: O Cobol resolve primeiro as expresses dentro dos parnteses.
Confira os dois exemplos abaixo e descubra a diferena entre eles:
IF (A = B OR C = D) AND E = F ...
IF A = B OR (C = D AND E = F) ...
3.4.7. ALTERAES/DESVIOS DO FLUXO DO PROGRAMA
A execuo da lgica do programa, ou algoritmo, feita pelas instrues que so
codificadas na PROCEDURE DIVISION. O Cobol executa as instrues sequencialmente,
de cima para baixo, somente saltando as instrues subordinadas aos testes condicionais
com resposta falsa. Os comandos de alterao/desvio de fluxo permitem interromper esta
seqncia de execuo.
Existem dois comandos utilizados para controle de fluxo de programa:
GO TO
PERFORM
Para permitir o uso de desvios na seqncia das instrues de um programa,
necessria a incluso de PARGRAFOS em pontos convenientes do programa. As duas
instrues acima desviam a execuo do programa para estes PARGRAFOS.
3.4.7.1. USO DO COMANDO GO TO
O comando GO TO usada para desvios simples e imperativos.
No exemplo abaixo, o comando GO TO est associado a um comando condicional.
- 37 -
IF
WRK-TEMPO-DE-CASA
GREATER 10
MOVE 50
TO WRK-BONUS
GO
TO DESVIO-1
END-IF.
MOVE ZEROS
TO WRK-BONUS.
DESVIO-1.
ADD WRK-BONUS
TO WRK-SALARIO.
IMPORTANTE:
O uso do comando GO TO deve ser feito com critrio. Nos ltimos anos, a utilizao do
GO TO se restringe a desvios para o incio ou final de uma seo.
Diz-se que, um programa bem estruturado no necessita de uso de GO TO.
TO WRK-CAMPO-TESTE.
PERFORM 2100-CALCULAR-DIGITO.
IF WRK-DIG-CALCULADO
MOVE OK
EQUAL WRK-DIGITO-TESTE
TO WRK-MENSAGEM
ELSE
MOVE DIGITO NO CONFERE
TO WRK-MENSAGEM
END-IF.
- 38 -
No programa dever existir um pargrafo / seo chamada 2100-CALCULARDIGITO, ou o compilador acusar erro de codificao.
*----------------------------------------------------------------------------------------------*
2100-CALCULAR-PRINCIPAL
SECTION.
*----------------------------------------------------------------------------------------------*
MOVE ZEROS
TO WRK-DIG-CALCULADO.
COMPUTE
MOVE WRK-DIG-RETORNO
TO WRK-DIG-CALCULADO.
*----------------------------------------------------------------------------------------------*
2100-99-FIM.
EXIT.
*----------------------------------------------------------------------------------------------*
A instruo PERFORM pode ser usada para executar mais de um pargrafo se tiver
a clusula THRU:
Sintaxe:
PERFORM pargrafo-1
THRU pargrafo-2.
n TIMES.
- 39 -
UNTIL condio.
Existe ainda uma forma mais sofisticada de PERFORM com repetio indefinida que
controla uma varivel que pode ser usada no pargrafo executado.
Sintaxe:
PERFORM pargrafo
Exemplo:
PERFORM 2200-CALCULAR-DESCONTO
VARYING TAXA
UNTIL
FROM 1 BY 1
- 40 -
A
S
Prim. Vez
> 500
Taxa =
1
S
N
Segue
N
S
Soma 1 na
Calcula .
taxa
Descont
o
- 41 -
4. ARQUIVO
Todas as instrues que vimos at aqui manipulavam as variveis na memria do
computador. Mas a memria voltil (quando se desliga o computador, perde-se todo seu
contedo). Alem disso, um recurso limitado, e quando nosso programa finaliza, ele precisa
ser apagado para que outros programas possam ser executados. Todos os dados que esto
na memria e que no queremos perder quando o programa encerrado devem ser
gravados em ARQUIVOS, como discos magnticos, fitas magnticas, etc.
Um programa Cobol trata todos os tipos de arquivos basicamente da mesma
maneira:
4.1. REGISTRO
Para armazenar informaes em arquivos, inicialmente necessrio definir um
arquivo para cada tipo de informao. Desta maneira teremos um arquivo para funcionrios,
um arquivo para produtos, um arquivo para notas fiscais, etc.
Uma vez definido a informao para um arquivo, devemos definir os dados que
queremos salvar neste arquivo. Por exemplo, para um arquivo de cadastro de funcionrios
poderamos gravar as seguintes informaes:
CODIGO DO FUNCIONARIO
NOME
DATA DE ADMISSO
CARGO
SALARIO
O arquivo de funcionrios ser ento uma repetio seqencial dos dados acima para
cada um dos funcionrios da empresa. Cada uma das informes acima recebe
- 42 -
CADFUNC
EMPRESA.
OUTPUT
CADSAIDA.
I-O
ARQLOG.
- 43 -
READ nome-do-arquivo
AT END instrues-1.
OU
READ nome-do-arquivo
Esta instruo l um registro do arquivo e carrega seus dados nas variveis definidas
na FD (FILE SECTION). A cada novo comando READ carrega o prximo registro do
arquivo e assim sucessivamente arquivo seqencial.
A clausula AT END opcional, e faz com que o programa execute as instrues-1
quando foram lidos todos os registros do arquivo ou se o arquivo estiver vazio.
GRAVAO
WRITE nvel 01 do registro definido na FD.
OU
WRITE nvel 01 do registro definido na FD FROM nvel 01 do registro auxiliar.
Esta instruo grava no arquivo todos os dados carregados no layout do registro na
FD. De maneira diferente do comando READ, que usa como operando o nome do arquivo, o
comando WRITE usa o nome do registro.
REGRAVAO
REWRITE nvel 01 do registro definido na FD.
Este comando usado para atualizar (alterar) o contedo de um registro j existente
em um arquivo. Por razes fsicas, este comando s pode ser usado com discos
magnticos.
4.4. FECHAMENTO DE ARQUIVO
Antes do trmino do programa, os arquivos abertos precisam ser fechados e desta
forma, liberar os dispositivos fsicos e no caso de gravaes garantir a integridade dos
dados.
- 44 -
Sintaxe:
CLOSE nome-do-arquivo.
4.5. ENTRADA E SADA DE BAIXO VOLUME
Quando um programa precisa receber uma informao com quantidade pequena de
bytes -- poucos caracteres como por exemplo, a data do processamento, ou emitir uma
sada pequena como por exemplo, uma mensagem de erro, pode-se usar as instrues
ACCEPT e DISPLAY.
Estas instrues no precisam da definio de arquivos de entrada e sada. Como em
muitas linguagens, o Cobol usa os conceitos de Entrada Padro e Sada Padro para
especificar dispositivos que o programa no define. Para o Mainframe, a Entrada Padro
geralmente o arquivo de comandos JCL usado para disparar o JOB, e a Sada Padro a
impressora que emite o resumo da execuo do JOB.
As instrues ACCEPT e DISPLAY operam sobre as entrada/sada padro, ou sobre
a Console do computador se for especificado.
Sintaxe do comando ACCEPT:
ACCEPT varivel receptora
FROM CONSOLE.
Onde:
Varivel receptora - deve ser definida na WORKING-STORAGE e ter formato
compatvel com a informao que ser recebida.
FROM CONSOLE - clausula opcional. Se omitida, os dados sero obtidos atravs de
comandos via JCL. Se especificado, o programa interrompido nesta instruo, uma
mensagem de dados requeridos aparece na console do computador, e somente quando o
operador digita os dados na console e tecla <ENTER> o programa continua.
O comando DISPLAY tem o formato:
DISPLAY varivel-1 varivel-2
UPON CONSOLE.
OU
DISPLAY varivel-1
Este comando exibir na sada padro os valores das variveis, varivel-1 e varivel2, ou sobre a Console quando a clausula UPON CONSOLE for especificada.
Varivel-1 e varivel-2 podem ser campos da WORKING-STORAGE ou literais.
- 45 -
5. ENCERRAMENTO DO PROGRAMA
Para finalizar um programa utiliza-se os comandos STOP RUN ou GOBACK.
O comando GOBACK deve ser usado para parar o programa chamado (mdulo) e
retornar ao programa chamador para dar continuidade a sua execuo.
IMPORTANTE:
O comando STOP RUN no pode ser utilizado para programas de processamento
ONLINE. Diferentemente do GOBACK que pode ser utilizado em programas BATCH e
ONLINE.
DIVISION.
*----------------------------------------------------------------------------------------------*
PROGRAM-ID. TREI0001.
AUTHOR. FULANO DE TAL.
*----------------------------------------------------------------------------------------------*
*
TCS TRAININGFORMACAO
*----------------------------------------------------------------------------------------------*
*
PROGRAMA TESTE
*----------------------------------------------------------------------------------------------*
ENVIRONMENT
DIVISION.
*----------------------------------------------------------------------------------------------*
*----------------------------------------------------------------------------------------------*
CONFIGURATION
SECTION.
*----------------------------------------------------------------------------------------------*
*----------------------------------------------------------------------------------------------*
INPUT-OUTPUT
SECTION.
*----------------------------------------------------------------------------------------------*
- 46 -
FILE-CONTROL.
SELECT ENTRADA
ASSIGN TO TAPE
FILE-STATUS
IS WRK-FS-ENTRADA.
SELECT SAIDA
ASSIGN TO PRINTER
FILE-STATUS
IS WRK-FS-SAIDA.
*----------------------------------------------------------------------------------------------*
DATA
DIVISION.
*----------------------------------------------------------------------------------------------*
FILE
SECTION.
*----------------------------------------------------------------------------------------------*
* INPUT
- LRECL = 0046
* ORG. SEQUENCIAL
*
*
*----------------------------------------------------------------------------------------------*
FD ENTRADA
01
RECORDING MODE
IS F
LABER RECORD
IS STANDARD
BLOCK CONTAINS
0 RECORDS.
REG-ENTRADA.
03 COD-PROD
PIC X(06).
03 NOME-PROD
PIC X(30).
03 QUANT-PROD
PIC 9(06)V99.
*----------------------------------------------------------------------------------------------*
* OUTPUT - ARQUIVO CONTENDO OS REGISTROS ENTRADA
* ORG. SEQUENCIAL
- LRECL = 0052
*
*
*----------------------------------------------------------------------------------------------*
FD SAIDA
RECORDING MODE
IS F
LABER RECORD
IS STANDARD
BLOCK CONTAINS
0 RECORDS.
01
REG-SAIDA.
03 COD-PROD
PIC X(06).
03 FILLER
PIC X(04).
03 NOME-PROD
PIC X(30).
03 FILLER
PIC X(04).
03 QUANT-PROD
PIC 9(06)V99.
- 47 -
*----------------------------------------------------------------------------------------------*
WORKING-STORAGE
SECTION.
*----------------------------------------------------------------------------------------------*
77
FILLER
PIC X(32)
VALUE
WRK-FS-ENTRADA
PIC X(02)
VALUE SPACES.
77
WRK-FS-SAIDA
PIC X(02)
VALUE SPACES.
77
WRK-COD-ANT
PIC X(06)
VALUE SPACES.
77
WRK-QUANT-PROD
PIC 9(06)V99
VALUE ZEROS.
77
WRK-NOME-ANT
PIC X(30)
VALUE SPACES.
77
FILLER
PIC X(32)
VALUE
- 48 -
*----------------------------------------------------------------------------------------------*
PROCEDURE
DIVISION.
*----------------------------------------------------------------------------------------------*
*----------------------------------------------------------------------------------------------*
0000-ROTINA-PRINCIPAL
SECTION.
*----------------------------------------------------------------------------------------------*
PERFORM 1000-INICIALIZAR.
PERFORM 2000-TRATAR-ARQ-VAZIO.
PERFORM 3000-PROCESSAR-REG UNTIL WRK-FS-ENTRADA EQUAL 10.
PERFORM 3100-GRAVAR-REG-SAIDA.
PERFORM 5000-FINALIZAR.
*----------------------------------------------------------------------------------------------*
0000-99-FIM.
EXIT.
*----------------------------------------------------------------------------------------------*
1000-INICIALIZAR
SECTION.
*----------------------------------------------------------------------------------------------*
OPEN INPUT
ENTRADA
OUTPUT SAIDA.
PERFORM 1100-TRATAR-FS-ENTRADA.
PERFORM 1200-TRATAR-FS-SAIDA.
*----------------------------------------------------------------------------------------------*
1000-99-FIM.
EXIT.
*----------------------------------------------------------------------------------------------*
*----------------------------------------------------------------------------------------------*
2000-TRATAR-ARQ-VAZIO
SECTION.
*----------------------------------------------------------------------------------------------*
PERFORM 2100-LER-ARQ-ENTRADA.
IF
WRK-FS-ENTRADA
EQUAL 10
DISPLAY *
PROCESSAMENTO ENCERRADO
DISPLAY *
- 49 -
*----------------------------------------------------------------------------------------------*
2000-99-FIM.
EXIT.
*----------------------------------------------------------------------------------------------*
*----------------------------------------------------------------------------------------------*
2100-LER-ARQ-ENTRADA
SECTION.
*----------------------------------------------------------------------------------------------*
READ ENTRADA.
IF
WRK-FS-ENTRADA
EQUAL 10
GO
TO 2100-99-FIM
END-IF.
MOVE COD-PROD OF REG-ENTRADA
TO WRK-COD-ANT.
MOVE NOME OF REG-ENTRADA TO WRK-NOME-ANT.
PERFORM 1100-TRATAR-FS-ENTRADA.
*----------------------------------------------------------------------------------------------*
2100-99-FIM.
EXIT.
*----------------------------------------------------------------------------------------------*
*----------------------------------------------------------------------------------------------*
3000-PROCESSAR-REG
SECTION.
*----------------------------------------------------------------------------------------------*
IF
COD-PROD OF REG-ENTRADA
NOT EQUAL WRK-COD-ANT
PERFORM 3100-GRAVAR-REG-SAIDA
MOVE ZEROS
TO WRK-QUANT-PROD
END-IF.
ADD QUANT-PROD OF REG-ENTRADA
TO WRK-QUANT-PROD.
PERFORM 2100-LER-ARQ-ENTRADA.
- 50 -
*----------------------------------------------------------------------------------------------*
3000-99-FIM.
EXIT.
*----------------------------------------------------------------------------------------------*
*----------------------------------------------------------------------------------------------*
3100-GRAVAR-REG-SAIDA
SECTION.
*----------------------------------------------------------------------------------------------*
MOVE SPACES
TO REG-SAIDA.
MOVE WRK-COD-ANT
TO COD-PROD OF REG-SAIDA.
MOVE WRK-NOME-ANT
TO NOME-PROD OF REG-SAIDA.
MOVE WRK-QUANT-PROD
TO QUANT-PROD OF REG-SAIDA.
WRITE REG-SAIDA.
PERFORM 1200-TRATAR-FS-SAIDA.
*----------------------------------------------------------------------------------------------*
3100-99-FIM.
EXIT.
*----------------------------------------------------------------------------------------------*
*----------------------------------------------------------------------------------------------*
4000-FINALIZAR
SECTION.
*----------------------------------------------------------------------------------------------*
CLOSE ENTRADA
SAIDA.
PERFORM 1100-TRATAR-FS-ENTRADA.
PERFORM 1200-TRATAR-FS-SAIDA.
STOP RUN.
*----------------------------------------------------------------------------------------------*
4000-99-FIM.
EXIT.
*----------------------------------------------------------------------------------------------*
- 51 -
WRK-VAR-1
PIC S9999.
Bits na memria
1100 0001
1111 0101
Valor decimal
191
245
Valor hexadecimal
C1
F5
Acontece porm que o computador no foi projetado para fazer clculos com este
formato. Ele usa o valor binrio puro dos bits para clculos, onde cada bit da direita para a
esquerda tem o valor da potncia de 2 correspondentes, como no esquema:
Bits
Valor
8
128
7
64
5
32
4
8
3
4
2
2
1
1
- 52 -
clculo, converter todas as variveis do formato EBCDIC para binrio, fazer o clculo, e
converter o resultado do formato binrio para EBCDIC, e devolver o resultado convertido
para a memria.
Os inconvenientes de trabalhar com variveis numricas em EBCDIC so:
- 53 -
DE
S9(1)COMP
S9(5)COMP
S9(10)COMP
ATE
S9(4) COMP
S9(9) COMP
S9(18)COMP
BYTES
2
4
8
VALORES
-32768 a + 32768
-2.147.483.648 a + 2.147.483.648
valores com ate 18 algarismos
8
8
7
4
6
2
5
1
4
8
3
4
2
2
1
1
Valor
hexa
A
B
C
Sinal
0
1
0
Valor
decimal
10
11
12
1
1
1
0
0
1
1
0
0
1
1
1
1
1
1
0
1
1
1
0
1
13
14
15
D
E
F
+
+
+
+
1111
Hexa
F2 F4 F5
00 F5
24 5C
- 54 -
PIC 9(8)V99.
03 TOTAL-02
PIC 9(8)V99.
03 TOTAL-12
PIC 9(8)V99.
PROCEDURE DIVISION.
IF MS = 01
ADD VENDAS TO TOTAL-01
ELSE IF MS = 02
ADD VENDAS TO TOTAL-02
ELSE ......
ELSE IF MS = 12
ADD VENDAS TO TOTAL-12.
A linguagem Cobol possui um recurso para resolver este problema. Na DATA
DIVISION a varivel ser definida somente uma vez, acompanhada da clusula OCCURS
que definir quantas vezes a varivel deve ser repetida. A sintaxe da definio do item com
OCCURS :
Nvel
varivel
n TIMES.
PIC 9(8)V99
OCCURS 12 TIMES.
- 55 -
Quando uma varivel de uma tabela (definida com OCCURS) for usada na
PROCEDURE DIVISION, ela precisa ser acompanhada de um indexador (subscrito) que
definir qual ocorrncia da tabela est sendo referido. Este subscrito deve estar dentro de
parnteses e pode ser um literal numrico ou uma varivel numrica com valores inteiros.
Por ex.:
ADD VENDAS
TO TOTAL-MENSAL(5).
PIC 9(8)V99
OCCURS 12 TIMES.
PROCEDURE DIVISION.
............
ADD VENDAS TO TOTAL-MENSAL (MS-VENDA).
6.4.1 NVEIS DAS TABELAS
Em Cobol podemos definir uma entrada de uma tabela como uma nova tabela, e
assim sucessivamente at um nvel 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 ms
de venda, montaremos a DATA DIVISION como abaixo:
DATA DIVISION.
01 TOTAIS-VENDA.
03 VENDAS-ESTADO
05
OCCURS 27 TIMES.
VENDAS-PRODUTO
07
VENDAS-MS
OCCURS 5 TIMES.
PIC 9(8)V99 OCCURS 12 TIMES.
Este cdigo montar na memria uma tabela com 3 nveis de 1620 totais (27
estados X 5 produtos X 12 meses). Para acessar um total desta tabela ser necessrio um
conjunto de 3 subscritores:
- 56 -
PROCEDURE DIVISION.
............
ADD VENDAS TO VENDAS-MS (COD-ESTADO, COD-PRODUTO, MS-VENDA).
Os subscritos dentro do parnteses devem estar na mesma seqncia da definio
das tabelas (mesma hierarquia).
- 57 -
7. IMPRESSO
O Cobol trata a impresso de relatrios de maneira similar gravao de arquivos,
ou seja, enviar uma linha de relatrio para a impressora idntico a gravar um registro em
um arquivo. Por isso precisamos definir o relatrio na INPUT-OUTPUT SECTION
(ENVIRONMENT DIVISION) com a instruo SELECT, precisamos definir o contedo das
linhas de impresso na FILE SECTION (DATA DIVISION) com a instruo FD, e na
PROCEDURE DIVISION devemos usar as instrues OPEN, WRITE e CLOSE para
controlar a impresso.
No entanto, obviamente existem diferenas entre um arquivo e um relatrio, e os
seguintes detalhes devem ser observados em um programa:
comum haver totalizaes em vrios nveis (sub-totais, totais gerais etc.). Estes
totais so emitidos quando muda a identificao de grupo dentro dos registros lidos.
Por exemplo, em um relatrio de vendas com totais por ms o programa deve
comparar o ms do registro lido com o ms do registro anterior para verificar se so
diferentes. Nestas mudanas de identificador de grupo (geralmente conhecido como
QUEBRA), o programa deve emitir uma linha de total, e acertar convenientemente
as variveis de totalizao.
- 58 -
IS OMITTED
RECORDING MODE IS F
BLOCK CONTAINS
0 RECORDS.
01 REG-RELATORIO.
03
02
CARRO
FILLER
PROCEDURE
WRITE RELATORIO
PIC X(01).
PIC X(132) VALUE SPACES.
DIVISION
FROM CABEC1 AFTER POSITIONING CARRO .
- 59 -
Abaixo encontra-se o valores possveis que podem ser atribudos ao salto do CARRO:
Branco
Espacejamento simples
Zero
Espacejamento duplo
Menos
-
Mais
+
1 a 9
A, B, C
Espacejamento triplo
Supresso do espacejamento
Salto do canal 1 a 9
Salto do canal 10, 11 e 12
- 60 -
Exemplo:
01
CAMPO
Definio
PIC --.---.---,99.
Picture
Valor Real
Na memria
9(04)
9999
502
502
9V9(2)
9V99
1,25
125
9(03)
999PP
43700
437
S9(02)
S99
-21
21-
9(05)
99.999
10.987
10987
9(04)V99
Z.ZZZ,99
25,50
002550
9(03)
ZZZ
9(03)
**9
9(03)
***
S9(03)V99
999,99CR
800,00CR
9(04)
990099
110025
1125
9(06)
99B99B99
12 13 15
121315
9(03)
$999
$371
371
000
422
422
***
000
80000(-)
S9(02)
-99
-15
15(-)
S9(02)
-99
16
16
S9(02)
+99
15
15(-)
S9(02)
+99
+16
16(+)
S9(02)
99-
15-
15(-)
S9(04)
-.--9
-12
0012(-)
OBS: caso tenha que utilizar o caracter , para se fazer entendido ao Cobol, define-se dentro
das aspas duplas.
Exemplo:
77 ASPA
PIC X(01)
VALUE .
A clusula PICTURE (ou PIC) tem alguns formatos prprios para fazer edio de
variveis numricas no momento de uma impresso.
- 61 -
Observao: Mscaras de edio tambm podem serem usadas para mensagens exibidas na
SYSOUT / CONSOLE e na formatao de campos alfanumricos.
7.3. SUPRESSO DE ZEROS
Tomemos como exemplo a seguinte varivel definida na WORKING-STORAGE:
03 VALOR
PIC 9(5)V99
VALUE 2.
PIC ZZZZ9,99.
VALUE
2
2
2
-2
-2
-2
-2
020304
020304
IMPRESSO
R$
2,00
$2,00
r$****2,00
2,00
-2,00
2,002,00CR
02/03/04
02 03 04
- 62 -
- 63 -
8. ORDENAO DE ARQUIVOS
Os registros esto dispostos nos arquivos na ordem em que foram gravados. Por
exemplo, um arquivo de clientes pode ter sido gravado em ordem crescente de cdigo de
cliente. Para se fazer um relatrio dos clientes em ordem alfabtica de nomes, necessrio
reordenar o arquivo nesta ordem. Isto feito em Cobol usando o recurso do SORT.
Para usar o SORT necessrio definir no programa um arquivo temporrio. O SORT
grava neste arquivo os registros a serem ordenados, efetua a classificao, e devolve nele
os registros ordenados. Alem deste temporrio, define-se tambm no programa um arquivo
de entrada (arquivo original), e um arquivo de sada que receber os registros ordenados.
A definio do arquivo temporrio feito com uma instruo SELECT padro. Na
FILE SECTION porem, o pargrafo FD deve ser substitudo pos SD (Sort Description), e
na descrio do registro suficiente definir os campos envolvidos na ordenao.
Existem duas maneiras de codificar a instruo SORT na PROCEDURE DIVISION:
Na primeira (SORT Intrnseco), o processo de classificao no altera o contedo do
registro do arquivo. Na segunda, o pode se alterar o lay-out dos registros do arquivo de
sada, eliminar campos na sada e at eliminar registros na classificao (mantendo
somente os que interessarem ao relatrio de sada). Esta segunda opo pode ser usada
para se melhorar a performance, ao se utilizar registros menores.
8.1. SORT INTRNSECO
No SORT INTRINSECO, a instruo SORT tem o formato:
SORT arquivo-sd ASCENDING campo
USING arquivo-entrada
GIVING arquivo-saida.
- 64 -
necessrio
definir
paragrafos
na
PROCEDURE
DIVISION,
INPUT
Na OUTPUT PROCEDURE, o arquivo de sada deve ser aberto com OPEN OUTPUT.
Em seguida deve-se ler cada registro classificado no arquivo SD com a instruo
RETURN, mover os campos da SD para o registro de sada (FD), e gravar o arquivo
de sada (WRITE). Repetir as leituras da SD e gravao da sada at o fim do
arquivo de SORT, e finalmente fechar o arquivo de sada.
PROCEDURE pargrafo-1
LISTACLI.
TCS.
*
ENVIRONMENT DIVISION.
- 65 -
CONFIGURATION SECTION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CLIENTES ASSIGN TO
DA-S-CLIENTES.
DA-S-RELAT.
*
DATA DIVISION.
FILE SECTION.
FD CLIENTES.
01 REG-CLIENTES.
10 CLIENTES-CODIGO
PIC 9(006).
10 CLIENTES-NOME
PIC X(050).
10 CLIENTES-DATA-NASC.
20 CLIENTES-DATA-NASC-ANO
PIC 9(004).
20 CLIENTES-DATA-NASC-MS
PIC 9(002).
20 CLIENTES-DATA-NASC-DIA
PIC 9(002).
10 CLIENTES-TELEFONE
PIC X(030).
10 CLIENTES-ENDERECO
PIC X(050).
10 CLIENTES-BAIRRO
PIC X(030).
10 CLIENTES-CIDADE
PIC X(030).
10 CLIENTES-ESTADO
PIC X(002).
10 CLIENTES-CEP
PIC 9(008).
10 CLIENTES-E-MAIL
PIC X(050).
SD ORD-CLIENTES.
01 SORT-REG-CLIENTES.
10 SORT-CLIENTES-CODIGO
PIC 9(006).
10 SORT-CLIENTES-NOME
PIC X(050).
10 SORT-CLIENTES-E-MAIL
PIC X(050).
FD RELAT.
01 REG-RELAT
PIC X(106).
- 66 -
WORKING-STORAGE SECTION.
*
PROCEDURE DIVISION.
INICIO.
SORT ORD-CLIENTES ASCENDING SORT-CLIENTES-NOME
INPUT PROCEDURE SORTIN-CLIENTES THRU EXIT-SORTIN-CLIENTES
OUTPUT PROCEDURE SORTOUT-CLIENTES
THRU EXIT-SORTOUT-CLIENTES
STOP RUN
*
SORTIN-CLIENTES.
OPEN INPUT CLIENTES.
LOOP-CLIENTES.
READ CLIENTES
AT END GO TO FIM-CLIENTES.
MOVE CLIENTES-CODIGO TO SORT-CLIENTES-CODIGO
MOVE CLIENTES-NOME TO SORT-CLIENTES-NOME
MOVE CLIENTES-E-MAIL TO SORT-CLIENTES-E-MAIL
RELEASE SORT-REG-CLIENTES
GO TO LOOP-CLIENTES.
FIM-CLIENTES.
CLOSE CLIENTES.
EXIT-SORTIN-CLIENTES.
EXIT.
SORTOUT-CLIENTES.
OPEN OUTPUT RELAT.
LOOP-SORTOUT.
RETURN ORD-CLIENTES
AT END GO TO FIM-SORTOUT.
WRITE REG-RELAT FROM SORT-REG-CLIENTES.
GO TO LOOP-SORTOUT.
FIM-SORTOUT.
CLOSE RELAT.
EXIT-SORTOUT-CLIENTES.
EXIT.
- 67 -
- 68 -
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
..
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT [OPTIONAL] nome-arquivo ASSIGN TO nome-externo
ORGANIZATION IS tipo-de-organizao
ACCESS MODE IS tipo-de acesso
RECORD KEY IS key-principal
ALTERNATE KEY IS key-alternada [WITH DUPLICATES]
FILE STATUS IS campo-status.
A clausula OPTIONAL ja foi descrita no SELECT para arquivos sequenciais.
Os detalhes do comando, mostrados em letras minsculas so explicados abaixo:
Tipo-de-organizao:
Tipo-de-acesso:
o
- 69 -
seguintes
clusulas
so
opcionais
no
SELECT:
ACCESS
MODE
ALTERNATE KEY.
9.1.2. FILE-STATUS
com
caracteres
definidos
na
WORKING-STORAGE
SECTION
- 70 -
- 71 -
WORK-COD
STATUS-CLIENTE
PIC .
PIC XX.
.....................
PROCEDURE DIVISION.
...........................
ACCEPT WORK-COD
MOVE WORK-COD TO COD-CLIENTE.
READ ARQ-CLIENTE
IF STATUS-CLIENTE = 10
MOVE CLIENTE NO EXISTE TO MENSAGEM
GO TO FIM-PROGRA.
9.1.6. READ NEXT - VSAM
Comando READ/NEXT:
READ arquivo NEXT.
Este comando l o prximo registro do arquivo na seqncia de chaves. Uma
seqncia de comandos READ NEXT retorna uma coleo de registros ordenada por uma
chave. Esta seqncia de READ NEXT deve ser precedida de um comando START que
especifica a chave usada nas leituras e o valor do inicio desta chave.
9.1.7. READ PREVIOUS VSAM
Comando READ/PREVIOUS:
READ arquivo PREVIOUS.
Este comando l o registro anterior do arquivo na seqncia de chaves. Funciona de
maneira idntica ao READ NEXT, usando a ordem decrescente da chave.
- 72 -
STATUS-CLIENTE
PIC XX.
.....................
PROCEDURE DIVISION.
...........................
MOVE JOSE TO NOME-CLIENTE.
START ARQ-CLIENTE KEY NOT LESS NOME-CLIENTE
IF STATUS-CLIENTE = 23
MOVE NO EXISTEM CLIENTES PARA ESTA CONDICAO.
GO TO FIM-PROGRA.
- 73 -
LOOP-LEITURA.
READ ARQ-CLIENTE NEXT
IF STATUS-CLIENTE = 10
GO TO FIM-PROGRA.
MOVE REG-CLIENTE TO REG-SAIDA
GO TO LOOP-LEITURA.
9.1.9. WRITE - VSAM
Comando WRITE:
WRITE record-name.
Este comando cria um registro novo no arquivo, com o contedo de record-name.
Record-name a varivel de nvel 01 definida na FD do arquivo a atualizar. O VSAM
examina o campo RECORD KEY dentro do record-name, e coloca o registro criado dentro
do arquivo na posio correta para manter a ordem crescente da RECORD KEY. Se o valor
da RECORD KEY do registro a gravar j existir no arquivo, o registro no ser includo e o
status 22 ser retornado.
9.1.10. REWRITE - VSAM
Comando REWRITE:
REWRITE record-name.
Este comando regrava o registro de chave igual a RECORD KEY no arquivo, com o
contedo de record-name. O VSAM examina o campo RECORD KEY dentro do
record-name, pesquisa o registro contendo esta RECORD KEY e o regrava com o contedo
de record-name.
O comando REWRITE s pode ser usado depois de um comando READ que leia o
registro a atualizar para a mamoria (portanto usando a RECORD KEY deste registro).
- 74 -
- 75 -
ASSIGN TO DA-S-SAIDA.
PIC 9(6).
03 DIGITO-CLIENTE PIC 9.
03 COD-PROD
PIC X(6).
03 QUANT-PROD
PIC 9(6).
- 76 -
FD MATERIAIS.
01 REG-MATERIAIS.
03 COD-MATER
PIC X(6).
03 NOME-PROD
PIC X(30).
03 ESTOQUE
PIC 9(8).
*
WORKING-STORAGE SECTION.
77 STATUS-MATER
PIC XX.
77 SUBROTINA
01 AREA-SENHA.
05 WCOD-CLIENTE
PIC 9(6).
05 WDIGITO-CLIENTE PIC 9.
05 WRETORNO
PIC 9.
*
PROCEDURE DIVISION.
INICIO.
OPEN INPUT SAIDA.
OPEN I-O
MATERIAIS.
IF STATUS-MATER NOT = 00
DISPLAY ERRO STATUS-MATER NO OPEN DO MATERIAL.
STOP RUN.
LEITURAS.
READ SAIDA
AT END GO TO FINAL.
MOVE COD-CLIENTE TO WCOD-CLIENTE
MOVE DIGITO-CLIENTE TO WDIGITO-CLIENTE.
CALL CALCSENHA USING AREA-SENHA.
IF WRETORNO NOT = ZERO
DISPLAY WCOD-CLIENTE WDIGITO-CLIENTE SENHA INVALIDA.
GO TO LEITURAS.
MOVE COD-PROD TO COD-MATER
- 77 -
READ MATERIAIS
IF STATUS-MATER = 23
DISPLAY WCOD-CLIENTE COD-MATER MATERIAL NO EXISTE.
GO TO LEITURAS.
IF QUANT-PROD > ESTOQUE
DISPLAY WCOD-CLIENTE COD-MATER QUANT-PROD
SEM ESTOQUE.
GO TO LEITURAS.
SUBTRACT QUANT-PROD FROM ESTOQUE.
REWRITE REG-MATERIAIS.
IF STATUS-MATER NOT = 00
DISPLAY ERRO STATUS-MATER NO REWRITE..
GO TO LEITURAS.
FINAL.
CLOSE SAIDA MATERAIS.
STOP RUN.
Programa CALCSENH.
IDENTIFICATION DIVISION.
PROGRAM-ID. CALCSENH.
*
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*
DATA DIVISION.
FILE SECTION.
*
WORKING-STORAGE SECTION.
77 WTRAB
PIC 9(6).
- 78 -
LINKAGE SECTION.
01 LINK-SENHA.
05 LCOD-CLIENTE
PIC 9(6).
05 LDIGITO-CLIENTE PIC 9.
05 LRETORNO
PIC 9.
*
PROCEDURE DIVISION USING LINK-SENHA.
INICIO.
MOVE 0 TO LRETORNO.
DIVIDE 9 INTO LCOD-CLIENTE GIVING WTRAB REMAINDER LRETORNO.
GOBACK.
Explicaes sobre os programas acima:
- O programa SAIDAMAT invoca o programa CALCSENH com a instruo:
CALL CALCSENH USING AREA-SENHA.
- A clusula USING AREA-SENHA da instruo acima indica que toda a informao da rea
AREA-SENHA deve ser passada para o programa CALCSENH.
- O programa CALCSENH deve ter na DATA DIVISION a LINKAGE SECTION. Nesta
SECTION devem ser descritos os dados recebidos pelo programa, ou seja, os campos da
LINKAGE SECTION do CALCSENH representam os campos AREA-SENHA passados pelo
CALL do SAIDAMAT.
- A LINKAGE SECTION funciona como uma janela atravez da qual o programa
CALCSENH v a rea AREA-SENHA. As alteraes feitas nos campos da LINKAGE
SECTION so na realidade executados sobre a AREA-SENHA.
- Na PROCEDURE DIVISION do programa CALC-SENHA precisa ter a clusula USING
para especificar que os dados recebidos do programa chamador esto em LINK-SENHA.
- O programa chamado (CALCSENH) no pode terminar com a instruo STOP RUN, que
somente deve ser usada no termino geral do JOB. A instruo GOBACK deve ser usada
para parar o programa chamado e continuar a execuo do programa chamador.
- 79 -
Observaes:
1 - Pode-se enviar mais de um nvel 01 de grupos ou varivel
pela parmetro
USING, porm, necessrio que a Linkage do programa chamado deve estar na mesma
sequncia;
2 O comando CALL CALCSENHA USING AREA-SENHA considerado uma
Chamada Esttica, uma vez que, o nome do programa j est mencionado no prprio
comando, porm, o comando CALL SUBROTINA USING AREA-SENHA considerada
uma Chamada Dinmaica, uma vez que, invocado uma rea do nvel 77 da Work-Storage,
onde o valor do campo SUBROTINA poder ser mudado para outros tipos de chamadas
no processamento do programa chamador no caso o Programa SAIDAS-MAT.
- 80 -
Uma varivel. Neste caso as opes WHEN devem testar valores ou faixas de
valores (usando o conector THRU) para esta varivel. Exemplo:
EVALUATE NOTA
WHEN 1 THRU 5
DISPLAY REPROVADO
WHEN 6 TO 9
DISPLAY APROVADO
WHEN 10
DISPLAY APROVADO COM LOUVOR.
- 81 -
Uma expresso. Neste caso as opes WHEN devem testar somente as constantes
executados. Exemplo:
EVALUATE TRUE
WHEN NOTA > 5
DISPLAY APROVADO
WHEN MES = 1
DISPLAY JANEIRO.
11.2. REDEFINES
A clusula REDEFINES usada quando alguma informao da DATA DIVISION precisa
ser definida em dois ou mais formatos diferentes. Por exemplo, em um campo de data
podemos o formato dia/ms/ano ou ano/ms/dia:
01 DATA-DIRETA.
01
03 DIA-D
PIC 99.
03 MS-D
PIC 99.
03 ANO-D
PIC 99.
PIC 99.
03 MS-I
PIC 99.
03 DIA-I
PIC 99.
- 82 -
PIC 9(6).
03 FILLER
PIC X(4).
PIC 9(8).
03 FILLER
PIC XX.
11.3. INSPECT
A instruo INSPECT varre um campo alfa-numrico contando caracteres ou fazendo
substituies de certos caracteres por outros. A sintaxe para fazer substituio :
INSPECT campo REPLACING condicao-1 var-1 BY var-2.
ou
INSPECT campo REPLACING CARACTERS BY var-2.
Condio-1 pode ser uma das seguintes palavras:
ALL - Todos os caracteres iguais a var-1 serao substituidos por var-2.
LEADING Todos os caracteres iguais a var-1 que estiverem no inicio do campo serao
substituidos por var-2. O primeiro caracter diferente de var-1 interrompe a substituicao.
FIRST O primeiro caracter igual a var-1 sera substituido por var-2. Esta condicao
provoca somente uma substituicao.
O uso da opo CARACTERS faz com que todos os caracteres do campo sejam substitudos
por var-2.
Os formatos acima podem ser ampliados pela clausula AFTER/BEFORE como segue:
INSPECT campo REPLACING condicao-1 var-1 BY var-2 condio-2 var-3.
ou
INSPECT campo REPLACING CARACTERS BY var-2 condio-2 var-3.
- 83 -
campo-2
JOSE
SILVA
campo-n
Aps o STRING:
Campo-1
campo-2
JOSE
SILVA
campo-n
JOSESILVA
- 84 -
VAR-2
RESP
SILVA
Aps o STRING:
VAR-1
JOSE
VAR-2
RESP
SILVA
JOSIL
A funo de WITH POINTER, tambm opcional, indicar a posio do campo receptor que
comea a receber os dados. Assim no exemplo:
STRING VAR-1 DELIMITED BY S
VAR-2 DELIMITED BY V
INTO RESP
WITH POINTER DESLOC.
Antes do STRING:
VAR-1
JOSE
VAR-2
DESLOC
SILVA
VAR-2
DESLOC
SILVA
RESP
XXXXXXX
Aps o STRING:
VAR-1
JOSE
RESP
XXJOSIL
11.5. UNSTRING
A funo do comando UNSTRING inversa do comando STRING, isto , ele quebra
o contedo de um campo emissor em varia partes movendo os resultados para vrios
campos. O formato deste comando :
UNSTRING campo
[DELIMITED BY [ALL] delim [OR [ALL] delim.
- 85 -
INTO var-1
[DELIMITER IN var-d]
[COUNT IN count]
Var-2
........
[WITH POINTER pointer]
[TALLYING IN var-t]
Usando esta sintaxe, os dados so extrados da varivel campo e colocados em var-1, var2, var-3 ... e assim sucessivamente. Veja o exemplo:
77 VAR-1
PIC XX.
77 VAR-2
PIC X(4).
77 CAMPO
PIC X(6)
VALUE 123456.
PROCEDURE DIVISION.
UNSTRING CAMPO INTO VAR-1 VAR-2.
Apos o comando:
CAMPO
VAR-1
123456
VAR-2
12
3456
PIC XX.
77 VAR-2
PIC X(4).
77 CAMPO
PIC X(6)
PROCEDURE DIVISION.
UNSTRING CAMPO DELIMITED BY SPACES
INTO VAR-1 VAR-2.
Aps o comando:
CAMPO
JOAO SILVA
VAR-1
JOAO
VAR-2
SILVA
- 86 -
- 87 -
Exemplo:
02 VENDAS OCCURS 12 TIMES
INDEXED BY IND-VENDAS
ASCENDING KEY MES-VENDA.
03 MES-VENDA
PIC 99.
03 VALOR-VENDA
PIC 9(6)V99.
Neste exemplo, IND-VENDAS o ndice alocado para a tabela. Este ndice no pode ser
definido na WORKING-STORAGE.
A clausula ASCENDING KEY opcional e serve para declarar que a tabela ordenada pela
varivel
MS-VENDA.
Tambm
podemos
declarar
tabelas
ordenadas
em
ordem
11.6.2. SEARCH
A intruo SEARCH usada para pesquisas em tabelas indexadas. Existem 2 opes
de pesquisa com SEARCH: pesquisa seqencial e pesquisa binria.
11.6.2.1. PESQUISA SEQUENCIAL
- 88 -
- 89 -
Na pesquisa binria a tabela deve ser definida com a clausula KEY, que definir a
chave que ser usada na pesquisa.
- 90 -
PARAGR-1.
GO TO PARAGR-2.
...............
ALTER PARAGR-1 TO PROCEED TO PARAGR-3
...............
PARAGR-2.
...............
PARAGR-3.
Neste exemplo, se o programa passar alguma vez pela instruo ALTER, a instruo GO TO
que aparece no PARAGR-1 funcionar como se estivesse sido escrito:
GO TO PARAGR-3.
11.8. GO TO DEPENDING ON
O comando GO TO pode apontar para varios paragrafos quando usado com a
clausula DEPENDING ON. Para isto necessario ter um campo para servir como
indexador, e o desvio ser feito para o paragrafo cuja sequencia for igual ao valor do
indexador. Por exemplo:
GO TO PARAGR-1 PARAGR-2 PARAGR-3 DEPENDING ON CONTADOR.
O desvio ser feito para PARAGR-1, PARAGR-2 PARAGR-3 se o valor de
CONTADOR for respectivamente 1, 2 ou 3. Qualquer outro valor de CONTADOR no
provoca desvio do GO TO.
11.9. NOMES CONDICIONAIS
Nomes condicionais (CONDITION NAMES) so recursos para atribuir nomes
alternativos para variveis quando elas recebem determinados valores. Para esta atribuio,
usado o nivel 88 da DATA DIVISION, como no exemplo:
- 91 -
77 ESTADO-CIVIL
PIC 9.
88
SOLTEIRO
VALUE 1.
88
CASADO
VALUE 2.
88
DESQUITADO
VALUE 3.
CASADOS.
ou
IF SOLTEIRO
DISPLAY
CASADOS.
Os nomes condicionais s podem ser usados em variveis de nvel elementar (que
tenham a clusula PIC).
11.10. COPY
O comando copy usado para copiar trechos de programa fonte que esto
armazenados em bibliotecas (BOOKS) para dentro dos programas Cobol. Estes trechos de
programa podem conter descries 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:
COPY nome-do-book.
- 92 -
Carto Perfurado
Deciso
Arquivo VSAM
Arquivo Sequencial
Fita Magntica
Banco de Dados
Manuseio de arquivos
- 93 -
Relatrios
Conector