Sunteți pe pagina 1din 188

COBOL

Introduo

SUMRIO
1 O QUE A LINGUAGEM COBOL......................................................................................7
2 ESTRUTURA DE UM PROGRAMA COBOL.......................................................................7
2.1 Estrutura bsica...............................................................................................................................................................7
2.2 Estrutura detalhada.........................................................................................................................................................8
2.3 Exemplos de programas simples ....................................................................................................................................9

3 STATEMENTS ...................................................................................................................10
4 CONJUNTO DE CARACTERES........................................................................................10
5 PALAVRAS .......................................................................................................................11
5.1) RESERVADAS ou PRE-DEFINIDAS...........................................................................................................................11
5.2) DEFINIDAS PELO PROGRAMADOR........................................................................................................................12

6 - VARIAVEIS E CONSTANTES............................................................................................13
6.1) Declarao.........................................................................................................................................................................13
Nmero de nvel ...................................................................................................................................................................13
Registro.................................................................................................................................................................................14
Nvel 01.................................................................................................................................................................................14
Cod Cliente............................................................................................................................................................................14
Nome.....................................................................................................................................................................................14
Data Nascimento...................................................................................................................................................................14
Local Nasc.............................................................................................................................................................................14
Nvel 02.................................................................................................................................................................................14
Dia.........................................................................................................................................................................................14
Mes........................................................................................................................................................................................14
Ano........................................................................................................................................................................................14
UF..........................................................................................................................................................................................14
Cidade....................................................................................................................................................................................14
Nvel 03.................................................................................................................................................................................14
Registro.................................................................................................................................................................................14
Nvel 01.................................................................................................................................................................................14
Cod Cliente............................................................................................................................................................................14
Nome.....................................................................................................................................................................................14
Data Nascimento...................................................................................................................................................................14
Local Nasc.............................................................................................................................................................................14
3

Nvel 05.................................................................................................................................................................................14
Dia.........................................................................................................................................................................................14
Mes........................................................................................................................................................................................14
Ano........................................................................................................................................................................................14
UF..........................................................................................................................................................................................14
Cidade....................................................................................................................................................................................14
Nvel 10.................................................................................................................................................................................14
Nome : ..................................................................................................................................................................................16
Redefines ..............................................................................................................................................................................17
Picture ..................................................................................................................................................................................19
Usage ....................................................................................................................................................................................22
(ocorrncias) .........................................................................................................................................................................26
Value ...................................................................................................................................................................................26

7 - IDENTIFICATION DIVISION...............................................................................................27
8 - ENVIRONMENT DIVISION.................................................................................................28
8.1) CONFIGURATION SECTION......................................................................................................................................28
8.2) INPUT-OUTPUT SECTION..........................................................................................................................................29
FILE-CONTROL..................................................................................................................................................................29
I-O-CONTROL.....................................................................................................................................................................29

9 - DATA DIVISION..................................................................................................................30
FILE SECTION.......................................................................................................................................................................30
WORKING-STORAGE SECTION......................................................................................................................................30
LINKAGE SECTION.............................................................................................................................................................30

10 - PROCEDURE DIVISION...................................................................................................31
10-1) OBSERVACOES GERAIS...........................................................................................................................................31
10-1-1) Continuao de comandos........................................................................................................................................31
10-1-2) Expresses................................................................................................................................................................31
10-1-3) Referncia explcita a sub-strings.............................................................................................................................32
10-1-4) Referncia a variveis com OCCURS......................................................................................................................32
10-1-5) Referncia a sub-strings e ndices............................................................................................................................32
10-1-6) Acesso ao PARM.....................................................................................................................................................33
10-1-7) Referncia ao tamanho de uma varivel...................................................................................................................33
10-1-8) Data e hora de execuo ..........................................................................................................................................34
10-2) Comandos executveis...................................................................................................................................................35
Clusulas de comandos Aritmticos .....................................................................................................................................35
ON SIZE ERROR.........................................................................................................................................................35
ROUNDED...................................................................................................................................................................36
GIVING.........................................................................................................................................................................36
4

Tabela de comandos ............................................................................................................................................................37


ACCEPT........................................................................................................................................................................37
ADD..............................................................................................................................................................................37
CALL.............................................................................................................................................................................37
CLOSE..........................................................................................................................................................................38
COMPUTE....................................................................................................................................................................39
CONTINUE...................................................................................................................................................................39
DELETE........................................................................................................................................................................39
DISPLAY......................................................................................................................................................................40
DIVIDE.........................................................................................................................................................................40
EVALUATE..................................................................................................................................................................40
EXIT..............................................................................................................................................................................40
GO TO...........................................................................................................................................................................41
GOBACK......................................................................................................................................................................41
IF...................................................................................................................................................................................41
INITIALIZE..................................................................................................................................................................42
INSPECT.......................................................................................................................................................................43
MOVE...........................................................................................................................................................................44
MULTIPLY...................................................................................................................................................................45
NEXT SENTENCE.......................................................................................................................................................45
OPEN.............................................................................................................................................................................46
PERFORM....................................................................................................................................................................46
READ............................................................................................................................................................................48
REWRITE.....................................................................................................................................................................48
SEARCH.......................................................................................................................................................................49
SET................................................................................................................................................................................50
START..........................................................................................................................................................................50
STOP RUN....................................................................................................................................................................50
STRING.........................................................................................................................................................................51
SUBTRACT..................................................................................................................................................................52
UNSTRING...................................................................................................................................................................52
WRITE..........................................................................................................................................................................53
Tabela de funcionamento do MOVE.....................................................................................................................................55
Exemplos de MOVEs com constantes figurativas...............................................................................................................56

11 - RELATRIOS...................................................................................................................57
Conceitos gerais :..................................................................................................................................................................57
Exemplo :..............................................................................................................................................................................59

12 SUB-ROTINAS.................................................................................................................63
13 ARQUIVOS VSAM KSDS................................................................................................69
13.1 Conceitos .........................................................................................................................................................................69
File Status :............................................................................................................................................................................69
Record Key ou Alternate Record Key :.................................................................................................................................69
Operaes possveis :............................................................................................................................................................69
Para alocar um VSAM :........................................................................................................................................................70
DD para VSAM.....................................................................................................................................................................71
5

13.2 Detalhes de algumas operaes possveis......................................................................................................................72


13.2.1 Incluir registros (em arquivo vazio) ..........................................................................................................................75
13.2.2 Incluir registros (em arquivo no vazio)....................................................................................................................84
13.2.3 Re-gravar registro (atualizao in-place) por chave primria ...................................................................................90
13.1.4 Re-gravar registro (atualizao in-place) por chave alternada 1 ...............................................................................97
13.1.5 Re-gravar registro (atualizao in-place) por chave alternada 2..............................................................................104
13.1.6 Ler sequencialmente por chave primria..................................................................................................................111
13.1.7 Ler sequencialmente por chave alternada 1.............................................................................................................115
13.1.8 Ler sequencialmente por chave alternada 2.............................................................................................................119
13.1.9 Ler sequencialmente faixa de registros por chave primria.....................................................................................123
13.1.10 Ler sequencialmente faixa de registros por chave alternada 1...............................................................................128
13.1.11 Ler sequencialmente faixa de registros por chave alternada 2...............................................................................133
13.1.12 Ler diretamente por chave primria.......................................................................................................................138
13.1.13 Ler diretamente por chave alternada 1...................................................................................................................141
13.1.14 Ler diretamente por chave alternada 2...................................................................................................................144
13.1.15 Deletar por chave primria.....................................................................................................................................148
13.1.16 Deletar por chave alternada 1.................................................................................................................................154
13.1.17 Deletar por chave alternada 2.................................................................................................................................160
13.3 File Status retornados pelas operaes em arquivos VSAM.....................................................................................166

APNDICES...........................................................................................................................172
APNDICE A - RELAO DE PALAVRAS RESERVADAS.......................................................................................172
APNDICE B Abends 0Cx................................................................................................................................................175
APNDICE C - Grace Murray Hopper - Creator of COBOL ........................................................................................177
APNDICE D First Computer BUG................................................................................................................................178
APNDICE E - Embedded commands (exemplos para SQL)......................................................................................179
APNDICE F Comparao dos tipos de variveis C/C++ e Cobol...............................................................................183
APNDICE G Indentao.................................................................................................................................................184
APNDICE G Pontos........................................................................................................................................................186
Guidelines for Procedure Design.........................................................................................................................................187

1 O que a linguagem Cobol

Nasceu no fim da dcada de 50


Orientada para aplicaes comerciais (ao contrario do FORTRAN, nascido mais ou menos na
mesma poca, para aplicaes cientificas)
COmmon Business Oriented Language
Tentou ser padro; apesar disso, evoluiu apresentando diferenas entre as diversas implementaes
dos compiladores
Tipos de COBOL: COBOL ANSI-74, COBOL 68, COBOL 74, COBOL 80,
COBOL ANSI 85, COBOL CODASYL, VISUAL COBOL

2 Estrutura de um programa Cobol


2.1 Estrutura bsica
*******************************************************
Identificao
IDENTIFICATION DIVISION.

bsica do programa

*******************************************************
ENVIRONMENT DIVISION.
*------------------------------------------------CONFIGURATION SECTION.
*-------------------------------------------------Informaes sobre o equipamento
INPUT-OUTPUT SECTION.
e sobre os arquivos utilizados
*-----------------------------------FILE-CONTROL.
*-----------------------------------I-O-CONTROL.
********************************************************
DATA DIVISION.
*------------------------------------------------FILE SECTION.
*------------------------------------------------WORKING-STORAGE SECTION.
Declarao das variveis
*------------------------------------------------LINKAGE SECTION.
*------------------------------------------------COMMUNICATION SECTION.
*------------------------------------------------REPORT SECTION.
*******************************************************
PROCEDURE DIVISION.

Declarao dos procedimentos

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

2.2 Estrutura detalhada


IDENTIFICATION DIVISION.
PROGRAM-ID.
nome do programa.
AUTHOR.
nome do programador.
DATE-WRITTEN.
data de codificao.
DATE-COMPILED.
data de compilao.
SECURITY.
comentrios.
REMARKS.
comentrios.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER.
...
OBJECT-COMPUTER.
...
SPECIAL-NAMES.
Cnn IS nome_usuario
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT arquivo ...
I-O CONTROL.
RERUN ... SAME... APPLY ... MULTIPLE...
DATA DIVISION.
FILE SECTION.
FD arquivo ...
01 area_fd ...
WORKING-STORAGE SECTION.
77 area ...
77 area ...
77 area ...
01 area ...
01 area ...
01 area ...
0n area ...
LINKAGE SECTION.
01 area ...
0n area ...
PROCEDURE DIVISION.
comandos

2.3 Exemplos de programas simples


IDENTIFICATION DIVISION.
PROGRAM-ID.
P06.
*****************************************************************
ENVIRONMENT DIVISION.
*****************************************************************
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NRO-DADO PIC 9(5) VALUE 12345.
01 QUAD-CALCULADO PIC 9(10) VALUE 0.
****************************************************************
PROCEDURE DIVISION.
INICIO.
COMPUTE QUAD-CALCULADO = NRO-DADO * NRO-DADO.
IF QUAD-CALCULADO GREATER 999999
DISPLAY "O quadrado de " NRO-DADO " E' MAIOR QUE 999999"
ELSE
DISPLAY "O quadrado de " NRO-DADO " E' " QUAD-CALCULADO.
STOP RUN.
ID DIVISION.
PROGRAM-ID.
PGM001.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
INPUT-OUTPUT SECTION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01
W-COMP
PIC 9(0018)
01
W-COMP-1
01
W-COMP-2
01
W-COMP-3
PIC 9(0018)
01
W-COMP-4
PIC 9(0018)
PROCEDURE DIVISION.
MOVE .123E03 TO W-COMP-1.
MOVE .123E03 TO W-COMP-2.
DISPLAY 'W-COMP
=' W-COMP.
DISPLAY 'W-COMP-1 =' W-COMP-1.
DISPLAY 'W-COMP-2 =' W-COMP-2.
DISPLAY 'W-COMP-3 =' W-COMP-3.
DISPLAY 'W-COMP-4 =' W-COMP-4.
STOP RUN.

COMP
COMP-1
COMP-2
COMP-3
COMP-4

VALUE
VALUE
VALUE
VALUE
VALUE

1.
.1E01.
.1E01.
1.
1.

Este programa produz a seguinte sada :


W-COMP
W-COMP-1
W-COMP-3
W-COMP-4

=0000000000000000001
= .12300000E 03
=000000000000000001
=0000000000000000001

W-COMP-2

= .12300000000000000E 03

3 Statements
72 Posies :
Posio 1 a 6 = numerao
Posio 7

= Continuao ( - )
Comentrio ( * )

Posio 8

= Margem A
Obrigatrio colocar na margem A:
- nvel 01
- FD
- nvel 77

Posio 12

= Margem B
Colocar da margem B em diante:
- tudo exceto o obrigatrio na margem A

4 Conjunto de caracteres
A ate Z
0 ate 9
espao
+
(mais; adio)
(hfen; subtrao)
*
(asterisco; multiplicao)
/
(barra; diviso)
>
(maior que)
<
(menor que)
=
(igual a)
.
(ponto)
,
(vrgula)
;
(ponto e virgula)
$
(cifro)
"
(aspas)
'
(apostrofe)
(
(abre parnteses)
)
(fecha parnteses)

10

ou

5 Palavras
5.1) RESERVADAS ou PRE-DEFINIDAS
5.1.1 CONECTORES (opcionais)
,
;

(virgula)
(ponto e virgula)

5.1.2 - REGISTROS (CAMPOS VARIAVEIS) ESPECIAIS


LENGTH OF
RETURN-CODE

5.1.3 - CONSTANTES FIGURATIVAS


ZERO , ZEROS ou ZEROES
SPACE ou SPACES
HIGH-VALUE ou HIGH-VALUES
LOW-VALUE ou LOW-VALUES
QUOTE ou QUOTES

ALL

zeros
espaos
XFF
X00
caracteres de delimitao de literais alfanumricas
(aspas ou apstrofes) referenciados como contedo
alfanumrico ser usado para preencher uma varivel
ou para comparao
repetio de caracteres ou de cadeias de caracteres

Ver Tabela de funcionamento do MOVE com exemplos de uso de constantes figurativas.

5.1.4 - OPERADORES ARITMETICOS E RELACIONAIS


+
*
/
=
>
<
>=
<=
NOT
AND
OR

adio
subtrao
multiplicao
diviso
igual
maior que
menor que
maior ou igual
menor ou igual

5.1.5 - PALAVRAS-CHAVE e PALAVRAS OPCIONAIS


PALAVRAS-CHAVE so verbos e outras palavras cujo significado fundamental para o entendimento
da ao pelo compilador.
Por exemplo, no comando IF VAR1 GREATER THAN VAR2 as palavras IF e GREATER so
palavras-chave.

11

As PALAVRAS OPCIONAIS so aquelas que podem ser colocadas, mas no exercem funo a no ser
melhorar a "leitura" do programador. Para o compilador elas so dispensveis e no alteram o
comportamento do programa.
Por exemplo, no comando IF VAR1 IS GREATER THAN VAR2 as palavras IS e THAN so
opcionais.
5.2) DEFINIDAS PELO PROGRAMADOR
5.2.1) TIPOS
DATA NAMES = nomes de campos de memria (variveis)
PROCEDURE NAMES = nomes de procedimentos (instrues)
A instruo anterior a um procedure name deve terminar com um ponto.
Um procedure name deve sempre ser seguido de um ponto.
Quando for nome de uma SECTION (section name), deve ter o procedure name , a
palavra SECTION e o ponto.
5.2.2) REGRAS DE FORMAO
Caracteres vlidos : letras (A a Z)
algarismos (0 a 9)
hfen
No pode comear nem terminar com hfen
Pode ter no mximo 30 caracteres
Obs.: data names de colunas de tabelas DB2 podem ter
Underscore (_) : na realidade tais referncias so
resolvidas pelo pr-compilador e no pelo COBOL
TELEF_CLI
ENDER_CLI
5.2.3) QUALIFICAO DE DATA NAMES DEFINIDOS MAIS DE UMA VEZ
CODCLI
CODCLI
CODCLI
CODCLI

OF
OF
IN
IN

REG-CADCLI
REG-ARQMOV
REG-CADCLI
REG-ARQMOV

Nas referncias a data names de colunas DB2 :


REG-CADCLI.CODCLI
REG-ARQMOV.CODCLI

12

6 - VARIAVEIS E CONSTANTES
6.1) Declarao
As variveis so declaradas na DATA DIVISION.
Para declarar reas internas do programa (que fazem parte fisicamente dele) usa-se a FILE SECTION
ou a WORKING-STORAGE SECTION.
Para declarar reas externas o programa (fisicamente esto em outro programa ou sub-programa) usa-se
a LINKAGE SECTION.
As reas relacionadas diretamente com os arquivos, usadas pelos comandos de I/O (ler arquivos, gravar
arquivos, imprimir linhas) devem obrigatoriamente ser definidas na FILE SECTION, aps a declarao
com nvel FD do arquivo respectivo.
As reas no relacionadas diretamente com arquivos devem ser declaradas na WORKING-STORAGE
SECTION.
A sintaxe simplificada para a declarao de variveis a seguinte :
nmero_de_nvel nome [REDEFINES nome] [picture] [usage] [ocorrncias] [value].

A sintaxe completa :
nmero_de_nvel nome
[REDEFINES nome-da-vriavel-definida-anteriormente]
[PIC {X | 9 | A | edio } ]
[ [USAGE] [IS] { [DISPLAY] | COMP | COMP-1 | COMP-2 | COMP-3 | COMP-4 | COMP-5 | } ]
[ OCCURS n [ TIMES ] [ DEPENDING ON variavel ] ]
[ VALUE [ IS ] contedo-inicial].

Nmero de nvel
Permite a declarao de uma estrutura de variveis.
Identifica se a varivel subconjunto de outra varivel ou no e/ou se ela tem ou no outras
variveis que sejam seus subconjuntos.
importante a ordem com que as variveis so declaradas, para, em conjunto com o nmero de
nvel, identificar se elas so parte de outra varivel ou no.
13

Nvel 01

Registro

Cod Cliente
Nome

Data Nascimento

Local Nasc.

Nvel 02

Cidade

Nvel 03

Declarao :
Nvel
01
02
02
02
03
03
03
02
03
03

Varivel
Registro
Cod.Cliente
Nome Cliente
Data Nascimento
Dia
Ms
Ano
Local Nascimento
UF
Cidade

Utiliza-se tambm a numerao dos nveis com intervalo entre um nmero e outro, para que se
possa inserir alguma estrutura / nome em nveis intermedirios, aps a declarao inicial, sem a
necessidade de alterar todos os nveis :
Nvel 01

Registro

Cod Cliente
Nome

Data Nascimento

Declarao :
14

Local Nasc.

Nvel 05

Cidade

Nvel 10

Nvel
01
05
05
05
10
10
10
05
10
10

Varivel
Registro
Cod.Cliente
Nome Cliente
Data Nascimento
Dia
Ms
Ano
Local Nascimento
UF
Cidade

Normalmente utiliza-se algum tipo de indentao para facilitar a visualizao da estrutura e da


hierarquia das variveis :
01

Registro
Cod.Cliente
Nome Cliente
Data Nascimento
10
Dia
10
Ms
10
Ano
05 Local Nascimento
10
UF
10
Cidade
05
05
05

Voltando sintaxe para declarao de variveis:

Nmeros de nveis especiais :


77 = variveis independentes (no so sub-diviso de outras nem tampouco tem sub-divises)
88 = atribuies de nomes de condies (variveis que apresentem determinados contedos), para
que possam ser referenciadas na parte de procedimentos. Ex.:
.
.
10

UF
88
88
88
88

PIC X(02).
VALUE SP.
VALUE BA.
VALUE MG.
VALUE PR.

PAULISTA
BAIANO
MINEIRO
PARANAENSE

.
.
.
IF PAULISTA MOVE 15 TO ALIQUOTA
.
.
.

Equivale a
IF UF = SP MOVE 15 TO ALIQUOTA
.
.
.

15

66 = para renomear variveis ou partes delas. Ex.:


.
.
01
TRECO-TODO.
05
TRECO1.
10
PARTE1
10
PARTE2
05
TRECO2.
10
PARTE3
10
PARTE4
10
PARTE5
66 COMBINADINHO RENAMES

PIC X(5).
PIC X(30).
PIC X(05).
PIC X(20).
PIC X(08).
PARTE2 THRU PARTE4.

O efeito seria o mesmo caso tivessem sido feitas as seguintes declaraes (ver a clusula
REDEFINES):
01
05
05

01
05
05
05

TRECO-TODO.
TRECO1.
10
PARTE1
PIC X(5).
10
PARTE2
PIC X(30).
TRECO2.
10
PARTE3
PIC X(05).
10
PARTE4
PIC X(20).
10
PARTE5
PIC X(08).
TRECO-TODOX REDEFINES TRECO-TODO.
FILLER
PIC X(5).
COMBINADINHO
PIC X(55).
FILLER
PIC X(08).

Nome :
Nome atribudo varivel (data name).
Regras do Cobol
1. Pode ter de 1 at 30 caracteres
2. Os caracteres vlidos so :
Alfabticos (A at Z)
Algarismos (0 at 9)
Hfen
3. Os hfens devem ser usados no
meio do nome (no pode comear
nem terminar com hfen)
4. No pode haver 2 hfens
subsequentes

Regras da vida...
1.
Atribuir nomes que lembrem a funo da varivel;
por exemplo, se uma varivel for usada para acumular os
valores de salrios de funcionrios, nomes como
TOTSALAR, ACSALAR, VALTOTSAL so bons; nomes
como I, TOT, VAR, VARX , embora vlidos, dificultam
MUITO a leitura e entendimento do programa
2.
Usar nomes mais longos somente quando for
absolutamente necessrio; eles so difceis de memorizar,
demoram mais para serem digitados e dificultam a leitura;
principalmente quando 2 ou mais nomes longos em boa
parte igual (entre eles) e diferenciam-se somente num
sufixo.
3.
Portanto, uma abreviao bem feita mais til que
um nome mais longo.

16

Redefines
um re-declarao de uma mesma varivel fsica com outra estrutura
Existem casos em que, feita a declarao de uma estrutura, conveniente refazer sua
declarao para que os dados nela contidos possam ser referenciados de outra forma.
Normalmente poder-se-ia contornar esta questo efetuando-se uma cpia do contedo da
varivel para uma outra que tivesse o mesmo tamanho, mas cuja estrutura fosse diferente.
No entanto, pode ser conveniente utilizar fisicamente a mesma rea. Neste caso, possvel
em Cobol efetuar a sua redefinio.
Suponha um texto cujo contedo fosse :
LINHAS=50
Isso implicaria na necessidade de utilizar uma varivel que fosse receber esse texto, que
tivesse 9 bytes :
01 TEXTO.
05 IDLIN
PIC X(6).
05 SEPARLIN PIC X(1).
05 QTLIN
PIC 9(2).

TEXTO

IDLIN

SEPARLIN

QTLIN

Se precisssemos de uma outra varivel para receber outro texto como o a seguir :
PAGS=1200
Isso implicaria na necessidade de utilizar uma varivel que fosse receber esse texto, que
tambm tivesse 9 bytes :
01 TEXTO.
05 IDPAG
PIC X(4).
05 SEPARPAG PIC X(1).
05 QTPAG
PIC 9(4).

TEXTO

IDPAG

SEPARPAG
17

QTPAG

Se fosse necessrio receber ambos os contedos na mesma varivel (mesma rea fsica),
poderamos faz-lo da seguinte forma, usando o REDEFINES :
01 TEXTO.
05 IDLIN
PIC X(6).
05 SEPARLIN PIC X(1).
05 QTLIN
PIC 9(2).
01 TEXTO2 REDEFINES TEXTO.
05 IDPAG
PIC X(4).
05 SEPARPAG PIC X(1).
05 QTPAG
PIC 9(4).

Ou seja, a rea, fisicamente seria uma s, mas teria nomes diferentes associados a pedaos
seus diferentes :
TEXTO
TEXTO2
IDLIN

IDPAG

QTLIN

SEPARLIN

SEPARPAG

QTPAG

Outro exemplo :
Registro Header
DE
1
2
10

AT
1
9
80

Tipo
Numerico
Numrico
Alfanumrico

Contedo
Tipo Registro
Data gravao (aaaammdd)
Vazio

Obs.
Fixo 1

Contedo
Tipo Registro
Conta corrente
Tipo movimento (Dou C)
Valor movimento
vazio

Obs.
Fixo 2

Contedo
Tipo Registro
Qtdd registros detalhe
Vazio

Obs.
Fixo 9

Registro Detalhe
DE
1
2
9
10
22

AT
1
8
9
21
80

Tipo
Numerico
Numrico
Alfanumrico
Numrico
Alfanumrico

2 decimais

Registro Trailler
DE
1
2
7

AT
1
6
80

Tipo
Numerico
Numrico
Alfanumrico

18

01 REG-ENTRADA.
05 REG-COD
05 REG-RESTO
05

PIC X(1).
PIC X(79).

REG-RESTO-HEADER REDEFINES REG-RESTO.


RH-DATA
PIC 9(08).
FILLER
PIC X(71).

10
10
05

REG-RESTO-DETALHE REDEFINES REG-RESTO.


RD-CONTA
PIC 9(07).
RD-TIPOMOV PIC X(01).
RD-VALMOV PIC 9(10)V99.
FILLER
PIC X(59).

10
10
10
10
05

REG-RESTO-TRAILLER REDEFINES REG-RESTO.


RH-QTDD
PIC 9(05).
FILLER
PIC X(74).

10
10

Picture
Indica tipo de dados na varivel. Se omitido, assume que o formato alfanumrico (PIC X) e a varivel
deve ter obrigatoriamente subdiviso; o tamanho a somatria de todas as subdivises declaradas em
seguida.Pode ser :

PIC X = alfanumrico

PIC A = alfabtico

PIC 9 = numrico
Sintaxe : (obs.: sempre que estiver especificado (n) indicando quantidade de bytes ou algarismos,
pode-se tambm especificar o tipo repetidamente, tantas vezes quantos forem os bytes ou algarismos).
PIC X = se a varivel tiver um nico byte
PIC X(n) = se a varivel tiver n bytes
Exemplo : PIC XXXXX
ou
PIC X(5)
PIC A = se a varivel tiver um nico byte
PIC A(n) = se a varivel tiver n bytes
Exemplo : PIC AAAAA
ou
PIC A(5)
PIC 9 = se o nmero (em decimal) contido na varivel tiver um nico
algarismo inteiro
PIC 9(i) = se o nmero (em decimal) contido na varivel tiver
algarismos inteiros

PIC 9(i)V9(d) = se o nmero (em decimal) contido na varivel tiver


algarismos inteiros e d algarismos decimais
Exemplos :
PIC 99999
PIC 99999V99

ou
ou

PIC 9(5)
PIC 9(5)V99

= 5 inteiros
ou PIC 99999V9(2) = 5 inteiros e 2 decimais

19

PICTURE DE EDIO
S pode ser usado como receptor de atribuies cuja origem seja um campo numrico
No pode ser usado em clculos
Caracteres que podem ser usados na edio, que so substitudos por algarismos ou por um
caracter de preenchimento (enquanto no houver algarismos significativos) :
Letra Z
Z
Algarismo 9
9
Asterisco
*

Deve ser substitudo por :

Algarismo, se j teve esquerda anteriormente algum algarismo significativo (no-zero)

Branco , se ainda no teve nenhum algarismo significativo esquerda


Deve ser substitudo pelo algarismo correspondente .
Replaces leading zeros with asterisks; has no effect on non-zero positions or zeros not in
leading positions; commonly used in check writing

Caracteres que podem ser usados na edio, que podem ser inseridos junto com os algarismos, para
permitir melhor visualizao do contedo numrico de um campo :
Sinal de menos
Sinal de mais
+
Separador da parte
inteira da parte
decimal
ou

Se o nmero for negativo, o lugar onde ele est na mscara fica com -
Se o nmero for negativo, o lugar onde ele est na mscara fica com espao
Se o nmero for negativo, o lugar onde ele est na mscara fica com -
Se o nmero for negativo, o lugar onde ele est na mscara fica com +
Se tiver DECIMAL-POINT IS COMMA : deve ser especificada a vrgula

, . Se no tiver DECIMAL-POINT IS COMMA: deve ser especifico o ponto

Separador visual de Se tiver DECIMAL-POINT IS COMMA : deve ser especificado o ponto.


grupos de
algarismos
Se no tiver DECIMAL-POINT IS COMMA: deve ser especificada a vrgula
ou

, .

Cifro
$
(Crdito)
CR
(Dbito)
DB
Barra
/

Inserido na primeira posio esquerda do campo editado (em geral usado para valores)
Usado ao final ( direita) do campo : se especificado CR , aparecer

CR se o campo for negativo

branco (espao) se o campo for positivo


Usado ao final ( direita) do campo : se especificado DB , aparecer

DB se o campo for negativo

branco (espao) se o campo for positivo


Inserida / na posio correspondente (em geral usado para datas)

Exemplo ( a letra b minscula indica espao em branco):


Campo origem

Picture de edio

Campo destino

00120056678
00120056678

Z.ZZZ.ZZZ.ZZ9,99
ZZZ.ZZZ.ZZZ.ZZ9

bb1.200.566,78
120.056.678

20

Outros exemplos :
Campo de origem
PIC
9(7)
Contedo 1234567
PIC
9(5)
Contedo 12345
PIC
9(7)
Contedo 0001234
PIC
9(7)
Contedo 0000123
PIC
9(7)
Contedo 0000001
PIC
9(7)
Contedo 0000000
PIC
9(7)V99
Contedo 123456789
PIC
9(7)V99
Contedo 123456789
PIC
9(7)V99
Contedo 000000001
PIC
9(7)V99
Contedo 123456789
PIC
9(7)V99
Contedo 123456789
PIC
9(5)V9(4)
Contedo 123456789
PIC
9(5)V9(2)
Contedo (+) 1234567
PIC
9(5)V9(2)
Contedo (-) 1234567

Destino (campo com PIC de edio)


PIC
Z.ZZZ.ZZ9
Fica com: 1.234.567
PIC
ZZ9
Fica com: 345
PIC
Z.ZZZ.ZZ9
Fica com: bbbb1.234
PIC
Z.ZZZ.ZZ9
Fica com: bbbbbb123
PIC
Z.ZZZ.ZZ9
Fica com: bbbbbbbb1
PIC
Z.ZZZ.ZZ9
Fica com: bbbbbbbb0
PIC
Z.ZZZ.ZZ9
Fica com: 1.234.567
PIC
Z.ZZZ.ZZZ,ZZ
Fica com: 1.234.567,89
PIC
Z.ZZZ.ZZZ,ZZ
Fica com: bbbbbbbbbbb1
PIC
Z.ZZZ.ZZ9,99
Fica com: bbbbbbbb0,01
PIC
Z.ZZZ.ZZ9,99999
Fica com: 1.234.567,89000
PIC
Z.ZZZ.ZZ9,99
Fica com: bbb12.345,67
PIC
-ZZ.ZZ9,99
Fica com: b12.345,67
PIC
-ZZ.ZZ9,99
Fica com: -12.345,67

Portanto, em geral :
Valores
: PIC .........ZZZ.ZZZ.ZZ9,99
Quantidades : PIC .........ZZZ.ZZ9

21

Usage
Indica o formato dos dados na varivel. Sintaxe :
[USAGE] DISPLAY = dados numricos em zonado. Cada algarismo ocupa um byte.
Mximo de 18 caracteres/algarismos.

[USAGE] BINARY = ver COMP

dados numricos no formato binrio ponto fixo (valor expresso


em decimal) ; os valores limite (menor e maior) so os que podem ser representados com a
quantidade de algarismos (decimais) indicada.

[USAGE] COMP

dados numricos no formato binrio ponto flutuante curto. No


colocar PIC (ele estabelecido automaticamente pelo compilador). Valor expresso em notao
cientfica (mantissa e expoente).

[USAGE] COMP-1

[USAGE] COMP-2
= dados numricos no formato binrio ponto flutuante longo. No
colocar PIC (ele estabelecido automaticamente pelo compilador). Valor expresso em notao
cientfica (mantissa e expoente).

[USAGE] COMP-3 = dados numricos no formato decimal compactado. Neste caso a


quantidade de noves especificada no PIC indica a quantidade de algarismos do maior nmero
que poder estar contido nesta varivel; cada algarismo ocupa meio byte. Para determinar o
tamanho total do campo, acrescentar mais meio byte para o sinal (ltimo meio byte direita;
independentemente de o campo ter sido definido com S ou no).

[USAGE] COMP-4

dados numricos no formato binrio ponto fixo. Valor expresso

em decimal.
dados numricos no formato binrio ponto fixo (valor expresso em
decimal) ; os valores limite (menor e maior) so os que podem ser representados no campo no
formato binrio ponto fixo.

[USAGE] COMP-5 =

22

Tabela de variveis numricas (em zonado ou compactado : DISPLAY ou COMP-3)


Quantidade de
Algarismos
1

Quantidade de
bytes, se a
varivel for
zonada
(DISPLAY)
1

Quantidade de
bytes, se a
varivel for
Compactada
(COMP-3)
1

10

10

11

11

12

12

13

13

14

14

15

15

16

16

17

17

18

18

10

Faixa de nmeros que podem


estar contidos na varivel, se for
quantidade
-9
a 9
-99
a 99
-999
a 999
-9.999
a 9.999
-99.999
a 99.999
-999.999
a 999.999
-9.999.999
a 9.999.999
-99.999.999
a 99.999.999
-999.999.999
a 999.999.999
-9.999.999.999
a 9.999.999.999
-99.999.999.999
a 99.999.999.999
-999.999.999.999
a 999.999.999.999
9.999.999.999.999
a 9.999.999.999.999
99.999.999.999.999
a 99.999.999.999.999
999.999.999.999.999
a 999.999.999.999.999
9.999.999.999.999.999
a 9.999.999.999.999.999
99.999.999.999.999.999
a 99.999.999.999.999.999
999.999.999.999.999.999
a 999.999.999.999.999.999

23

Faixa de nmeros que podem estar


contidos na varivel, se for valor
-0,09
a 0,09
-0,99
a 0,99
-9,99
a 9,99
-99,99
a 99,99
-999,99
a 999,99
-9.999,99
a 9.999,99
-99.999,99
99.999,99
-999.999,99
a 999.999,99
-9.999.999,99
a 9.999.999,99
-99.999.999,99
a 99.999.999,99
-999.999.999,99
a 999.999.999,99
-9.999.999.999,99
a 9.999.999.999,99
-99.999.999.999,99
a 99.999.999.999,99
-999.999.999.999,99
a 999.999.999.999,99
-9.999.999.999.999,99
a 9.999.999.999.999,99
-99.999.999.999.999,99
a 99.999.999.999.999,99
-999.999.999.999.999,99
a 999.999.999.999.999,99
-9.999.999.999.999.999,99
a 9.999.999.999.999.999,99

Tabela de variveis numricas (em binrio ponto fixo : COMP ou COMP-4)


Quantidade de
Algarismos
Com
Sinal
(1-4)
S9(1) a
S9(4)

Quantidade
de bytes

2 bytes

(5-9)
S9(5) a
S9(9)

4 bytes

(10-18)
S9(10) a
S9(18)

8 bytes

Sem
Sinal
(1-4)
9(1) a
9(4)

2 bytes

(5-9)
9(5) a
9(9)

4 bytes

(10-18)
9(10) a
9(18)

8 bytes

Faixa de nmeros que podem ser


representados, se for quantidade
(dependendo da quantidade de
algarismos)

Faixa de nmeros que podem ser


representados, se for valor
(dependendo da quantidade de
algarismos)

-9 a 9
-99 a 99
-999 a 999
-9.999 a 9.999
-99.999 a 99.999
-999.999 a 999.999
-9.999.999 a 9.999.999
-99.999.999 a 99.999.999
-999.999.999 a 999.999.999
-9.999.999.999 a
9.999.999.999
... at ...
-999999999999999999 a
999999999999999999

-0,09 a 0,09
-0,99 a 0,99
-9,99 a 9,99
-99,99 a 99,99
-999,99 a 999,99
-9.999,99 a 9.999,99
-99.999,99 a 99.999,99
-999.999,99 a 999.999,99
-9.999.999,99 a 9.999.999,99
-99.999.999,99 a
99.999.999,99
... at ...
-9999999999999999,99 a
9999999999999999,99

0 a 9
0 a 99
0 a 999
0 a 9.999
0 a 99.999
0 a 999.999
0 a 9.999.999
0 a 99.999.999
0 a 999.999.999
0 a 9.999.999.999
... at ...
0 a 999999999999999999

0 a 0,09
0 a 0,99
0 a 9,99
0 a 99,99
0,00 a 999,99
0,00 a 9.999,99
0,00 a 99.999,99
0,00 a 999.999,99
0,00 a 9.999.999,99
0,00 a 99.999.999,99
... at ...
0,00 a 9999999999999999,99

24

Tabela de variveis numricas (em binrio ponto fixo : COMP-5)


Quantidade de
Algarismos
Com
Sinal
(1-4)
S9(1) a
S9(4)
(5-9)
S9(5) a
S9(9)
(10-18)
S9(10) a
S9(18)
Sem
Sinal
(1-4)
9(1) a
9(4)
(5-9)
9(5) a
9(9)
(10-18)
9(10) a
9(18)

Quantidade de
bytes

Faixa de nmeros que podem ser


representados, se for quantidade
(dependendo da quantidade de
algarismos)

Faixa de nmeros que podem ser


representados, se for valor
(dependendo da quantidade de
algarismos)

2 bytes

-32.768
a 32.767

-327,68
a 327,67

4 bytes

-2.147.483.648
a 2.147.483.647

-21.474.836,48
a 21.474.836,47

8 bytes

-9.223.372.036.854.775.808
a 9.223.372.036.854.775.807

-92.233.720.368.547.758,08
a 92.233.720.368.547.758,07

2 bytes

0
a 65.535

0
a 655,35

4 bytes

0
a 4.294.967.295

0
a 42.949.672,95

8 bytes

0
a a 184.467.440.737.095.516,15
18.446.744.073.709.551.615

IMPORTANTE :
Para campos numricos (PIC 9) DISPLAY ou COMP-3 ou COMP-4 pode-se
opcionalmente colocar a indicao de sinal :
PIC 9(03)

ou PIC S9(03).

Se no for especificado sinal, o campo ser SEMPRE tratado como se tivesse nmero positivo.
Exemplo : se a varivel WCALC for definida com PIC 9(03) e contiver zero, se subtrairmos 1,
ela passar a ter o nmero 1 positivo ( sempre forado sinal positivo aps uma operao
aritmtica)
Se for especificado sinal, o campo ser SEMPRE tratado conforme os nmeros relativos.
Exemplo : se a varivel WCALC for definida com PIC S9(03) e contiver zero, se subtrairmos
1, ela passar a ter o nmero 1 negativo
Mximo de 18 algarismos num campo numrico, incluindo parte inteira e decimal, para usage
DISPLAY, COMP-3

25

(ocorrncias)
Indica a quantidade de vezes que a varivel ocorre (usado para declarao de vetores). Occurs
Sintaxe :
OCCURS n TIMES [DEPENDING ON varivel]
Exemplo :

10

VALOR OCCURS 100 TIMES.

Variveis declaradas com OCCURS , ao serem referenciadas na PROCEDURE DIVISION,


devem obrigatoriamente ter a indicao do ndice (atravs de literal ou outra varivel com
contedo inteiro e positivo):
VALOR (01)
VALOR (98)
VALOR (WIDX)

Value
Indica o contedo inicial que deve ser atribudo varivel (em tempo de compilao). specificado
atravs de literal ou constante figurativa.
Sintaxe :
VALUE literal
Exemplo :

VALUE
VALUE
VALUE
VALUE
VALUE
VALUE

100
ZERO
.123E12
RELATORIO
ALL *
ALL *-

26

7 - IDENTIFICATION DIVISION
PROGRAM-ID.
AUTHOR.
DATE-WRITTEN.
DATE-COMPILED.
SECURITY.
REMARKS.

nome do programa.
nome do programador.
data de codificao.
data de compilao.
comentrios.
comentrios.

27

8 - ENVIRONMENT DIVISION
8.1) CONFIGURATION SECTION.
SOURCE-COMPUTER.
OBJECT-COMPUTER.
SPECIAL-NAMES.

...
...
Cnn IS nome_usuario
DECIMAL-POINT IS COMMA.

Cnn (pode ser desde C01 at C12) indica para qual canal de impressora deseja-se atribuir um nome
de usurio, para referenciar nos comandos de impresso (WRITE).

Se for colocado C01 IS NOVAPAGINA, por exemplo, no comando WRITE para pular de pgina
pode-se especificar
WRITE area_fd [FROM area_wss] BEFORE ADVANCING PAGE

ou
WRITE area_fd [FROM area_wss] BEFORE ADVANCING NOVAPAGINA

Se for colocado C02 IS ITENSNOTAFISCAL, por exemplo, no comando WRITE para imprimir a
linha (com o primeiro tem de uma nota fiscal) deve-se especificar
WRITE area_fd [FROM area_wss] BEFORE ADVANCING ITENSNOTAFISCAL

Importante :

Normalmente C01 a posio onde ser impressa a primeira linha de uma pgina

Se for utilizado canais C02 at C12 , deve ser preparada a definio das caractersticas
do formulrio com a indicao dos canais e as respectivas posies (linhas) em que se
encontram; normalmente um procedimento feito pelo pessoal de produo

DECIMAL-POINT IS COMMA indica que a notao de nmeros utilizada :

Pontos separando visualmente grupos de algarismos e vrgula separando parte inteira da parte
decimal
Se no especificado, vale a notao americana (Vrgulas separando visualmente grupos de
algarismos e ponto separando parte inteira da parte decimal)

28

8.2) INPUT-OUTPUT SECTION.


FILE-CONTROL.
Para arquivos SEQUENCIAIS
SELECT nome_interno_arquivo ASSIGN TO nome_externo.
Para arquivos VSAM
SELECT nome_interno_arquivo
ASSIGN nome_externo
ORGANIZATION IS INDEXED
ACCESS IS DYNAMIC ou SEQUENTIAL ou RANDOM
RECORD KEY IS variavel_fd_chave
ALTERNATE RECORD KEY IS variavel_fd_chave_alternada
FILE STATUS variavel.

I-O-CONTROL.
Clusulas para diversas finalidades, normalmente no usadas :
RERUN, SAME, MULTIPLE, APPLY

29

9 - DATA DIVISION
FILE SECTION.
Para declarao de caractersticas de arquivos e das variveis com os registros dos arquivos.
Para cada arquivo deve ser colocada uma declarao de nvel FD, seguida da declarao da rea de
I/O respectiva.
FD
01
FD
01

ENTRA.
AE-FD
SAIDA.
AS-FD

PIC X(80).
PIC X(133).

IMPORTANTE :
Cada arquivo tem UMA NICA rea de I/O.
No entanto, pode-se declarar diversas reas com nvel 01; caso haja mais de uma rea com nvel 01
para um arquivo, internamente a declarao funciona como uma sequncia de REDEFINES.
Devido a isso, o uso do REDEFINES na FILE SECTION no permitido.
WORKING-STORAGE SECTION.
Para declarao das variveis de trabalho, no vinculadas diretamente aos registros dos arquivos.

LINKAGE SECTION.
Para indicar as variveis usadas no programa, mas declaradas externamente.
No exemplo a seguir, a rea W-DATA-VIA-PARM na verdade est declarada (est fisicamente) em
rea do sistema operacional, que quem chama o programa e lhe passa o parametro (dados).
LINKAGE SECTION.
01 W-DATA-VIA-PARM.
03 W-DATA-PARM-TAM
PIC 9(02) COMP.
03 W-DATA-1
PIC X(10).
03 W-DATA-2
PIC X(08).
*===============================================================*
PROCEDURE DIVISION USING W-DATA-VIA-PARM.
DISPLAY W-DATA-PARM-TAM.
DISPLAY W-DATA-1 '
' W-DATA-2.

30

10 - PROCEDURE DIVISION
10-1) OBSERVACOES GERAIS
10-1-1) Continuao de comandos
Uma instruo pode ser continuada por quantas linhas forem necessrias :
.........1.........2.........3.........4.........5.........6.........7..
DISPLAY 'CONTEUDO DA VARIAVEL W-COMP = '
W-COMP
' CONTEUDO DA VARIAVEL W-DATA = '
W-DATA

Uma literal que no caiba numa linha, para que seja continuada na prxima linha,
precisa ter na prxima linha a indicao da continuao (hfen na coluna 7) e, em
qualquer coluna a partir da 12, um apstrofe indicando o incio da continuao.

Rguas para
simples referncia

15 PARTCAB PIC X(88) VALUE 'RELATORIO MENSAL DAS VENDAS EFETUA


'DAS AOS DOMINGOS'

DISPLAY 'Rua Antonio Jose Pereira de Almeida Junior Graziano d


'as Neves nro 1'

.........1.........2.........3.........4.........5.........6.........7..

10-1-2) Expresses
Uma expresso indica uma srie de operaes aritmticas que devem ser efetuadas. A hierarquia para
sua resoluo a normal (multiplicao e diviso, soma e subtrao), sendo os componentes de dentro
dos parnteses sendo resolvidos primeiro. Pode-se colocar quantos nveis de parnteses forem
necessrios, observando-se que sempre eles devem estar em pares.
Exemplo :
COMPUTE RESULT = ((AA * 2) + BB) / (((CC + 1.7) * (DD 3.14)) / 1952)

31

10-1-3) Referncia explcita a sub-strings


MOVE W-HORARIO (01:02)
MOVE W-HORARIO (03:02)
MOVE W-HORARIO (05:02)
Posio (byte) inicial

TO WS-HORA
TO WS-MIN
TO WS-SEG
Tamanho (qtdd bytes)

10-1-4) Referncia a variveis com OCCURS


Devem indicar um ndice, que pode ser uma literal numrica (nmero inteiro positivo) ou uma outra
varivel com um nmero inteiro positivo:
Vetores (1 dimenso)
10 VALOR PIC 9(9)V99 OCCURS 50.
MOVE VALOR (01) TO WS-WORK
MOVE VALOR (IND) TO WS-WORK
Matrizes (mais de 1 dimenso)
10
VALORES-REF-1ANO OCCURS 10.
15 VALOR-REF-1MES PIC 9(9)V99 OCCURS 12.
MOVE VALOR (7 12) TO WS-WORK
MOVE VALOR (WANO WMES) TO WS-WORK
ndice de 1 nvel : indica qual varivel
VALORES-REF-1ANO
das 10 existentes

ndice de 2 nvel : indica qual


varivel VALOR-REF-1MS das 12
(na realidade 120) existentes

10-1-5) Referncia a sub-strings e ndices


MOVE W-HORARIO (03:02) (WIND)
Posio (byte) inicial

TO WS-WORK

Tamanho (qtdd bytes)

32

ndice (s)

10-1-6) Acesso ao PARM


Para acessar dados informados atravs do PARM, declarar na LINKAGE SECTION uma estrutura
com:
Uma varivel PIC 9(02) COMP que recebe o tamanho dos dados
Em continuao, outra varivel que ir conter, em tempo de execuo, os dados informados atravs
do PARM; ela deve ter tamanho suficiente para receber todos os dados.
LINKAGE SECTION.
01 W-DATA-VIA-PARM.
03 W-DATA-PARM-TAM
PIC 9(02) COMP.
03 W-DATA-1
PIC X(10).
03 W-DATA-2
PIC X(08).
*===============================================================*
PROCEDURE DIVISION USING W-DATA-VIA-PARM.
DISPLAY W-DATA-PARM-TAM.
DISPLAY W-DATA-1 '
' W-DATA-2.

Se o programa for executado com PARM='01/01/200331/12/03' ele exibir


00018
01/01/2003

31/12/03

Note que o tamanho da varivel colocado em W-DATA-PARM-TAM inclui somente o tamanho dos
dados em si, sem incluir os 2 bytes de W-DATA-PARM-TAM.
10-1-7) Referncia ao tamanho de uma varivel
A funo LENGTH OF retorna o tamanho de uma varivel. As instrues
01

W-DATA-VIA-PARM.
03 W-DATA-PARM-TAM
03 W-DATA-1
03 W-DATA-2

PIC 9(02) COMP.


PIC X(10).
PIC X(08).

PROCEDURE DIVISION USING W-DATA-VIA-PARM.


DISPLAY 'VOU EXIBIR TAMANHO DE W-DATA-VIA-PARM'
DISPLAY LENGTH OF W-DATA-VIA-PARM

exibem o seguinte :
VOU EXIBIR
000000020

TAMANHO DE W-DATA-VIA-PARM

33

10-1-8) Data e hora de execuo


A funo CURRENT-DATE retorna a data e a hora atuais. As instrues
DISPLAY 'VOU EXIBIR FUNCTION CURRENT-DATE : '
DISPLAY '01 A 08 = ' FUNCTION CURRENT-DATE(01:08).
DISPLAY '09 A 14 = ' FUNCTION CURRENT-DATE(09:06).

podem exibir o seguinte :


VOU EXIBIR FUNCTION CURRENT-DATE :
01 A 08 = 20030826
09 A 14 = 120822

34

10-2) Comandos executveis


Clusulas de comandos Aritmticos
ON SIZE ERROR

Os comandos aritmticos possuem a clusula ON SIZE ERROR , que refere-se condio de o


tamanho do campo de resultado ser insuficiente para conter o resultado (overflow).
Aps a referida clusula deve-se especificar comando(s) imperativo(s) , ou seja, cuja execuo no
seja condicional (como um IF e as instrues que formam sua sintaxe completa).
Caso a condio de overflow ocorra, ser executado o bloco de instrues que seguem a clusula ON
SIZE ERROR e que termina com a especificao de um ponto ou do comando ENDoperaoaritmtica.
A sintaxe geral :
comandoaritmrico ON SIZE ERROR bloco de instrues imperativas para a condio de overflow
ou
comandoaritmrico ON SIZE ERROR bloco de instrues imperativas para a condio de overflow
END-comandoaritmetico

Exemplos genricos :
ADD ... ON SIZE ERROR comandos para overflow END-ADD comandos para overflow e no-overflow
ADD ... ON SIZE ERROR comandos para overflow comandos para overflow e no-overflow
MULTIPLY ... ON SIZE ERROR comandos para overflow END-MULTIPLY comandos para overflow e nooverflow
MULTIPLY .... ON SIZE ERROR comandos para overflow comandos para overflow e no-overflow

A clusula ON SIZE ERROR pode ser precedida do operador NOT.


Neste caso, o bloco de comando(s) imperativo(s) especificado para execuo na condio em que
no haja overflow .
ADD ... NOT ON SIZE ERROR comandos para no-overflow END-ADD comandos para overflow e nooverflow
ADD ... NOT ON SIZE ERROR comandos para no-overflow comandos para overflow e no-overflow
MULTIPLY ... NOT ON SIZE ERROR comandos para no-overflow END-MULTIPLY comandos para
overflow e no-overflow
MULTIPLY .... NOT ON SIZE ERROR comandos para no-overflow comandos para overflow e nooverflow

35

ROUNDED

Os comandos aritmticos possuem a clusula ROUNDED , que refere-se ao arredondamento efetuado


nos resultados.
condio de o tamanho do campo de resultado ser insuficiente para conter o resultado (overflow).
GIVING

Os comandos aritmticos possuem a clusula ROUNDED , que refere-se ao arredondamento efetuado


nos resultados.
condio de o tamanho do campo de resultado ser insuficiente para conter o resultado (overflow).

36

Tabela de comandos
1.

Comando

Descrio

ACCEPT

Recebe dados de dispositivo de entrada (padro =


dispositivo com DDNAME SYSIN)

Exemplo(s)

ACCEPT varivel

ACCEPT RESPOSTA
L um registro lgico em SYSIN e colocao na varivel
denominada
RESPOSTA
ACCEPT NUMERO(INDEXADOR)
L um registro lgico em SYSIN e colocao na varivel denominada NUMERO
indexada pela varivel INDEXADOR
(portanto coloca num elemento de um
vetor)

2.

ADD

ADD V1 TO V2
Efetua V2 = V2 + V1

Soma 2 ou mais valores


ADD parcela(s) TO
Varivel(is)-resultado
[ROUNDED]
[ GIVING variavel-resultado ]
[ [NOT] ON SIZE ERROR comando(s) ]
[END-ADD]

ADD 1 TO V2
Efetua V2 = V2 + 1
ADD V1 V2 V3 TO V4
Efetua V4 = V1 + V2 + V3
ADD V1 V2 V3 V4 TO V4
Efetua V4 = V1 + V2 + V3 + V4
ADD 1 TO V1 V2 V3 V4
Efetua
V1 = V1 + 1
V2 = V2 + 1
V3 = V3 + 1
V4 = V4 + 1
ADD V1 TO V2 ROUNDED
Efetua V2 arredondado = V2 + V1

3.

CALL

CALL MYSERV USING WS-PARAM


Chama a rotina denominada MYSERV; a
rea de comunicao
Obs.1:
WS-PARAM
CALL esttico = a sub-rotina linkeditada junto com
o programa; portanto, quando o programa
CALL WS-NOMEROT USING WS-PARAM
carregado na memria, a rorina carregada junto.
Chama a rotina cujo nome est na varivel
CALL dinmico = a sub-rotina linkeditada
WS-NOMEROT; a rea
separada; quando o programa carregado na
de comunicao WSmemria, a rotina no carregada; ela s carregada
PARAM
quando o CALL for executado pela primeira vez
durante a execuo.
CALL DATACONV USING DATAVAI
Chama sub-rotina para execuo.

37

DATAVEM
Obs.2:
Chama a rotina denominada DATACONV;
Passagem de parametro por referencia (BY
as reas de
REFERENCE) significa que o dado vai ser
comunicao so
efetivamente passado e pode ser alterado
DATAVAI e DATAVEM
Passagem de parametro por conteudo (BY
CONTENT) significa que somente seus valores serao
passados e portanto os seus conteudos efetivos nao
podem ser alterados
Se nao for especificado nem BY REFERENCE nedm
BY CONTENT assume BY REFERENCE
Obs.3:
parametro-n indica que o parametro pode ser
especificado de uma das 7 maneiras a seguir :
BY REFERENCE variavel_ou_literal
BY REFERENCE ADDRESS OF variavel_ou_literal
BY REFERENCE arquivo
BY CONTENT
LENGTH OF variavel
BY CONTENT
ADDRESS OF variavel
BY CONTENT
literal
Variavel_ou_literal

Formato mais simples :


CALL nome-rotina
[USING parametro-1
[parametro-2 ... parametro-n] ]
Formato com teste de overflow (nao ha memoria para a
sub-rotina) :
CALL nome-rotina
[USING parametro-1
[parametro-2 ... parametro-n] ]
[O
Oimperativo]
N
VER
[E
]CA
NDFormato com teste de exceo (algum erro na execucao
da sub-rotina) :

4.

CLOSE

CALL nome-rotina
[USING parametro-1
[parametro-2 ... parametro-n] ]
[ [NOT] ON EXCEPTION imperativo]
[END-CALL]
Efetua o fechamento de arquivos.
CLOSE nome-arquivo1
[ nome-arq-2 ... nome-arq-n ]

38

CLOSE
CLOSE
CLOSE
CLOSE
CLOSE
CLOSE
CLOSE

ARQENTRA
ARQSAI
ARQENTRA
ARQENTSAI
ARQENT1, ARQENT2, ARQENT3
ARQSAI1, ARQSAI2, ARQSAI3
ARQES1, ARQES2, ARQES3

CLOSE ARQENT1 ARQSAI1 ARQES1


CLOSE ARQENT1 AR2 ARQ1 ARQ3
5.

COMPUTE

Efetua a resoluo de uma expresso matemtica e coloca


COMPUTE
nmero resultante no campo de resultado.
COMPUTE
COMPUTE
COMPUTE varivel
[ROUNDED] = expresso
COMPUTE
[ [NOT] ON SIZE ERROR comando(s)
COMPUTE
[END-COMPUTE] ]
COMPUTE

6.

CONTINUE

Comando imperativo que no efetua funo nehuma,


atuando como um NO-Operation ; usado somente para
que possa haver (pelo menos) um comando imperativo
quando a sintaxe exigir ; ou para melhora de legibilidade
do programa.

CAMPO1 = 1 + 1
CAMPO1 EQUAL 1 + 1
CAMPOXX EQUAL CAMPOYY
CAMPOZZ
ALFA = ALFA ALFA
BETA = BETA * BETA
GAMA = DIVIDENDO /
DIVISOR
COMPUTE RESULT = (AA + BB) / CC
COMPUTE RESULT = ((AA + BB) /
CC) / DD

CONTINUE

Exemplo 1:
MOVE SPACES TO TEXTO.
IF TEXTO EQUAL SPACES
CONTINUE
ELSE
DISPLAY "NAO PASSA AQUI".
Exemplo 2:
IF CAMPOA GREATER THAN CAMPOB
CONTINUE
ELSE
COMPUTE CPOC = CPOA CPOB.
TESTA-SIGLA-REGIAO-SUL.
IF SIGLA = "SP" CONTINUE
ELSE
IF SIGLA = "PR"
CONTINUE
ELSE
IF SIGLA = "SC"
CONTINUE
ELSE
IF SIGLA = "RS"
CONTINUE
ELSE
PERFORM ERRO1.
SIGLA-OK.

7.

DELETE

Deleta um registro lgico de um arquivo VSAM KSDS


ou RRDS (no possvel deletar registros de ESDS);
observar que a deleo lgica e no fsica
DELETE arquivo [RECORD]
[ [NOT] [INVALID KEY] imperativo ]
[END-DELETE]
39

DELETE CADCLI INVALID KEY


MOVE "NAO" TO DELETOU
END-DELETE
DELETE CADCLI NOT INVALID KEY
MOVE "SIM" TO DELETOU

END-DELETE
8.

DISPLAY
Exibe contedo de campo(s) num dispositivo de sada.
Normalmnte o dispositivo cujo DDNAME SYSOUT
DISPLAY [variavel | literal] ...
[variavel | literal]

DISPLAY "LIDOS = "

WS-REGLID

DISPLAY "PROGRAMA INICIANDO..."


DISPLAY WS-SQLCODE
DISPLAY WDIA / WMES / WANO

9.

DIVIDE
Efetua uma diviso, disponibilizando o cociente e, se
indicado, o resto
Sintaxe 1 :
DIVIDE divisor INTO dividendo/cociente
[ REMAINDER variavel-resto ]
[ GIVING variavel-cociente ]
[ ROUNDED ]
[ [NOT] ON SIZE ERROR comando(s) ]
[END-DIVIDE]
Sintaxe 2 :
DIVIDE dividendo BY divisor
[ REMAINDER variavel-resto]
[ GIVING variavel-cociente ]
[ ROUNDED ]
[ [NOT] ON SIZE ERROR comando(s) ]
[END-DIVIDE] ]

10
.

DIVIDE REAIS-POR-DOLAR INTO


TOT-REAIS GIVING DOLARES

DIVIDE QUANTIA BY 5
GIVING CADA-UM-RECEBE
REMAINDER PARA-O-SANTO

EVALUATE
Faz a comparao de uma varivel contra os valores
indicados, efetuando os procedimentos correspondentes :
EVALUATE varivel
WHEN literal-1
bloco_se_varivel=literal-1
[WHEN literal-2
bloco_se_varivel=literal-2]
[WHEN literal-n
bloco_se_varivel=literal-n]
[WHEN OTHER
bloco_se_varivel_diferente_
de_todas_as_literais]
END-EVALUATE

11
.

DIVIDE 2 INTO NUMERO

EXIT

EXIT

EVALUATE SIGLA-UF
WHEN 'SP' DISPLAY 'PAULISTA'
WHEN 'PR' DISPLAY 'PARANAENSE'
WHEN 'SC' DISPLAY 'CATARINENSE'
WHEN 'RS' DISPLAY
'SULRIOGRANDENSE'
WHEN OTHER DISPLAY
'OUTROS ESTADOS'
END-EVALUATE.

Ver PERFORM

Na verdade, uma instruo EXIT no Cobol de fato um


GO TO.
Se foi dado um PERFORM no qual a ltima instruo do
40

12
.

GO TO

13
.

GOBACK

14
.

IF

bloco a ser executado um EXIT , ele (o EXIT)


transformado num GO TO para a instruo seguinte ao
PERFORM. Antes de o PERFORM ser executado (e,
portanto, de o EXIT ser transformado, ele funciona
como um CONTINUE.
Faz o desvio para o procedure name(s) indicado(s)
Sintaxe 1 :
GO TO nome-da-instrucao

GO TO CANCELAR

Sintaxe 2 :
GO TO nome-da-instrucao-1 .... nomeda-instrucao-n DEPENDING ON varivel

GO TO CASO1 CASO2 CASO3 CASO4


DEPENDING ON CODIGO.

Volta para o programa ou rotina chamador.


GOBACK

GOBACK

Efetua teste da(s) condio(es) especificada, e efetua os


desvios necessrios de acordo com o resultado.
A base para identificar os pontos de desvio o PONTO
ou o ELSE ou o END-IF.
O PONTO e o END-IF indicam o fim da especificao da
instruo; as instrues que esto aps o PONTO e o
END-IF, portanto, so executadas tanto para os casos de
condio satisfeita quanto para os casos de condio no
satisfeita.
Sintaxe 1 :
IF condio
Bloco-se-verdadeiro
Bloco-se-verdadeiro-ou-falso
Sintaxe 2 :
IF condio
Bloco-se-verdadeiro
END-IF
Bloco-se-verdadeiro-ou-falso
Sintaxe 3 :
IF condio
Bloco-se-verdadeiro
ELSE
Bloco-sefalso
Bloco-se-verdadeiro-ou-falso

IF V1 LESS THAN V2
DISPLAY "V1 MENOR QUE V2"
DISPLAY "VEM PRA CA DE QUALQUER
JEITO"

IF V1 LESS THAN V2
DISPLAY "V1 MENOR QUE V2"
END-IF
DISPLAY "VEM PRA CA DE QUALQUER
JEITO"
IF V1 LESS THAN V2
DISPLAY "V1 MENOR QUE V2"
ELSE
DISPLAY "V1 > OU = A V2"
DISPLAY "VEM PRA CA DE QUALQUER
JEITO"
IF V1 LESS THAN V2
DISPLAY "V1 MENOR QUE V2"
ELSE
DISPLAY "V1 > OU = A V2"

Sintaxe 4 :
IF condio
Bloco-se-verdadeiro
ELSE
41

Bloco-se-falso
END-IF
Bloco-se-verdadeiro-ou-falso
Sintaxe 5 :
IF condio
CONTINUE
ELSE
Bloco-se-falso
Bloco-se-verdadeiro-ou-falso
Sintaxe 6 :
IF V1 LESS THAN V2
CONTINUE
ELSE
Bloco-se-falso
END-IF
Bloco-se-verdadeiro-ou-falso

15
.

INITIALIZE

END-IF
DISPLAY "VEM PRA CA DE QUALQUER
JEITO"
IF V1 LESS THAN V2
CONTINUE
ELSE
DISPLAY "V1 > OU = A V2"
DISPLAY "VEM PRA CA DE QUALQUER
JEITO"
IF V1 LESS THAN V2
CONTINUE
ELSE
DISPLAY "V1 > OU = A V2"
END-IF
DISPLAY "VEM PRA CA DE QUALQUER
JEITO"

Sintaxe 7 (aninhamento):
IF condicao-1
...para condicao-1-verdadeira...
IF condicao-1
Bloco-se-verdadeiro-1
ELSE
Bloco-se-falso-1
END-IF
ELSE
Bloco-se-condicao-1-falsa
Bloco-qualquer-condicao-verd-ou-falsa

IF V1 LESS THAN V2
DISPLAY "V1 MENOR QUE V2"
IF V3 LESS THAN V4
DISPLAY "V3 < V4"
ELSE
DISPLAY "V3 >= A V4"
END-IF
ELSE
DISPLAY "V1 >= A V2"
DISPLAY "VEM PRA CA DE QUALQUER
JEITO"

Efetua a inicializao (atribuio de valores) de uma


varivel (ou um conjunto de variveis); como default
variveis numricas so inicializadas com zeros e
variveis alfanumricas so inicializadas com espaos.
Se a varivel especificada for um tem de grupo, todos os
seus sub-itens sero inicializados de acordo com seu
formato : os que forem numricos, sero inicializados
com zero (respeitando-se seu formato : zonado,
compactado ou binrio) ; se a varivel for alfanumrica
ou alfabtica, ela ser inicializada com espaos.
Da mesma forma, se a varivel tiver a clusula OCCURS,
todas as suas ocorrncias sero inicializadas.
Pode-se especidficar um contedo alternativo para a
inicializao, atravs da clusula REPLACING.

Exemplo 1 :
INITIALIZE TABELA

INITIALIZE varivel
[REPLACING [NUMERIC | ALPHABETIC] DATA
BY literal/varivel]
42

Exemplo 2 :
INITIALIZE TABELA REPLACING
NUMERIC DATA BY ZERO
Exemplo 3 :
INITIALIZE TABELA REPLACING
ALPHABETIC DATA BY SPACES
Exemplo 4 :
01 AREA-MISTA.
05 AM1 PIC 9(05).
05 AM2 PIC 9(05) COMP-3.
05 AM3 PIC X(05).
05 AM4.
10 AM5 OCCURS 5 PIC 9(05).
10 AM6 OCCURS 5 PIC 9(05) COMP-3.
10 AM7 OCCURS 5 PIC X(05).

O comando INITIALIZE AREA-MISTA


atribui :
Zeros (zonados) a AM1
Zeros (compactados) a AM2
Espaos a AM3
Zeros (zonados) a AM5(1) AM5(2)
AM5(3) AM5(4) e AM5(5)
Zeros (compactados) a AM6(1)
AM6(2) AM6(3) AM6(4) e AM6(5)
Espaos a AM7(1) AM7(2) AM7(3)
AM7(4) e AM7(5)
Exemplo 4 :
01

TABELA-ACUMULADORES.
ELEMENTO OCCURS 5000.
10 SIGLAPROD PIC X(005).
10 VALOR
PIC 9(011)V99.

05

O comando INITIALIZE TABELAACUMULADORES atribui :


Espaos a SIGLAPROD(1) at
SIGLAPROD(5000)
Zeros (zonados) a VALOR(1) at
VALOR(5000)
16
.

INSPECT

Efetua anlise e substituio de dados que estejam em


uma varivel.
Sintaxe 1 (conta quantidade de ocorrncias de caracteres
ou strings em um string; a quantidade de ocorrncias
colocada em var_vezes):
INSPECT variavel TALLYING var_vezes
FOR CHARACTERS {BEFORE | AFTER}
INITIAL {var | lit}
Ou
INSPECT variavel TALLYING var_vezes
FOR {ALL | LEADING} {var | lit}
{BEFORE | AFTER} INITIAL {var | lit}
Sintaxe 2 (substitui ocorrncias de caracteres ou strings
em um string; o string de e o string para devem ter o
mesmo tamanho):
INSPECT variavel REPLACING
CHARACTERS {var | lit}
{BEFORE | AFTER} INITIAL {var | lit}
Ou
INSPECT variavel REPLACING
{ALL | LEADING | FIRST} {var | lit}
BY {var | lit} {BEFORE | AFTER}
43

INITIAL {var | lit}


Sintaxe 3 (combinao dos 2 formatos anteriores : conta
enquanto substitui):
INSPECT variavel TALLYING var_vezes
FOR contar
REPLACING substituir
Sendo
contar :
CHARACTERS {BEFORE | AFTER}
INITIAL {var | lit}
Ou
{ALL | LEADING} {var | lit}
{BEFORE | AFTER}
INITIAL {var | lit}
Substituir :
CHARACTERS {var | lit}
{BEFORE | AFTER}
INITIAL {var | lit}
Ou
{ALL|LEADING|FIRST} {var|lit}
BY {var|lit}
{BEFORE|AFTER} INITIAL {var|lit}
Sintaxe 4 (para substituir ocorrncias de diversos
caracteres em um string : o primeiro caracter do
CONVERTING ser substituido pelo primeiro caracter do
TO; o segundo do CONVERTING pelo segundo do TO e
assim por diante ):
INSPECT variavel CONVERTING
{var | lit} TO {var | lit}
{BEFORE | AFTER} INITIAL {var | lit}
17
.

MOVE

Efetua a cpia de um campo para uma varivel (ou mais


variveis)
MOVE campo-emissor TO cpo-receptor-1
[cpo-receptor-2 ... cpo-receptor-n]

Varivel para varivel :


MOVE EMISSOR TO RECEPTOR
Literal alfanumrica para varivel :
MOVE "XXXXX" TO RECEPTOR

Ver adiante, apos esta tabela de comandos, tabela


completa explicativa de funcionamento
do MOVE.

Uma literal numrica para vrias variveis


MOVE 0 TO CONTADOR LINHAS
FOLHAS TOTAL-GASTO

Observe que em todos os casos o campo receptor uma


varivel !!!

Uma literal alfanumrica para vrias variveis


MOVE "NAO" TO QUEBRA-BCO
QUEBRA-AGE QUEBRA-CONTA
Uma CONSTANTE FIGURATIVA para vrias

44

variveis
MOVE SPACES TO LINDET1 LINDET2
LINDET3
Outros exemplos :
MOVE EMISSOR TO RECEPTOR
MOVE "XXXXX" TO RECEPTOR
MOVE 0 TO CONTADOR LINHAS
FOLHAS TOTAL-GASTO
MOVE "NAO" TO QUEBRA-BCO
QUEBRA-AGE
QUEBRA-CONTA
MOVE SPACES TO LINDET1 LINDET2
LINDET3
MOVE FUNCTION CURRENT-DATE
(01:04) TO WS-ANO
MOVE FUNCTION CURRENT-DATE
(05:02) TO WS-MES
MOVE FUNCTION CURRENT-DATE
(07:02) TO WS-DIA
MOVE FUNCTION CURRENT-DATE
(09:02) TO WS-HOR
MOVE FUNCTION CURRENT-DATE
(11:02) TO WS-MIN
MOVE FUNCTION CURRENT-DATE
(13:02) TO WS-SEG
18
.

MULTIPLY

Efetua a multiplicao entre variveis


MULTIPLY parcela(s) BY varivel(is)resultado
[GIVING variavel-resultado]
[ROUNDED]
[ [NOT] ON SIZE ERROR comando(s) ]
[END-MULTIPLY ] ]

19
.

NEXT

MULTIPLY 2 BY VALOR
MULTIPLY VALOR BY 2 GIVING
DOBRO
MULTIPLY 2 BY VALOR GIVING
DOBRO

SEN Efetua um desvio para a prxima sentena (o incio dela Exemplo 1 :


TEN identificado pelo prximo ponto ou END-comando
IF A > B
CE
NEXT SENTENCE
ELSE
NEXT SENTENCE
DISPLAY A MENOR ou = B
END-IF.
CONTINUACAO.
DISPLAY PASSA AQUI.
Exemplo 2 :
IF A > B
NEXT SENTENCE
ELSE
DISPLAY A MENOR ou = B
END-IF
DISPLAY PASSA AQUI.
45

CONTINUACAO.
DISPLAY PASSA AQUI TBEM.
20
.

OPEN
Efetua a abertura de arquivo(s)
OPEN [INPUT | OUTPUT | I/O]
Nome-arquivo1
[ nome-arquivo2 ... nome-arquivon ]

21
.

PERFORM

Efetua a execuo de um conjunto de instrues que no


estejam em linha (sub-rotina), isto , desvia para a
instruo indicada (que deve ser o incio da sub-rotina), e
executa a partir desse ponto at chegaar ao ponto de
retorno, quando ento desvia para a instruo subsequente
ao PERFORM.
Sintaxe 1:
PERFORM procname

OPEN
OPEN
OPEN
OPEN
OPEN
OPEN
OPEN
OPEN

INPUT ARQENTRA
OUTPUT ARQSAI
ARQENTRA
I-O ARQENTSAI
INPUT ARQENT1, ARQENT2
OUTPUT ARQSAI1, ARQSAI2
I-O ARQES1, ARQES2, ARQES3
INPUT ARQENT1
OUTPUT ARQSAI1
I-O ARQES1
OPEN INPUT ARQENT1 ARQENT2
OUTPUT ARQSAI1 ARQSAI2
I-O ARQES1

PERFORM ROTINA1

Executa a SECTION inteira se procname for um nome de


PERFORM ABENDAR
SECTION
Executa at a instruo que antecede o procedure-name
seguinte se procname no for um nome de SECTION.
Sintaxe 2:
PERFORM procname UNTIL condio
Executa n vezes a SECTION inteira se procname for
nome de SECTION
Executa n vezes o lao que vai desde procname at a
instruo que antecede o procedure-name seguinte.

PERFORM IMPDET UNTIL LINS > 59

O fim da repetio do lao ocorre quando a condio


especificada for satisfeita.
A responsabilidade de inicializar uma varivel de controle
(relacionada condio) e de alter-la do programador.
Sintaxe 3:
PERFORM UNTIL condio
.
.
END-PERFORM

PERFORM UNTIL LINHAS > 59


PERFORM IMP-LINDET
END-PERFORM

Executa o bloco de instrues especificado entre o


PERFORM e o
46

END-PERFORM at que a condio seja satisfeita.


A responsabilidade de inicializar uma varivel de controle
(relacionada condio) e de alter-la do programador.
Sintaxe 4:
PERFORM procname

TIMES

PERFORM IMPDET 60 TIMES

Executa o bloco de instrues que se inicia em procname


e termina em :
Se procname for um nome de SECTION, executa a
SECTION inteira.
Se procname for o nome de uma instruo comum,
executa at a instruo que antecede o procedure-name
seguinte.
Tantas vezes quantas n indicar (n pode ser uma literal
ou uma varivel).

PERFORM IMPDET VEZES TIMES

Sintaxe 5:
PERFORM procname-x THRU procname-y

Exemplo 1 (executa desde XXX at a instruo


anterior ZZZ).:
PERFORM XXX THRU YYY
Procname-x e procname-y no podem ser nomes de
...
SECTION.
Executa o bloco de instrues que se inicia em procname- XXX.
...
x e termina em:
YYY.
Procname-y se esse procedure name tiver uma instruo
...
EXIT (recomendado)
ZZZ.
Na instruo imediatamente anterior ao procedure name
seguinte a procname-y se esse procname-y tiver outra
Exemplo 2 (Executa desde XXX at YYY
instruo que no seja EXIT
inclusive):
PERFORM XXX THRU YYY
Tantas vezes quantas n indicar (n pode ser uma literal
...
ou uma varivel)
.
XXX.
A responsabilidade de inicializar uma varivel de controle
...
(relacionada condio) e de alter-la do programador.
.
YYY. EXIT.
Sintaxe 6:
PERFORM procname-x THRU procname-y
n
TIMES
Executa o bloco de instrues conforme sintaxe 5, n
vezes

PERFORM XXX THRU YYY 12 TIMES


...
.
.
YYY. EXIT.
Executa desde XXX at YYY (volta quando
encontra o EXIT) 12 vezes

Sintaxe 7:
PERFORM procname-x VARYING
n BY m UNTIL condico

campo FROM

Executa o bloco de instrues conforme sintaxe 1, at que


47

PERFORM IMPDET VARYING LINHAS


FROM 1 BY 1 UNTIL LINHAS EQUAL
60

a condio especificada seja satisfeita.


Antes de executar o bloco de instrues pela primeira vez,
atribui o valor n varivel campo.
Aps cada execuo do bloco, antes de voltar a executlo, incrementa m varivel campo.
Sintaxe 8:
PERFORM procname-x THRU procname-y VARYING
campo FROM n BY m UNTIL condico

PERFORM IMPDET THRU SAI-IMPDET


VARYING LINHAS FROM 1 BY 1 UNTIL
Executa o bloco de instrues conforme sintaxe 5, at que LINHAS EQUAL 60

a condio especificada seja satisfeita.


Antes de executar o bloco de instrues pela primeira vez,
atribui o valor n varivel campo.
Aps cada execuo do bloco, antes de voltar a executlo, incrementa m varivel campo.
22
.

READ
Efetua a leitura de um registro lgico, colocando-o em
uma (ou duas) varivel (eis).
Caso seja detectado fim de arquivo, o processamento
desviado para a(s) instruo(es) imperativas indicadas na
clusula AT END.
Se no for especificada a rea da Working-Storage
Section, o registro ficar na rea declarada em nvel
01 no FD do arquivo
Se for especificada a rea da Working-Storage
Section, o registro ficar tanto na rea do FD do
arquivo quanto na rea da Working-Storage Section.
Para leitura sequrencial :
READ nome-arquivo [INTO nome-areaworking] [AT END comando-imperativo]
[END-READ]

READ ARQUIVO-ENTRADA-SEQUENCIAL
AT END GO TO TERMINOU.
NO-TERMINOU.
...
READ ARQ-ENTRA-SEQ
AT END MOVE S TO EOFARQ.
IF
EOFARQ = S
PERFORM ROTFIM THRU SAIRF
ELSE
PERFORM ROTPRO THRU SAIRP.

Para leitura direta :


READ nome-arquivo [INTO nome-areaworking]
INVALID KEY comandos-imperativos
[END-READ]

READ ARQUIVO-ENTRADA-DIRETO.
IF FILE-STATUS-ARQUIVO = ...

... depois do READ testar file status ...

23
.

REWRITE
Efetua a regravao (atualizao in-place) de um
registro lgico em um arquivo.
Para arquivos sequenciais :
48

REWRITE AREA-GRAV
REWRITE AREA-GRAV FROM
REGISTRO-FUNCIONARIO

... antes o registro deve ter sido lido ...

REWRITE area-do-fd [FROM area-daworking]


[END-REWRITE]

REWRITE AG-FS INVALID KEY


DISPLAY CHAVE NO EXISTE

Para arquivos indexados (VSAM KSDS) :

REWRITE AG NOT INVALID KEY

... antes o registro deve ter sido lido ... CHAVE OK ATUALIZADO

REWRITE area-do-fd [NOT] INVALID KEY


comandos-imperativos
[END-REWRITE]
24
.

SEARCH

Efetua pesquisa sequencial ou binaria em vetor.


Sintaxe 1 (Pesquisa sequencial)
SEARCH vetor_pesquisa_seq
VARYING variavel_ou_indexador
AT END imperativo
WHEN condicao
{imperativo | NEXT SENTENCE}
[END-SEARCH]
vetor_pesquisa_seq deve ser definido com
OCCURS com a clausula INDEXED BY

*** declara variaveis ***


05 T-VET PIC 9(03) VALUE ZERO.
05 VET-BANCO.
SEARCH ALL vetor_pesquisa_bin
OCCURS 1 TO 20 TIMES
AT END imperativo
DEPENDING ON T-VET
WHEN condicao imperativo/NEXT SENTENCE
ASCENDING KEY IS VET-COD
INDEXED BY X-BCO.
[END-SEARCH]
10 VET-COD PIC 9(03) VALUE 0.
10 VET-NOM PIC X(15) VALUE
vetor_pesquisa_bin deve ser definido com
SPACES.
OCCURS com a clausula INDEXED BY e ASCENDING *** constroi vetor ***
SET IND-BCO TO 1.
ou DESCENDING KEY .
PERFORM UNTIL T-VET = 15
ADD 1 TO T-VET
condicao pode ser especificada de uma das 2 formas :
MOVE T-VET TO VET-COD (X-BCO)
MOVE xxxx TO VET-NOM (X-BCO)
SET X-BCO UP BY 1
nome_de_condicao
END-PERFORM.
*** pesquisa vetor ***
ou
SEARCH ALL VET-BANCO

Sintaxe 2 (Pesquisa binaria)

49

variavel { EQUAL TO | = } {variavel |


literal | expressao }
25
.

SET

Para colocar valores em indices ou condicoes.

AT END DISPLAY 'BCO NO TEM'


WHEN VET-COD (X-BCO)
EQUAL QUERO-COD-BCO
PERFORM ACHOU-BCO.

Ver exemplo em SEARCH

Sintaxe 1 : para colocar valor em indice ou para colocar o


valor de um indice numa variavel
SET {variavel | indice }
TO {variavel | indice | literal_int}
Sintaxe 2 : para alterar valor de um indice
SET indice { UP | DOWN }
BY {variavel | literal_int}
Sintaxe 3 : para alterar valor de um mnemonic name
SET mnemonic_name TO { ON | OFF }
Sintaxe 4 : para alterar valor de um condition name para
TRUE
SET condition_name TO TRUE

26
.

START
Posiciona o arquivo no primeiro registro da faixa
desejada. O posicionamento NO L nenhum
registro, apenas deixa um ponteiro indicando que o
prximo READ deve ler na posio do arquivo marcada.
START nome-arquivo
KEY
GREATER
>
EQUAL
=
NOT LESS
NOT <
chave-area-fd
[NOT] INVALID KEY imperativo
[END-START]

27
.

STOP RUN
Encerra a execuo de um programa (devolve o controle
ao sistema operacional).
STOP RUN
50

STOP RUN

28
.

STRING

Efetua a concatenao de diversos campos, gerando um


nico campo de destino.
STRING origem1 [ origem2 ... origemn]
[DELIMITED BY {delimitador / SIZE}]
INTO destino
[WITH POINTER posicao]
[ON OVERFLOW comando-imperativo]
[END-STRING]
origem : campos de origem cujo contedo sero
concatenados para formar o contedo do campo de
destino. Pode ser literal no-numrico, constante
figurativa de um caractere, ou uma varivel.
DELIMITED BY SIZE indica que o campo origem
deve ser movido inteiro (a menos que o campo receptor
tenha sido completado).
DELIMITED BY delimitador indica que o campo
origem deve ser movido at o byte anterior quele cujo
contedo for indicado por delimitador.
INTO destino : indica o nome de uma varivel que
receber o contedo concatenado dos campos de origem.
Deve ser alfanumrico sem smbolo de edio e sem a
clusula JUSTIFIED.
WITH POINTER posicao indica o nome de uma
varivel numrica (inteira) que tem a posio inicial a
partir da qual sero movidos os dados para o campo
receptor e que, aps a execuo do comando STRING ,
ter o nmero original (posio inicial) acrescido da
quantidade de caracteres movidos dos campos de origem
para o de destino.
Se omitido, assumido que o movimento inicia-se a partir
da posio 1.
Se em qualquer ponto o contedo da varivel indicada por
POINTER for menor que 1 ou maior que o tamanho do
destino, no ocorrer nenhum movimento de dado, e a
condio de OVERFLOW ocorrer.
ON OVERFLOW comando_imperativo indica o
procedimento a ser efetuado casa haja algum erro.
No h nenhum preenchimento automtico de espao(s)
em nenhuma posio da varivel de destino. Isto , as
posies de destino que no tiverem correspondente nas
origens, no sero preenchidas com nenhum contedo
(brancos, por exemplo). Elas simplesmente no so
alteradas.

51

Exemplo 1:
01 WS-MSG PIC X(3).
MOVE SPACES TO WS-MSG
STRING A B C INTO WS-MSG
WS-MSG fica com ABC
Exemplo 2:
01 WS-NOME PIC X(10).
01 WS-MSG PIC X(05).
MOVE SPACES TO WS-MSG
STRING NOME= WS-NOME ! INTO
WS-MSG
Se WS-NOME tiver SCHIESARI. WSMSG fica com NOME=SCHIESARI.!
Exemplo 3:
01 WS-MSG PIC X(6).
MOVE SPACES TO WS-MSG
STRING A BC DEF INTO
WS-MSG
WS-MSG fica com ABCDEF
Exemplo 4:
01 WS-MSG PIC X(6).
MOVE SPACES TO WS-MSG
STRING A B C D E F G H I
DELIMITED BY SPACE INTO WS-MSG
WS-MSG fica com ADG
Exemplo 5:
01 DT-DATA PIC X(10).
01 CONT PIC 9(02).
01 DIA
PIC X(2).
01 MS
PIC X(2).
01 ANO
PIC X(4).
MOVE SPACES TO DT-DATA
MOVE 1 TO CONT
STRING DIA '/' MES '/' ANO
DELIMITED BY SIZE
INTO DT-DATA POINTER CONT
SUBTRACT 1 FROM CONT
DISPLAY 'BYTES MOVIDOS=' CONT
DISPLAY 'DATA=' DT-DATA

Exemplo 6:
01 DT-DATA PIC X(10).
01 CONT PIC 9(02).
01 DIA
PIC X(2).
01 MS
PIC X(2).
01 ANO
PIC X(4).
MOVE SPACES TO DT-DATA
MOVE 1 TO CONT

STRING DIA '/' MES '/' ANO


DELIMITED BY SIZE
INTO DT-DATA POINTER CONT
STRING DIA '/' MES '/' ANO
DELIMITED BY SIZE
INTO DT-DATA POINTER CONT
ON OVERFLOW MOVE 'S' TO ERRO
END-STRING
SUBTRACT 1 FROM CONT
IF ERRO = 'N'
SUBTRACT 1 FROM CONT
DISPLAY 'BYTES MOVIDOS=' CONT
DISPLAY 'DATA=' DT-DATA
ELSE
DISPLAY 'OCORREU ERRO'
END-IF

29
.

SUBTRACT

Efetua subtrao.
Sintaxe 1 :
SUBTRACT subtraendo FROM resto
[ROUNDED] [ [NOT] ON SIZE ERROR
comando(s) ]
[END-SUBTRACT]
Sintaxe 2 :
SUBTRACT subtraendo FROM minuendo
[GIVING variavel-resultado] [ROUNDED]
[ [NOT] ON SIZE ERROR comando(s)]
[END-SUBTRACT]

30
.

UNSTRING

Efetua a separao de dados que estejam num nico


campo, colocando-os em diversos campos de destino.
UNSTRING identificador-1
[ DELIMITED BY [ALL] operando1 [OR
[ALL] operando-2]...]
INTO {identificador-2
[DELIMITER IN identificador-3]
[COUNT IN identificador-4]}...
[WITH POINTER identificador-5]
TALLYING IN identificador-6]
[ON OVERFLOW comando-imperativo]
[END-UNSTRING]
DELIMITED BY ALL delim-geral-1 : indica
para considerar como um nico delimitador ocorrncias
contguas iguais especificada em delimitador2
DELIMITED BY delim-geral-1 : indica que o
campo origem deve ser movido at o byte anterior quele
cujo contedo for indicado por delimitador1.
INTO destino1 : indica uma das variveis de
destino. Os campos receptores (destino-n) podem ser
52

SUBTRACT 1 FROM FALTA.


SUBTRACT CONTA FROM VALOR.

SUBTRACT 1 FROM VEZES GIVING


FALTA
SUBTRACT CONTA FROM PAGOU
GIVING TROCO
01 DIA
PIC X(2).
01 MES
PIC X(2).
01 ANO
PIC X(4).
* O TAMANHO DA STRING INICIAL
* INFLUENCIA NOS CONTADORES
01 DT-DATA
PIC X(10) VALUE
'27/10.2003'.
01 S1
PIC X(6) VALUE SPACES.
01 S2
PIC X(7) VALUE SPACES.
01 CONT1
PIC 99 VALUE 0.
01 CONT2
PIC 99 VALUE 0.
01 CONT3
PIC 99 VALUE 0.
* O CONTADOR USADO NO POINTER TEM QUE
* SER MAIOR QUE ZERO
01 CONT-PONT
PIC 99 VALUE 1.
01 CONT-TALL
PIC 99 VALUE 0.
01 ERRO
PIC X(3) VALUE 'NAO'.

UNSTRING DT-DATA
DELIMITED BY SPACE OR '/' OR '.'
INTO DIA DELIMITER IN S1
COUNT IN CONT1
MES DELIMITER IN S2
COUNT IN CONT2
ANO COUNT IN CONT3
WITH POINTER CONT-PONT

TALLYING IN CONT-TALL
Alfanumrico no editado (ou tem de grupo) ou
ON OVERFLOW MOVE 'SIM' TO ERRO.
Numrico decimal zonado (cujo PIC no tenha nenhum
caractere P).
UNSTRING DT-DATA
DELIMITER IN delim-dest : delimitador est
DELIMITED BY '/'
neste campo de destino.
INTO DIA, MES, ANO.
COUNT IN qtos-bytes : varivel numrica que
UNSTRING DT-DATA
receber a quantidade de caracteres movidos para
DELIMITED BY '/'
destino1
INTO DIA COUNT IN CONT1
WITH POINTER posicao : varivel numrica
MES COUNT IN CONT2
(inteira) que tem a posio inicial a partir da qual sero
ANO COUNT IN CONT3
movidos os dados do campo origem e que, aps a
WITH POINTER CONT-PONT
execuo do comando UNSTRING, ter o nmero
TALLYING IN CONT-TALL
(posio inicial) original acrescido da quantidade de
ON OVERFLOW MOVE 'SIM' TO ERRO.
caracteres movidos dos campos de origem para o de
destino. Se omitido, assumido que o movimento iniciase a partir da posio 1.
Se em qualquer ponto o conteudo da variavel indicada por
POINTER for menor que 1 ou maior que o tamanho da
origem, ocorre a condio de erro e ser executado o(s)
comando(s) especificados em OVERFLOW.
ON OVERFLOW comando-imperativo : se
houver algum erro ocorre OVERFLOW e o controle
passa para o(s) comando(s) imperativo(s) especificado(s).
TALLYING IN qtd-destinos : varivel
numrica inteira que recebe a quantidade de campos
destino utilizados.

31
.

WRITE
Efetua a gravao de um registro lgico em um arquivo.
Se no for especificada a rea da Working-Storage
Section, o registro ser obtido da rea declarada em
nvel 01 na (Data Division) FILE SECTION / FD do
arquivo
Se for especificada a rea da Working-Storage
Section, o registro ser obtido da rea da WorkingStorage Section , copiado para a rea da (Data
Division) FILE SECTION / FD do arquivo , e
gravado.
Para gravao sequencial :
WRITE area-do-fd [FROM area-daworking-storage]

WRITE AREA-DE-GRAVACAO

Para gravao direta :


WRITE area-do-fd [FROM area-daworking-storage] [NOT] INVALID KEY
comandos_imperativos
[END-WRITE]

WRITE AG-FD FROM AG-WSS


NOT INVALID KEY
DISPLAY "JA TINHA REG
COM ESSA CHAVE"
END-WRITE

53

WRITE AREA-DA-FD FROM AREA-DAWORKING

Para impresso: imprimir e depois pular de pgina :


WRITE area-do-fd [FROM area-daworking] BEFORE [ADVANCING] PAGE
Para impresso : imprimir e depois pular n linhas
(n pode estar em uma varivel ou ser especificado por
uma literal; pode ser 1 , 2 ou 3)
WRITE area-do-fd [FROM area-daworking] BEFORE [ADVANCING] n [LINES]
Para impresso : imprimir e depois pular n linhas
(mnemnico deve ser definido em SPECIAL
NAMES na Configuration Section)
WRITE area-do-fd BEFORE ADVANCING
mnemnico
Para impresso: pular de pgina e depois imprimir :
WRITE area-do-fd [FROM area-daworking] AFTER [ADVANCING] PAGE
Para impresso: pular 1 linha e depois imprimir :
(n pode estar em uma varivel ou ser especificado por
uma literal; pode ser 1 , 2 ou 3)
WRITE area-do-fd [FROM area-daworking] AFTER [ADVANCING] n [LINES]

Para impresso : pular n linhas e depois imprimir


(mnemnico deve ser definido em SPECIAL
NAMES na Configuration Section)
WRITE area-do-fd AFTER [ADVANCING]
mnemnico

54

WRITE LCAB BEFORE ADVANCING PAGE

WRITE LDET BEFORE ADVANCING 1


WRITE ARIMP BEFORE ADVANCING 2
WRITE LDET2 BEFORE ADVANCING 3
WRITE ARIMP BEFORE ADVANCING CONTR

WRITE ARIMP BEFORE ADVANCING PULO

WRITE ARIMP AFTER ADVANCING PAGE

WRITE ARIMP AFTER ADVANCING 2

WRITE ARIMP AFTER ADVANCING PULO

Tabela de funcionamento do MOVE


Campo
Origem
PIC X

Campo
Destino
PIC X

Sentido do
movimento
Esquerda para
Direita

PIC 9(n)

PIC 9(m)

(ambos so
nmeros
inteiros)
Direita para
Esquerda

PIC 9(n)V9(d)

PIC 9(m)

Parte inteira :
Direita para
Esquerda

PIC 9(n)V9(d)

PIC 9(m)V9(f)

Parte decimal :
No movida
pois o campo
destino
nmero inteiro
Parte inteira :
Direita para
Esquerda
Parte decimal :
Esquerda para
Direita

Preenchimento e / ou
Truncamento
Se tamanho campo origem > tamanho campo destino :
preenche os bytes sobrando direita do destino com
espaos
Se tamanho campo origem menor tamanho campo
destino : trunca os bytes direita que estiverem
faltando no destino
Se tamanho campo origem > tamanho campo destino :
preenche os algarismos sobrando esquerda do destino
com zeros
Se tamanho campo origem menor tamanho campo
destino : trunca os algarismos esquerda que estiverem
faltando no destino
Parte inteira :
Se tamanho campo origem > tamanho campo destino :
preenche os algarismos sobrando esquerda do destino
com zeros
Se tamanho campo origem menor tamanho campo
destino : trunca os algarismos esquerda que estiverem
faltando no destino
Parte decimal : no movida, portanto no ocorre nem
preenchimento nem truncamento
Parte inteira :
Se tamanho campo origem > tamanho campo destino :
preenche os algarismos sobrando esquerda do destino
com zeros
Se tamanho campo origem menor tamanho campo
destino : trunca os algarismos esquerda que estiverem
faltando no destino
Parte decimal :
Se tamanho campo origem > tamanho campo destino :
preenche os algarismos sobrando direita do destino
com zeros
Se tamanho campo origem menor tamanho campo
destino : trunca os bytes direita que estiverem
faltando no destino

55

Exemplos de MOVEs com constantes figurativas


Comando

Campo emissor
(constante
figurativa)

MOVE
MOVE
MOVE
MOVE
MOVE
MOVE
MOVE
MOVE
MOVE
MOVE
MOVE
MOVE
MOVE

ZERO
ZEROS
ZEROES
ZERO
ZEROS
ZEROES
SPACE
SPACES
HIGH-VALUE
HIGH-VALUES
LOW-VALUE
LOW-VALUES
QUOTE

ZERO TO TOTSAL
ZEROS TO TOTSAL
ZEROES TO TOTSAL
ZERO TO TOTSAL
ZEROS TO TOTSAL
ZEROES TO TOTSAL
SPACE TO SIGLA
SPACES TO SIGLA
HIGH-VALUE TO WWW
HIGH-VALUES TO WWW
LOW-VALUE TO WWW
LOW-VALUES TO WWW
QUOTE TO YYY

MOVE QUOTES TO YYY

QUOTES

MOVE ALL * TO WW-MSG ALL *


MOVE ALL *A TO WW-MSG ALL *A

Campo receptor :
formato

Contedo do campo
receptor
aps o MOVE
(expresso em hexa)
PIC 9(7) COMP-3 00.00.00.0C
PIC 9(7) COMP-3 00.00.00.0C
PIC 9(7) COMP-3 00.00.00.0C
PIC 9(5)
F0.F0.F0.F0.F0
PIC 9(5)
F0.F0.F0.F0.F0
PIC 9(5)
F0.F0.F0.F0.F0
PIC X(02)
40.40
PIC X(02)
40.40
PIC X(03)
FF.FF.FF
PIC X(03)
FF.FF.FF
PIC X(03)
00.00.00
PIC X(03)
00.00.00
PIC X(05)
7D.7D.7D.7D.7D
7F.7F.7F.7F.7F
PIC X(05)
7D.7D.7D.7D.7D
7F.7F.7F.7F.7F
PIC X(05)
5C.5C.5C.5C.5C
PIC X(05)
5C.C1.5C.C1.5C

56

ou
ou

11 - RELATRIOS
Conceitos gerais :

Primeiro byte esquerda da linha (da varivel com os dados a serem impressos na linha)
reservado para conter o caracter de controle de espacejamento , um cdigo que vai indicar
impressora o espacejamento a ser efetuado antes ou depois da impresso.
Existem basicamente 2 tipos (de padro) de caracter de controle que podem ser usados :

Cdigo ASA (American Standard Association) = WRITE area_fd AFTER ...


primeiro salta e depois imprime
1
(espao)
0 (zero)
- (hfen)
2
3
4
5
6
7
8
9

saltar de folha (para o canal 1) e depois imprimir


saltar 1 linha e depois imprimir (sem linhas em branco entre 2 linhas impressas)
saltar 2 linhas e depois imprimir (1 linha em branco entre 2 linhas impressas)
saltar 3 linhas e depois imprimir (2 linha em branco entre 2 linhas impressas)
saltar para o canal 2 e depois imprimir
saltar para o canal 3 e depois imprimir
saltar para o canal 4 e depois imprimir
saltar para o canal 5 e depois imprimir
saltar para o canal 6 e depois imprimir
saltar para o canal 7 e depois imprimir
saltar para o canal 8 e depois imprimir
saltar para o canal 9 e depois imprimir

Cdigo de mquina = WRITE area_fd BEFORE ...


Primeiro imprime e depois salta

Codigo

Ao

X09
X0B
X11
X13
X19
X1B
X89
X8B
X91
X93
X99
X9B
XA1
XA3
XA9
XAB
XB1

imprime e depois salta 1 linha


salta 1 linha (sem imprimir)
imprime e depois salta 2 linhas
salta 2 linhas (sem imprimir)
imprime e depois salta 3 linhas
salta 3 linhas (sem imprimir)
imprime e depois salta para o canal 1
salta para o canal 1 (sem imprimir)
imprime e depois salta para o canal 2
salta para o canal 2 (sem imprimir)
imprime e depois salta para o canal 3
salta para o canal 3 (sem imprimir)
imprime e depois salta para o canal 4
salta para o canal 4 (sem imprimir)
imprime e depois salta para o canal 5
salta para o canal 5 (sem imprimir)
imprime e depois salta para o canal 6

XB3
XB9
XBB
XC1
XC3
XC9
XCB
XD1
XD3
XD9
XDB
XE1
XE3

57

salta para o canal 6 (sem imprimir)


imprime e depois salta para o canal 7
salta para o canal 7 (sem imprimir)
imprime e depois salta para o canal 8
salta para o canal 8 (sem imprimir)
imprime e depois salta para o canal 9
salta para o canal 9 (sem imprimir)
imprime e depois salta para o canal 10
salta para o canal 10 (sem imprimir)
imprime e depois salta para o canal 11
salta para o canal 11 (sem imprimir)
imprime e depois salta para o canal 12
salta para o canal 12 (sem imprimir)

Frequentemente o tamanho das linhas num programa de 133 bytes pois :

O primeiro byte esquerda reservado para que nele seja colocado o cdigo que indica
o espacejamento que deve ser dado associado impresso da linha

Os demais 132 bytes tem o contedo a ser impresso ; o tamanho de 132 deriva do fato de
que as impressoras originalmente utilizadas por mainframes tinham a capacidade fsica fixa de
impresso de 132 caracteres por linha

No sub-parmetro RECFM do parmetro DCB do statement DD do JCL , se for colocado

FBA significa que o caracter de controle de espacejamento ASA

FBM significa que o caracter de controle de espacejamento de mquina

Para ver o contedo do caracter de controle das linhas:

No ROSCOE :
Attachar o JOB com : A J nnn CC
No TSO :
Com o JOB j attachado , dar F10.

No COBOL :

1 WRITE = 1 linha

IMPORTANTE : num mesmo programa, no misturar BEFORE e AFTER para um mesmo arquivo

Primeiro salta, depois imprime :

Para saltar de folha, imprimir uma linha e ficar posicionado na linha que imprimiu =
WRITE area_fd [FROM area_wss] AFTER ADVANCING PAGE
Para avanar 1 linha, imprimir e ficar posicionado na linha que imprimiu =
WRITE area_fd [FROM area_wss] AFTER ADVANCING 1 [LINE]
Para avanar 2 linhas, imprimir e ficar posicionado na linha que imprimiu =
WRITE area_fd [FROM area_wss] AFTER ADVANCING 2 [LINES]
Para avanar 3 linhas, imprimir e ficar posicionado na linha que imprimiu =
WRITE area_fd [FROM area_wss] AFTER ADVANCING 3 [LINES]

Primeiro imprime, depois salta :

Para imprimir uma linha, saltar de folha e ficar posicionado na primeira linha da folha =
WRITE area_fd [FROM area_wss] BEFORE ADVANCING PAGE
Para imprimir, avanar 1 linha, e ficar posicionado nela =
WRITE area_fd [FROM area_wss] BEFORE ADVANCING 1 [LINE]
Para imprimir, avanar 2 linhas, e ficar posicionado na segunda aps a impressa (uma em branco a cada impressa) =
WRITE area_fd [FROM area_wss] BEFORE ADVANCING 2 [LINES]
58

Para imprimir, avanar 3 linhas, e ficar posicionado na terceira aps a impressa (duas em branco a cada impressa) =
WRITE area_fd [FROM area_wss] BEFORE ADVANCING 3 [LINES]

Exemplo :
O programa Cobol colocado a partir da prxima pgina l os dados abaixo :
1
2
3
4
5
6
7
8
12345678901234567890123456789012345678901234567890123456789012345678901234567890
000001NOME
000002NOME
000003NOME
000004NOME
000005NOME
000006NOME
000007NOME
000008NOME
000009NOME
000010NOME
000011NOME
000012NOME
000013NOME
000014NOME
000015NOME
000016NOME

PECA000001LITROS0100000001COMENTARIO
PECA000002LITROS0200000002COMENTARIO
PECA000003LITROS0300000003COMENTARIO
PECA000004LITROS0400000004COMENTARIO
PECA000005LITROS0500000005COMENTARIO
PECA000006LITROS0600000006COMENTARIO
PECA000007LITROS0700000007COMENTARIO
PECA000008LITROS0800000008COMENTARIO
PECA000009LITROS0900000009COMENTARIO
PECA000010LITROS1000000010COMENTARIO
PECA000011LITROS1100000011COMENTARIO
PECA000012LITROS1200000012COMENTARIO
PECA000013LITROS1300000013COMENTARIO
PECA000014LITROS1400000014COMENTARIO
PECA000015LITROS1500000015COMENTARIO
PECA000016LITROS1600000016COMENTARIO

PECA
PECA
PECA
PECA
PECA
PECA
PECA
PECA
PECA
PECA
PECA
PECA
PECA
PECA
PECA
PECA

000001
000002
000003
000004
000005
000006
000007
000008
000009
000010
000011
000012
000013
000014
000015
000016

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

E imprime o seguinte relatrio (a numerao fora do quadro para simples referncia das posies):
1
2
3
4
5
6
7
8
12345678901234567890123456789012345678901234567890123456789012345678901234567890
PAG.

1
***

TITULO PRINCIPAL
SUB TITULO
***

DATA: 02/09/2004--------------------------------------------------HORA: 14.51.07


CODIGO NOME

000001
000002
000003
000004
000005
000006
000007
000008
000009
000010
000011

NOME
NOME
NOME
NOME
NOME
NOME
NOME
NOME
NOME
NOME
NOME

UNIDADE

PECA000001
PECA000002
PECA000003
PECA000004
PECA000005
PECA000006
PECA000007
PECA000008
PECA000009
PECA000010
PECA000011

LITROS01
LITROS02
LITROS03
LITROS04
LITROS05
LITROS06
LITROS07
LITROS08
LITROS09
LITROS10
LITROS11

PRECO

OBSERVACAO

0,01
0,02
0,03
0,04
0,05
0,06
0,07
0,08
0,09
0,10
0,11

COMENTARIO
COMENTARIO
COMENTARIO
COMENTARIO
COMENTARIO
COMENTARIO
COMENTARIO
COMENTARIO
COMENTARIO
COMENTARIO
COMENTARIO

59

PECA
PECA
PECA
PECA
PECA
PECA
PECA
PECA
PECA
PECA
PECA

000001
000002
000003
000004
000005
000006
000007
000008
000009
000010
000011

*
*
*
*
*
*
*
*
*
*
*

1
2
3
4
5
6
7
8
12345678901234567890123456789012345678901234567890123456789012345678901234567890
PAG.

2
***

TITULO PRINCIPAL
SUB TITULO
***

DATA: 02/09/2004--------------------------------------------------HORA: 14.51.07


CODIGO NOME

000012
000013
000014
000015
000016

NOME
NOME
NOME
NOME
NOME

UNIDADE

PECA000012
PECA000013
PECA000014
PECA000015
PECA000016

LITROS12
LITROS13
LITROS14
LITROS15
LITROS16

PRECO

OBSERVACAO

0,12
0,13
0,14
0,15
0,16

COMENTARIO
COMENTARIO
COMENTARIO
COMENTARIO
COMENTARIO

PECA
PECA
PECA
PECA
PECA

000012
000013
000014
000015
000016

*
*
*
*
*

IDENTIFICATION DIVISION.
PROGRAM-ID. TESTE.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT ENTRA
ASSIGN TO ENTRA.
SELECT SAIDA
ASSIGN TO SAIDA.
*----------------------------------------------------------------DATA DIVISION.
FILE SECTION.
*------------*
FD
ENTRA.
01
AE-FD
PIC X(80).
FD
SAIDA.
01
AS-FD
PIC X(133).
*----------------------------------------------------------------WORKING-STORAGE SECTION.
*
01 FIMENTRA
PIC X(01) VALUE 'N'.
01 CONTLINS
PIC 9(05) VALUE 99.
01 CONTFOLS
PIC 9(05) VALUE ZERO.
01 AE.
05 AE-COD
PIC X(06).
05 AE-NOME
PIC X(15).
05 AE-UNID
PIC X(08).
05 AE-PRECO
PIC 9(06)V99.
05 AE-OBS
PIC X(36).
05 FILLER
PIC X(07).
01 AS.
60

05
05
*

01

01

01

01

01

AS-CTL
AS-DADOS

LCAB1.
05 FILLER
05 FILLER
05 LCAB1FOL
05 FILLER
05 FILLER
05 FILLER
LCAB2.
05 FILLER
05 FILLER
05 FILLER
05 FILLER
LCAB3.
05 FILLER
05 LCAB3-DATA
05 FILLER
05 LCAB3-HORA
LCAB4.
05 FILLER
05 FILLER
05 FILLER
05 FILLER
05 FILLER
05 FILLER
05 FILLER
05 FILLER
05 FILLER
05 FILLER
LDET.
05 FILLER
05 LDET-COD
05 FILLER
05 LDET-NOME
05 FILLER
05 LDET-UNID
05 FILLER
05 LDET-PRECO
05 FILLER
05 LDET-OBS

PIC X(01).
PIC X(80).
PIC
PIC
PIC
PIC
PIC
PIC

X(01).
X(04) VALUE
ZZ.ZZ9.
X(22) VALUE
X(16) VALUE
X(32) VALUE

PIC
PIC
PIC
PIC

X(01).
X(28) VALUE SPACES.
X(24) VALUE '***
SUB TITULO
X(28) VALUE SPACES.

PIC
PIC
PIC
PIC

X(01).
X(16) VALUE 'DATA: DD/MM/AAAA'.
X(50) VALUE ALL '-'.
X(14) VALUE 'HORA: HH.MM.SS'.

PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC

X(01).
X(06) VALUE
X(01) VALUE
X(15) VALUE
X(01) VALUE
X(08) VALUE
X(01) VALUE
X(10) VALUE
X(01) VALUE
X(37) VALUE

PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC

X(01).
X(06).
X(01) VALUE
X(15).
X(01) VALUE
X(08).
X(01) VALUE
ZZZ.ZZ9,99.
X(01) VALUE
X(36).

'PAG.'.
SPACES.
'TITULO PRINCIPAL'.
SPACES.

***'.

'CODIGO'.
SPACES.
'NOME'.
SPACES.
'UNIDADE'.
SPACES.
'PRECO'.
SPACES.
'OBSERVACAO'.

SPACES.
SPACES.
SPACES.
SPACES.

*
*---------------------------------------------------------------PROCEDURE DIVISION.
*---------------------------------------------------------------PROGRAMA SECTION.
*
MOVE FUNCTION CURRENT-DATE (07:2) TO LCAB3-DATA (07:2)
MOVE FUNCTION CURRENT-DATE (05:2) TO LCAB3-DATA (10:2)
MOVE FUNCTION CURRENT-DATE (01:4) TO LCAB3-DATA (13:4)
*
MOVE FUNCTION CURRENT-DATE (09:2) TO LCAB3-HORA (07:2)
61

MOVE FUNCTION CURRENT-DATE (11:2) TO LCAB3-HORA (10:2)


MOVE FUNCTION CURRENT-DATE (13:2) TO LCAB3-HORA (13:2)
*

OPEN
OPEN
VOLTALER.
READ
IF
IF

INPUT ENTRA.
OUTPUT SAIDA.
ENTRA INTO AE
AT END MOVE 'S' TO FIMENTRA.
FIMENTRA = 'S'
GO TO FECHAR.
CONTLINS GREATER 10
PERFORM CABEC.
AE-COD
TO LDET-COD.
AE-NOME
TO LDET-NOME.
AE-UNID
TO LDET-UNID.
AE-PRECO TO LDET-PRECO.
AE-OBS
TO LDET-OBS.
LDET
TO AS-FD.
AS-FD AFTER ADVANCING 1.
TO CONTLINS.
VOLTALER.

MOVE
MOVE
MOVE
MOVE
MOVE
MOVE
WRITE
ADD 1
GO TO
FECHAR.
CLOSE ENTRA SAIDA.
TERMINAR.
STOP RUN.
*---------------------------------------------------------------CABEC.
*---------------------------------------------------------------ADD
1
TO CONTFOLS.
MOVE
CONTFOLS TO LCAB1FOL.
MOVE
ZERO
TO CONTLINS.
MOVE
LCAB1
TO AS-FD.
WRITE AS-FD
AFTER ADVANCING PAGE.
MOVE
LCAB2
TO AS-FD.
WRITE AS-FD
AFTER ADVANCING 1.
MOVE
LCAB3
TO AS-FD.
WRITE AS-FD
AFTER ADVANCING 2.
MOVE
LCAB4
TO AS-FD.
WRITE AS-FD
AFTER ADVANCING 2.
MOVE
SPACES
TO AS-FD.
WRITE AS-FD
AFTER ADVANCING 3.
SAI-CABEC. EXIT.

62

12 SUB-ROTINAS
Programa principal (chamador)
Working-Storage Section.
Declarao da varivel parmetro
[e da varivel que ir conter o nome da rotina]

Procedure Division.
CALL nome_rotina [USING varivel_parmetro]
Ou
CALL variavel_com_nome_rotina [USING varivel_parmetro]

Sub-rotina (chamado)
Working-Storage Section.
Declarao das variveis de trabalho da rotina
Linkage Section.
Declarao da varivel parmetro.
Fisicamente elas esto no programa chamador.
Aqui somente uma mscara para que possa ser feita
referncia na Procedure Division.
Procedure Division USING varivel_parmetro.

63

Exemplos :
Chamador :
01 AREA-DE-INTERFACE.
05 ENVIANDO.
10 NUMERO-NUMERICO PIC 9(9)V99.
05 RECEBENDO.
10 COD-RETORNO
PIC 9(1).
10 NUMERO-EXTENSO PIC X(300).
CALL ROT-EXTENDER USING AREA-DE-INTERFACE.
IF COD-RETORNO = ZERO
PERFORM DISPLAY NUMERO-EXTENSO
ELSE
DISPLAY ERRO NO NUMERO FORNECIDO. CODIGO = COD-RETORNO
END-IF
Chamado :
LINKAGE SECTION.
01 AREA-DE-INTERFACE.
05 VOUPEGAR.
10 NUMERO-NUMERICO PIC 9(9)V99.
05 VOUDEVOLVER.
10 COD-RETORNO
PIC 9(1).
10 NUMERO-EXTENSO PIC X(300).
PROCEDURE DIVISION USING AREA-DE-INTERFACE.
PERFORM VALIDA-NUM
IF ERRO = SIM
MOVE 4 TO COD-RETORNO
ELSE
PERFORM TRANSFORMA-EM-TEXTO
MOVE ZERO TO COD-RETORNO
END-IF
RETURN

64

Chamador :
01 COMMAREA.
05 CHAMADOR.
10 CODCLI PIC 9(5).
05 CHAMADO.
10 COD-RETORNO
PIC 9(1).
10 NOMECLI
PIC X(30).
CALL PESQNOME USING COMMAREA.
IF COD-RETORNO = ZERO
PERFORM DISPLAY NOMECLI
ELSE
DISPLAY CLIENTE NO CADASTRADO (RC= COD-RETORNO )
END-IF
Chamado :
LINKAGE SECTION.
01 COMMAREA.
05 CHAMADOR.
10 CODCLI PIC 9(5).
05 CHAMADO.
10 COD-RETORNO
PIC 9(1).
10 NOMECLI
PIC X(30).
PROCEDURE DIVISION USING AREA-DE-INTERFACE.
PERFORM ACESSA-CADCLI
IF ACHOU = SIM
MOVE 0 TO COD-RETORNO
ELSE
MOVE 4 TO COD-RETORNO
END-IF
RETURN

65

//EPC##ARS JOB ('ALBERTO'),'ALBERTO',CLASS=1,MSGCLASS=X


//PROCLIB JCLLIB ORDER=(TORI243.T#RPC.SRC)
//*--------------------------------------------------------//* CATALOGACAO (COMPILACAO + LINKEDICAO)
//* DA ROTINA DENOMINADA SUBROT1
//*--------------------------------------------------------//STEP1
EXEC CALLCAT,MEMBER=SUBROT1
//COMPSUB.SYSIN DD *
ID DIVISION.
PROGRAM-ID.
SUBROT1.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
INPUT-OUTPUT SECTION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01
MENSAGEM PIC X(30) VALUE 'XXXXXXXXXXXXXXXXXXXXXXXXXX'.
PROCEDURE DIVISION.
DISPLAY 'PASSEI PELA SUBROTINA 1 ! '.
GOBACK.
//*--------------------------------------------------------//* CATALOGACAO (COMPILACAO + LINKEDICAO)
//* DA ROTINA DENOMINADA SUBROT2
//*--------------------------------------------------------//STEP2
EXEC CALLCAT,MEMBER=SUBROT2
//COMPSUB.SYSIN DD *
ID DIVISION.
PROGRAM-ID.
SUBROT2.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
INPUT-OUTPUT SECTION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01
MENSAGEM PIC X(30) VALUE 'XXXXXXXXXXXXXXXXXXXXXXXXXX'.
PROCEDURE DIVISION.
DISPLAY 'PASSEI PELA SUBROTINA 2 ! '.
GOBACK.
//*--------------------------------------------------------//* CATALOGACAO (COMPILACAO + LINKEDICAO)
//* DA ROTINA DENOMINADA SUBROT3
//*--------------------------------------------------------//STEP3
EXEC CALLCAT,MEMBER=SUBROT3
//COMPSUB.SYSIN DD *
ID DIVISION.
PROGRAM-ID.
SUBROT3.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
INPUT-OUTPUT SECTION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 MSG
PIC X(20) VALUE 'AQUI EH SUBROT3'.
LINKAGE SECTION.
01 AREA-COMUNICACAO.
05 PARTE1.
66

10 DIVIDENDO
PIC 9(15).
10 DIVISOR
PIC 9(5).
05 PARTE2.
10 NOSSO-RC
PIC 9(1).
10 COCIENTE
PIC 9(15).
10 RESTO
PIC 9(5).
PROCEDURE DIVISION USING AREA-COMUNICACAO.
DISPLAY MSG
IF DIVIDENDO NOT NUMERIC OR
DIVISOR NOT NUMERIC
MOVE 4 TO NOSSO-RC
ELSE
DIVIDE DIVIDENDO BY DIVISOR
GIVING COCIENTE REMAINDER RESTO
MOVE
0 TO NOSSO-RC
END-IF
GOBACK.
//*--------------------------------------------------------//* COMPILACAO + LINKEDICAO
//* DO PROGRAMA PRINCIPAL, CHAMADOR DE
//*
SUBROT1, SUBROT2 E SUBROT3
//*--------------------------------------------------------//STEP4
EXEC CALLCCLG,MEMBER=CHAMADOR
//COMPMAIN.SYSIN DD *
ID DIVISION.
PROGRAM-ID.
CHAMADOR.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
INPUT-OUTPUT SECTION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NOMEDELA
PIC X(8) VALUE SPACES.
01 AREA-COMUNICACAO.
05 PARTE1.
10 DIVIDENDO
PIC 9(15).
10 DIVISOR
PIC 9(5).
05 PARTE2.
10 NOSSORC
PIC 9(1).
10 COCIENTE
PIC 9(15).
10 RESTO
PIC 9(5).
PROCEDURE DIVISION.
DISPLAY '-----------------------------------------'.
CALL 'SUBROT1'
MOVE 'SUBROT2' TO NOMEDELA
CALL NOMEDELA
MOVE 'SUBROT3' TO NOMEDELA
MOVE 1234
TO DIVIDENDO
MOVE 5
TO DIVISOR
CALL NOMEDELA USING AREA-COMUNICACAO
DISPLAY 'DIVIDENDO= ' DIVIDENDO
DISPLAY 'DIVISOR = ' DIVISOR
DISPLAY 'COCIENTE = ' COCIENTE
DISPLAY 'RESTO
= ' RESTO
67

DISPLAY '-----------------------------------------'.
STOP RUN.
//GO.SYSPRINT DD SYSOUT=*
//GO.SYSOUT
DD SYSOUT=*
JOBNAME
EPC##ARS
EPC##ARS
EPC##ARS
EPC##ARS
EPC##ARS
EPC##ARS
EPC##ARS
EPC##ARS
EPC##ARS

STEPNAME
STEP1
STEP1
STEP2
STEP2
STEP3
STEP3
STEP4
STEP4
STEP4

PROCSTEP
COMPSUB
LKEDSUB
COMPSUB
LKEDSUB
COMPSUB
LKEDSUB
COMPMAIN
LKED
GO

PROGRAM
IGYCRCTL
IEWL
IGYCRCTL
IEWL
IGYCRCTL
IEWL
IGYCRCTL
IEWL
PGM=*.DD

RC
00
00
00
00
00
00
00
00
00

----------------------------------------PASSEI PELA SUBROTINA 1 !


PASSEI PELA SUBROTINA 2 !
AQUI EH SUBROT3
DIVIDENDO= 000000000001234
DIVISOR = 00005
COCIENTE = 000000000000246
RESTO
= 00004
-----------------------------------------

68

13 ARQUIVOS VSAM KSDS


13.1 Conceitos
File Status :
Sempre indicar no SELECT qual a varivel usada para o mtodo de acesso devolver um cdigo
que mostra o resultado da instruo pedida : o file status. Ela deve ser declarada na WORKINGSTORAGE SECTION com 2 bytes (alfanumrica) : PIC X(2).
Record Key ou Alternate Record Key :
As variveis referenciadas como RECORD KEY ou ALTERNATE RECORD KEY devem
obrigatriamente ser declaradas como parte do registro na File Section.
Operaes possveis :

Incluir registros num arquivo vazio

Incluir registros num arquivo que j tenha registros

Atualizar registros (update in-place no mesmo lugar fsico)


identificados pela chave primria
identificados pela chave alternada 1
identificados pela chave alternada 2
... e assim por diante ...

Ler sequencialmente (arquivo inteiro)


pela chave primaria
pela chave alternada 1
pela chave alternada 2
... e assim por diante ...

Ler sequencialmente (faixa de registros)


pela chave primaria
pela chave alternada 1
pela chave alternada 2
... e assim por diante ...

Ler aleatoriamente (diretamente) um registro


pela chave primaria
pela chave alternada 1
pela chave alternada 2
... e assim por diante ...

Deletar registros
pela chave primria
pela chave alternada 1
pela chave alternada 2
... assim por diante ...

Outras assemelhadas ...


69

Para alocar um VSAM :

Via JCL
//STEPALOC EXEC PGM=IEFBR14
//VKSDS1 DD DSN=DSVAABVS.LSG.A889.ALBERTO,DISP=(,CATLG,DELETE),
//
SPACE=(CYL,(10,10)),LRECL=100,KEYOFF=10,
//
KEYLEN=12,RECORG=KS

Via IDCAMS

//STEP1
EXEC PGM=IDCAMS
//SYSOUT
DD SYSOUT=*
//SYSUDUMP
DD SYSOUT=*
//SYSPRINT
DD SYSOUT=*
//SYSABOUT
DD SYSOUT=*
//SYSIN DD *
DEFINE
CLUSTER
( NAME('DSVAABVS.LSG.A889.ALBERTO')
INDEXED
FREESPACE(20 10)
KEYS(12 10)
RECORDSIZE(100 100)
NOREPLICATE
NOREUSE
SHAREOPTIONS(2 3)
) /* CLUSTER */
DATA
( NAME('DSVAABVS.EPC.ALBERTO.A001.DATA')
CYL(10 10)
CISZ(4096)
SPEED
) /* DATA */
INDEX
( NAME('DSVAABVS.EPC.ALBERTO.A001.INDEX')
TRACKS(5 5)
CISZ(2048)
) /* INDEX */

70

DD para VSAM
Considerando um arquivo declarado com SELECT arquivo ... :
Se tiver RECORD KEY aberto o arquivo //ddname DD DSN=nome_arquivo

Se tiver ALTERNATE RECORD KEY : abre CADA UM dos arquivos :


Para o primeiro ALTERNATE RECORD KEY aberto o arquivo
//ddname1 DD DSN=nome_arquivo
(apontar para ...PATH.AIX1)
Para o segundo ALTERNATE RECORD KEY aberto o arquivo
//ddname2 DD DSN=nome_arquivo
(apontar para ...PATH.AIX2)
Para o terceiro ALTERNATE RECORD KEY aberto o arquivo
//ddname3 DD DSN=nome_arquivo
(apontar para ...PATH.AIX3)
E assim por diante...

Portanto :
Mesmo que no seja(m) usada(s) chave(s) alternada(s), se forem especificadas no
SELECT ALTERNATE RECORD KEYs, sero abertos os arquivos ndice respectivos
(referenciados via PATH); se no for colocado statement DD para tais arquivos (PATHs), a
mensagem DD STATEMENT MISSING aparecer para eles quando o arquivo for aberto;
se houver tentativa de uso, o programa abenda; se no for usado, no haver problema.
Dependendo do uso que ser feito , uma chave alternada pode ter que ser especificada
como chave primria (ver leitura sequencial por chave alternada adiante)
Para que o sistema saiba efetuar o relacionamento correto entre um PATH e a chave
alternada qual ele est associado, FUNDAMENTAL que a especificao das chaves
alternadas seja feita na sequncia adequada (a chave alternada 1 deve ser a primeira
ALTERNATE RECORD KEY; a chave alternada 2 deve ser a segund ALTERNATE
RECORD KEY; e assim por diante
Por isso, mesmo que um programa no use todas as chaves alternadas, a partir da
segunda, obrigatorio que se declare todas as anteriorers : se for usar s a segunda, deve-se
especificar a primeira e a segunda (nessa ordem); se for usada s a terceira, deve-se
especificar a primeira, a segunda e a terceira (nessa ordem).

71

13.2 Detalhes de algumas operaes possveis


Nos tens 13.2.1 a 13.2.17 a seguir temos 17 jobs / programas, por meio dos quais ser explicado em
detalhes como efetuar uma srie de operaes com arquivos VSAM KSDS.
O primeiro Job / programa ir alocar o arquivo e gravar um primeiro conjunto de registros; o segundo
programa ir trabalhar com o arquivo gravado pelo primeiro; o terceiro programa ir ler o arquivo
com as alteraes feitas pelo segundo programa; e assim por diante.
Par melhor entendimento das mudanas que o arquivo VSAM do exemplo sofre em cada um dos
programas, convm analisar as operaes na sequncia explicada, pois um programa parte do princpio
que o arquivo existente (e com o qual ir trabalhar) o resultante do processamento do programa
anterior.
Para facilitar, veja a tabela resumo a seguir, indicando o que cada um dos 17 programas faz.

Programa

Funo

P01CRIA

Gravar registros num arquivo


vazio

P02INCL

P03UP

P04UA1

P05UA2

P06LSP

P07LSA1

Registros manuseados

Criados os registros com


Chave primria = 00001 a 00021
[chave alternada 1 = 00100 a 0080
chave alternada 2 = (99991 a 99999) + (00000 a 00011) ]
Gravar registros num arquivo que Incluidos os registros com
j tinha registros
Chave primria = 00501 a 00511
[chave alternada 1 = 00200 a 00190
chave alternada 2 = 90091 a 90101]
Atualizar registros (in-place)
Atualizados registros com
identificados pela chave primria
chave primria = 00001 a 00006
[chave alternada 1 = 00100 a 00095
chave alternada 2 = 99991 a 99996]
Atualizar registros (in-place)
Atualizados registros com
identificados pela chave alternada [chave primria = 00016 a 00020 ]
1
chave alternada 1 = 00085 a 00081
[chave alternada 2 = 00006 a 00010]
Atualizar registros (in-place)
Atualizados registros com
identificados pela chave alternada [chave primria = 00011 a 00015
2
chave alternada 1 = 00090 a 00086]
chave alternada 2 = 00001 a 00005
Ler registros sequencialmente pela Lidos registros com
chave primria
Chave primria = 00001 a 00021 + 00501 a 00511
[chave alternada 1 = 00100 a 0080 + 00200 a 00190
chave alternada 2 = (99991 a 99999) + (00000 a 00011)
+ (90091 a 90101) ]
Ler registros sequencialmente pela Lidos registros com
chave alternada 1
[Chave primria = 00021 a 00001 + 00511 00501 ]
chave alternada 1 = 00080 a 00100 + 00190 a 00200
[chave alternada 2 = (00011 a 00000) + (99999 a 99991)]
72

Identificao
Campos
Resto
*CR1
*CR2
*CR3
*CR4
#IR1
#IR2
#IR3
#IR4
@UR1
@UR2
@UR3
@UR4
$UR1
$UR2
$UR3
$UR4
#UR1
#UR2
#UR3
#UR4

P08LSA2

P09LFP

P10LFA1

P11LFA2

P12LDP

P13LDA1

P14LDA2

P15DP

P16DA1

P17DA2

+ (90101 a 90091)
Ler registros sequencialmente pela Lidos registros com
chave alternada 2
[chave primria = 00010 a 00021 + 00501 a 00511
+ 00001 a 00009
chave alternada 1 = 00091 a 00080 + 00200 a 00190
+ 00100 a 00092 ]
chave alternada 2 = 00000 a 00011 + 90091 a 90101
Ler faixa de registros pela chave
Lidos registros com
primria
chave primria = 00004 a 00010
[chave alternada 1 = 00097 a 00090
chave alternada 2 = 99994 a 99999 + 00000 e 00001]
Ler faixa de registros pela chave
Lidos registros com
alternada 1
[chave primria = 00006 a 00001]
chave alternada 1 = 00095 a 00100
[chave alternada 2 = 99996 a 99991]
Ler faixa de registros pela chave
Lidos registros com
alternada 2
[chave primria = 00505 a 00511 + 00001 a 00005
chave alternada 1 = 00196 a 00190 + 00100 a 00096]
chave alternada 2 = 90095 a 90101 + 99991 a 99994
Ler registros diretamente pela
Lidos registros com
chave primria
chave primria = 00005 (acha), 00015 (acha) , 00025 (no
acha) e 00035 (no acha)
[chave alternada 1 = 00096 e 00086
chave alternada 2 = 99995 e 00005]
Ler registros diretamente pela
Lidos registros com
chave alternada 1
[chave primria = 00021 e 00511 ]
chave alternada 1 = 00078 (no acha), 00080 (acha) , 00189
(no acha) e 00190 (acha)
[chave alternada 2 = 00011 e 90101]
Ler registros diretamente pela
Lidos registros com
chave alternada 2
[chave primria = 00021 , 00501 e 00001
chave alternada 1 = 00080 , 00200 e 00100]
chave alternada 2 = 00011 (acha) , 90091 (acha) , 90102
(no acha) e 99991 (acha)
Deletar registros (lidos
Deletados registros com
diretamente) pela chave primria
chave primria = 00005 e 00015
[chave alternada 1 = 00096 e 00086
chave alternada 2 = 99995 e 00005]
Deletar registros (lidos
Deletados registros com
diretamente) pela chave alternada [chave primria = 00006 e 00016]
1
chave alternada 1 = 00095 e 00085
[chave alternada 2 = 99996 e 00006]
Deletar registros (lidos
Deletados registros com
diretamente) pela chave alternada [chave primria = 00007 e 00017
2
chave alternada 1 = 00094 e 00084]
chave alternada 2 = 99997 e 00007

73

74

13.2.1 Incluir registros (em arquivo vazio)

Conceitos :
Para efetuar a carga inicial dos registros de dados (mass insertion) num arquivo VSAM KSDS,
muitas vezes o procedimento consiste na execuo do IDCAMS (funo REPRO), copiando um
arquivo SAM (j formatado com a estrutura desejada no VSAM) para VSAM;
pode-se tambm, obviamente, desenvolver programa que faa a carga.
os registros a gravar (voa IDCAMS ou aplicativo) devem estar em ordem crescente tendo como
critrio de classificao o campo de chave primria; para isso, se necessrio, gerar com o SORT o
arquivo que ser usado como base da carga.

SELECT nome_arquivo
ORGANIZATION IS INDEXED
ACCESS IS SEQUENTIAL
FILE STATUS IS variavel_wss
RECORD KEY IS chave_primria

DDs

Procedimentos :
Abrir o arquivo com OPEN OUTPUT nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro
Importante : O arquivo VSAM KSDS de sada s pode ser aberto como OUTPUT se estiver vazio
na hora da abertura !!!
Preparar a rea de gravao (declarada na FILE SECTION) com os dados que formam o registro e
Gravar o registro com o comando WRITE nome_rea_fd e testar o file status :
File Status = 00 : WRITE OK. Registro incluido
File Status = 21 : erro OUTOFSEQ : Registro no incluido pois a chave primria est fora de
sequncia
File Status = 22 : erro DUPKEY : Registro no incluido pois j existe registro com chave
primria igual chave primria do registro que se tentou incluir
File Status outros = : erro no WRITE
Fechar o arquivo com CLOSE nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro

//ddname

DD

DISP=SHR,DSN=dsname_cluster

75

Exemplo : JCL e fontes


//LSG#@CRI JOB ('ALBERTO'),'ALBERTO',CLASS=9,MSGCLASS=X
//PROCLIB JCLLIB ORDER=(TORI243.T#RPC.SRC)
//*------------------------------------------------------------------//* DELETA, DEFINE CLUSTER
//*------------------------------------------------------------------//STEP1
EXEC PGM=IDCAMS
//SYSOUT
DD SYSOUT=*
//SYSUDUMP
DD SYSOUT=*
//SYSPRINT
DD SYSOUT=*
//SYSABOUT
DD SYSOUT=*
//SYSIN DD *
DELETE DSVAABVS.LSG.A002.ALBERTO PURGE
DEFINE CLUSTER
( NAME('DSVAABVS.LSG.A002.ALBERTO') INDEXED
FREESPACE(20 10)
KEYS(5 0)
RECORDSIZE(080 080)
NOREPLICATE
NOREUSE
SHAREOPTIONS(2 3)
)
/* END OF CLUSTER */ DATA
( NAME('DSVAABVS.LSG.A002.ALBERTO.DATA')
TRACKS(5 1)
CISZ(4096)
SPEED
)
/* END OF DATA */
INDEX
( NAME('DSVAABVS.LSG.A002.ALBERTO.INDEX')
TRACKS(1 1)
CISZ(2048)
)
/* END OF INDEX */
//*------------------------------------------------------------------//* COMPILA, LINKEDITA E EXECUTA APLICATIVO
//*--------------------------------------------------------------//STEP2
EXEC COBCLG,MEMBER=P01CRIA
//COMP.SYSIN
DD *
IDENTIFICATION DIVISION.
PROGRAM-ID. P01CRIA.
*---------------------------------------------------------------* GRAVACAO DE REGISTROS NUM ARQUIVO ALOCADO, MAS VAZIO
* AS CHAVES PRECISAM ESTAR EM SEQUENCIA CRESCENTE
*---------------------------------------------------------------ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*----------------------------------------------------------------* ARQUIVO - VSAM KSDS ORIGINALMENTE VAZIO; REGS ADICIONADOS
*----------------------------------------------------------------SELECT ARQUIVO ASSIGN TO ARQUIVO
ORGANIZATION INDEXED
ACCESS SEQUENTIAL

76

RECORD KEY A-FD-ARQUIVO-CHAVEP


FILE STATUS FS-ARQ.
*----------------------------------------------------------------DATA DIVISION.
FILE SECTION.
*----------------------------------------------------------------FD
ARQUIVO.
01
A-FD-ARQUIVO.
05 A-FD-ARQUIVO-CHAVEP
PIC X(05).
05 A-FD-ARQUIVO-RESTO1
PIC X(10).
05 A-FD-ARQUIVO-CHAVES1
PIC X(05).
05 A-FD-ARQUIVO-RESTO2
PIC X(10).
05 A-FD-ARQUIVO-CHAVES2
PIC X(05).
05 A-FD-ARQUIVO-RESTO3
PIC X(10).
05 A-FD-ARQUIVO-RESTO4
PIC X(35).
*----------------------------------------------------------------WORKING-STORAGE SECTION.
*
01 FS-ARQ
PIC X(02).
01 EOF-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 STOP-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 GG-ARQUIVO
PIC 9(5) VALUE ZERO.
01 WW-ULTGRAVADO
PIC 9(5) VALUE ZERO.
01 WW-ARQUIVO
PIC 9(5) VALUE ZERO.
01 WW-CHAVEP
PIC 9(5) VALUE ZERO.
01 WW-CHAVES1
PIC 9(5) VALUE ZERO.
01 WW-CHAVES2
PIC 9(5) VALUE ZERO.
*
*---------------------------------------------------------------PROCEDURE DIVISION.
*---------------------------------------------------------------PROGRAMA SECTION.
*
DISPLAY '------------------------------------------------'
DISPLAY 'GRAVACAO REGS NUM ARQUIVO VAZIO'
DISPLAY '------------------------------------------------'
*
OPEN
OUTPUT ARQUIVO.
EVALUATE FS-ARQ
WHEN '00'
DISPLAY '
FS=' FS-ARQ ' OPEN OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQ ' OPEN ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
*
IF
STOP-ARQUIVO EQUAL 'NAO'
MOVE ZERO TO WW-ARQUIVO
PERFORM GRAVINCL1 UNTIL
WW-ARQUIVO > 20
OR
STOP-ARQUIVO = 'SIM'
END-IF
*
CLOSE ARQUIVO.
EVALUATE FS-ARQ
WHEN '00'
DISPLAY '
FS=' FS-ARQ ' CLOSE OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQ ' CLOSE ERRO'

77

END-EVALUATE
*
DISPLAY '--------------------------------------------------'
DISPLAY 'GRAVADOS ARQUIVO
= ' GG-ARQUIVO
DISPLAY '--------------------------------------------------'
*
STOP RUN.
*---------------------------------------------------------------* INCLUIR REGS EM ARQUIVO VAZIO
*---------------------------------------------------------------GRAVINCL1 SECTION.
ADD
1
TO WW-ARQUIVO.
MOVE
WW-ARQUIVO
TO WW-CHAVEP
MOVE
WW-CHAVEP
TO A-FD-ARQUIVO-CHAVEP
MOVE
'*CR1'
TO A-FD-ARQUIVO-RESTO1
COMPUTE WW-CHAVES1
= 100100 - WW-ARQUIVO + 1
COMPUTE WW-CHAVES2
= 99990 + WW-ARQUIVO
MOVE
WW-CHAVES1
TO A-FD-ARQUIVO-CHAVES1
MOVE
WW-CHAVES2
TO A-FD-ARQUIVO-CHAVES2
MOVE
ALL '*CR2
'
TO A-FD-ARQUIVO-RESTO2
MOVE
ALL '*CR3
'
TO A-FD-ARQUIVO-RESTO3
MOVE
ALL '*CR4
'
TO A-FD-ARQUIVO-RESTO4
*
WRITE
A-FD-ARQUIVO
EVALUATE FS-ARQ
WHEN '00'
DISPLAY '
FS=' FS-ARQ ' WRITE OK '
' CHAVEP :' A-FD-ARQUIVO-CHAVEP
' CHAVES1:' A-FD-ARQUIVO-CHAVES1
' CHAVES2:' A-FD-ARQUIVO-CHAVES2
' RESTO1 :' A-FD-ARQUIVO-RESTO1
ADD 1 TO GG-ARQUIVO
IF WW-CHAVEP > WW-ULTGRAVADO
MOVE WW-CHAVEP TO WW-ULTGRAVADO
END-IF
WHEN '21'
DISPLAY '
FS=' FS-ARQ ' WRITE OUTSEQ ' WW-CHAVEP
WHEN '22'
DISPLAY '
FS=' FS-ARQ ' WRITE DUPREC ' WW-CHAVEP
WHEN OTHER
DISPLAY '
FS=' FS-ARQ ' WRITE ERRO'
END-EVALUATE
*
CONTINUE.
SAI-GRAVINCL1. EXIT.
*---------------------------------------------------------------//GO.SYSPRINT DD SYSOUT=*
//GO.ARQUIVO
DD DSN=DSVAABVS.LSG.A002.ALBERTO,DISP=SHR
//*------------------------------------------------------------------//* DEFINE AIXS E PATHS
//*------------------------------------------------------------------//STEP3
EXEC PGM=IDCAMS
//SYSOUT
DD SYSOUT=*
//SYSUDUMP
DD SYSOUT=*
//SYSPRINT
DD SYSOUT=*
//SYSABOUT
DD SYSOUT=*
//SYSIN DD *
DEFINE AIX (NAME(DSVAABVS.LSG.A002.ALBERTO.AIX1)
RELATE(DSVAABVS.LSG.A002.ALBERTO)
-

78

RECSZ(080 080)
KEYS(05 15)
FSPC(10 10)
CYL(2 1)
SPEED
UPGRADE
UNIQUEKEY
SHR(2 3))

DEFINE PATH(NAME(DSVAABVS.LSG.A002.ALBERTO.PATH.AIX1)
PATHENTRY(DSVAABVS.LSG.A002.ALBERTO.AIX1))
DEFINE AIX (NAME(DSVAABVS.LSG.A002.ALBERTO.AIX2)
RELATE(DSVAABVS.LSG.A002.ALBERTO)
RECSZ(080 080)
KEYS(05 30)
FSPC(10 10)
CYL(2 1)
SPEED
UPGRADE
UNIQUEKEY
SHR(2 3))
DEFINE PATH(NAME(DSVAABVS.LSG.A002.ALBERTO.PATH.AIX2)
PATHENTRY(DSVAABVS.LSG.A002.ALBERTO.AIX2))

//*------------------------------------------------------------------//* BUILD INDEX DOS AIX A PARTIR DO INDICE PRINCIPAL


//*------------------------------------------------------------------//STEP4
EXEC PGM=IDCAMS
//SYSOUT
DD SYSOUT=*
//SYSPRINT
DD SYSOUT=*
//DD1 DD
DSN=DSVAABVS.LSG.A002.ALBERTO,DISP=SHR
//DD2A DD
DSN=DSVAABVS.LSG.A002.ALBERTO.AIX1,DISP=SHR
//DD2B DD
DSN=DSVAABVS.LSG.A002.ALBERTO.AIX2,DISP=SHR
//SYSIN
DD *
BLDINDEX INFILE(DD1) OUTFILE(DD2A)
BLDINDEX INFILE(DD1) OUTFILE(DD2B)
//*------------------------------------------------------------------//* LISTA VSAM POR CHAVE PRIMARIA E SECUNDARIA
//*------------------------------------------------------------------//STEP5
EXEC PGM=EZTPA00
//STEPLIB DD DSN=CAI.EASY.CAILIB,DISP=SHR
//
DD DSN=DSVAABLB.BATCH.LOADLIB,DISP=SHR
//ENTRAPP
DD DSN=DSVAABVS.LSG.A002.ALBERTO,DISP=SHR
//ENTRASS1 DD DSN=DSVAABVS.LSG.A002.ALBERTO.PATH.AIX1,DISP=SHR
//ENTRASS2 DD DSN=DSVAABVS.LSG.A002.ALBERTO.PATH.AIX2,DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSOUT
DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSIN DD *
FILE ENTRAPP VS
PPCHAVE-PRI
1 5 A
PPRESTO1
6 10 A
PPCHAVE-SEC1 16 5 A
PPRESTO2
21 10 A
PPCHAVE-SEC2 31 5 A
PPRESTO3
36 10 A

79

PPRESTO4
46 35 A
FILE ENTRASS1 VS
S1CHAVE-PRI
1 5 A
S1RESTO1
6 10 A
S1CHAVE-SEC1 16 5 A
S1RESTO2
21 10 A
S1CHAVE-SEC2 31 5 A
S1RESTO3
36 10 A
S1RESTO4
46 35 A
FILE ENTRASS2 VS
S2CHAVE-PRI
1 5 A
S2RESTO1
6 10 A
S2CHAVE-SEC1 16 5 A
S2RESTO2
21 10 A
S2CHAVE-SEC2 31 5 A
S2RESTO3
36 10 A
S2RESTO4
46 35 A
*---------------------------------------------------------------JOB INPUT ENTRAPP START DISPP
DISPLAY 'CHAVE-PRI=' PPCHAVE-PRI +
' CHAVE-S1=' PPCHAVE-SEC1 +
' CHAVE-S2=' PPCHAVE-SEC2 +
' R1=' PPRESTO1
+
' R2=' PPRESTO2
+
' R3=' PPRESTO3
+
' R4=' PPRESTO4
GOTO JOB
DISPP. PROC
DISPLAY '*************** LISTA POR CHAVE PRIMARIA ***********'
END-PROC
*---------------------------------------------------------------JOB INPUT ENTRASS1 START DISPS1
DISPLAY 'CHAVE-PRI=' S1CHAVE-PRI +
' CHAVE-S1=' S1CHAVE-SEC1 +
' CHAVE-S2=' S1CHAVE-SEC2 +
' R1=' S1RESTO1
+
' R2=' S1RESTO2
+
' R3=' S1RESTO3
+
' R4=' S1RESTO4
GOTO JOB
DISPS1. PROC
DISPLAY '*************** LISTA POR CHAVE ALTERN 1 ***********'
END-PROC
*---------------------------------------------------------------JOB INPUT ENTRASS2 START DISPS2
DISPLAY 'CHAVE-PRI=' S2CHAVE-PRI +
' CHAVE-S1=' S2CHAVE-SEC1 +
' CHAVE-S2=' S2CHAVE-SEC2 +
' R1=' S2RESTO1
+
' R2=' S2RESTO2
+
' R3=' S2RESTO3
+
' R4=' S2RESTO4
GOTO JOB
DISPS2. PROC
DISPLAY '*************** LISTA POR CHAVE ALTERN 2 ***********'
END-PROC
*---------------------------------------------------------------//*--------------------------------------------------------------//* LISTA INFORMACOES DO ARQUIVO

80

//*--------------------------------------------------------------//STEP6
EXEC PGM=IDCAMS
//SYSOUT
DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSABOUT DD SYSOUT=*
//SYSIN DD *
LISTCAT ENTRIES(DSVAABVS.LSG.A002.ALBERTO) ALL

Exemplo : listagem produzida pelo aplicativo


-----------------------------------------------GRAVACAO REGS NUM ARQUIVO VAZIO
-----------------------------------------------FS=00 OPEN OK
FS=00 WRITE OK CHAVEP :00001 CHAVES1:00100 CHAVES2:99991
FS=00 WRITE OK CHAVEP :00002 CHAVES1:00099 CHAVES2:99992
FS=00 WRITE OK CHAVEP :00003 CHAVES1:00098 CHAVES2:99993
FS=00 WRITE OK CHAVEP :00004 CHAVES1:00097 CHAVES2:99994
FS=00 WRITE OK CHAVEP :00005 CHAVES1:00096 CHAVES2:99995
FS=00 WRITE OK CHAVEP :00006 CHAVES1:00095 CHAVES2:99996
FS=00 WRITE OK CHAVEP :00007 CHAVES1:00094 CHAVES2:99997
FS=00 WRITE OK CHAVEP :00008 CHAVES1:00093 CHAVES2:99998
FS=00 WRITE OK CHAVEP :00009 CHAVES1:00092 CHAVES2:99999
FS=00 WRITE OK CHAVEP :00010 CHAVES1:00091 CHAVES2:00000
FS=00 WRITE OK CHAVEP :00011 CHAVES1:00090 CHAVES2:00001
FS=00 WRITE OK CHAVEP :00012 CHAVES1:00089 CHAVES2:00002
FS=00 WRITE OK CHAVEP :00013 CHAVES1:00088 CHAVES2:00003
FS=00 WRITE OK CHAVEP :00014 CHAVES1:00087 CHAVES2:00004
FS=00 WRITE OK CHAVEP :00015 CHAVES1:00086 CHAVES2:00005
FS=00 WRITE OK CHAVEP :00016 CHAVES1:00085 CHAVES2:00006
FS=00 WRITE OK CHAVEP :00017 CHAVES1:00084 CHAVES2:00007
FS=00 WRITE OK CHAVEP :00018 CHAVES1:00083 CHAVES2:00008
FS=00 WRITE OK CHAVEP :00019 CHAVES1:00082 CHAVES2:00009
FS=00 WRITE OK CHAVEP :00020 CHAVES1:00081 CHAVES2:00010
FS=00 WRITE OK CHAVEP :00021 CHAVES1:00080 CHAVES2:00011
FS=00 CLOSE OK
-------------------------------------------------GRAVADOS ARQUIVO
= 00021
--------------------------------------------------

Exemplo : arquivo resultante listado por ordem de chave primria


(listagem produzida pelo EASYTRIEVE do step 5)
***************
CHAVE-PRI=00001
CHAVE-PRI=00002
CHAVE-PRI=00003
CHAVE-PRI=00004
CHAVE-PRI=00005
CHAVE-PRI=00006
CHAVE-PRI=00007
CHAVE-PRI=00008
CHAVE-PRI=00009
CHAVE-PRI=00010
CHAVE-PRI=00011
CHAVE-PRI=00012

LISTA POR CHAVE PRIMARIA ***********


CHAVE-S1=00100 CHAVE-S2=99991 R1=*CR1
CHAVE-S1=00099 CHAVE-S2=99992 R1=*CR1
CHAVE-S1=00098 CHAVE-S2=99993 R1=*CR1
CHAVE-S1=00097 CHAVE-S2=99994 R1=*CR1
CHAVE-S1=00096 CHAVE-S2=99995 R1=*CR1
CHAVE-S1=00095 CHAVE-S2=99996 R1=*CR1
CHAVE-S1=00094 CHAVE-S2=99997 R1=*CR1
CHAVE-S1=00093 CHAVE-S2=99998 R1=*CR1
CHAVE-S1=00092 CHAVE-S2=99999 R1=*CR1
CHAVE-S1=00091 CHAVE-S2=00000 R1=*CR1
CHAVE-S1=00090 CHAVE-S2=00001 R1=*CR1
CHAVE-S1=00089 CHAVE-S2=00002 R1=*CR1

81

RESTO1
RESTO1
RESTO1
RESTO1
RESTO1
RESTO1
RESTO1
RESTO1
RESTO1
RESTO1
RESTO1
RESTO1
RESTO1
RESTO1
RESTO1
RESTO1
RESTO1
RESTO1
RESTO1
RESTO1
RESTO1

:*CR1
:*CR1
:*CR1
:*CR1
:*CR1
:*CR1
:*CR1
:*CR1
:*CR1
:*CR1
:*CR1
:*CR1
:*CR1
:*CR1
:*CR1
:*CR1
:*CR1
:*CR1
:*CR1
:*CR1
:*CR1

CHAVE-PRI=00013
CHAVE-PRI=00014
CHAVE-PRI=00015
CHAVE-PRI=00016
CHAVE-PRI=00017
CHAVE-PRI=00018
CHAVE-PRI=00019
CHAVE-PRI=00020
CHAVE-PRI=00021

CHAVE-S1=00088
CHAVE-S1=00087
CHAVE-S1=00086
CHAVE-S1=00085
CHAVE-S1=00084
CHAVE-S1=00083
CHAVE-S1=00082
CHAVE-S1=00081
CHAVE-S1=00080

CHAVE-S2=00003
CHAVE-S2=00004
CHAVE-S2=00005
CHAVE-S2=00006
CHAVE-S2=00007
CHAVE-S2=00008
CHAVE-S2=00009
CHAVE-S2=00010
CHAVE-S2=00011

R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1

Exemplo : arquivo resultante listado por ordem de chave alternada 1


(listagem produzida pelo EASYTRIEVE do step 5)
***************
CHAVE-PRI=00021
CHAVE-PRI=00020
CHAVE-PRI=00019
CHAVE-PRI=00018
CHAVE-PRI=00017
CHAVE-PRI=00016
CHAVE-PRI=00015
CHAVE-PRI=00014
CHAVE-PRI=00013
CHAVE-PRI=00012
CHAVE-PRI=00011
CHAVE-PRI=00010
CHAVE-PRI=00009
CHAVE-PRI=00008
CHAVE-PRI=00007
CHAVE-PRI=00006
CHAVE-PRI=00005
CHAVE-PRI=00004
CHAVE-PRI=00003
CHAVE-PRI=00002
CHAVE-PRI=00001

LISTA POR CHAVE ALTERN 1 ***********


CHAVE-S1=00080 CHAVE-S2=00011 R1=*CR1
CHAVE-S1=00081 CHAVE-S2=00010 R1=*CR1
CHAVE-S1=00082 CHAVE-S2=00009 R1=*CR1
CHAVE-S1=00083 CHAVE-S2=00008 R1=*CR1
CHAVE-S1=00084 CHAVE-S2=00007 R1=*CR1
CHAVE-S1=00085 CHAVE-S2=00006 R1=*CR1
CHAVE-S1=00086 CHAVE-S2=00005 R1=*CR1
CHAVE-S1=00087 CHAVE-S2=00004 R1=*CR1
CHAVE-S1=00088 CHAVE-S2=00003 R1=*CR1
CHAVE-S1=00089 CHAVE-S2=00002 R1=*CR1
CHAVE-S1=00090 CHAVE-S2=00001 R1=*CR1
CHAVE-S1=00091 CHAVE-S2=00000 R1=*CR1
CHAVE-S1=00092 CHAVE-S2=99999 R1=*CR1
CHAVE-S1=00093 CHAVE-S2=99998 R1=*CR1
CHAVE-S1=00094 CHAVE-S2=99997 R1=*CR1
CHAVE-S1=00095 CHAVE-S2=99996 R1=*CR1
CHAVE-S1=00096 CHAVE-S2=99995 R1=*CR1
CHAVE-S1=00097 CHAVE-S2=99994 R1=*CR1
CHAVE-S1=00098 CHAVE-S2=99993 R1=*CR1
CHAVE-S1=00099 CHAVE-S2=99992 R1=*CR1
CHAVE-S1=00100 CHAVE-S2=99991 R1=*CR1

Exemplo : arquivo resultante listado por ordem de chave alternada 2


(listagem produzida pelo EASYTRIEVE do step 5)
***************
CHAVE-PRI=00010
CHAVE-PRI=00011
CHAVE-PRI=00012
CHAVE-PRI=00013
CHAVE-PRI=00014
CHAVE-PRI=00015
CHAVE-PRI=00016
CHAVE-PRI=00017
CHAVE-PRI=00018
CHAVE-PRI=00019
CHAVE-PRI=00020
CHAVE-PRI=00021
CHAVE-PRI=00001
CHAVE-PRI=00002
CHAVE-PRI=00003
CHAVE-PRI=00004

LISTA POR CHAVE ALTERN 2 ***********


CHAVE-S1=00091 CHAVE-S2=00000 R1=*CR1
CHAVE-S1=00090 CHAVE-S2=00001 R1=*CR1
CHAVE-S1=00089 CHAVE-S2=00002 R1=*CR1
CHAVE-S1=00088 CHAVE-S2=00003 R1=*CR1
CHAVE-S1=00087 CHAVE-S2=00004 R1=*CR1
CHAVE-S1=00086 CHAVE-S2=00005 R1=*CR1
CHAVE-S1=00085 CHAVE-S2=00006 R1=*CR1
CHAVE-S1=00084 CHAVE-S2=00007 R1=*CR1
CHAVE-S1=00083 CHAVE-S2=00008 R1=*CR1
CHAVE-S1=00082 CHAVE-S2=00009 R1=*CR1
CHAVE-S1=00081 CHAVE-S2=00010 R1=*CR1
CHAVE-S1=00080 CHAVE-S2=00011 R1=*CR1
CHAVE-S1=00100 CHAVE-S2=99991 R1=*CR1
CHAVE-S1=00099 CHAVE-S2=99992 R1=*CR1
CHAVE-S1=00098 CHAVE-S2=99993 R1=*CR1
CHAVE-S1=00097 CHAVE-S2=99994 R1=*CR1

82

CHAVE-PRI=00005
CHAVE-PRI=00006
CHAVE-PRI=00007
CHAVE-PRI=00008
CHAVE-PRI=00009

CHAVE-S1=00096
CHAVE-S1=00095
CHAVE-S1=00094
CHAVE-S1=00093
CHAVE-S1=00092

CHAVE-S2=99995
CHAVE-S2=99996
CHAVE-S2=99997
CHAVE-S2=99998
CHAVE-S2=99999

R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1

83

13.2.2 Incluir registros (em arquivo no vazio)

Conceitos :
os registros a incluir podem estar em qualquer ordem;
o arquivo precisa ter pelo menos 1 registro j gravado (quando for aberto)

SELECT nome_arquivo
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
FILE STATUS IS variavel_wss
RECORD KEY IS chave_primria
[ ALTERNATE RECORD KEY IS chave_alternada_1 ]

DDs

Procedimentos :
Abrir o arquivo com OPEN I-O nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro
Preparar a rea de gravao (declarada na FILE SECTION) com os dados que formam o registro e
Gravar o registro com o comando WRITE nome_rea_fd e testar o file status :
File Status = 00 : WRITE OK. Registro incluido
File Status = 22 : erro : DUPKEY (chave primria do registro que se tentou incluir igual de
um registro j existente)
File Status outros : erro no WRITE
Fechar o arquivo com CLOSE nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro

//ddname

DD

DISP=SHR,DSN=dsname_cluster

Exemplo : JCL e fonte


//LSG#@INC JOB ('ALBERTO'),'ALBERTO',CLASS=9,MSGCLASS=X
//PROCLIB JCLLIB ORDER=(TORI243.T#RPC.SRC)
//*--------------------------------------------------------------//STEP1
EXEC COBCLG,MEMBER=P02INCL
//COMP.SYSIN
DD *
IDENTIFICATION DIVISION.
PROGRAM-ID. P02INCL.
*---------------------------------------------------------------* GRAVACAO DE REGISTROS NUM ARQUIVO QUE TEM REGISTROS
* GRAVADOS ANTERIORMENTE (BASE = CHAVE PRIMARIA)
*---------------------------------------------------------------ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*-----------------------------------------------------------------

84

* ARQUIVO - VSAM KSDS JAH EXISTENTE; INCLUI REG POR CHAVE PRIMARIA
*----------------------------------------------------------------SELECT ARQUIVO ASSIGN TO ARQUIVO
ORGANIZATION INDEXED
ACCESS RANDOM
RECORD KEY A-FD-ARQUIVO-CHAVEP
FILE STATUS FS-ARQ.
*----------------------------------------------------------------DATA DIVISION.
FILE SECTION.
*----------------------------------------------------------------FD
ARQUIVO.
01
A-FD-ARQUIVO.
05 A-FD-ARQUIVO-CHAVEP
PIC X(05).
05 A-FD-ARQUIVO-RESTO1
PIC X(10).
05 A-FD-ARQUIVO-CHAVES1
PIC X(05).
05 A-FD-ARQUIVO-RESTO2
PIC X(10).
05 A-FD-ARQUIVO-CHAVES2
PIC X(05).
05 A-FD-ARQUIVO-RESTO3
PIC X(10).
05 A-FD-ARQUIVO-RESTO4
PIC X(35).
*----------------------------------------------------------------WORKING-STORAGE SECTION.
*
01 FS-ARQ
PIC X(02).
01 EOF-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 STOP-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 WW-ULTGRAVADO
PIC 9(5) VALUE ZERO.
01 WW-ARQUIVO
PIC 9(5) VALUE ZERO.
01 WW-CHAVEP
PIC 9(5) VALUE ZERO.
01 WW-CHAVES1
PIC 9(5) VALUE ZERO.
01 WW-CHAVES2
PIC 9(5) VALUE ZERO.
01 GG-ARQUIVO
PIC 9(5) VALUE ZERO.
*---------------------------------------------------------------PROCEDURE DIVISION.
*---------------------------------------------------------------PROGRAMA SECTION.
DISPLAY '------------------------------------------------'
DISPLAY 'GRAVACAO REGS NUM ARQUIVO QUE JAH TEM REGISTROS'
DISPLAY '------------------------------------------------'
*
OPEN I-O
ARQUIVO.
EVALUATE FS-ARQ
WHEN '00'
DISPLAY '
FS=' FS-ARQ ' OPEN OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQ ' OPEN ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
*
IF STOP-ARQUIVO EQUAL 'NAO'
PERFORM GRAVINCL2 UNTIL
WW-ARQUIVO > 10
OR
STOP-ARQUIVO = 'SIM'
END-IF
*
CLOSE ARQUIVO.
EVALUATE FS-ARQ
WHEN '00'
DISPLAY '
FS=' FS-ARQ ' CLOSE OK'

85

WHEN OTHER
DISPLAY '
END-EVALUATE

FS=' FS-ARQ ' CLOSE ERRO'

*
DISPLAY '------------------------------------------------'
DISPLAY 'GRAVADOS ARQUIVO
= ' GG-ARQUIVO
DISPLAY '------------------------------------------------'
STOP RUN.
*
*---------------------------------------------------------------* INCLUIR REGS EM ARQUIVO JAH EXISTENTE
*---------------------------------------------------------------GRAVINCL2 SECTION.
ADD
1
TO WW-ARQUIVO.
COMPUTE WW-CHAVEP
= WW-ARQUIVO + 500.
MOVE
WW-CHAVEP
TO A-FD-ARQUIVO-CHAVEP
MOVE
'#IR1'
TO A-FD-ARQUIVO-RESTO1
COMPUTE WW-CHAVES1
= 100200 - WW-ARQUIVO + 1
COMPUTE WW-CHAVES2
= 90090 + WW-ARQUIVO
MOVE
WW-CHAVES1
TO A-FD-ARQUIVO-CHAVES1
MOVE
WW-CHAVES2
TO A-FD-ARQUIVO-CHAVES2
MOVE
ALL '#IR2'
TO A-FD-ARQUIVO-RESTO2
MOVE
ALL '#IR3'
TO A-FD-ARQUIVO-RESTO3
MOVE
ALL '#IR4'
TO A-FD-ARQUIVO-RESTO4
*
WRITE A-FD-ARQUIVO
EVALUATE FS-ARQ
WHEN '00'
DISPLAY '
FS=' FS-ARQ ' WRITE OK'
' CHAVEP :' A-FD-ARQUIVO-CHAVEP
' CHAVES1:' A-FD-ARQUIVO-CHAVES1
' CHAVES2:' A-FD-ARQUIVO-CHAVES2
' RESTO1 :' A-FD-ARQUIVO-RESTO1
ADD 1 TO GG-ARQUIVO
IF WW-CHAVEP > WW-ULTGRAVADO
MOVE WW-CHAVEP TO WW-ULTGRAVADO
END-IF
WHEN '22'
DISPLAY '
FS=' FS-ARQ ' WRITE DUPKEY '
' CHAVEP : ' WW-CHAVEP
WHEN OTHER
DISPLAY '
FS=' FS-ARQ ' WRITE ERRO'
' CHAVEP : ' WW-CHAVEP
END-EVALUATE
*
CONTINUE.
SAI-GRAVINCL2. EXIT.
*
//GO.SYSPRINT DD SYSOUT=*
//GO.ARQUIVO
DD DSN=DSVAABVS.LSG.A002.ALBERTO,DISP=SHR

Exemplo : listagem produzida pelo aplicativo


-----------------------------------------------GRAVACAO REGS NUM ARQUIVO QUE JAH TEM REGISTROS
-----------------------------------------------FS=00 OPEN OK
FS=00 WRITE OK CHAVEP :00501 CHAVES1:00200 CHAVES2:90091 RESTO1 :#IR1
FS=00 WRITE OK CHAVEP :00502 CHAVES1:00199 CHAVES2:90092 RESTO1 :#IR1

86

FS=00 WRITE OK CHAVEP :00503 CHAVES1:00198 CHAVES2:90093


FS=00 WRITE OK CHAVEP :00504 CHAVES1:00197 CHAVES2:90094
FS=00 WRITE OK CHAVEP :00505 CHAVES1:00196 CHAVES2:90095
FS=00 WRITE OK CHAVEP :00506 CHAVES1:00195 CHAVES2:90096
FS=00 WRITE OK CHAVEP :00507 CHAVES1:00194 CHAVES2:90097
FS=00 WRITE OK CHAVEP :00508 CHAVES1:00193 CHAVES2:90098
FS=00 WRITE OK CHAVEP :00509 CHAVES1:00192 CHAVES2:90099
FS=00 WRITE OK CHAVEP :00510 CHAVES1:00191 CHAVES2:90100
FS=00 WRITE OK CHAVEP :00511 CHAVES1:00190 CHAVES2:90101
FS=00 CLOSE OK
-----------------------------------------------GRAVADOS ARQUIVO
= 00011
------------------------------------------------

RESTO1
RESTO1
RESTO1
RESTO1
RESTO1
RESTO1
RESTO1
RESTO1
RESTO1

Exemplo : arquivo resultante listado por ordem de chave primria


***************
CHAVE-PRI=00001
CHAVE-PRI=00002
CHAVE-PRI=00003
CHAVE-PRI=00004
CHAVE-PRI=00005
CHAVE-PRI=00006
CHAVE-PRI=00007
CHAVE-PRI=00008
CHAVE-PRI=00009
CHAVE-PRI=00010
CHAVE-PRI=00011
CHAVE-PRI=00012
CHAVE-PRI=00013
CHAVE-PRI=00014
CHAVE-PRI=00015
CHAVE-PRI=00016
CHAVE-PRI=00017
CHAVE-PRI=00018
CHAVE-PRI=00019
CHAVE-PRI=00020
CHAVE-PRI=00021
CHAVE-PRI=00501
CHAVE-PRI=00502
CHAVE-PRI=00503
CHAVE-PRI=00504
CHAVE-PRI=00505
CHAVE-PRI=00506
CHAVE-PRI=00507
CHAVE-PRI=00508
CHAVE-PRI=00509
CHAVE-PRI=00510
CHAVE-PRI=00511

LISTA POR CHAVE PRIMARIA ***********


CHAVE-S1=00100 CHAVE-S2=99991 R1=*CR1
CHAVE-S1=00099 CHAVE-S2=99992 R1=*CR1
CHAVE-S1=00098 CHAVE-S2=99993 R1=*CR1
CHAVE-S1=00097 CHAVE-S2=99994 R1=*CR1
CHAVE-S1=00096 CHAVE-S2=99995 R1=*CR1
CHAVE-S1=00095 CHAVE-S2=99996 R1=*CR1
CHAVE-S1=00094 CHAVE-S2=99997 R1=*CR1
CHAVE-S1=00093 CHAVE-S2=99998 R1=*CR1
CHAVE-S1=00092 CHAVE-S2=99999 R1=*CR1
CHAVE-S1=00091 CHAVE-S2=00000 R1=*CR1
CHAVE-S1=00090 CHAVE-S2=00001 R1=*CR1
CHAVE-S1=00089 CHAVE-S2=00002 R1=*CR1
CHAVE-S1=00088 CHAVE-S2=00003 R1=*CR1
CHAVE-S1=00087 CHAVE-S2=00004 R1=*CR1
CHAVE-S1=00086 CHAVE-S2=00005 R1=*CR1
CHAVE-S1=00085 CHAVE-S2=00006 R1=*CR1
CHAVE-S1=00084 CHAVE-S2=00007 R1=*CR1
CHAVE-S1=00083 CHAVE-S2=00008 R1=*CR1
CHAVE-S1=00082 CHAVE-S2=00009 R1=*CR1
CHAVE-S1=00081 CHAVE-S2=00010 R1=*CR1
CHAVE-S1=00080 CHAVE-S2=00011 R1=*CR1
CHAVE-S1=00200 CHAVE-S2=90091 R1=#IR1
CHAVE-S1=00199 CHAVE-S2=90092 R1=#IR1
CHAVE-S1=00198 CHAVE-S2=90093 R1=#IR1
CHAVE-S1=00197 CHAVE-S2=90094 R1=#IR1
CHAVE-S1=00196 CHAVE-S2=90095 R1=#IR1
CHAVE-S1=00195 CHAVE-S2=90096 R1=#IR1
CHAVE-S1=00194 CHAVE-S2=90097 R1=#IR1
CHAVE-S1=00193 CHAVE-S2=90098 R1=#IR1
CHAVE-S1=00192 CHAVE-S2=90099 R1=#IR1
CHAVE-S1=00191 CHAVE-S2=90100 R1=#IR1
CHAVE-S1=00190 CHAVE-S2=90101 R1=#IR1

Exemplo : arquivo resultante listado por ordem de chave alternada 1


*************** LISTA POR CHAVE ALTERN 1 ***********
CHAVE-PRI=00021 CHAVE-S1=00080 CHAVE-S2=00011 R1=*CR1
CHAVE-PRI=00020 CHAVE-S1=00081 CHAVE-S2=00010 R1=*CR1
CHAVE-PRI=00019 CHAVE-S1=00082 CHAVE-S2=00009 R1=*CR1
CHAVE-PRI=00018 CHAVE-S1=00083 CHAVE-S2=00008 R1=*CR1
CHAVE-PRI=00017 CHAVE-S1=00084 CHAVE-S2=00007 R1=*CR1

87

:#IR1
:#IR1
:#IR1
:#IR1
:#IR1
:#IR1
:#IR1
:#IR1
:#IR1

CHAVE-PRI=00016
CHAVE-PRI=00015
CHAVE-PRI=00014
CHAVE-PRI=00013
CHAVE-PRI=00012
CHAVE-PRI=00011
CHAVE-PRI=00010
CHAVE-PRI=00009
CHAVE-PRI=00008
CHAVE-PRI=00007
CHAVE-PRI=00006
CHAVE-PRI=00005
CHAVE-PRI=00004
CHAVE-PRI=00003
CHAVE-PRI=00002
CHAVE-PRI=00001
CHAVE-PRI=00511
CHAVE-PRI=00510
CHAVE-PRI=00509
CHAVE-PRI=00508
CHAVE-PRI=00507
CHAVE-PRI=00506
CHAVE-PRI=00505
CHAVE-PRI=00504
CHAVE-PRI=00503
CHAVE-PRI=00502
CHAVE-PRI=00501

CHAVE-S1=00085
CHAVE-S1=00086
CHAVE-S1=00087
CHAVE-S1=00088
CHAVE-S1=00089
CHAVE-S1=00090
CHAVE-S1=00091
CHAVE-S1=00092
CHAVE-S1=00093
CHAVE-S1=00094
CHAVE-S1=00095
CHAVE-S1=00096
CHAVE-S1=00097
CHAVE-S1=00098
CHAVE-S1=00099
CHAVE-S1=00100
CHAVE-S1=00190
CHAVE-S1=00191
CHAVE-S1=00192
CHAVE-S1=00193
CHAVE-S1=00194
CHAVE-S1=00195
CHAVE-S1=00196
CHAVE-S1=00197
CHAVE-S1=00198
CHAVE-S1=00199
CHAVE-S1=00200

CHAVE-S2=00006
CHAVE-S2=00005
CHAVE-S2=00004
CHAVE-S2=00003
CHAVE-S2=00002
CHAVE-S2=00001
CHAVE-S2=00000
CHAVE-S2=99999
CHAVE-S2=99998
CHAVE-S2=99997
CHAVE-S2=99996
CHAVE-S2=99995
CHAVE-S2=99994
CHAVE-S2=99993
CHAVE-S2=99992
CHAVE-S2=99991
CHAVE-S2=90101
CHAVE-S2=90100
CHAVE-S2=90099
CHAVE-S2=90098
CHAVE-S2=90097
CHAVE-S2=90096
CHAVE-S2=90095
CHAVE-S2=90094
CHAVE-S2=90093
CHAVE-S2=90092
CHAVE-S2=90091

R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1

Exemplo : arquivo resultante listado por ordem de chave alternada 2


***************
CHAVE-PRI=00010
CHAVE-PRI=00011
CHAVE-PRI=00012
CHAVE-PRI=00013
CHAVE-PRI=00014
CHAVE-PRI=00015
CHAVE-PRI=00016
CHAVE-PRI=00017
CHAVE-PRI=00018
CHAVE-PRI=00019
CHAVE-PRI=00020
CHAVE-PRI=00021
CHAVE-PRI=00501
CHAVE-PRI=00502
CHAVE-PRI=00503
CHAVE-PRI=00504
CHAVE-PRI=00505
CHAVE-PRI=00506
CHAVE-PRI=00507
CHAVE-PRI=00508
CHAVE-PRI=00509
CHAVE-PRI=00510
CHAVE-PRI=00511
CHAVE-PRI=00001
CHAVE-PRI=00002
CHAVE-PRI=00003
CHAVE-PRI=00004
CHAVE-PRI=00005

LISTA POR CHAVE ALTERN 2 ***********


CHAVE-S1=00091 CHAVE-S2=00000 R1=*CR1
CHAVE-S1=00090 CHAVE-S2=00001 R1=*CR1
CHAVE-S1=00089 CHAVE-S2=00002 R1=*CR1
CHAVE-S1=00088 CHAVE-S2=00003 R1=*CR1
CHAVE-S1=00087 CHAVE-S2=00004 R1=*CR1
CHAVE-S1=00086 CHAVE-S2=00005 R1=*CR1
CHAVE-S1=00085 CHAVE-S2=00006 R1=*CR1
CHAVE-S1=00084 CHAVE-S2=00007 R1=*CR1
CHAVE-S1=00083 CHAVE-S2=00008 R1=*CR1
CHAVE-S1=00082 CHAVE-S2=00009 R1=*CR1
CHAVE-S1=00081 CHAVE-S2=00010 R1=*CR1
CHAVE-S1=00080 CHAVE-S2=00011 R1=*CR1
CHAVE-S1=00200 CHAVE-S2=90091 R1=#IR1
CHAVE-S1=00199 CHAVE-S2=90092 R1=#IR1
CHAVE-S1=00198 CHAVE-S2=90093 R1=#IR1
CHAVE-S1=00197 CHAVE-S2=90094 R1=#IR1
CHAVE-S1=00196 CHAVE-S2=90095 R1=#IR1
CHAVE-S1=00195 CHAVE-S2=90096 R1=#IR1
CHAVE-S1=00194 CHAVE-S2=90097 R1=#IR1
CHAVE-S1=00193 CHAVE-S2=90098 R1=#IR1
CHAVE-S1=00192 CHAVE-S2=90099 R1=#IR1
CHAVE-S1=00191 CHAVE-S2=90100 R1=#IR1
CHAVE-S1=00190 CHAVE-S2=90101 R1=#IR1
CHAVE-S1=00100 CHAVE-S2=99991 R1=*CR1
CHAVE-S1=00099 CHAVE-S2=99992 R1=*CR1
CHAVE-S1=00098 CHAVE-S2=99993 R1=*CR1
CHAVE-S1=00097 CHAVE-S2=99994 R1=*CR1
CHAVE-S1=00096 CHAVE-S2=99995 R1=*CR1

88

CHAVE-PRI=00006
CHAVE-PRI=00007
CHAVE-PRI=00008
CHAVE-PRI=00009

CHAVE-S1=00095
CHAVE-S1=00094
CHAVE-S1=00093
CHAVE-S1=00092

CHAVE-S2=99996
CHAVE-S2=99997
CHAVE-S2=99998
CHAVE-S2=99999

R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1

89

13.2.3 Re-gravar registro (atualizao in-place) por chave primria

Conceitos :
pode-se alterar dados exceto chaves
quando comando o REWRITE , o ltimo registro lido que alterado, independentemente de
como ele foi lido

SELECT nome_arquivo
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
FILE STATUS IS variavel_wss
RECORD KEY IS chave_primria
[ ALTERNATE RECORD KEY IS chave_alternada_1 ]

DDs

Procedimentos :
Abrir o arquivo com OPEN I-O nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro
Ler o registro que se deseja alterar (de qualquer maneira) :

Se se quiser fazer leitura direta : neste caso, a leitura deve ser feita conforme explicado
em LEITURA DIRETA por chave primria :
mover o valor da chave que identifica o registro desejado para a rea da RECORD KEY e em
seguida dar o comando READ nome_arquivo e testar file status :
File Status : 00 = OK ; 02 = READ OK , DUPKEY ; 23 = NOTFOUND
outros = erro

Se se quiser fazer leitura sequencial : efetuar a leitura conforme explicado em


LEITURA SEQUENCIAL por chave primria :
dar o comando READ nome_arquivo e testar file status :
File Status : 00 = OK. ; 10 = EOF ; outros = erro

Pode-se fazer outros tipo de leitura (com START, etc...)


Se o registro foi lido, para atualiz-lo :
Alterar a rea do FD colocando os novos dados (alteraes desejadas) e
RE-Gravar o registro com REWRITE nome_rea_fd testando o file status:
File Status = 00 : REWRITE OK. Registro atualizado
File Status = 21 : erro : a chave primria foi mudada
File Status = 22 : erro : DUPKEY ; reg no atualizado pois j existe registro
com chave primria igual a chave primria do registro que se tentou incluir
File Status = 23 : erro : NOTFOUND; registro no atualizado pois no foi
previamente lido
File Status outros = : erro no REWRITE
Fechar o arquivo com CLOSE nome_arquivo e testar file status :

//ddname

DD

DISP=SHR,DSN=dsname_cluster

90

File Status = 00 : OK
File Status 00 : erro
Exemplos bsicos :
REWRITE area-fd INVALID KEY imperativo
Ex.: REWRITE AG INVALID KEY DISPLAY CHAVE INVALIDA
REWRITE area-fd NOT INVALID KEY imperativo
Ex.: REWRITE AG NOT INVALID KEY DISPLAY CHAVE OK. REGRAVADO
REWRITE area-fd FROM area-working-storage INVALID KEY imperativo
Ex.: REWRITE AG FROM REG-CADASTRO INVALID KEY CHAVE INVALIDA
REWRITE area-fd FROM area-working-storage NOT INVALID KEY imperativo
Ex.: REWRITE AG FROM REG-CADASTRO NOT INVALID KEY DISPLAY OK!!

Exemplo : JCL e fonte


//LSG#@UP
JOB ('ALBERTO'),'ALBERTO',CLASS=9,MSGCLASS=X
//PROCLIB JCLLIB ORDER=(TORI243.T#RPC.SRC)
//*--------------------------------------------------------------//STEP1
EXEC COBCLG,MEMBER=P03UP
//COMP.SYSIN
DD *
IDENTIFICATION DIVISION.
PROGRAM-ID. P03UP.
*---------------------------------------------------------------* RE-GRAVACAO DE REGISTROS (ATUALIZ IN-PLACE) POR CHAVE PRIMARIA
*---------------------------------------------------------------ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*----------------------------------------------------------------* ARQUIVO - VSAM KSDS JAH EXISTENTE; UPDATE REGISTROS JAH EXISTEM
*----------------------------------------------------------------SELECT ARQUIVO ASSIGN TO ARQUIVO
ORGANIZATION INDEXED
ACCESS RANDOM
RECORD KEY A-FD-ARQUIVO-CHAVEP
FILE STATUS FS-ARQ.
*----------------------------------------------------------------DATA DIVISION.
FILE SECTION.
*----------------------------------------------------------------FD
ARQUIVO.
01
A-FD-ARQUIVO.
05 A-FD-ARQUIVO-CHAVEP
PIC X(05).
05 A-FD-ARQUIVO-RESTO1
PIC X(10).
05 A-FD-ARQUIVO-CHAVES1
PIC X(05).
05 A-FD-ARQUIVO-RESTO2
PIC X(10).
05 A-FD-ARQUIVO-CHAVES2
PIC X(05).
05 A-FD-ARQUIVO-RESTO3
PIC X(10).
05 A-FD-ARQUIVO-RESTO4
PIC X(35).

91

*----------------------------------------------------------------WORKING-STORAGE SECTION.
01 FS-ARQ
PIC X(02).
01 EOF-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 STOP-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 LEU-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 WW-ULTGRAVADO
PIC 9(5) VALUE ZERO.
01 WW-ARQUIVO
PIC 9(5) VALUE ZERO.
01 WW-CHAVEP
PIC 9(5) VALUE ZERO.
01 WW-CHAVES1
PIC 9(5) VALUE ZERO.
01 WW-CHAVES2
PIC 9(5) VALUE ZERO.
01 UU-ARQUIVO
PIC 9(5) VALUE ZERO.
*---------------------------------------------------------------PROCEDURE DIVISION.
*---------------------------------------------------------------PROGRAMA SECTION.
*
DISPLAY '------------------------------------------------'
DISPLAY 'UPDATE (IN-PLACE) DE REGISTROS POR CHAVE PRIMARIA'
DISPLAY '------------------------------------------------'
*
OPEN I-O
ARQUIVO.
EVALUATE FS-ARQ
WHEN '00'
DISPLAY '
FS=' FS-ARQ ' OPEN OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQ ' OPEN ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
*
IF STOP-ARQUIVO EQUAL 'NAO'
PERFORM GRAVUPDT UNTIL
WW-ARQUIVO > 5
OR
STOP-ARQUIVO = 'SIM'
END-IF
*
CLOSE ARQUIVO.
EVALUATE FS-ARQ
WHEN '00'
DISPLAY '
FS=' FS-ARQ ' CLOSE OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQ ' CLOSE ERRO'
END-EVALUATE
*
DISPLAY '------------------------------------------------'
DISPLAY 'REGRAVADOS ARQUIVO
= ' UU-ARQUIVO
DISPLAY '------------------------------------------------'
STOP RUN.
*---------------------------------------------------------------* EFETUAR UPDATE
*---------------------------------------------------------------GRAVUPDT SECTION.
ADD
1
TO WW-ARQUIVO.
MOVE
WW-ARQUIVO
TO WW-CHAVEP.
PERFORM LER-PARA-POSICIONAR
*
IF
LEU-ARQUIVO
= 'SIM'
MOVE
'@UR1
'
TO A-FD-ARQUIVO-RESTO1
MOVE
'@UR2
'
TO A-FD-ARQUIVO-RESTO2

92

MOVE
MOVE

'@UR3
'@UR4

'
'

TO A-FD-ARQUIVO-RESTO3
TO A-FD-ARQUIVO-RESTO4

*
REWRITE A-FD-ARQUIVO
EVALUATE FS-ARQ
WHEN '00'
DISPLAY '
FS=' FS-ARQ ' REWRITE OK'
' CHAVEP:' A-FD-ARQUIVO-CHAVEP
' CHAVES1:' A-FD-ARQUIVO-CHAVES1
' CHAVES2:' A-FD-ARQUIVO-CHAVES2
' RESTO1:' A-FD-ARQUIVO-RESTO1
ADD 1 TO UU-ARQUIVO
WHEN '21'
DISPLAY '
FS=' FS-ARQ ' REWRITE CHAVE MUDADA'
' CHAVEP :' WW-CHAVEP
WHEN '22'
DISPLAY '
FS=' FS-ARQ ' REWRITE DUPKEY'
' CHAVEP :' WW-CHAVEP
WHEN '23'
DISPLAY '
FS=' FS-ARQ ' REWRITE NOTFOUND'
' CHAVEP :' WW-CHAVEP
WHEN OTHER
DISPLAY '
FS=' FS-ARQ ' REWRITE ERRO'
' CHAVEP :' WW-CHAVEP
END-EVALUATE
END-IF
*
CONTINUE.
SAI-GRAVUPDT. EXIT.
*---------------------------------------------------------------* LE UM REGISTRO PARA PODER ATUALIZA-LO
*---------------------------------------------------------------LER-PARA-POSICIONAR SECTION.
MOVE
'NAO'
TO LEU-ARQUIVO
MOVE
WW-CHAVEP
TO A-FD-ARQUIVO-CHAVEP
READ
ARQUIVO
EVALUATE FS-ARQ
WHEN '00'
DISPLAY '
FS=' FS-ARQ ' READ OK ' WW-CHAVEP
MOVE
'SIM' TO LEU-ARQUIVO
WHEN '02'
DISPLAY '
FS=' FS-ARQ ' READ KEYDUP ' WW-CHAVEP
WHEN '23'
DISPLAY '
FS=' FS-ARQ ' READ NOTFOUND ' WW-CHAVEP
WHEN OTHER
DISPLAY '
FS=' FS-ARQ ' READ ERRO ' WW-CHAVEP
END-EVALUATE
CONTINUE.
SAI-LER-PARA-POSICIONAR. EXIT.
//GO.SYSPRINT DD SYSOUT=*
//GO.ARQUIVO
DD DSN=DSVAABVS.LSG.A002.ALBERTO,DISP=SHR

Exemplo : listagem produzida pelo aplicativo


-----------------------------------------------UPDATE (IN-PLACE) DE REGISTROS POR CHAVE PRIMARIA
-----------------------------------------------FS=00 OPEN OK
FS=00 READ OK 00001

93

FS=00 REWRITE OK CHAVEP:00001 CHAVES1:00100 CHAVES2:99991


FS=00 READ OK 00002
FS=00 REWRITE OK CHAVEP:00002 CHAVES1:00099 CHAVES2:99992
FS=00 READ OK 00003
FS=00 REWRITE OK CHAVEP:00003 CHAVES1:00098 CHAVES2:99993
FS=00 READ OK 00004
FS=00 REWRITE OK CHAVEP:00004 CHAVES1:00097 CHAVES2:99994
FS=00 READ OK 00005
FS=00 REWRITE OK CHAVEP:00005 CHAVES1:00096 CHAVES2:99995
FS=00 READ OK 00006
FS=00 REWRITE OK CHAVEP:00006 CHAVES1:00095 CHAVES2:99996
FS=00 CLOSE OK
-----------------------------------------------REGRAVADOS ARQUIVO
= 00006
------------------------------------------------

RESTO1:@UR1
RESTO1:@UR1
RESTO1:@UR1
RESTO1:@UR1
RESTO1:@UR1
RESTO1:@UR1

Exemplo : arquivo resultante listado por ordem de chave primria


***************
CHAVE-PRI=00001
CHAVE-PRI=00002
CHAVE-PRI=00003
CHAVE-PRI=00004
CHAVE-PRI=00005
CHAVE-PRI=00006
CHAVE-PRI=00007
CHAVE-PRI=00008
CHAVE-PRI=00009
CHAVE-PRI=00010
CHAVE-PRI=00011
CHAVE-PRI=00012
CHAVE-PRI=00013
CHAVE-PRI=00014
CHAVE-PRI=00015
CHAVE-PRI=00016
CHAVE-PRI=00017
CHAVE-PRI=00018
CHAVE-PRI=00019
CHAVE-PRI=00020
CHAVE-PRI=00021
CHAVE-PRI=00501
CHAVE-PRI=00502
CHAVE-PRI=00503
CHAVE-PRI=00504
CHAVE-PRI=00505
CHAVE-PRI=00506
CHAVE-PRI=00507
CHAVE-PRI=00508
CHAVE-PRI=00509
CHAVE-PRI=00510
CHAVE-PRI=00511

LISTA POR CHAVE PRIMARIA ***********


CHAVE-S1=00100 CHAVE-S2=99991 R1=@UR1
CHAVE-S1=00099 CHAVE-S2=99992 R1=@UR1
CHAVE-S1=00098 CHAVE-S2=99993 R1=@UR1
CHAVE-S1=00097 CHAVE-S2=99994 R1=@UR1
CHAVE-S1=00096 CHAVE-S2=99995 R1=@UR1
CHAVE-S1=00095 CHAVE-S2=99996 R1=@UR1
CHAVE-S1=00094 CHAVE-S2=99997 R1=*CR1
CHAVE-S1=00093 CHAVE-S2=99998 R1=*CR1
CHAVE-S1=00092 CHAVE-S2=99999 R1=*CR1
CHAVE-S1=00091 CHAVE-S2=00000 R1=*CR1
CHAVE-S1=00090 CHAVE-S2=00001 R1=*CR1
CHAVE-S1=00089 CHAVE-S2=00002 R1=*CR1
CHAVE-S1=00088 CHAVE-S2=00003 R1=*CR1
CHAVE-S1=00087 CHAVE-S2=00004 R1=*CR1
CHAVE-S1=00086 CHAVE-S2=00005 R1=*CR1
CHAVE-S1=00085 CHAVE-S2=00006 R1=*CR1
CHAVE-S1=00084 CHAVE-S2=00007 R1=*CR1
CHAVE-S1=00083 CHAVE-S2=00008 R1=*CR1
CHAVE-S1=00082 CHAVE-S2=00009 R1=*CR1
CHAVE-S1=00081 CHAVE-S2=00010 R1=*CR1
CHAVE-S1=00080 CHAVE-S2=00011 R1=*CR1
CHAVE-S1=00200 CHAVE-S2=90091 R1=#IR1
CHAVE-S1=00199 CHAVE-S2=90092 R1=#IR1
CHAVE-S1=00198 CHAVE-S2=90093 R1=#IR1
CHAVE-S1=00197 CHAVE-S2=90094 R1=#IR1
CHAVE-S1=00196 CHAVE-S2=90095 R1=#IR1
CHAVE-S1=00195 CHAVE-S2=90096 R1=#IR1
CHAVE-S1=00194 CHAVE-S2=90097 R1=#IR1
CHAVE-S1=00193 CHAVE-S2=90098 R1=#IR1
CHAVE-S1=00192 CHAVE-S2=90099 R1=#IR1
CHAVE-S1=00191 CHAVE-S2=90100 R1=#IR1
CHAVE-S1=00190 CHAVE-S2=90101 R1=#IR1

Exemplo : arquivo resultante listado por ordem de chave alternada 1


***************
CHAVE-PRI=00021
CHAVE-PRI=00020
CHAVE-PRI=00019

LISTA POR CHAVE ALTERN 1 ***********


CHAVE-S1=00080 CHAVE-S2=00011 R1=*CR1
CHAVE-S1=00081 CHAVE-S2=00010 R1=*CR1
CHAVE-S1=00082 CHAVE-S2=00009 R1=*CR1

94

CHAVE-PRI=00018
CHAVE-PRI=00017
CHAVE-PRI=00016
CHAVE-PRI=00015
CHAVE-PRI=00014
CHAVE-PRI=00013
CHAVE-PRI=00012
CHAVE-PRI=00011
CHAVE-PRI=00010
CHAVE-PRI=00009
CHAVE-PRI=00008
CHAVE-PRI=00007
CHAVE-PRI=00006
CHAVE-PRI=00005
CHAVE-PRI=00004
CHAVE-PRI=00003
CHAVE-PRI=00002
CHAVE-PRI=00001
CHAVE-PRI=00511
CHAVE-PRI=00510
CHAVE-PRI=00509
CHAVE-PRI=00508
CHAVE-PRI=00507
CHAVE-PRI=00506
CHAVE-PRI=00505
CHAVE-PRI=00504
CHAVE-PRI=00503
CHAVE-PRI=00502
CHAVE-PRI=00501

CHAVE-S1=00083
CHAVE-S1=00084
CHAVE-S1=00085
CHAVE-S1=00086
CHAVE-S1=00087
CHAVE-S1=00088
CHAVE-S1=00089
CHAVE-S1=00090
CHAVE-S1=00091
CHAVE-S1=00092
CHAVE-S1=00093
CHAVE-S1=00094
CHAVE-S1=00095
CHAVE-S1=00096
CHAVE-S1=00097
CHAVE-S1=00098
CHAVE-S1=00099
CHAVE-S1=00100
CHAVE-S1=00190
CHAVE-S1=00191
CHAVE-S1=00192
CHAVE-S1=00193
CHAVE-S1=00194
CHAVE-S1=00195
CHAVE-S1=00196
CHAVE-S1=00197
CHAVE-S1=00198
CHAVE-S1=00199
CHAVE-S1=00200

CHAVE-S2=00008
CHAVE-S2=00007
CHAVE-S2=00006
CHAVE-S2=00005
CHAVE-S2=00004
CHAVE-S2=00003
CHAVE-S2=00002
CHAVE-S2=00001
CHAVE-S2=00000
CHAVE-S2=99999
CHAVE-S2=99998
CHAVE-S2=99997
CHAVE-S2=99996
CHAVE-S2=99995
CHAVE-S2=99994
CHAVE-S2=99993
CHAVE-S2=99992
CHAVE-S2=99991
CHAVE-S2=90101
CHAVE-S2=90100
CHAVE-S2=90099
CHAVE-S2=90098
CHAVE-S2=90097
CHAVE-S2=90096
CHAVE-S2=90095
CHAVE-S2=90094
CHAVE-S2=90093
CHAVE-S2=90092
CHAVE-S2=90091

R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=*CR1
R1=@UR1
R1=@UR1
R1=@UR1
R1=@UR1
R1=@UR1
R1=@UR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1

Exemplo : arquivo resultante listado por ordem de chave alternada 2


***************
CHAVE-PRI=00010
CHAVE-PRI=00011
CHAVE-PRI=00012
CHAVE-PRI=00013
CHAVE-PRI=00014
CHAVE-PRI=00015
CHAVE-PRI=00016
CHAVE-PRI=00017
CHAVE-PRI=00018
CHAVE-PRI=00019
CHAVE-PRI=00020
CHAVE-PRI=00021
CHAVE-PRI=00501
CHAVE-PRI=00502
CHAVE-PRI=00503
CHAVE-PRI=00504
CHAVE-PRI=00505
CHAVE-PRI=00506
CHAVE-PRI=00507
CHAVE-PRI=00508
CHAVE-PRI=00509
CHAVE-PRI=00510
CHAVE-PRI=00511
CHAVE-PRI=00001
CHAVE-PRI=00002
CHAVE-PRI=00003

LISTA POR CHAVE ALTERN 2 ***********


CHAVE-S1=00091 CHAVE-S2=00000 R1=*CR1
CHAVE-S1=00090 CHAVE-S2=00001 R1=*CR1
CHAVE-S1=00089 CHAVE-S2=00002 R1=*CR1
CHAVE-S1=00088 CHAVE-S2=00003 R1=*CR1
CHAVE-S1=00087 CHAVE-S2=00004 R1=*CR1
CHAVE-S1=00086 CHAVE-S2=00005 R1=*CR1
CHAVE-S1=00085 CHAVE-S2=00006 R1=*CR1
CHAVE-S1=00084 CHAVE-S2=00007 R1=*CR1
CHAVE-S1=00083 CHAVE-S2=00008 R1=*CR1
CHAVE-S1=00082 CHAVE-S2=00009 R1=*CR1
CHAVE-S1=00081 CHAVE-S2=00010 R1=*CR1
CHAVE-S1=00080 CHAVE-S2=00011 R1=*CR1
CHAVE-S1=00200 CHAVE-S2=90091 R1=#IR1
CHAVE-S1=00199 CHAVE-S2=90092 R1=#IR1
CHAVE-S1=00198 CHAVE-S2=90093 R1=#IR1
CHAVE-S1=00197 CHAVE-S2=90094 R1=#IR1
CHAVE-S1=00196 CHAVE-S2=90095 R1=#IR1
CHAVE-S1=00195 CHAVE-S2=90096 R1=#IR1
CHAVE-S1=00194 CHAVE-S2=90097 R1=#IR1
CHAVE-S1=00193 CHAVE-S2=90098 R1=#IR1
CHAVE-S1=00192 CHAVE-S2=90099 R1=#IR1
CHAVE-S1=00191 CHAVE-S2=90100 R1=#IR1
CHAVE-S1=00190 CHAVE-S2=90101 R1=#IR1
CHAVE-S1=00100 CHAVE-S2=99991 R1=@UR1
CHAVE-S1=00099 CHAVE-S2=99992 R1=@UR1
CHAVE-S1=00098 CHAVE-S2=99993 R1=@UR1

95

CHAVE-PRI=00004
CHAVE-PRI=00005
CHAVE-PRI=00006
CHAVE-PRI=00007
CHAVE-PRI=00008
CHAVE-PRI=00009

CHAVE-S1=00097
CHAVE-S1=00096
CHAVE-S1=00095
CHAVE-S1=00094
CHAVE-S1=00093
CHAVE-S1=00092

CHAVE-S2=99994
CHAVE-S2=99995
CHAVE-S2=99996
CHAVE-S2=99997
CHAVE-S2=99998
CHAVE-S2=99999

R1=@UR1
R1=@UR1
R1=@UR1
R1=*CR1
R1=*CR1
R1=*CR1

96

13.1.4 Re-gravar registro (atualizao in-place) por chave alternada 1

Conceitos :
pode-se alterar dados exceto chaves
quando comando o REWRITE , o ltimo registro lido que alterado, independentemente de
como ele foi lido

SELECT nome_arquivo
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
FILE STATUS IS variavel_wss
RECORD KEY IS chave_alternada_1

DDs

Procedimentos :
Abrir o arquivo com OPEN I-O nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro
Ler o registro que se deseja alterar;

Se se quiser fazer leitura direta : efetuar a leitura conforme explicado em LEITURA


DIRETA por chave alternada 1 :
mover o valor da chave que identifica o registro desejado para a rea da RECORD KEY ou
ALTERNATE RECORD KEY na FILE SECTION e em seguida dar o comando READ
nome_arquivo e testar file status :
File Status : 00 = OK ; 02 = OK; DUPKEY ; 23 = NOTFOUND ; outros = erro

Se se quiser fazer leitura sequencial : efetuar a leitura conforme explicado em


LEITURA SEQUENCIAL por chave alternada 1:
dar o comando READ nome_arquivo e testar file status :
File Status : 00 : OK ; 10 = EOF ; outros = erro

Pode-se fazer outro tipo de leitura (com START , etc...)


Se o registro foi lido, para atualiz-lo :
Alterar a rea do FD com os novos dados (alteraes desejadas) e
RE-Gravar o registro com REWRITE nome_rea_fd testando o file status :
File Status = 00 : REWRITE OK. Registro atualizado
File Status = 21 : erro : a chave primria foi mudada
File Status = 22 : erro : DUPKEY = Reg no atualizado
File Status = 23 : erro : NOTFOUND = Reg no atualizado pois no foi previamente
lido
File Status outros = : erro no REWRITE
Fechar o arquivo com CLOSE nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro

//ddname

DD

DISP=SHR,DSN=dsname_cluster.PATH.AIX1

97

Exemplos bsicos :
REWRITE area-fd INVALID KEY imperativo
Ex.: REWRITE AG INVALID KEY DISPLAY CHAVE INVALIDA
REWRITE area-fd NOT INVALID KEY imperativo
Ex.: REWRITE AG NOT INVALID KEY DISPLAY CHAVE OK. REGRAVADO
REWRITE area-fd FROM area-working-storage INVALID KEY imperativo
Ex.: REWRITE AG FROM REG-CADASTRO INVALID KEY CHAVE INVALIDA
REWRITE area-fd FROM area-working-storage NOT INVALID KEY imperativo
Ex.: REWRITE AG FROM REG-CADASTRO NOT INVALID KEY DISPLAY OK !!

Exemplo : JCL e fonte


//LSG#@UA1 JOB ('ALBERTO'),'ALBERTO',CLASS=1,MSGCLASS=X
//PROCLIB JCLLIB ORDER=(TORI243.T#RPC.SRC)
//*--------------------------------------------------------------//STEP1
EXEC COBCLG,MEMBER=P04UA1
//COMP.SYSIN
DD *
IDENTIFICATION DIVISION.
PROGRAM-ID. P04UA1.
*---------------------------------------------------------------* RE-GRAVACAO DE REGISTROS (ATUALIZ IN-PLACE) POR CHAVE ALTERN 1
*---------------------------------------------------------------ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*----------------------------------------------------------------* ARQUIVO - VSAM KSDS JAH EXISTENTE; UPDATE REGISTROS JAH EXISTEM
*----------------------------------------------------------------SELECT ARQUIVO ASSIGN TO ARQUIVO
ORGANIZATION INDEXED
ACCESS RANDOM
RECORD KEY A-FD-ARQUIVO-CHAVES1
File Status FS-ARQ.
*----------------------------------------------------------------DATA DIVISION.
FILE SECTION.
*----------------------------------------------------------------FD
ARQUIVO.
01
A-FD-ARQUIVO.
05 A-FD-ARQUIVO-CHAVEP
PIC X(05).
05 A-FD-ARQUIVO-RESTO1
PIC X(10).
05 A-FD-ARQUIVO-CHAVES1
PIC X(05).
05 A-FD-ARQUIVO-RESTO2
PIC X(10).
05 A-FD-ARQUIVO-CHAVES2
PIC X(05).
05 A-FD-ARQUIVO-RESTO3
PIC X(10).
05 A-FD-ARQUIVO-RESTO4
PIC X(35).

98

*----------------------------------------------------------------WORKING-STORAGE SECTION.
*
01 FS-ARQ
PIC X(02).
01 EOF-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 STOP-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 LEU-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 WW-ULTGRAVADO
PIC 9(5) VALUE ZERO.
01 WW-ARQUIVO
PIC 9(5) VALUE ZERO.
01 WW-CHAVEP
PIC 9(5) VALUE ZERO.
01 WW-CHAVES1
PIC 9(5) VALUE ZERO.
01 WW-CHAVES2
PIC 9(5) VALUE ZERO.
01 UU-ARQUIVO
PIC 9(5) VALUE ZERO.
*---------------------------------------------------------------PROCEDURE DIVISION.
*---------------------------------------------------------------PROGRAMA SECTION.
*
DISPLAY '------------------------------------------------'
DISPLAY 'UPDATE (IN-PLACE) DE REGS POR CHAVE ALTERNADA 1 '
DISPLAY '------------------------------------------------'
*
OPEN I-O
ARQUIVO.
EVALUATE FS-ARQ
WHEN '00'
DISPLAY '
FS=' FS-ARQ ' OPEN OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQ ' OPEN ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
*
IF STOP-ARQUIVO EQUAL 'NAO'
PERFORM GRAVUPDT UNTIL
WW-ARQUIVO > 4
OR
STOP-ARQUIVO = 'SIM'
END-IF
*
CLOSE ARQUIVO.
EVALUATE FS-ARQ
WHEN '00'
DISPLAY '
FS=' FS-ARQ ' CLOSE OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQ ' CLOSE ERRO'
END-EVALUATE
*
DISPLAY '------------------------------------------------'
DISPLAY 'REGRAVADOS ARQUIVO
= ' UU-ARQUIVO
DISPLAY '------------------------------------------------'
STOP RUN.
*
*---------------------------------------------------------------* EFETUAR UPDATE
*---------------------------------------------------------------GRAVUPDT SECTION.
*
ADD
1
TO WW-ARQUIVO.
COMPUTE WW-CHAVES1 = WW-ARQUIVO + 80
*
PERFORM LER-PARA-POSICIONAR

99

*
IF
MOVE
MOVE
MOVE
MOVE

LEU-ARQUIVO
'$UR1
'
'$UR2
'
'$UR3
'
'$UR4
'

= 'SIM'
TO A-FD-ARQUIVO-RESTO1
TO A-FD-ARQUIVO-RESTO2
TO A-FD-ARQUIVO-RESTO3
TO A-FD-ARQUIVO-RESTO4

*
REWRITE A-FD-ARQUIVO
EVALUATE FS-ARQ
WHEN '00'
DISPLAY '
FS=' FS-ARQ ' REWRITE OK'
' CHAVEP:' A-FD-ARQUIVO-CHAVEP
' CHAVES1:' A-FD-ARQUIVO-CHAVES1
' CHAVES2:' A-FD-ARQUIVO-CHAVES2
' RESTO1:' A-FD-ARQUIVO-RESTO1
MOVE
'SIM' TO LEU-ARQUIVO
ADD 1 TO UU-ARQUIVO
WHEN '21'
DISPLAY '
FS=' FS-ARQ ' REWRITE CHAVE MUDADA'
' CHAVEP :' WW-CHAVEP
WHEN '22'
DISPLAY '
FS=' FS-ARQ ' REWRITE DUPKEY'
' CHAVEP :' WW-CHAVEP
WHEN '23'
DISPLAY '
FS=' FS-ARQ ' REWRITE NOTFOUND'
' CHAVEP :' WW-CHAVEP
WHEN OTHER
DISPLAY '
FS=' FS-ARQ ' REWRITE ERRO'
' CHAVEP :' WW-CHAVEP
END-EVALUATE
END-IF
*
CONTINUE.
SAI-GRAVUPDT. EXIT.
*---------------------------------------------------------------* LE UM REGISTRO PARA PODER ATUALIZA-LO
*---------------------------------------------------------------LER-PARA-POSICIONAR SECTION.
MOVE
'NAO'
TO LEU-ARQUIVO
MOVE
WW-CHAVES1
TO A-FD-ARQUIVO-CHAVES1
READ
ARQUIVO
EVALUATE FS-ARQ
WHEN '00'
DISPLAY '
FS=' FS-ARQ ' READ
OK'
' CHAVEP:' A-FD-ARQUIVO-CHAVEP
' CHAVES1:' A-FD-ARQUIVO-CHAVES1
' CHAVES2:' A-FD-ARQUIVO-CHAVES2
MOVE
'SIM' TO LEU-ARQUIVO
WHEN '02'
DISPLAY '
FS=' FS-ARQ ' READ KEYDUP
' WW-CHAVES1
WHEN '23'
DISPLAY '
FS=' FS-ARQ ' READ NOTFOUND ' WW-CHAVES1
WHEN OTHER
DISPLAY '
FS=' FS-ARQ ' READ ERRO
' WW-CHAVES1
END-EVALUATE
*
CONTINUE.
SAI-LER-PARA-POSICIONAR. EXIT.
*

100

//GO.SYSPRINT
//GO.ARQUIVO

DD SYSOUT=*
DD DSN=DSVAABVS.LSG.A002.ALBERTO.PATH.AIX1,DISP=SHR

Exemplo : listagem produzida pelo aplicativo


-----------------------------------------------UPDATE (IN-PLACE) DE REGS POR CHAVE ALTERNADA 1
-----------------------------------------------FS=00 OPEN OK
FS=00 READ
OK CHAVEP:00020 CHAVES1:00081 CHAVES2:00010
FS=00 REWRITE OK CHAVEP:00020 CHAVES1:00081 CHAVES2:00010
FS=00 READ
OK CHAVEP:00019 CHAVES1:00082 CHAVES2:00009
FS=00 REWRITE OK CHAVEP:00019 CHAVES1:00082 CHAVES2:00009
FS=00 READ
OK CHAVEP:00018 CHAVES1:00083 CHAVES2:00008
FS=00 REWRITE OK CHAVEP:00018 CHAVES1:00083 CHAVES2:00008
FS=00 READ
OK CHAVEP:00017 CHAVES1:00084 CHAVES2:00007
FS=00 REWRITE OK CHAVEP:00017 CHAVES1:00084 CHAVES2:00007
FS=00 READ
OK CHAVEP:00016 CHAVES1:00085 CHAVES2:00006
FS=00 REWRITE OK CHAVEP:00016 CHAVES1:00085 CHAVES2:00006
FS=00 CLOSE OK
-----------------------------------------------REGRAVADOS ARQUIVO
= 00005
------------------------------------------------

Exemplo : arquivo resultante listado por ordem de chave primria


***************
CHAVE-PRI=00001
CHAVE-PRI=00002
CHAVE-PRI=00003
CHAVE-PRI=00004
CHAVE-PRI=00005
CHAVE-PRI=00006
CHAVE-PRI=00007
CHAVE-PRI=00008
CHAVE-PRI=00009
CHAVE-PRI=00010
CHAVE-PRI=00011
CHAVE-PRI=00012
CHAVE-PRI=00013
CHAVE-PRI=00014
CHAVE-PRI=00015
CHAVE-PRI=00016
CHAVE-PRI=00017
CHAVE-PRI=00018
CHAVE-PRI=00019
CHAVE-PRI=00020
CHAVE-PRI=00021
CHAVE-PRI=00501
CHAVE-PRI=00502
CHAVE-PRI=00503
CHAVE-PRI=00504
CHAVE-PRI=00505
CHAVE-PRI=00506
CHAVE-PRI=00507
CHAVE-PRI=00508
CHAVE-PRI=00509
CHAVE-PRI=00510

LISTA POR CHAVE PRIMARIA ***********


CHAVE-S1=00100 CHAVE-S2=99991 R1=@UR1
CHAVE-S1=00099 CHAVE-S2=99992 R1=@UR1
CHAVE-S1=00098 CHAVE-S2=99993 R1=@UR1
CHAVE-S1=00097 CHAVE-S2=99994 R1=@UR1
CHAVE-S1=00096 CHAVE-S2=99995 R1=@UR1
CHAVE-S1=00095 CHAVE-S2=99996 R1=@UR1
CHAVE-S1=00094 CHAVE-S2=99997 R1=*CR1
CHAVE-S1=00093 CHAVE-S2=99998 R1=*CR1
CHAVE-S1=00092 CHAVE-S2=99999 R1=*CR1
CHAVE-S1=00091 CHAVE-S2=00000 R1=*CR1
CHAVE-S1=00090 CHAVE-S2=00001 R1=*CR1
CHAVE-S1=00089 CHAVE-S2=00002 R1=*CR1
CHAVE-S1=00088 CHAVE-S2=00003 R1=*CR1
CHAVE-S1=00087 CHAVE-S2=00004 R1=*CR1
CHAVE-S1=00086 CHAVE-S2=00005 R1=*CR1
CHAVE-S1=00085 CHAVE-S2=00006 R1=$UR1
CHAVE-S1=00084 CHAVE-S2=00007 R1=$UR1
CHAVE-S1=00083 CHAVE-S2=00008 R1=$UR1
CHAVE-S1=00082 CHAVE-S2=00009 R1=$UR1
CHAVE-S1=00081 CHAVE-S2=00010 R1=$UR1
CHAVE-S1=00080 CHAVE-S2=00011 R1=*CR1
CHAVE-S1=00200 CHAVE-S2=90091 R1=#IR1
CHAVE-S1=00199 CHAVE-S2=90092 R1=#IR1
CHAVE-S1=00198 CHAVE-S2=90093 R1=#IR1
CHAVE-S1=00197 CHAVE-S2=90094 R1=#IR1
CHAVE-S1=00196 CHAVE-S2=90095 R1=#IR1
CHAVE-S1=00195 CHAVE-S2=90096 R1=#IR1
CHAVE-S1=00194 CHAVE-S2=90097 R1=#IR1
CHAVE-S1=00193 CHAVE-S2=90098 R1=#IR1
CHAVE-S1=00192 CHAVE-S2=90099 R1=#IR1
CHAVE-S1=00191 CHAVE-S2=90100 R1=#IR1

101

RESTO1:$UR1
RESTO1:$UR1
RESTO1:$UR1
RESTO1:$UR1
RESTO1:$UR1

CHAVE-PRI=00511 CHAVE-S1=00190 CHAVE-S2=90101 R1=#IR1

Exemplo : arquivo resultante listado por ordem de chave alternada 1


***************
CHAVE-PRI=00021
CHAVE-PRI=00020
CHAVE-PRI=00019
CHAVE-PRI=00018
CHAVE-PRI=00017
CHAVE-PRI=00016
CHAVE-PRI=00015
CHAVE-PRI=00014
CHAVE-PRI=00013
CHAVE-PRI=00012
CHAVE-PRI=00011
CHAVE-PRI=00010
CHAVE-PRI=00009
CHAVE-PRI=00008
CHAVE-PRI=00007
CHAVE-PRI=00006
CHAVE-PRI=00005
CHAVE-PRI=00004
CHAVE-PRI=00003
CHAVE-PRI=00002
CHAVE-PRI=00001
CHAVE-PRI=00511
CHAVE-PRI=00510
CHAVE-PRI=00509
CHAVE-PRI=00508
CHAVE-PRI=00507
CHAVE-PRI=00506
CHAVE-PRI=00505
CHAVE-PRI=00504
CHAVE-PRI=00503
CHAVE-PRI=00502
CHAVE-PRI=00501

LISTA POR CHAVE ALTERN 1 ***********


CHAVE-S1=00080 CHAVE-S2=00011 R1=*CR1
CHAVE-S1=00081 CHAVE-S2=00010 R1=$UR1
CHAVE-S1=00082 CHAVE-S2=00009 R1=$UR1
CHAVE-S1=00083 CHAVE-S2=00008 R1=$UR1
CHAVE-S1=00084 CHAVE-S2=00007 R1=$UR1
CHAVE-S1=00085 CHAVE-S2=00006 R1=$UR1
CHAVE-S1=00086 CHAVE-S2=00005 R1=*CR1
CHAVE-S1=00087 CHAVE-S2=00004 R1=*CR1
CHAVE-S1=00088 CHAVE-S2=00003 R1=*CR1
CHAVE-S1=00089 CHAVE-S2=00002 R1=*CR1
CHAVE-S1=00090 CHAVE-S2=00001 R1=*CR1
CHAVE-S1=00091 CHAVE-S2=00000 R1=*CR1
CHAVE-S1=00092 CHAVE-S2=99999 R1=*CR1
CHAVE-S1=00093 CHAVE-S2=99998 R1=*CR1
CHAVE-S1=00094 CHAVE-S2=99997 R1=*CR1
CHAVE-S1=00095 CHAVE-S2=99996 R1=@UR1
CHAVE-S1=00096 CHAVE-S2=99995 R1=@UR1
CHAVE-S1=00097 CHAVE-S2=99994 R1=@UR1
CHAVE-S1=00098 CHAVE-S2=99993 R1=@UR1
CHAVE-S1=00099 CHAVE-S2=99992 R1=@UR1
CHAVE-S1=00100 CHAVE-S2=99991 R1=@UR1
CHAVE-S1=00190 CHAVE-S2=90101 R1=#IR1
CHAVE-S1=00191 CHAVE-S2=90100 R1=#IR1
CHAVE-S1=00192 CHAVE-S2=90099 R1=#IR1
CHAVE-S1=00193 CHAVE-S2=90098 R1=#IR1
CHAVE-S1=00194 CHAVE-S2=90097 R1=#IR1
CHAVE-S1=00195 CHAVE-S2=90096 R1=#IR1
CHAVE-S1=00196 CHAVE-S2=90095 R1=#IR1
CHAVE-S1=00197 CHAVE-S2=90094 R1=#IR1
CHAVE-S1=00198 CHAVE-S2=90093 R1=#IR1
CHAVE-S1=00199 CHAVE-S2=90092 R1=#IR1
CHAVE-S1=00200 CHAVE-S2=90091 R1=#IR1

Exemplo : arquivo resultante listado por ordem de chave alternada 2


***************
CHAVE-PRI=00010
CHAVE-PRI=00011
CHAVE-PRI=00012
CHAVE-PRI=00013
CHAVE-PRI=00014
CHAVE-PRI=00015
CHAVE-PRI=00016
CHAVE-PRI=00017
CHAVE-PRI=00018
CHAVE-PRI=00019
CHAVE-PRI=00020
CHAVE-PRI=00021
CHAVE-PRI=00501
CHAVE-PRI=00502
CHAVE-PRI=00503
CHAVE-PRI=00504

LISTA POR CHAVE ALTERN 2 ***********


CHAVE-S1=00091 CHAVE-S2=00000 R1=*CR1
CHAVE-S1=00090 CHAVE-S2=00001 R1=*CR1
CHAVE-S1=00089 CHAVE-S2=00002 R1=*CR1
CHAVE-S1=00088 CHAVE-S2=00003 R1=*CR1
CHAVE-S1=00087 CHAVE-S2=00004 R1=*CR1
CHAVE-S1=00086 CHAVE-S2=00005 R1=*CR1
CHAVE-S1=00085 CHAVE-S2=00006 R1=$UR1
CHAVE-S1=00084 CHAVE-S2=00007 R1=$UR1
CHAVE-S1=00083 CHAVE-S2=00008 R1=$UR1
CHAVE-S1=00082 CHAVE-S2=00009 R1=$UR1
CHAVE-S1=00081 CHAVE-S2=00010 R1=$UR1
CHAVE-S1=00080 CHAVE-S2=00011 R1=*CR1
CHAVE-S1=00200 CHAVE-S2=90091 R1=#IR1
CHAVE-S1=00199 CHAVE-S2=90092 R1=#IR1
CHAVE-S1=00198 CHAVE-S2=90093 R1=#IR1
CHAVE-S1=00197 CHAVE-S2=90094 R1=#IR1

102

CHAVE-PRI=00505
CHAVE-PRI=00506
CHAVE-PRI=00507
CHAVE-PRI=00508
CHAVE-PRI=00509
CHAVE-PRI=00510
CHAVE-PRI=00511
CHAVE-PRI=00001
CHAVE-PRI=00002
CHAVE-PRI=00003
CHAVE-PRI=00004
CHAVE-PRI=00005
CHAVE-PRI=00006
CHAVE-PRI=00007
CHAVE-PRI=00008
CHAVE-PRI=00009

CHAVE-S1=00196
CHAVE-S1=00195
CHAVE-S1=00194
CHAVE-S1=00193
CHAVE-S1=00192
CHAVE-S1=00191
CHAVE-S1=00190
CHAVE-S1=00100
CHAVE-S1=00099
CHAVE-S1=00098
CHAVE-S1=00097
CHAVE-S1=00096
CHAVE-S1=00095
CHAVE-S1=00094
CHAVE-S1=00093
CHAVE-S1=00092

CHAVE-S2=90095
CHAVE-S2=90096
CHAVE-S2=90097
CHAVE-S2=90098
CHAVE-S2=90099
CHAVE-S2=90100
CHAVE-S2=90101
CHAVE-S2=99991
CHAVE-S2=99992
CHAVE-S2=99993
CHAVE-S2=99994
CHAVE-S2=99995
CHAVE-S2=99996
CHAVE-S2=99997
CHAVE-S2=99998
CHAVE-S2=99999

R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=@UR1
R1=@UR1
R1=@UR1
R1=@UR1
R1=@UR1
R1=@UR1
R1=*CR1
R1=*CR1
R1=*CR1

103

13.1.5 Re-gravar registro (atualizao in-place) por chave alternada 2

Conceitos :
pode-se alterar dados exceto chaves
quando comando o REWRITE , o ltimo registro lido que alterado, independentemente de
como ele foi lido

SELECT nome_arquivo
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
FILE STATUS IS variavel_wss
RECORD KEY IS chave_alternada_2

DDs

Procedimentos :
Abrir o arquivo com OPEN I-O nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro
Ler o registro que se deseja alterar;

Se se quiser fazer leitura direta : efetuar a leitura conforme explicado em LEITURA


DIRETA por chave alternada 2 :
mover o valor da chave que identifica o registro desejado para a rea da RECORD KEY ou
ALTERNATE RECORD KEY na FILE SECTION e em seguida dar o comando READ
nome_arquivo e testar file status :
File Status : 00 = OK ; 02 = OK; DUPKEY ; 23 = NOTFOUND ; outros = erro

Se se quiser fazer leitura sequencial : efetuar a leitura conforme explicado em


LEITURA SEQUENCIAL por chave alternada 2:
dar o comando READ nome_arquivo e testar file status :
File Status : 00 : OK ; 10 = EOF ; outros = erro

Pode-se fazer outro tipo de leitura (com START, etc...)


Se o registro foi lido, para atualiz-lo :
Alterar a rea do FD com os novos dados (alteraes desejadas) e
RE-Gravar o registro com REWRITE nome_rea_fd testando o file status :
File Status = 00 : REWRITE OK. Registro atualizado
File Status = 21 : erro : a chave primria foi mudada
File Status = 22 : erro : DUPKEY = Reg no atualizado
File Status = 23 : erro : NOTFOUND = Reg no atualizado pois no foi previamente
lido
File Status outros = : erro no REWRITE
Fechar o arquivo com CLOSE nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro

//ddname

DD

DISP=SHR,DSN=dsname_cluster.PATH.AIX2

104

Exemplos bsicos :
REWRITE area-fd INVALID KEY imperativo
Ex.: REWRITE AG INVALID KEY DISPLAY CHAVE INVALIDA
REWRITE area-fd NOT INVALID KEY imperativo
Ex.: REWRITE AG NOT INVALID KEY DISPLAY CHAVE OK. REGRAVADO
REWRITE area-fd FROM area-working-storage INVALID KEY imperativo
Ex.: REWRITE AG FROM REG-CADASTRO INVALID KEY CHAVE INVALIDA
REWRITE area-fd FROM area-working-storage NOT INVALID KEY imperativo
Ex.: REWRITE AG FROM REG-CADASTRO NOT INVALID KEY DISPLAY OK !!

Exemplo : JCL e fonte


//LSG#@UA2 JOB ('ALBERTO'),'ALBERTO',CLASS=9,MSGCLASS=X
//PROCLIB JCLLIB ORDER=(TORI243.T#RPC.SRC)
//*--------------------------------------------------------------//STEP1
EXEC COBCLG,MEMBER=P05UA2
//COMP.SYSIN
DD *
IDENTIFICATION DIVISION.
PROGRAM-ID. P05UA2.
*---------------------------------------------------------------* RE-GRAVACAO DE REGISTROS (ATUALIZ IN-PLACE) POR CHAVE ALTERN 2
*---------------------------------------------------------------ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*----------------------------------------------------------------* ARQUIVO - VSAM KSDS JAH EXISTENTE; UPDATE REGISTROS JAH EXISTEM
*----------------------------------------------------------------SELECT ARQUIVO ASSIGN TO ARQUIVO
ORGANIZATION INDEXED
ACCESS RANDOM
RECORD KEY A-FD-ARQUIVO-CHAVES2
File Status FS-ARQ.
*----------------------------------------------------------------DATA DIVISION.
FILE SECTION.
*----------------------------------------------------------------FD
ARQUIVO.
01
A-FD-ARQUIVO.
05 A-FD-ARQUIVO-CHAVEP
PIC X(05).
05 A-FD-ARQUIVO-RESTO1
PIC X(10).
05 A-FD-ARQUIVO-CHAVES1
PIC X(05).
05 A-FD-ARQUIVO-RESTO2
PIC X(10).
05 A-FD-ARQUIVO-CHAVES2
PIC X(05).
05 A-FD-ARQUIVO-RESTO3
PIC X(10).

105

05 A-FD-ARQUIVO-RESTO4
PIC X(35).
*----------------------------------------------------------------WORKING-STORAGE SECTION.
*
01 FS-ARQ
PIC X(02).
01 EOF-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 STOP-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 LEU-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 WW-ULTGRAVADO
PIC 9(5) VALUE ZERO.
01 WW-ARQUIVO
PIC 9(5) VALUE ZERO.
01 WW-CHAVEP
PIC 9(5) VALUE ZERO.
01 WW-CHAVES1
PIC 9(5) VALUE ZERO.
01 WW-CHAVES2
PIC 9(5) VALUE ZERO.
01 UU-ARQUIVO
PIC 9(5) VALUE ZERO.
*---------------------------------------------------------------PROCEDURE DIVISION.
*---------------------------------------------------------------PROGRAMA SECTION.
*
DISPLAY '------------------------------------------------'
DISPLAY 'UPDATE (IN-PLACE) DE REGS POR CHAVE ALTERNADA 2 '
DISPLAY '------------------------------------------------'
*
OPEN I-O
ARQUIVO.
EVALUATE FS-ARQ
WHEN '00'
DISPLAY '
FS=' FS-ARQ ' OPEN OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQ ' OPEN ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
*
IF STOP-ARQUIVO EQUAL 'NAO'
PERFORM GRAVUPDT UNTIL
WW-ARQUIVO > 4
OR
STOP-ARQUIVO = 'SIM'
END-IF
*
CLOSE ARQUIVO.
EVALUATE FS-ARQ
WHEN '00'
DISPLAY '
FS=' FS-ARQ ' CLOSE OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQ ' CLOSE ERRO'
END-EVALUATE
*
DISPLAY '------------------------------------------------'
DISPLAY 'REGRAVADOS ARQUIVO
= ' UU-ARQUIVO
DISPLAY '------------------------------------------------'
STOP RUN.
*
*---------------------------------------------------------------* EFETUAR UPDATE
*---------------------------------------------------------------GRAVUPDT SECTION.
*
ADD
1
TO WW-ARQUIVO.
MOVE
WW-ARQUIVO
TO WW-CHAVES2.
*

106

PERFORM LER-PARA-POSICIONAR
*
IF
MOVE
MOVE
MOVE
MOVE

LEU-ARQUIVO
'#UR1
'
'#UR2
'
'#UR3
'
'#UR4
'

= 'SIM'
TO A-FD-ARQUIVO-RESTO1
TO A-FD-ARQUIVO-RESTO2
TO A-FD-ARQUIVO-RESTO3
TO A-FD-ARQUIVO-RESTO4

*
REWRITE A-FD-ARQUIVO
EVALUATE FS-ARQ
WHEN '00'
DISPLAY '
FS=' FS-ARQ ' REWRITE OK'
' CHAVEP:' A-FD-ARQUIVO-CHAVEP
' CHAVES1:' A-FD-ARQUIVO-CHAVES1
' CHAVES2:' A-FD-ARQUIVO-CHAVES2
' RESTO1:' A-FD-ARQUIVO-RESTO1
MOVE
'SIM' TO LEU-ARQUIVO
ADD 1 TO UU-ARQUIVO
WHEN '21'
DISPLAY '
FS=' FS-ARQ ' REWRITE CHAVE MUDADA'
' CHAVEP :' WW-CHAVEP
WHEN '22'
DISPLAY '
FS=' FS-ARQ ' REWRITE DUPKEY'
' CHAVEP :' WW-CHAVEP
WHEN '23'
DISPLAY '
FS=' FS-ARQ ' REWRITE NOTFOUND'
' CHAVEP :' WW-CHAVEP
WHEN OTHER
DISPLAY '
FS=' FS-ARQ ' REWRITE ERRO'
' CHAVEP :' WW-CHAVEP
END-EVALUATE
END-IF
*
CONTINUE.
SAI-GRAVUPDT. EXIT.
*---------------------------------------------------------------* LE UM REGISTRO PARA PODER ATUALIZA-LO
*---------------------------------------------------------------LER-PARA-POSICIONAR SECTION.
*
MOVE
'NAO'
TO LEU-ARQUIVO
MOVE
WW-CHAVES2
TO A-FD-ARQUIVO-CHAVES2
READ
ARQUIVO
EVALUATE FS-ARQ
WHEN '00'
DISPLAY '
FS=' FS-ARQ ' READ
OK'
' CHAVEP:' A-FD-ARQUIVO-CHAVEP
' CHAVES1:' A-FD-ARQUIVO-CHAVES1
' CHAVES2:' A-FD-ARQUIVO-CHAVES2
MOVE
'SIM' TO LEU-ARQUIVO
WHEN '02'
DISPLAY '
FS=' FS-ARQ ' READ KEYDUP
' WW-CHAVES2
WHEN '23'
DISPLAY '
FS=' FS-ARQ ' READ NOTFOUND ' WW-CHAVES2
WHEN OTHER
DISPLAY '
FS=' FS-ARQ ' READ ERRO
' WW-CHAVES2
END-EVALUATE
*
CONTINUE.

107

SAI-LER-PARA-POSICIONAR. EXIT.
*
//GO.SYSPRINT DD SYSOUT=*
//GO.ARQUIVO
DD DSN=DSVAABVS.LSG.A002.ALBERTO.PATH.AIX2,DISP=SHR

Exemplo : listagem produzida pelo aplicativo


-----------------------------------------------UPDATE (IN-PLACE) DE REGS POR CHAVE ALTERNADA 2
-----------------------------------------------FS=00 OPEN OK
FS=00 READ
OK CHAVEP:00011 CHAVES1:00090 CHAVES2:00001
FS=00 REWRITE OK CHAVEP:00011 CHAVES1:00090 CHAVES2:00001
FS=00 READ
OK CHAVEP:00012 CHAVES1:00089 CHAVES2:00002
FS=00 REWRITE OK CHAVEP:00012 CHAVES1:00089 CHAVES2:00002
FS=00 READ
OK CHAVEP:00013 CHAVES1:00088 CHAVES2:00003
FS=00 REWRITE OK CHAVEP:00013 CHAVES1:00088 CHAVES2:00003
FS=00 READ
OK CHAVEP:00014 CHAVES1:00087 CHAVES2:00004
FS=00 REWRITE OK CHAVEP:00014 CHAVES1:00087 CHAVES2:00004
FS=00 READ
OK CHAVEP:00015 CHAVES1:00086 CHAVES2:00005
FS=00 REWRITE OK CHAVEP:00015 CHAVES1:00086 CHAVES2:00005
FS=00 CLOSE OK
-----------------------------------------------REGRAVADOS ARQUIVO
= 00005
------------------------------------------------

Exemplo : arquivo resultante listado por ordem de chave primria


***************
CHAVE-PRI=00001
CHAVE-PRI=00002
CHAVE-PRI=00003
CHAVE-PRI=00004
CHAVE-PRI=00005
CHAVE-PRI=00006
CHAVE-PRI=00007
CHAVE-PRI=00008
CHAVE-PRI=00009
CHAVE-PRI=00010
CHAVE-PRI=00011
CHAVE-PRI=00012
CHAVE-PRI=00013
CHAVE-PRI=00014
CHAVE-PRI=00015
CHAVE-PRI=00016
CHAVE-PRI=00017
CHAVE-PRI=00018
CHAVE-PRI=00019
CHAVE-PRI=00020
CHAVE-PRI=00021
CHAVE-PRI=00501
CHAVE-PRI=00502
CHAVE-PRI=00503
CHAVE-PRI=00504
CHAVE-PRI=00505
CHAVE-PRI=00506
CHAVE-PRI=00507
CHAVE-PRI=00508

LISTA POR CHAVE PRIMARIA ***********


CHAVE-S1=00100 CHAVE-S2=99991 R1=@UR1
CHAVE-S1=00099 CHAVE-S2=99992 R1=@UR1
CHAVE-S1=00098 CHAVE-S2=99993 R1=@UR1
CHAVE-S1=00097 CHAVE-S2=99994 R1=@UR1
CHAVE-S1=00096 CHAVE-S2=99995 R1=@UR1
CHAVE-S1=00095 CHAVE-S2=99996 R1=@UR1
CHAVE-S1=00094 CHAVE-S2=99997 R1=*CR1
CHAVE-S1=00093 CHAVE-S2=99998 R1=*CR1
CHAVE-S1=00092 CHAVE-S2=99999 R1=*CR1
CHAVE-S1=00091 CHAVE-S2=00000 R1=*CR1
CHAVE-S1=00090 CHAVE-S2=00001 R1=#UR1
CHAVE-S1=00089 CHAVE-S2=00002 R1=#UR1
CHAVE-S1=00088 CHAVE-S2=00003 R1=#UR1
CHAVE-S1=00087 CHAVE-S2=00004 R1=#UR1
CHAVE-S1=00086 CHAVE-S2=00005 R1=#UR1
CHAVE-S1=00085 CHAVE-S2=00006 R1=$UR1
CHAVE-S1=00084 CHAVE-S2=00007 R1=$UR1
CHAVE-S1=00083 CHAVE-S2=00008 R1=$UR1
CHAVE-S1=00082 CHAVE-S2=00009 R1=$UR1
CHAVE-S1=00081 CHAVE-S2=00010 R1=$UR1
CHAVE-S1=00080 CHAVE-S2=00011 R1=*CR1
CHAVE-S1=00200 CHAVE-S2=90091 R1=#IR1
CHAVE-S1=00199 CHAVE-S2=90092 R1=#IR1
CHAVE-S1=00198 CHAVE-S2=90093 R1=#IR1
CHAVE-S1=00197 CHAVE-S2=90094 R1=#IR1
CHAVE-S1=00196 CHAVE-S2=90095 R1=#IR1
CHAVE-S1=00195 CHAVE-S2=90096 R1=#IR1
CHAVE-S1=00194 CHAVE-S2=90097 R1=#IR1
CHAVE-S1=00193 CHAVE-S2=90098 R1=#IR1

108

RESTO1:#UR1
RESTO1:#UR1
RESTO1:#UR1
RESTO1:#UR1
RESTO1:#UR1

CHAVE-PRI=00509 CHAVE-S1=00192 CHAVE-S2=90099 R1=#IR1


CHAVE-PRI=00510 CHAVE-S1=00191 CHAVE-S2=90100 R1=#IR1
CHAVE-PRI=00511 CHAVE-S1=00190 CHAVE-S2=90101 R1=#IR1

Exemplo : arquivo resultante listado por ordem de chave alternada 1


***************
CHAVE-PRI=00021
CHAVE-PRI=00020
CHAVE-PRI=00019
CHAVE-PRI=00018
CHAVE-PRI=00017
CHAVE-PRI=00016
CHAVE-PRI=00015
CHAVE-PRI=00014
CHAVE-PRI=00013
CHAVE-PRI=00012
CHAVE-PRI=00011
CHAVE-PRI=00010
CHAVE-PRI=00009
CHAVE-PRI=00008
CHAVE-PRI=00007
CHAVE-PRI=00006
CHAVE-PRI=00005
CHAVE-PRI=00004
CHAVE-PRI=00003
CHAVE-PRI=00002
CHAVE-PRI=00001
CHAVE-PRI=00511
CHAVE-PRI=00510
CHAVE-PRI=00509
CHAVE-PRI=00508
CHAVE-PRI=00507
CHAVE-PRI=00506
CHAVE-PRI=00505
CHAVE-PRI=00504
CHAVE-PRI=00503
CHAVE-PRI=00502
CHAVE-PRI=00501

LISTA POR CHAVE ALTERN 1 ***********


CHAVE-S1=00080 CHAVE-S2=00011 R1=*CR1
CHAVE-S1=00081 CHAVE-S2=00010 R1=$UR1
CHAVE-S1=00082 CHAVE-S2=00009 R1=$UR1
CHAVE-S1=00083 CHAVE-S2=00008 R1=$UR1
CHAVE-S1=00084 CHAVE-S2=00007 R1=$UR1
CHAVE-S1=00085 CHAVE-S2=00006 R1=$UR1
CHAVE-S1=00086 CHAVE-S2=00005 R1=#UR1
CHAVE-S1=00087 CHAVE-S2=00004 R1=#UR1
CHAVE-S1=00088 CHAVE-S2=00003 R1=#UR1
CHAVE-S1=00089 CHAVE-S2=00002 R1=#UR1
CHAVE-S1=00090 CHAVE-S2=00001 R1=#UR1
CHAVE-S1=00091 CHAVE-S2=00000 R1=*CR1
CHAVE-S1=00092 CHAVE-S2=99999 R1=*CR1
CHAVE-S1=00093 CHAVE-S2=99998 R1=*CR1
CHAVE-S1=00094 CHAVE-S2=99997 R1=*CR1
CHAVE-S1=00095 CHAVE-S2=99996 R1=@UR1
CHAVE-S1=00096 CHAVE-S2=99995 R1=@UR1
CHAVE-S1=00097 CHAVE-S2=99994 R1=@UR1
CHAVE-S1=00098 CHAVE-S2=99993 R1=@UR1
CHAVE-S1=00099 CHAVE-S2=99992 R1=@UR1
CHAVE-S1=00100 CHAVE-S2=99991 R1=@UR1
CHAVE-S1=00190 CHAVE-S2=90101 R1=#IR1
CHAVE-S1=00191 CHAVE-S2=90100 R1=#IR1
CHAVE-S1=00192 CHAVE-S2=90099 R1=#IR1
CHAVE-S1=00193 CHAVE-S2=90098 R1=#IR1
CHAVE-S1=00194 CHAVE-S2=90097 R1=#IR1
CHAVE-S1=00195 CHAVE-S2=90096 R1=#IR1
CHAVE-S1=00196 CHAVE-S2=90095 R1=#IR1
CHAVE-S1=00197 CHAVE-S2=90094 R1=#IR1
CHAVE-S1=00198 CHAVE-S2=90093 R1=#IR1
CHAVE-S1=00199 CHAVE-S2=90092 R1=#IR1
CHAVE-S1=00200 CHAVE-S2=90091 R1=#IR1

Exemplo : arquivo resultante listado por ordem de chave alternada 2


***************
CHAVE-PRI=00010
CHAVE-PRI=00011
CHAVE-PRI=00012
CHAVE-PRI=00013
CHAVE-PRI=00014
CHAVE-PRI=00015
CHAVE-PRI=00016
CHAVE-PRI=00017
CHAVE-PRI=00018
CHAVE-PRI=00019
CHAVE-PRI=00020
CHAVE-PRI=00021
CHAVE-PRI=00501

LISTA POR CHAVE ALTERN 2 ***********


CHAVE-S1=00091 CHAVE-S2=00000 R1=*CR1
CHAVE-S1=00090 CHAVE-S2=00001 R1=#UR1
CHAVE-S1=00089 CHAVE-S2=00002 R1=#UR1
CHAVE-S1=00088 CHAVE-S2=00003 R1=#UR1
CHAVE-S1=00087 CHAVE-S2=00004 R1=#UR1
CHAVE-S1=00086 CHAVE-S2=00005 R1=#UR1
CHAVE-S1=00085 CHAVE-S2=00006 R1=$UR1
CHAVE-S1=00084 CHAVE-S2=00007 R1=$UR1
CHAVE-S1=00083 CHAVE-S2=00008 R1=$UR1
CHAVE-S1=00082 CHAVE-S2=00009 R1=$UR1
CHAVE-S1=00081 CHAVE-S2=00010 R1=$UR1
CHAVE-S1=00080 CHAVE-S2=00011 R1=*CR1
CHAVE-S1=00200 CHAVE-S2=90091 R1=#IR1

109

CHAVE-PRI=00502
CHAVE-PRI=00503
CHAVE-PRI=00504
CHAVE-PRI=00505
CHAVE-PRI=00506
CHAVE-PRI=00507
CHAVE-PRI=00508
CHAVE-PRI=00509
CHAVE-PRI=00510
CHAVE-PRI=00511
CHAVE-PRI=00001
CHAVE-PRI=00002
CHAVE-PRI=00003
CHAVE-PRI=00004
CHAVE-PRI=00005
CHAVE-PRI=00006
CHAVE-PRI=00007
CHAVE-PRI=00008
CHAVE-PRI=00009

CHAVE-S1=00199
CHAVE-S1=00198
CHAVE-S1=00197
CHAVE-S1=00196
CHAVE-S1=00195
CHAVE-S1=00194
CHAVE-S1=00193
CHAVE-S1=00192
CHAVE-S1=00191
CHAVE-S1=00190
CHAVE-S1=00100
CHAVE-S1=00099
CHAVE-S1=00098
CHAVE-S1=00097
CHAVE-S1=00096
CHAVE-S1=00095
CHAVE-S1=00094
CHAVE-S1=00093
CHAVE-S1=00092

CHAVE-S2=90092
CHAVE-S2=90093
CHAVE-S2=90094
CHAVE-S2=90095
CHAVE-S2=90096
CHAVE-S2=90097
CHAVE-S2=90098
CHAVE-S2=90099
CHAVE-S2=90100
CHAVE-S2=90101
CHAVE-S2=99991
CHAVE-S2=99992
CHAVE-S2=99993
CHAVE-S2=99994
CHAVE-S2=99995
CHAVE-S2=99996
CHAVE-S2=99997
CHAVE-S2=99998
CHAVE-S2=99999

R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=@UR1
R1=@UR1
R1=@UR1
R1=@UR1
R1=@UR1
R1=@UR1
R1=*CR1
R1=*CR1
R1=*CR1

110

13.1.6 Ler sequencialmente por chave primria

Conceito : leitura de todos os registros (um a um) do arquivo at a condio de EOF

SELECT nome_arquivo
ORGANIZATION IS INDEXED
ACCESS IS SEQUENTIAL
FILE STATUS IS variavel_wss
RECORD KEY IS chave_primaria

DDs

Procedimentos :
Abrir o arquivo com OPEN INPUT nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro
Ler com o comando READ nome_arquivo (sem o AT END !!!) e testar a condio de fim de
arquivo testando o file status
File Status = 10 : EOF (fim de arquivo)
File Status outros : erro no READ
Fechar o arquivo com CLOSE nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro

//ddname

DD

DISP=SHR,DSN=dsname_cluster

Exemplo : JCL e fonte


//LSG#@LSP JOB ('ALBERTO'),'ALBERTO',CLASS=1,MSGCLASS=X
//PROCLIB JCLLIB ORDER=(TORI243.T#RPC.SRC)
//*--------------------------------------------------------------//STEP1
EXEC COBCLG,MEMBER=P06LSP
//COMP.SYSIN
DD *
IDENTIFICATION DIVISION.
PROGRAM-ID. P06LSP.
*---------------------------------------------------------------* LEITURA SEQUENCIAL DE REGISTROS POR CHAVE PRIMARIA
*---------------------------------------------------------------ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*----------------------------------------------------------------* ENTRADA - VSAM KSDS LIDO SEQUENCIALMENTE POR CHAVE PRIMARIA
*----------------------------------------------------------------SELECT ARQUIVO ASSIGN TO ARQUIVO
ORGANIZATION INDEXED
ACCESS SEQUENTIAL
RECORD KEY A-FD-ARQUIVO-CHAVEP

111

File Status FS-ARQUIVO.


*----------------------------------------------------------------DATA DIVISION.
FILE SECTION.
*------------*
FD
ARQUIVO.
01
A-FD-ARQUIVO.
05 A-FD-ARQUIVO-CHAVEP
PIC X(05).
05 A-FD-ARQUIVO-RESTO1
PIC X(10).
05 A-FD-ARQUIVO-CHAVES1
PIC X(05).
05 A-FD-ARQUIVO-RESTO2
PIC X(10).
05 A-FD-ARQUIVO-CHAVES2
PIC X(05).
05 A-FD-ARQUIVO-RESTO3
PIC X(10).
05 A-FD-ARQUIVO-RESTO4
PIC X(35).
*----------------------------------------------------------------WORKING-STORAGE SECTION.
*
01 FS-ARQUIVO
PIC X(02).
01 EOF-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 STOP-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 LL-ARQUIVO
PIC 9(5) VALUE ZERO.
01 WW-CHAVEP
PIC 9(5) VALUE ZERO.
01 WW-CHAVES
PIC 9(5) VALUE ZERO.
01 WW-CHAVES
PIC 9(5) VALUE ZERO.
*---------------------------------------------------------------PROCEDURE DIVISION.
*---------------------------------------------------------------PROGRAMA SECTION.
*
DISPLAY '------------------------------------------------'
DISPLAY 'LEITURA SEQUENCIAL POR CHAVE PRIMARIA'
DISPLAY '------------------------------------------------'
*
OPEN
INPUT ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' OPEN OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' OPEN ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
*
PERFORM LERSEQS UNTIL EOF-ARQUIVO = 'SIM' OR
STOP-ARQUIVO = 'SIM'
*
CLOSE ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE ERRO'
END-EVALUATE
*
DISPLAY '------------------------------------------------'
DISPLAY 'LIDOS
ARQUIVO
= ' LL-ARQUIVO
DISPLAY '------------------------------------------------'
STOP RUN.
*---------------------------------------------------------------* LEITURA SEQUENCIAL POR CHAVE PRIMARIA

112

*---------------------------------------------------------------LERSEQS SECTION.
READ ARQUIVO
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' READ OK' ' REG '
' CHAVEP : ' A-FD-ARQUIVO-CHAVEP
' CHAVES1 : ' A-FD-ARQUIVO-CHAVES1
' CHAVES2 : ' A-FD-ARQUIVO-CHAVES2
ADD 1 TO LL-ARQUIVO
WHEN '10'
DISPLAY '
FS=' FS-ARQUIVO ' READ EOF'
MOVE 'SIM' TO EOF-ARQUIVO
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' READ ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
CONTINUE.
SAI-LERSEQS. EXIT.
//GO.SYSPRINT DD SYSOUT=*
//GO.ARQUIVO
DD DSN=DSVAABVS.LSG.A002.ALBERTO,DISP=SHR

Exemplo : listagem produzida pelo aplicativo


-----------------------------------------------LEITURA SEQUENCIAL POR CHAVE PRIMARIA
-----------------------------------------------FS=00 OPEN OK
FS=00 READ OK REG
CHAVEP : 00001 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00002 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00003 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00004 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00005 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00006 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00007 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00008 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00009 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00010 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00011 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00012 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00013 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00014 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00015 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00016 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00017 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00018 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00019 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00020 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00021 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00501 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00502 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00503 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00504 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00505 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00506 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00507 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00508 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00509 CHAVES1 :
FS=00 READ OK REG
CHAVEP : 00510 CHAVES1 :

113

00100
00099
00098
00097
00096
00095
00094
00093
00092
00091
00090
00089
00088
00087
00086
00085
00084
00083
00082
00081
00080
00200
00199
00198
00197
00196
00195
00194
00193
00192
00191

CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2

:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:

99991
99992
99993
99994
99995
99996
99997
99998
99999
00000
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
90091
90092
90093
90094
90095
90096
90097
90098
90099
90100

FS=00 READ OK REG


CHAVEP : 00511 CHAVES1 : 00190
FS=10 READ EOF
FS=00 CLOSE OK
-----------------------------------------------LIDOS
ARQUIVO
= 00032
------------------------------------------------

114

CHAVES2 : 90101

13.1.7 Ler sequencialmente por chave alternada 1

Conceito : leitura de todos os registros (um a um) do arquivo at a condio de EOF

SELECT nome_arquivo
ORGANIZATION IS INDEXED
ACCESS IS SEQUENTIAL
FILE STATUS IS variavel_wss
RECORD KEY IS chave_alternada_1

DDs

Procedimentos :
Abrir o arquivo com OPEN INPUT nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro
Ler com o comando READ nome_arquivo (sem o AT END !!!) e testar a condio de fim de
arquivo testando o file status
File Status = 10 : EOF (fim de arquivo)
File Status outros : erro no READ
Fechar o arquivo com CLOSE nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro

//ddname

DD

DISP=SHR,DSN=dsname_cluster.PATH.AIX1

Exemplo : JCL e fonte


//LSG#@LS1 JOB ('ALBERTO'),'ALBERTO',CLASS=1,MSGCLASS=X
//PROCLIB JCLLIB ORDER=(TORI243.T#RPC.SRC)
//*------------------------------------------------------------------//STEP1
EXEC COBCLG,MEMBER=P07LA1
//COMP.SYSIN DD *
IDENTIFICATION DIVISION.
PROGRAM-ID. P07LA1.
*---------------------------------------------------------------* LEITURA SEQUENCIAL DE REGISTROS POR CHAVE ALTERNADA 1
*---------------------------------------------------------------ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*----------------------------------------------------------------* ENTRADA - VSAM KSDS LIDO SEQUENCIALMENTE POR CHAVE ALTERNADA 1
*----------------------------------------------------------------SELECT ARQUIVO ASSIGN TO ARQUIVO
ORGANIZATION INDEXED
ACCESS SEQUENTIAL
RECORD KEY
A-FD-ARQUIVO-CHAVES1
File Status FS-ARQUIVO.
*-----------------------------------------------------------------

115

DATA DIVISION.
FILE SECTION.
*------------*
FD
ARQUIVO.
01
A-FD-ARQUIVO.
05 A-FD-ARQUIVO-CHAVEP
PIC X(05).
05 A-FD-ARQUIVO-RESTO1
PIC X(10).
05 A-FD-ARQUIVO-CHAVES1
PIC X(05).
05 A-FD-ARQUIVO-RESTO2
PIC X(10).
05 A-FD-ARQUIVO-CHAVES2
PIC X(05).
05 A-FD-ARQUIVO-RESTO3
PIC X(10).
05 A-FD-ARQUIVO-RESTO4
PIC X(35).
*----------------------------------------------------------------WORKING-STORAGE SECTION.
01 FS-ARQUIVO
PIC X(02).
01 EOF-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 STOP-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 LL-ARQUIVO
PIC 9(5) VALUE ZERO.
01 WW-CHAVEP
PIC 9(5) VALUE ZERO.
01 WW-CHAVES
PIC 9(5) VALUE ZERO.
01 WW-FORAFAIXA
PIC X(03) VALUE 'NAO'.
01 WW-CHAVE-INI-FAIXA PIC X(05).
01 WW-CHAVE-FIM-FAIXA PIC X(05).
*---------------------------------------------------------------PROCEDURE DIVISION.
*---------------------------------------------------------------PROGRAMA SECTION.
DISPLAY '------------------------------------------------'
DISPLAY 'LEITURA SEQUENCIAL POR CHAVE ALTERNADA 1'
DISPLAY '------------------------------------------------'
*
OPEN
INPUT ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' OPEN OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' OPEN ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
*
PERFORM LERSEQS UNTIL EOF-ARQUIVO = 'SIM' OR
STOP-ARQUIVO = 'SIM'
*
CLOSE ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE ERRO'
END-EVALUATE
DISPLAY '------------------------------------------------'
DISPLAY 'LIDOS ARQUIVO : ' LL-ARQUIVO
DISPLAY '------------------------------------------------'
STOP RUN.
*---------------------------------------------------------------* LEITURA SEQUENCIAL POR CHAVE SECUNDARIA
*---------------------------------------------------------------LERSEQS SECTION.
READ ARQUIVO

116

EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' READ OK' ' REG'
' CHAVEP : ' A-FD-ARQUIVO-CHAVEP
' CHAVES1 : ' A-FD-ARQUIVO-CHAVES1
' CHAVES2 : ' A-FD-ARQUIVO-CHAVES2
ADD 1 TO LL-ARQUIVO
WHEN '10'
DISPLAY '
FS=' FS-ARQUIVO ' READ EOF'
MOVE 'SIM' TO EOF-ARQUIVO
MOVE 'SIM' TO STOP-ARQUIVO
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' READ ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
CONTINUE.
SAI-LERSEQS. EXIT.
//GO.SYSPRINT DD SYSOUT=*
//GO.ARQUIVO
DD DSN=DSVAABVS.LSG.A002.ALBERTO.PATH.AIX1,DISP=SHR

Exemplo : listagem produzida pelo aplicativo


-----------------------------------------------LEITURA SEQUENCIAL POR CHAVE ALTERNADA 1
-----------------------------------------------FS=00 OPEN OK
FS=00 READ OK REG CHAVEP : 00021 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00020 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00019 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00018 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00017 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00016 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00015 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00014 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00013 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00012 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00011 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00010 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00009 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00008 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00007 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00006 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00005 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00004 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00003 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00002 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00001 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00511 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00510 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00509 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00508 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00507 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00506 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00505 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00504 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00503 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00502 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00501 CHAVES1 :
FS=10 READ EOF

117

00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200

CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2

:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:

00011
00010
00009
00008
00007
00006
00005
00004
00003
00002
00001
00000
99999
99998
99997
99996
99995
99994
99993
99992
99991
90101
90100
90099
90098
90097
90096
90095
90094
90093
90092
90091

FS=00 CLOSE OK
-----------------------------------------------LIDOS ARQUIVO : 00032
------------------------------------------------

118

13.1.8 Ler sequencialmente por chave alternada 2

Conceito : leitura de todos os registros (um a um) do arquivo at a condio de EOF

SELECT nome_arquivo
ORGANIZATION IS INDEXED
ACCESS IS SEQUENTIAL
FILE STATUS IS variavel_wss
RECORD KEY IS chave_alternada_2

DDs

Procedimentos :
Abrir o arquivo com OPEN INPUT nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro
Ler com o comando READ nome_arquivo (sem o AT END !!!) e testar a condio de fim de
arquivo testando o file status
File Status = 10 : EOF (fim de arquivo)
File Status outros : erro no READ
Fechar o arquivo com CLOSE nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro

//ddname

DD

DISP=SHR,DSN=dsname_cluster.PATH.AIX2

Exemplo : JCL e fonte


//LSG#@LS2 JOB ('ALBERTO'),'ALBERTO',CLASS=1,MSGCLASS=X
//PROCLIB JCLLIB ORDER=(TORI243.T#RPC.SRC)
//*------------------------------------------------------------------//STEP1
EXEC COBCLG,MEMBER=P08LA2
//COMP.SYSIN DD *
IDENTIFICATION DIVISION.
PROGRAM-ID. P08LA2.
*---------------------------------------------------------------* LEITURA SEQUENCIAL DE ARQUIVO POR CHAVE ALTERNADA 2
*---------------------------------------------------------------ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*----------------------------------------------------------------* ENTRADA - VSAM KSDS LIDO SEQUENCIALMENTE POR CHAVE ALTERNADA 2
*----------------------------------------------------------------SELECT ARQUIVO ASSIGN TO ARQUIVO
ORGANIZATION INDEXED
ACCESS SEQUENTIAL
RECORD KEY
A-FD-ARQUIVO-CHAVES2
File Status FS-ARQUIVO.
*-----------------------------------------------------------------

119

DATA DIVISION.
FILE SECTION.
*------------*
FD
ARQUIVO.
01
A-FD-ARQUIVO.
05 A-FD-ARQUIVO-CHAVEP
PIC X(05).
05 A-FD-ARQUIVO-RESTO1
PIC X(10).
05 A-FD-ARQUIVO-CHAVES1
PIC X(05).
05 A-FD-ARQUIVO-RESTO2
PIC X(10).
05 A-FD-ARQUIVO-CHAVES2
PIC X(05).
05 A-FD-ARQUIVO-RESTO3
PIC X(10).
05 A-FD-ARQUIVO-RESTO4
PIC X(35).
*----------------------------------------------------------------WORKING-STORAGE SECTION.
01 FS-ARQUIVO
PIC X(02).
01 EOF-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 STOP-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 LL-ARQUIVO
PIC 9(5) VALUE ZERO.
01 WW-CHAVEP
PIC 9(5) VALUE ZERO.
01 WW-CHAVES
PIC 9(5) VALUE ZERO.
01 WW-FORAFAIXA
PIC X(03) VALUE 'NAO'.
01 WW-CHAVE-INI-FAIXA PIC X(05).
01 WW-CHAVE-FIM-FAIXA PIC X(05).
*---------------------------------------------------------------PROCEDURE DIVISION.
*---------------------------------------------------------------PROGRAMA SECTION.
DISPLAY '------------------------------------------------'
DISPLAY 'LEITURA SEQUENCIAL POR CHAVE ALTERNADA 2'
DISPLAY '------------------------------------------------'
*
OPEN
INPUT ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' OPEN OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' OPEN ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
*
PERFORM LERSEQS UNTIL EOF-ARQUIVO = 'SIM' OR
STOP-ARQUIVO = 'SIM'
*
CLOSE ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE ERRO'
END-EVALUATE
DISPLAY '------------------------------------------------'
DISPLAY 'LIDOS ARQUIVO : ' LL-ARQUIVO
DISPLAY '------------------------------------------------'
STOP RUN.
*---------------------------------------------------------------* LEITURA SEQUENCIAL POR CHAVE SECUNDARIA
*---------------------------------------------------------------LERSEQS SECTION.
READ ARQUIVO

120

EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' READ OK' ' REG'
' CHAVEP : ' A-FD-ARQUIVO-CHAVEP
' CHAVES1 : ' A-FD-ARQUIVO-CHAVES1
' CHAVES2 : ' A-FD-ARQUIVO-CHAVES2
ADD 1 TO LL-ARQUIVO
WHEN '10'
DISPLAY '
FS=' FS-ARQUIVO ' READ EOF'
MOVE 'SIM' TO EOF-ARQUIVO
MOVE 'SIM' TO STOP-ARQUIVO
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' READ ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
CONTINUE.
SAI-LERSEQS. EXIT.
//GO.SYSPRINT DD SYSOUT=*
//GO.ARQUIVO
DD DSN=DSVAABVS.LSG.A002.ALBERTO.PATH.AIX2,DISP=SHR

Exemplo : listagem produzida pelo aplicativo


-----------------------------------------------LEITURA SEQUENCIAL POR CHAVE ALTERNADA 2
-----------------------------------------------FS=00 OPEN OK
FS=00 READ OK REG CHAVEP : 00010 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00011 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00012 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00013 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00014 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00015 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00016 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00017 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00018 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00019 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00020 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00021 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00501 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00502 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00503 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00504 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00505 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00506 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00507 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00508 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00509 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00510 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00511 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00001 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00002 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00003 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00004 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00005 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00006 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00007 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00008 CHAVES1 :
FS=00 READ OK REG CHAVEP : 00009 CHAVES1 :
FS=10 READ EOF

121

00091
00090
00089
00088
00087
00086
00085
00084
00083
00082
00081
00080
00200
00199
00198
00197
00196
00195
00194
00193
00192
00191
00190
00100
00099
00098
00097
00096
00095
00094
00093
00092

CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2
CHAVES2

:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:

00000
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
90091
90092
90093
90094
90095
90096
90097
90098
90099
90100
90101
99991
99992
99993
99994
99995
99996
99997
99998
99999

FS=00 CLOSE OK
-----------------------------------------------LIDOS ARQUIVO : 00032
------------------------------------------------

122

13.1.9 Ler sequencialmente faixa de registros por chave primria

Conceito : leitura de faixa de registros : desde registro cuja chave tem determinado valor at
registro cuja chave tenha outro determinado valor;
Por exemplo : desde registro com chave 30000 at registro com chave 59999. Portanto, a chave
30000 indica o incio da faixa de registros a considerar e a chave 59999 indica o final da faixa, ou
seja : registros com chave < 30000 devem ser pulados, registros com chaves entre 30000 (inclusive)
e 59999 (inclusive) devem ser processados e registros com chave maior que 59999 no devem ser
processados.
Neste caso o aplicativo deve :
(a) comandar o posicionamento no ponto do arquivo em que houver registro com chave igual ou
maior chave que caracteriza o incio da faixa de registros desejada
(b) efetuar lao de leitura sequencial dos registros at que a chave do registro lido esteja fora da
faixa desejada (chave maior que a que determina o fim da faixa) ou a condio de fim de arquivo
(EOF) seja detectada

SELECT nome_arquivo
ORGANIZATION IS INDEXED
ACCESS IS DYNAMIC
FILE STATUS IS variavel_wss
RECORD KEY IS chave_primaria

DDs

Procedimentos :
Abrir o arquivo com OPEN INPUT nome_arquivo e testar o file status
File Status = 00 : OK
File Status 00 : erro
Posicionar o arquivo no primeiro registro da faixa desejada usando o comando
START nome_arquivo KEY operador_relacional
rea_chave_primria_fd
e testar o file status
O operador relacional do START pode ser um dos seguintes :
GREATER ou > ou EQUAL ou = ou NOT LESS ou NOT <
Ele NO aceita NENHUMA OUTRA especificao !
O file status deve ser testado com :
File Status = 00 : START OK. Posicionamento feito (mas registro no lido!)
File Status = 10 : EOF (fim de arquivo)
File Status outros : (outro) erro no START
IMPORTANTE : o posicionamento, feito atravs da instruo START , NO L nenhum
registro, apenas deixa um ponteiro indicando que o prximo READ deve ler na posio do
arquivo marcada.
Ler sequencialmente os registros a partir daquele posicionado pelo START usando
READ rea_fd NEXT e testar o file status

//ddname

DD

DISP=SHR,DSN=dsname_cluster

123

File Status = 00 : READ OK. Registro lido


File Status = 10 : EOF (fim de arquivo)
File Status outros : (outro) erro no READ
A determinao do fim da leitura sequencial deve ser feita baseada em 2 eventos : EOF (file
status 10) ou chave do registro lido maior que a chave indicadora de fim da faixa de registros
desejados.
O EOF detectado pelo mtodo de acesso, que avisa o aplicativo, que deve testar e seguir o
proceimento correspondente.
A verificao da condio da chave do registro lido ser maior que a chave que indica fim da
faixa de registros a ler, responsabilidade do aplicativo.
Fechar o arquivo com CLOSE nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro

Exemplo : JCL e fonte


//LSG#@LFP JOB ('ALBERTO'),'ALBERTO',CLASS=1,MSGCLASS=X
//PROCLIB JCLLIB ORDER=(TORI243.T#RPC.SRC)
//*------------------------------------------------------------------//STEP1
EXEC COBCLG,MEMBER=P09LFP
//COMP.SYSIN DD *
IDENTIFICATION DIVISION.
PROGRAM-ID. P09LFP.
*---------------------------------------------------------------* LEITURA DE FAIXA DE REGISTROS POR CHAVE PRIMARIA
*---------------------------------------------------------------ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*----------------------------------------------------------------* ENTRADA - VSAM KSDS LIDO SEQUENCIALMENTE POR FAIXA DE REGISTROS
*
POR CHAVE PRIMARIA
*----------------------------------------------------------------SELECT ARQUIVO ASSIGN TO ARQUIVO
ORGANIZATION INDEXED
ACCESS DYNAMIC
RECORD KEY A-FD-ARQUIVO-CHAVEP
File Status FS-ARQUIVO.
*----------------------------------------------------------------DATA DIVISION.
FILE SECTION.
*------------*
FD
ARQUIVO.
01
A-FD-ARQUIVO.
05 A-FD-ARQUIVO-CHAVEP
PIC X(05).
05 A-FD-ARQUIVO-RESTO1
PIC X(10).
05 A-FD-ARQUIVO-CHAVES1
PIC X(05).
05 A-FD-ARQUIVO-RESTO2
PIC X(10).
05 A-FD-ARQUIVO-CHAVES2
PIC X(05).
05 A-FD-ARQUIVO-RESTO3
PIC X(10).
05 A-FD-ARQUIVO-RESTO4
PIC X(35).

124

*----------------------------------------------------------------WORKING-STORAGE SECTION.
*
01 FS-ARQUIVO
PIC X(02).
01 EOF-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 STOP-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 LL-ARQUIVO
PIC 9(5) VALUE ZERO.
01 FORA-DENTRO
PIC X(6) VALUE SPACES.
01 WW-CHAVEP
PIC 9(5) VALUE ZERO.
01 WW-CHAVES
PIC 9(5) VALUE ZERO.
01 WW-FORAFAIXA
PIC X(03) VALUE 'NAO'.
01 WW-CHAVE-INI-FAIXA PIC X(05) VALUE '00004'.
01 WW-CHAVE-FIM-FAIXA PIC X(05) VALUE '00010'.
*
*---------------------------------------------------------------PROCEDURE DIVISION.
*---------------------------------------------------------------PROGRAMA SECTION.
*
DISPLAY '------------------------------------------------'
DISPLAY 'LEITURA DE FAIXA DE REGISTROS POR CHAVE PRIMARIA'
DISPLAY '------------------------------------------------'
*
OPEN
INPUT ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' OPEN OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' OPEN ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
*
IF STOP-ARQUIVO EQUAL 'NAO'
MOVE 'NAO' TO STOP-ARQUIVO
PERFORM POSICIONA
IF STOP-ARQUIVO EQUAL 'NAO'
PERFORM LERFAIXA UNTIL STOP-ARQUIVO = 'SIM'
END-IF
END-IF
*
CLOSE ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE ERRO'
END-EVALUATE
*
DISPLAY '------------------------------------------------'
DISPLAY 'LIDOS
ARQUIVO
= ' LL-ARQUIVO
DISPLAY '------------------------------------------------'
STOP RUN.
*
*---------------------------------------------------------------* POSICIONA NO REGISTRO COM CHAVE IGUAL OU MAIOR QUE A PEDIDA
* OBS. O REGISTRO NAO EH LIDO !!!
*---------------------------------------------------------------POSICIONA SECTION.
POSICIONA-MAS-NAO-LE.

125

MOVE WW-CHAVE-INI-FAIXA TO A-FD-ARQUIVO-CHAVEP


*
START ARQUIVO KEY NOT LESS
A-FD-ARQUIVO-CHAVEP
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' START OK'
WHEN '10'
DISPLAY '
FS=' FS-ARQUIVO ' START EOF'
MOVE 'SIM' TO EOF-ARQUIVO
MOVE 'SIM' TO STOP-ARQUIVO
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' START ERRO'
END-EVALUATE
*
CONTINUE.
SAI-POSICIONA. EXIT.
*
*---------------------------------------------------------------* LEITURA SEQUENCIAL ENTRE LIMITES
*---------------------------------------------------------------LERFAIXA SECTION.
*
* O PRIMEIRO READ LE O REGISTRO QUE FOI POSICIONADO PELO START
*
READ ARQUIVO NEXT
EVALUATE FS-ARQUIVO
WHEN '00'
ADD 1 TO LL-ARQUIVO
IF A-FD-ARQUIVO-CHAVEP NOT GREATER WW-CHAVE-FIM-FAIXA
MOVE 'DENTRO' TO FORA-DENTRO
ELSE
MOVE 'FORA ' TO FORA-DENTRO
MOVE 'SIM' TO STOP-ARQUIVO
END-IF
DISPLAY '
FS=' FS-ARQUIVO ' READ NEXT OK'
' CHAVEP :' A-FD-ARQUIVO-CHAVEP
' CHAVES1:' A-FD-ARQUIVO-CHAVES1
' CHAVES2:' A-FD-ARQUIVO-CHAVES2
' ' FORA-DENTRO
WHEN '10'
DISPLAY '
FS=' FS-ARQUIVO ' READ NEXT EOF'
MOVE 'SIM' TO EOF-ARQUIVO
MOVE 'SIM' TO STOP-ARQUIVO
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' READ NEXT ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
*
CONTINUE.
SAI-LERFAIXA. EXIT.
//GO.SYSPRINT DD SYSOUT=*
//GO.ARQUIVO
DD DSN=DSVAABVS.LSG.A002.ALBERTO,DISP=SHR

Exemplo : listagem produzida pelo aplicativo


-----------------------------------------------LEITURA DE FAIXA DE REGISTROS POR CHAVE PRIMARIA
-----------------------------------------------FS=00 OPEN OK

126

FS=00 START OK
FS=00 READ NEXT OK CHAVEP :00004 CHAVES1:00097
FS=00 READ NEXT OK CHAVEP :00005 CHAVES1:00096
FS=00 READ NEXT OK CHAVEP :00006 CHAVES1:00095
FS=00 READ NEXT OK CHAVEP :00007 CHAVES1:00094
FS=00 READ NEXT OK CHAVEP :00008 CHAVES1:00093
FS=00 READ NEXT OK CHAVEP :00009 CHAVES1:00092
FS=00 READ NEXT OK CHAVEP :00010 CHAVES1:00091
FS=00 READ NEXT OK CHAVEP :00011 CHAVES1:00090
FS=00 CLOSE OK
-----------------------------------------------LIDOS
ARQUIVO
= 00008
------------------------------------------------

127

CHAVES2:99994
CHAVES2:99995
CHAVES2:99996
CHAVES2:99997
CHAVES2:99998
CHAVES2:99999
CHAVES2:00000
CHAVES2:00001

DENTRO
DENTRO
DENTRO
DENTRO
DENTRO
DENTRO
DENTRO
FORA

13.1.10 Ler sequencialmente faixa de registros por chave alternada 1

Conceito : leitura de faixa de registros : desde registro cuja chave tem determinado valor at
registro cuja chave tenha outro determinado valor; por exemplo : desde registro com chave 30000
at registro com chave 59999. Portanto, a chave 30000 indica o incio da faixa de registros a
considerar e a chave 59999 indica o final da faixa, ou seja : registros com chave < 30000 devem ser
pulados, registros com chaves entre 30000 (inclusive) e 59999 (inclusive) devem ser processados e
registros com chave maior que 59999 no devem ser processados.
Neste caso o aplicativo deve
(a) comandar o posicionamento no ponto do arquivo em que houver registro com chave igual ou
maior chave que caracteriza o incio da faixa de registros desejada
(b) efetuar lao de leitura sequencial dos registros at que a chave do registro lido esteja fora da
faixa desejada (chave maior que a que determina o fim da faixa) ou a condio de fim de arquivo
(EOF) seja detectada

SELECT nome_arquivo
ORGANIZATION IS INDEXED
ACCESS IS DYNAMIC
FILE STATUS IS variavel_wss
RECORD KEY IS chave_primaria
ALTERNATE RECORD KEY IS chave_alternada_1

Declarar a chave primria e as chaves alternadas at a chave alternada a ser usada


(neste caso : RECORD KEY para a chave primria e ALTERNATE RECORD KEY para a
primeira chave alternada)

DDs

Procedimentos :
Abrir o arquivo com OPEN INPUT nome_arquivo e testar o file status
File Status = 00 : OK
File Status 00 : erro
Posicionar o arquivo no primeiro registro da faixa desejada usando o comando
START nome_arquivo KEY relao rea_chave_primria_fd e testar o file status
O operador relacional do START pode ser um dos seguintes :
GREATER ou > ou EQUAL ou = ou NOT LESS ou NOT <
Ele NO aceita NENHUMA OUTRA especificao !
O file status deve ser testado com :
File Status = 00 : START OK. Posicionamento feito (mas registro no lido!)
File Status = 10 : EOF (fim de arquivo)
File Status outros : (outro) erro no START

//ddname
//ddname1

DD
DD

DISP=SHR,DSN=dsname_cluster
DISP=SHR,DSN=dsname_cluster.PATH.AIX1

128

IMPORTANTE : o posicionamento, feito atravs da instruo START , NO L nenhum


registro, apenas deixa um ponteiro indicando que o prximo READ deve ler na posio do
arquivo marcada.
Ler sequencialmente os registros a partir daquele posicionado pelo START usando
READ rea_fd NEXT e testar o file status
File Status = 00 : READ OK. Registro lido
File Status = 10 : EOF (fim de arquivo)
File Status outros : (outro) erro no READ
A determinao do fim da leitura sequencial deve ser feita baseada em 2 eventos : EOF (file
status 10) ou chave do registro lido maior que a chave indicadora de fim da faixa de registros
desejados.
O EOF detectado pelo mtodo de acesso, que avisa o aplicativo, que deve testar e seguir o
proceimento correspondente.
A verificao da condio da chave do registro lido ser maior que a chave que indica fim da
faixa de registros a ler, responsabilidade do aplicativo.
Fechar o arquivo com CLOSE nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro

Exemplo : JCL e fonte


//LSG#@LF1 JOB ('ALBERTO'),'ALBERTO',CLASS=1,MSGCLASS=X
//PROCLIB JCLLIB ORDER=(TORI243.T#RPC.SRC)
//*------------------------------------------------------------------//STEP1
EXEC COBCLG,MEMBER=P10LA1
//COMP.SYSIN DD *
IDENTIFICATION DIVISION.
PROGRAM-ID. P10LA1.
*---------------------------------------------------------------* LEITURA DE FAIXA DE REGISTROS POR CHAVE ALTERNADA 1
*---------------------------------------------------------------ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*----------------------------------------------------------------* ENTRADA - VSAM KSDS LIDO SEQUENCIALMENTE POR FAIXA DE REGISTROS
*
POR CHAVE ALTERNADA 1
*----------------------------------------------------------------SELECT ARQUIVO ASSIGN TO ARQUIVO
ORGANIZATION INDEXED
ACCESS DYNAMIC
RECORD KEY
A-FD-ARQUIVO-CHAVEP
ALTERNATE RECORD KEY A-FD-ARQUIVO-CHAVES1
File Status FS-ARQUIVO.
*----------------------------------------------------------------DATA DIVISION.
FILE SECTION.
*------------*
FD
ARQUIVO.
01
A-FD-ARQUIVO.

129

05 A-FD-ARQUIVO-CHAVEP
PIC X(05).
05 A-FD-ARQUIVO-RESTO1
PIC X(10).
05 A-FD-ARQUIVO-CHAVES1
PIC X(05).
05 A-FD-ARQUIVO-RESTO2
PIC X(10).
05 A-FD-ARQUIVO-CHAVES2
PIC X(05).
05 A-FD-ARQUIVO-RESTO3
PIC X(10).
05 A-FD-ARQUIVO-RESTO4
PIC X(35).
*----------------------------------------------------------------WORKING-STORAGE SECTION.
01 FS-ARQUIVO
PIC X(02).
01 EOF-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 STOP-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 LL-ARQUIVO
PIC 9(5) VALUE ZERO.
01 FORA-DENTRO
PIC X(6) VALUE SPACES.
01 WW-CHAVEP
PIC 9(5) VALUE ZERO.
01 WW-CHAVES
PIC 9(5) VALUE ZERO.
01 WW-FORAFAIXA
PIC X(03) VALUE 'NAO'.
01 WW-CHAVE-INI-FAIXA PIC X(05) VALUE '00095'.
01 WW-CHAVE-FIM-FAIXA PIC X(05) VALUE '00104'.
*---------------------------------------------------------------PROCEDURE DIVISION.
*---------------------------------------------------------------PROGRAMA SECTION.
DISPLAY '------------------------------------------------'
DISPLAY 'LEITURA DE FAIXA DE REGISTROS POR CHAVE ALTERN 1'
DISPLAY '------------------------------------------------'
*
OPEN
INPUT ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' OPEN OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' OPEN ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
*
IF STOP-ARQUIVO EQUAL 'NAO'
MOVE 'NAO' TO STOP-ARQUIVO
PERFORM POSICIONA
IF STOP-ARQUIVO EQUAL 'NAO'
PERFORM LERFAIXA UNTIL STOP-ARQUIVO = 'SIM'
END-IF
END-IF
*
CLOSE ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE ERRO'
END-EVALUATE
*
DISPLAY '------------------------------------------------'
DISPLAY 'LIDOS
ARQUIVO
= ' LL-ARQUIVO
DISPLAY '------------------------------------------------'
STOP RUN.
*---------------------------------------------------------------* POSICIONA NO REGISTRO COM CHAVE IGUAL OU MAIOR QUE A PEDIDA
* OBS. O REGISTRO NAO EH LIDO !!!

130

*---------------------------------------------------------------POSICIONA SECTION.
POSICIONA-MAS-NAO-LE.
MOVE WW-CHAVE-INI-FAIXA TO A-FD-ARQUIVO-CHAVES1
*
START ARQUIVO KEY NOT LESS
A-FD-ARQUIVO-CHAVES1
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' START OK'
WHEN '10'
DISPLAY '
FS=' FS-ARQUIVO ' START EOF'
MOVE 'SIM' TO EOF-ARQUIVO
MOVE 'SIM' TO STOP-ARQUIVO
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' START ERRO'
END-EVALUATE
*
CONTINUE.
SAI-POSICIONA. EXIT.
*---------------------------------------------------------------* LEITURA SEQUENCIAL ENTRE LIMITES
*---------------------------------------------------------------LERFAIXA SECTION.
*
* O PRIMEIRO READ LE O REGISTRO QUE FOI POSICIONADO PELO START
*
READ ARQUIVO NEXT
EVALUATE FS-ARQUIVO
WHEN '00'
ADD 1 TO LL-ARQUIVO
IF A-FD-ARQUIVO-CHAVES1 NOT GREATER WW-CHAVE-FIM-FAIXA
MOVE 'DENTRO' TO FORA-DENTRO
ELSE
MOVE 'FORA ' TO FORA-DENTRO
MOVE 'SIM' TO STOP-ARQUIVO
END-IF
DISPLAY '
FS=' FS-ARQUIVO ' READ NEXT OK'
' CHAVEP :' A-FD-ARQUIVO-CHAVEP
' CHAVES1:' A-FD-ARQUIVO-CHAVES1
' CHAVES2:' A-FD-ARQUIVO-CHAVES2
' ' FORA-DENTRO
WHEN '10'
DISPLAY '
FS=' FS-ARQUIVO ' READ NEXT EOF'
MOVE 'SIM' TO EOF-ARQUIVO
MOVE 'SIM' TO STOP-ARQUIVO
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' READ NEXT ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
*
CONTINUE.
SAI-LERFAIXA. EXIT.
//GO.SYSPRINT DD SYSOUT=*
//GO.ARQUIVO
DD DSN=DSVAABVS.LSG.A002.ALBERTO,DISP=SHR
//GO.ARQUIVO1 DD DSN=DSVAABVS.LSG.A002.ALBERTO.PATH.AIX1,DISP=SHR

Exemplo : listagem produzida pelo aplicativo


------------------------------------------------

131

LEITURA DE FAIXA DE REGISTROS POR CHAVE ALTERN 1


-----------------------------------------------FS=00 OPEN OK
FS=00 START OK
FS=00 READ NEXT OK CHAVEP :00006 CHAVES1:00095
FS=00 READ NEXT OK CHAVEP :00005 CHAVES1:00096
FS=00 READ NEXT OK CHAVEP :00004 CHAVES1:00097
FS=00 READ NEXT OK CHAVEP :00003 CHAVES1:00098
FS=00 READ NEXT OK CHAVEP :00002 CHAVES1:00099
FS=00 READ NEXT OK CHAVEP :00001 CHAVES1:00100
FS=00 READ NEXT OK CHAVEP :00511 CHAVES1:00190
FS=00 CLOSE OK
-----------------------------------------------LIDOS
ARQUIVO
= 00007
------------------------------------------------

132

CHAVES2:99996
CHAVES2:99995
CHAVES2:99994
CHAVES2:99993
CHAVES2:99992
CHAVES2:99991
CHAVES2:90101

DENTRO
DENTRO
DENTRO
DENTRO
DENTRO
DENTRO
FORA

13.1.11 Ler sequencialmente faixa de registros por chave alternada 2

Conceito : leitura de faixa de registros : desde registro cuja chave tem determinado valor at
registro cuja chave tenha outro determinado valor;
Por exemplo : desde registro com chave 30000 at registro com chave 59999. Portanto, a chave
30000 indica o incio da faixa de registros a considerar e a chave 59999 indica o final da faixa, ou
seja : registros com chave < 30000 devem ser pulados, registros com chaves entre 30000 (inclusive)
e 59999 (inclusive) devem ser processados e registros com chave maior que 59999 no devem ser
processados.
Neste caso o aplicativo deve
(a) comandar o posicionamento no ponto do arquivo em que houver registro com chave igual ou
maior chave que caracteriza o incio da faixa de registros desejada
(b) efetuar lao de leitura sequencial dos registros at que a chave do registro lido esteja fora da
faixa desejada (chave maior que a que determina o fim da faixa) ou a condio de fim de arquivo
(EOF) seja detectada

SELECT nome_arquivo
ORGANIZATION IS INDEXED
ACCESS IS DYNAMIC
FILE STATUS IS variavel_wss
RECORD KEY IS chave_primaria
ALTERNATE RECORD KEY IS chave_alternada_1
ALTERNATE RECORD KEY IS chave_alternada_2

Declarar a chave primria e as chaves alternadas at a chave alternada a ser usada


(neste caso : RECORD KEY para a chave primria , ALTERNATE RECORD KEY para a
primeira chave alternada e ALTERNATE RECORD KEY para a segunda chave alternada)
Se houver 8 chaves alternadas, e se desejar efetuar o acesso pela chave alternada 5 deve-se
especificar pelo menos
RECORD KEY IS chave_primaria
ALTERNATE RECORD KEY IS chave_alternada_1
ALTERNATE RECORD KEY IS chave_alternada_2
ALTERNATE RECORD KEY IS chave_alternada_3
ALTERNATE RECORD KEY IS chave_alternada_4
ALTERNATE RECORD KEY IS chave_alternada_5

DDs
//ddname
//ddname1
//ddname2
...
//ddnamen

DD
DD
DD

DISP=SHR,DSN=dsname_cluster
DISP=SHR,DSN=dsname_cluster.PATH.AIX1
DISP=SHR,DSN=dsname_cluster.PATH.AIX2

DD

DISP=SHR,DSN=dsname_cluster.PATH.AIXn

//ddname
//ddname1
//ddname2

DD
DD
DD

DISP=SHR,DSN=dsname_cluster
DISP=SHR,DSN=dsname_cluster.PATH.AIX1
DISP=SHR,DSN=dsname_cluster.PATH.AIX2

ou

133

...
//ddnamen

DD

DISP=SHR,DSN=dsname_cluster.PATH.AIXn

Procedimentos :
Abrir o arquivo com OPEN INPUT nome_arquivo e testar o file status
File Status = 00 : OK
File Status 00 : erro
Posicionar o arquivo no primeiro registro da faixa desejada usando o comando
START nome_arquivo KEY relao rea_chave_primria_fd e testar o file status
O operador relacional do START pode ser um dos seguintes :
GREATER ou > ou EQUAL ou = ou NOT LESS ou NOT <
Ele NO aceita NENHUMA OUTRA especificao !
O file status deve ser testado com :
File Status = 00 : START OK. Posicionamento feito (mas registro no lido!)
File Status = 10 : EOF (fim de arquivo)
File Status outros : (outro) erro no START
IMPORTANTE : o posicionamento, feito atravs da instruo START , NO L nenhum
registro, apenas deixa um ponteiro indicando que o prximo READ deve ler na posio do
arquivo marcada.
Ler sequencialmente os registros a partir daquele posicionado pelo START usando
READ rea_fd NEXT e testar o file status
File Status = 00 : READ OK. Registro lido
File Status = 10 : EOF (fim de arquivo)
File Status outros : (outro) erro no READ
A determinao do fim da leitura sequencial deve ser feita baseada em 2 eventos : EOF (file
status 10) ou chave do registro lido maior que a chave indicadora de fim da faixa de registros
desejados. O controle desses eventos responsabilidade do aplicativo.
Fechar o arquivo com CLOSE nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro

Exemplo : JCL e fonte


//LSG#@LF2 JOB ('ALBERTO'),'ALBERTO',CLASS=1,MSGCLASS=X
//PROCLIB JCLLIB ORDER=(TORI243.T#RPC.SRC)
//*------------------------------------------------------------------//STEP1
EXEC COBCLG,MEMBER=P11LA2
//COMP.SYSIN DD *
IDENTIFICATION DIVISION.
PROGRAM-ID. P12LA2.
*---------------------------------------------------------------* LEITURA DE FAIXA DE REGISTROS POR CHAVE ALTERNADA 2
*---------------------------------------------------------------ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.

134

*----------------------------------------------------------------* ENTRADA - VSAM KSDS LIDO SEQUENCIALMENTE POR FAIXA DE REGISTROS


*
POR CHAVE ALTERNADA 2
*----------------------------------------------------------------SELECT ARQUIVO ASSIGN TO ARQUIVO
ORGANIZATION INDEXED
ACCESS DYNAMIC
RECORD KEY
A-FD-ARQUIVO-CHAVEP
ALTERNATE RECORD KEY A-FD-ARQUIVO-CHAVES1
ALTERNATE RECORD KEY A-FD-ARQUIVO-CHAVES2
File Status FS-ARQUIVO.
*----------------------------------------------------------------DATA DIVISION.
FILE SECTION.
*------------*
FD
ARQUIVO.
01
A-FD-ARQUIVO.
05 A-FD-ARQUIVO-CHAVEP
PIC X(05).
05 A-FD-ARQUIVO-RESTO1
PIC X(10).
05 A-FD-ARQUIVO-CHAVES1
PIC X(05).
05 A-FD-ARQUIVO-RESTO2
PIC X(10).
05 A-FD-ARQUIVO-CHAVES2
PIC X(05).
05 A-FD-ARQUIVO-RESTO3
PIC X(10).
05 A-FD-ARQUIVO-RESTO4
PIC X(35).
*----------------------------------------------------------------WORKING-STORAGE SECTION.
*
01 FS-ARQUIVO
PIC X(02).
01 EOF-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 STOP-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 LL-ARQUIVO
PIC 9(5) VALUE ZERO.
01 FORA-DENTRO
PIC X(6) VALUE SPACES.
01 WW-CHAVEP
PIC 9(5) VALUE ZERO.
01 WW-CHAVES
PIC 9(5) VALUE ZERO.
01 WW-FORAFAIXA
PIC X(03) VALUE 'NAO'.
01 WW-CHAVE-INI-FAIXA PIC X(05) VALUE '90095'.
01 WW-CHAVE-FIM-FAIXA PIC X(05) VALUE '99994'.
*
*---------------------------------------------------------------PROCEDURE DIVISION.
*---------------------------------------------------------------PROGRAMA SECTION.
*
DISPLAY '------------------------------------------------'
DISPLAY 'LEITURA DE FAIXA DE REGISTROS POR CHAVE ALTERN 2'
DISPLAY '------------------------------------------------'
*
OPEN
INPUT ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' OPEN OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' OPEN ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
*
IF STOP-ARQUIVO EQUAL 'NAO'
MOVE 'NAO' TO STOP-ARQUIVO
PERFORM POSICIONA

135

IF STOP-ARQUIVO EQUAL 'NAO'


PERFORM LERFAIXA UNTIL STOP-ARQUIVO = 'SIM'
END-IF
END-IF
*
CLOSE ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE ERRO'
END-EVALUATE
*
DISPLAY '------------------------------------------------'
DISPLAY 'LIDOS
ARQUIVO
= ' LL-ARQUIVO
DISPLAY '------------------------------------------------'
STOP RUN.
*
*---------------------------------------------------------------* POSICIONA NO REGISTRO COM CHAVE IGUAL OU MAIOR QUE A PEDIDA
* OBS. O REGISTRO NAO EH LIDO !!!
*---------------------------------------------------------------POSICIONA SECTION.
POSICIONA-MAS-NAO-LE.
MOVE WW-CHAVE-INI-FAIXA TO A-FD-ARQUIVO-CHAVES2
*
START ARQUIVO KEY NOT LESS
A-FD-ARQUIVO-CHAVES2
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' START OK'
WHEN '10'
DISPLAY '
FS=' FS-ARQUIVO ' START EOF'
MOVE 'SIM' TO EOF-ARQUIVO
MOVE 'SIM' TO STOP-ARQUIVO
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' START ERRO'
END-EVALUATE
*
CONTINUE.
SAI-POSICIONA. EXIT.
*
*---------------------------------------------------------------* LEITURA SEQUENCIAL ENTRE LIMITES
*---------------------------------------------------------------LERFAIXA SECTION.
*
* O PRIMEIRO READ LE O REGISTRO QUE FOI POSICIONADO PELO START
*
READ ARQUIVO NEXT
EVALUATE FS-ARQUIVO
WHEN '00'
ADD 1 TO LL-ARQUIVO
IF A-FD-ARQUIVO-CHAVES2 NOT GREATER WW-CHAVE-FIM-FAIXA
MOVE 'DENTRO' TO FORA-DENTRO
ELSE
MOVE 'FORA ' TO FORA-DENTRO
MOVE 'SIM' TO STOP-ARQUIVO
END-IF
DISPLAY '
FS=' FS-ARQUIVO ' READ NEXT OK'

136

'
'
'
'

CHAVEP :' A-FD-ARQUIVO-CHAVEP


CHAVES1:' A-FD-ARQUIVO-CHAVES1
CHAVES2:' A-FD-ARQUIVO-CHAVES2
' FORA-DENTRO

WHEN '10'
DISPLAY '
FS=' FS-ARQUIVO ' READ NEXT EOF'
MOVE 'SIM' TO EOF-ARQUIVO
MOVE 'SIM' TO STOP-ARQUIVO
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' READ NEXT ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
*
CONTINUE.
SAI-LERFAIXA. EXIT.
//GO.SYSPRINT DD SYSOUT=*
//GO.ARQUIVO
DD DSN=DSVAABVS.LSG.A002.ALBERTO,DISP=SHR
//GO.ARQUIVO1 DD DSN=DSVAABVS.LSG.A002.ALBERTO.PATH.AIX1,DISP=SHR
//GO.ARQUIVO2 DD DSN=DSVAABVS.LSG.A002.ALBERTO.PATH.AIX2,DISP=SHR

Exemplo : listagem produzida pelo aplicativo


-----------------------------------------------LEITURA DE FAIXA DE REGISTROS POR CHAVE ALTERN 2
-----------------------------------------------FS=00 OPEN OK
FS=00 START OK
FS=00 READ NEXT OK CHAVEP :00505 CHAVES1:00196
FS=00 READ NEXT OK CHAVEP :00506 CHAVES1:00195
FS=00 READ NEXT OK CHAVEP :00507 CHAVES1:00194
FS=00 READ NEXT OK CHAVEP :00508 CHAVES1:00193
FS=00 READ NEXT OK CHAVEP :00509 CHAVES1:00192
FS=00 READ NEXT OK CHAVEP :00510 CHAVES1:00191
FS=00 READ NEXT OK CHAVEP :00511 CHAVES1:00190
FS=00 READ NEXT OK CHAVEP :00001 CHAVES1:00100
FS=00 READ NEXT OK CHAVEP :00002 CHAVES1:00099
FS=00 READ NEXT OK CHAVEP :00003 CHAVES1:00098
FS=00 READ NEXT OK CHAVEP :00004 CHAVES1:00097
FS=00 READ NEXT OK CHAVEP :00005 CHAVES1:00096
FS=00 CLOSE OK
-----------------------------------------------LIDOS
ARQUIVO
= 00012
------------------------------------------------

137

CHAVES2:90095
CHAVES2:90096
CHAVES2:90097
CHAVES2:90098
CHAVES2:90099
CHAVES2:90100
CHAVES2:90101
CHAVES2:99991
CHAVES2:99992
CHAVES2:99993
CHAVES2:99994
CHAVES2:99995

DENTRO
DENTRO
DENTRO
DENTRO
DENTRO
DENTRO
DENTRO
DENTRO
DENTRO
DENTRO
DENTRO
FORA

13.1.12 Ler diretamente por chave primria

Conceito : leitura de um registro de forma direta (sem ler os anteriores) ; o acesso possvel pois
fornecido um argumento (valor de um campo chave) , o qual consultado nos ndices mantidos
pelo mtodo de acesso, e que tem pointers para sua localizao na rea de dados;

SELECT nome_arquivo
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
FILE STATUS IS variavel_wss
RECORD KEY IS chave_primaria

DDs

Procedimentos :
Abrir o arquivo com OPEN INPUT nome_arquivo e testar o file status
File Status = 00 : OK
File Status 00 : erro
Mover o valor da chave que identifica o registro desejado para a rea da RECORD KEY na FILE
SECTION e em seguida dar o comando READ nome_arquivo e testar file status :
File Status = 00 : READ OK. Registro lido
File Status = 02 : READ OK chave duplicada (DUPKEY)
File Status = 23 : NOTFOUND : registro no achado
File Status outros : (outro) erro no READ
Fechar o arquivo com CLOSE nome_arquivo e testar file status :
File Status = 00 : OK

//ddname

DD

DISP=SHR,DSN=dsname_cluster

File Status 00 : erro

Exemplo : JCL e fonte


//LSG#@LDP JOB ('ALBERTO'),'ALBERTO',CLASS=9,MSGCLASS=X
//PROCLIB JCLLIB ORDER=(TORI243.T#RPC.SRC)
//*--------------------------------------------------------------//STEP1
EXEC COBCLG,MEMBER=P12LDP
//COMP.SYSIN
DD *
IDENTIFICATION DIVISION.
PROGRAM-ID. P12LDP.
*---------------------------------------------------------------* LEITURA DIRETA POR CHAVE PRIMARIA
*---------------------------------------------------------------ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*----------------------------------------------------------------* ARQUIVO - VSAM KSDS JAH EXISTENTE
*-----------------------------------------------------------------

138

SELECT ARQUIVO

ASSIGN TO ARQUIVO
ORGANIZATION INDEXED
ACCESS RANDOM
RECORD KEY A-FD-ARQUIVO-CHAVEP
File Status FS-ARQUIVO.
*----------------------------------------------------------------DATA DIVISION.
FILE SECTION.
*----------------------------------------------------------------FD
ARQUIVO.
01
A-FD-ARQUIVO.
05 A-FD-ARQUIVO-CHAVEP
PIC X(05).
05 A-FD-ARQUIVO-RESTO1
PIC X(10).
05 A-FD-ARQUIVO-CHAVES1
PIC X(05).
05 A-FD-ARQUIVO-RESTO2
PIC X(10).
05 A-FD-ARQUIVO-CHAVES2
PIC X(05).
05 A-FD-ARQUIVO-RESTO3
PIC X(10).
05 A-FD-ARQUIVO-RESTO4
PIC X(35).
*----------------------------------------------------------------WORKING-STORAGE SECTION.
*
01 FS-ARQUIVO
PIC X(02).
01 EOF-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 STOP-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 LEU-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 WW-ULTGRAVADO
PIC 9(5) VALUE ZERO.
01 WW-ARQUIVO
PIC 9(5) VALUE ZERO.
01 WW-CHAVEP
PIC 9(5) VALUE ZERO.
01 WW-CHAVES1
PIC 9(5) VALUE ZERO.
01 WW-CHAVES2
PIC 9(5) VALUE ZERO.
01 LL-ARQUIVO
PIC 9(5) VALUE ZERO.
*---------------------------------------------------------------PROCEDURE DIVISION.
*---------------------------------------------------------------PROGRAMA SECTION.
*
DISPLAY '------------------------------------------------'
DISPLAY 'READ DIRETO POR CHAVE PRIMARIA '
DISPLAY '------------------------------------------------'
*
OPEN INPUT
ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' OPEN OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' OPEN ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
*
MOVE
'00005' TO WW-CHAVEP
PERFORM LER-DIRETO
MOVE
'00015' TO WW-CHAVEP
PERFORM LER-DIRETO
MOVE
'00025' TO WW-CHAVEP
PERFORM LER-DIRETO
MOVE
'00035' TO WW-CHAVEP
PERFORM LER-DIRETO
*
CLOSE ARQUIVO.

139

EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE ERRO'
END-EVALUATE
*
DISPLAY '------------------------------------------------'
DISPLAY 'LIDOS ARQUIVO
= ' LL-ARQUIVO
DISPLAY '------------------------------------------------'
STOP RUN.
*---------------------------------------------------------------* (TENTA) LER UM REGISTRO
*---------------------------------------------------------------LER-DIRETO SECTION.
*
MOVE
'NAO'
TO LEU-ARQUIVO
MOVE
WW-CHAVEP
TO A-FD-ARQUIVO-CHAVEP
READ
ARQUIVO
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' READ OK' ' REG '
' CHAVEP : ' A-FD-ARQUIVO-CHAVEP
' CHAVES1 : ' A-FD-ARQUIVO-CHAVES1
' CHAVES2 : ' A-FD-ARQUIVO-CHAVES2
MOVE
'SIM' TO LEU-ARQUIVO
ADD
1
TO LL-ARQUIVO
WHEN '02'
DISPLAY '
FS=' FS-ARQUIVO ' READ KEYDUP
' WW-CHAVEP
WHEN '23'
DISPLAY '
FS=' FS-ARQUIVO ' READ NOTFOUND ' WW-CHAVEP
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' READ ERRO
' WW-CHAVEP
END-EVALUATE
*
CONTINUE.
SAI-LER-DIRETO. EXIT.
*
//GO.SYSPRINT DD SYSOUT=*
//GO.ARQUIVO
DD DSN=DSVAABVS.LSG.A002.ALBERTO,DISP=SHR

Exemplo : listagem produzida pelo aplicativo


-----------------------------------------------READ DIRETO POR CHAVE PRIMARIA
-----------------------------------------------FS=00 OPEN OK
FS=00 READ OK REG
CHAVEP : 00005 CHAVES1 : 00096
FS=00 READ OK REG
CHAVEP : 00015 CHAVES1 : 00086
FS=23 READ NOTFOUND 00025
FS=23 READ NOTFOUND 00035
FS=00 CLOSE OK
-----------------------------------------------LIDOS ARQUIVO
= 00002
------------------------------------------------

140

CHAVES2 : 99995
CHAVES2 : 00005

13.1.13 Ler diretamente por chave alternada 1

Conceito : leitura de um registro de forma direta (sem ler os anteriores) ; o acesso possvel pois
fornecido um argumento (valor de um campo chave) , o qual consultado nos ndices mantidos
pelo mtodo de acesso, e que tem pointers para sua localizao na rea de dados;

SELECT nome_arquivo
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
FILE STATUS IS variavel_wss
RECORD KEY IS chave_alternada_1

DDs

Procedimentos :
Abrir o arquivo com OPEN INPUT nome_arquivo e testar o file status
File Status = 00 : OK
File Status 00 : erro
Mover o valor da chave que identifica o registro desejado para a rea indicada como RECORD
KEY na FILE SECTION e em seguida comandar a leitura com o comando READ nome_arquivo
e testar file status :
File Status = 00 : READ OK. Registro lido
File Status = 02 : READ OK chave duplicada
File Status = 23 : registro no achado
File Status outros : (outro) erro no READ
Fechar o arquivo com CLOSE nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro

//ddname

DD

DISP=SHR,DSN=dsname_cluster.PATH.AIX1

Exemplo : JCL e fonte


//LSG#@LD1 JOB ('ALBERTO'),'ALBERTO',CLASS=9,MSGCLASS=X
//PROCLIB JCLLIB ORDER=(TORI243.T#RPC.SRC)
//*--------------------------------------------------------------//STEP1
EXEC COBCLG,MEMBER=P13LA1
//COMP.SYSIN
DD *
IDENTIFICATION DIVISION.
PROGRAM-ID. P13LA1.
*---------------------------------------------------------------* LEITURA DIRETA POR CHAVE ALTERNADA 1
*---------------------------------------------------------------ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*----------------------------------------------------------------* ARQUIVO - VSAM KSDS JAH EXISTENTE

141

*----------------------------------------------------------------SELECT ARQUIVO ASSIGN TO ARQUIVO


ORGANIZATION INDEXED
ACCESS RANDOM
RECORD KEY
A-FD-ARQUIVO-CHAVES1
File Status FS-ARQUIVO.
*----------------------------------------------------------------DATA DIVISION.
FILE SECTION.
*----------------------------------------------------------------FD
ARQUIVO.
01
A-FD-ARQUIVO.
05 A-FD-ARQUIVO-CHAVEP
PIC X(05).
05 A-FD-ARQUIVO-RESTO1
PIC X(10).
05 A-FD-ARQUIVO-CHAVES1
PIC X(05).
05 A-FD-ARQUIVO-RESTO2
PIC X(10).
05 A-FD-ARQUIVO-CHAVES2
PIC X(05).
05 A-FD-ARQUIVO-RESTO3
PIC X(10).
05 A-FD-ARQUIVO-RESTO4
PIC X(35).
*----------------------------------------------------------------WORKING-STORAGE SECTION.
*
01 FS-ARQUIVO
PIC X(02).
01 EOF-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 STOP-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 LEU-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 WW-ULTGRAVADO
PIC 9(5) VALUE ZERO.
01 WW-ARQUIVO
PIC 9(5) VALUE ZERO.
01 WW-CHAVEP
PIC 9(5) VALUE ZERO.
01 WW-CHAVES1
PIC 9(5) VALUE ZERO.
01 WW-CHAVES2
PIC 9(5) VALUE ZERO.
01 LL-ARQUIVO
PIC 9(5) VALUE ZERO.
*---------------------------------------------------------------PROCEDURE DIVISION.
*---------------------------------------------------------------PROGRAMA SECTION.
*
DISPLAY '------------------------------------------------'
DISPLAY 'READ DIRETO POR CHAVE ALTERNADA 1'
DISPLAY '------------------------------------------------'
*
OPEN INPUT
ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' OPEN OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' OPEN ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
*
MOVE
'00078' TO WW-CHAVES1
PERFORM LER-DIRETO
MOVE
'00080' TO WW-CHAVES1
PERFORM LER-DIRETO
MOVE
'00189' TO WW-CHAVES1
PERFORM LER-DIRETO
MOVE
'00190' TO WW-CHAVES1
PERFORM LER-DIRETO
*

142

CLOSE ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE ERRO'
END-EVALUATE
*
DISPLAY '------------------------------------------------'
DISPLAY 'LIDOS ARQUIVO
= ' LL-ARQUIVO
DISPLAY '------------------------------------------------'
STOP RUN.
*---------------------------------------------------------------* (TENTA) LER UM REGISTRO
*---------------------------------------------------------------LER-DIRETO SECTION.
*
MOVE
'NAO'
TO LEU-ARQUIVO
MOVE
WW-CHAVES1
TO A-FD-ARQUIVO-CHAVES1
READ
ARQUIVO
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' READ OK' ' REG '
' CHAVEP : ' A-FD-ARQUIVO-CHAVEP
' CHAVES1 : ' A-FD-ARQUIVO-CHAVES1
' CHAVES2 : ' A-FD-ARQUIVO-CHAVES2
MOVE
'SIM' TO LEU-ARQUIVO
WHEN '02'
DISPLAY '
FS=' FS-ARQUIVO ' READ KEYDUP
' WW-CHAVES1
WHEN '23'
DISPLAY '
FS=' FS-ARQUIVO ' READ NOTFOUND ' WW-CHAVES1
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' READ ERRO
' WW-CHAVES1
END-EVALUATE
*
CONTINUE.
SAI-LER-DIRETO. EXIT.
*
//GO.SYSPRINT DD SYSOUT=*
//GO.ARQUIVO
DD DSN=DSVAABVS.LSG.A002.ALBERTO.PATH.AIX1,DISP=SHR

Exemplo : listagem produzida pelo aplicativo


-----------------------------------------------READ DIRETO POR CHAVE ALTERNADA 1
-----------------------------------------------FS=00 OPEN OK
FS=23 READ NOTFOUND 00078
FS=00 READ OK REG
CHAVEP : 00021 CHAVES1 : 00080
FS=23 READ NOTFOUND 00189
FS=00 READ OK REG
CHAVEP : 00511 CHAVES1 : 00190
FS=00 CLOSE OK
-----------------------------------------------LIDOS ARQUIVO
= 00002
------------------------------------------------

143

CHAVES2 : 00011
CHAVES2 : 90101

13.1.14 Ler diretamente por chave alternada 2

Conceito : leitura de um registro de forma direta (sem ler os anteriores) ; o acesso possvel pois
fornecido um argumento (valor de um campo chave) , o qual consultado nos ndices mantidos
pelo mtodo de acesso, e que tem pointers para sua localizao na rea de dados;

SELECT nome_arquivo
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
FILE STATUS IS variavel_wss
RECORD KEY IS chave_alternada_2

DDs

Procedimentos :
Abrir o arquivo com OPEN INPUT nome_arquivo e testar o file status
File Status = 00 : OK
File Status 00 : erro
Mover o valor da chave que identifica o registro desejado para a rea da ALTERNATE RECORD
KEY na FILE SECTION e em seguida comandar a leitura com o comando READ nome_arquivo
e testar file status :
File Status = 00 : READ OK. Registro lido
File Status = 02 : READ OK chave duplicada
File Status = 23 : registro no achado
File Status outros : (outro) erro no READ
Fechar o arquivo com CLOSE nome_arquivo e testar file status :
File Status = 00 : OK

//ddname

DD

DISP=SHR,DSN=dsname_cluster.PATH.AIX2

File Status 00 : erro

Exemplo : JCL e fonte


//LSG#@LD2 JOB ('ALBERTO'),'ALBERTO',CLASS=9,MSGCLASS=X
//PROCLIB JCLLIB ORDER=(TORI243.T#RPC.SRC)
//*--------------------------------------------------------------//STEP1
EXEC COBCLG,MEMBER=P14LA2
//COMP.SYSIN
DD *
IDENTIFICATION DIVISION.
PROGRAM-ID. P14LA2.
*---------------------------------------------------------------* LEITURA DIRETA POR CHAVE ALTERNADA 2
*---------------------------------------------------------------ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*----------------------------------------------------------------* ARQUIVO - VSAM KSDS JAH EXISTENTE

144

*----------------------------------------------------------------SELECT ARQUIVO ASSIGN TO ARQUIVO


ORGANIZATION INDEXED
ACCESS RANDOM
RECORD KEY
A-FD-ARQUIVO-CHAVES2
File Status FS-ARQUIVO.
*----------------------------------------------------------------DATA DIVISION.
FILE SECTION.
*----------------------------------------------------------------FD
ARQUIVO.
01
A-FD-ARQUIVO.
05 A-FD-ARQUIVO-CHAVEP
PIC X(05).
05 A-FD-ARQUIVO-RESTO1
PIC X(10).
05 A-FD-ARQUIVO-CHAVES1
PIC X(05).
05 A-FD-ARQUIVO-RESTO2
PIC X(10).
05 A-FD-ARQUIVO-CHAVES2
PIC X(05).
05 A-FD-ARQUIVO-RESTO3
PIC X(10).
05 A-FD-ARQUIVO-RESTO4
PIC X(35).
*----------------------------------------------------------------WORKING-STORAGE SECTION.
*
01 FS-ARQUIVO
PIC X(02).
01 EOF-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 STOP-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 LEU-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 WW-ULTGRAVADO
PIC 9(5) VALUE ZERO.
01 WW-ARQUIVO
PIC 9(5) VALUE ZERO.
01 WW-CHAVEP
PIC 9(5) VALUE ZERO.
01 WW-CHAVES1
PIC 9(5) VALUE ZERO.
01 WW-CHAVES2
PIC 9(5) VALUE ZERO.
01 LL-ARQUIVO
PIC 9(5) VALUE ZERO.
*---------------------------------------------------------------PROCEDURE DIVISION.
*---------------------------------------------------------------PROGRAMA SECTION.
*
DISPLAY '------------------------------------------------'
DISPLAY 'READ DIRETO POR CHAVE ALTERNADA 2'
DISPLAY '------------------------------------------------'
*
OPEN INPUT
ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' OPEN OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' OPEN ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
*
MOVE
'00011' TO WW-CHAVES2
PERFORM LER-DIRETO
MOVE
'90091' TO WW-CHAVES2
PERFORM LER-DIRETO
MOVE
'90102' TO WW-CHAVES2
PERFORM LER-DIRETO
MOVE
'99991' TO WW-CHAVES2
PERFORM LER-DIRETO
*

145

CLOSE ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE ERRO'
END-EVALUATE
*
DISPLAY '------------------------------------------------'
DISPLAY 'LIDOS ARQUIVO
= ' LL-ARQUIVO
DISPLAY '------------------------------------------------'
STOP RUN.
*---------------------------------------------------------------* (TENTA) LER UM REGISTRO
*---------------------------------------------------------------LER-DIRETO SECTION.
*
MOVE
'NAO'
TO LEU-ARQUIVO
MOVE
WW-CHAVES2
TO A-FD-ARQUIVO-CHAVES2
READ
ARQUIVO
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' READ OK' ' REG '
' CHAVEP : ' A-FD-ARQUIVO-CHAVEP
' CHAVES1 : ' A-FD-ARQUIVO-CHAVES1
' CHAVES2 : ' A-FD-ARQUIVO-CHAVES2
ADD
1 TO LL-ARQUIVO
MOVE
'SIM' TO LEU-ARQUIVO
WHEN '02'
DISPLAY '
FS=' FS-ARQUIVO ' READ KEYDUP
' WW-CHAVES2
WHEN '23'
DISPLAY '
FS=' FS-ARQUIVO ' READ NOTFOUND ' WW-CHAVES2
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' READ ERRO
' WW-CHAVES2
END-EVALUATE
*
CONTINUE.
SAI-LER-DIRETO. EXIT.
*
//GO.SYSPRINT DD SYSOUT=*
//GO.ARQUIVO
DD DSN=DSVAABVS.LSG.A002.ALBERTO.PATH.AIX2,DISP=SHR

Exemplo : listagem produzida pelo aplicativo


-----------------------------------------------READ DIRETO POR CHAVE ALTERNADA 2
-----------------------------------------------FS=00 OPEN OK
FS=00 READ OK REG
CHAVEP : 00021 CHAVES1 : 00080
FS=00 READ OK REG
CHAVEP : 00501 CHAVES1 : 00200
FS=23 READ NOTFOUND 90102
FS=00 READ OK REG
CHAVEP : 00001 CHAVES1 : 00100
FS=00 CLOSE OK
-----------------------------------------------LIDOS ARQUIVO
= 00003
------------------------------------------------

146

CHAVES2 : 00011
CHAVES2 : 90091
CHAVES2 : 99991

147

13.1.15 Deletar por chave primria

Conceito : leitura de um registro de forma direta (sem ler os anteriores) ; o acesso possvel pois
fornecido um argumento (valor de um campo chave) , o qual consultado nos ndices mantidos
pelo mtodo de acesso, e que tem pointers para sua localizao na rea de dados;

SELECT nome_arquivo
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
FILE STATUS IS variavel_wss
RECORD KEY IS chave_primaria

DDs

Procedimentos :
Abrir o arquivo com OPEN I-O nome_arquivo e testar o file status
File Status = 00 : OK
File Status 00 : erro
Mover o valor da chave que identifica o registro desejado para a rea de RECORD KEY na FILE
SECTION e em seguida dar o comando READ nome_arquivo e testar file status :
File Status = 00 : READ OK. Registro lido
File Status = 23 : registro no achado
File Status outros : (outro) erro no READ
Comandar o DELETE para deletar o registro : DELETE nome_arquivo e testar file status :
File Status = 00 : DELETE OK. Registro deletado
File Status = 23 : NOTFOUND. Registro no achado
File Status outros : (outro) erro no DELETE
Fechar o arquivo com CLOSE nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro

//ddname

DD

DISP=SHR,DSN=dsname_cluster

Exemplo : JCL e fonte


//LSG#@DP
JOB ('ALBERTO'),'ALBERTO',CLASS=1,MSGCLASS=X
//PROCLIB JCLLIB ORDER=(TORI243.T#RPC.SRC)
//*--------------------------------------------------------------//STEP1
EXEC COBCLG,MEMBER=P15DP
//COMP.SYSIN
DD *
IDENTIFICATION DIVISION.
PROGRAM-ID. P15DP.
*---------------------------------------------------------------* DELETAR DIRETO POR CHAVE PRIMARIA
*---------------------------------------------------------------ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.

148

FILE-CONTROL.
*----------------------------------------------------------------* ARQUIVO
*----------------------------------------------------------------SELECT ARQUIVO ASSIGN TO ARQUIVO
ORGANIZATION INDEXED
ACCESS RANDOM
RECORD KEY A-FD-ARQUIVO-CHAVEP
File Status FS-ARQUIVO.
*----------------------------------------------------------------DATA DIVISION.
FILE SECTION.
*----------------------------------------------------------------FD
ARQUIVO.
01
A-FD-ARQUIVO.
05 A-FD-ARQUIVO-CHAVEP
PIC X(05).
05 A-FD-ARQUIVO-RESTO1
PIC X(10).
05 A-FD-ARQUIVO-CHAVES1
PIC X(05).
05 A-FD-ARQUIVO-RESTO2
PIC X(10).
05 A-FD-ARQUIVO-CHAVES2
PIC X(05).
05 A-FD-ARQUIVO-RESTO3
PIC X(10).
05 A-FD-ARQUIVO-RESTO4
PIC X(35).
*----------------------------------------------------------------WORKING-STORAGE SECTION.
*
01 FS-ARQUIVO
PIC X(02).
01 EOF-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 STOP-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 LEU-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 WW-ULTGRAVADO
PIC 9(5) VALUE ZERO.
01 WW-ARQUIVO
PIC 9(5) VALUE ZERO.
01 WW-CHAVEP
PIC X(5) VALUE SPACES.
01 WW-CHAVES1
PIC X(5) VALUE SPACES.
01 WW-CHAVES2
PIC X(5) VALUE SPACES.
01 LL-ARQUIVO
PIC 9(5) VALUE ZERO.
01 DD-ARQUIVO
PIC 9(5) VALUE ZERO.
*---------------------------------------------------------------PROCEDURE DIVISION.
*---------------------------------------------------------------PROGRAMA SECTION.
*
DISPLAY '------------------------------------------------'
DISPLAY 'DELETE POR CHAVE PRIMARIA APOS READ DIRETO'
DISPLAY '------------------------------------------------'
*
OPEN I-O
ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' OPEN OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' OPEN ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
*
MOVE
'00005' TO WW-CHAVEP
PERFORM LER-DIRETO
IF
LEU-ARQUIVO = 'SIM'
PERFORM DELETAR
END-IF

149

MOVE
'00015' TO WW-CHAVEP
PERFORM LER-DIRETO
IF
LEU-ARQUIVO = 'SIM'
PERFORM DELETAR
END-IF
*
CLOSE ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE ERRO'
END-EVALUATE
*
DISPLAY '------------------------------------------------'
DISPLAY 'LIDOS ARQUIVO
= ' LL-ARQUIVO
DISPLAY 'DELETADOS ARQ.
= ' DD-ARQUIVO
DISPLAY '------------------------------------------------'
STOP RUN.
*---------------------------------------------------------------* (TENTA) LER UM REGISTRO
*---------------------------------------------------------------LER-DIRETO SECTION.
*
MOVE
'NAO'
TO LEU-ARQUIVO
MOVE
WW-CHAVEP
TO A-FD-ARQUIVO-CHAVEP
READ
ARQUIVO
EVALUATE FS-ARQUIVO
WHEN '00'
MOVE
A-FD-ARQUIVO-CHAVEP
TO WW-CHAVEP
MOVE
A-FD-ARQUIVO-CHAVES1 TO WW-CHAVES1
MOVE
A-FD-ARQUIVO-CHAVES2 TO WW-CHAVES2
DISPLAY '
FS=' FS-ARQUIVO ' READ OK
'
' CHAVEP : ' A-FD-ARQUIVO-CHAVEP
' CHAVES1 : ' A-FD-ARQUIVO-CHAVES1
' CHAVES2 : ' A-FD-ARQUIVO-CHAVES2
MOVE
'SIM' TO LEU-ARQUIVO
ADD
1
TO LL-ARQUIVO
WHEN '02'
DISPLAY '
FS=' FS-ARQUIVO ' READ KEYDUP
' WW-CHAVEP
WHEN '23'
DISPLAY '
FS=' FS-ARQUIVO ' READ NOTFOUND ' WW-CHAVEP
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' READ ERRO
' WW-CHAVEP
END-EVALUATE
*
CONTINUE.
SAI-LER-DIRETO. EXIT.
*---------------------------------------------------------------* DELETA REGISTRO LIDO
*---------------------------------------------------------------DELETAR SECTION.
*
DELETE ARQUIVO
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' DELETE OK
'
' CHAVEP : ' WW-CHAVEP
' CHAVES1 : ' WW-CHAVES1

150

'
ADD
1
WHEN '23'
DISPLAY '
'
'
'
WHEN OTHER
DISPLAY '
'
'
'
END-EVALUATE

CHAVES2 : ' WW-CHAVES2


TO DD-ARQUIVO
FS=' FS-ARQUIVO ' DELETE NOTFOUND'
CHAVEP : ' WW-CHAVEP
CHAVES1 : ' WW-CHAVES1
CHAVES2 : ' WW-CHAVES2
FS=' FS-ARQUIVO ' READ ERRO
CHAVEP : ' WW-CHAVEP
CHAVES1 : ' WW-CHAVES1
CHAVES2 : ' WW-CHAVES2

'

*
CONTINUE.
SAI-DELETAR. EXIT.
//GO.SYSPRINT DD SYSOUT=*
//GO.ARQUIVO
DD DSN=DSVAABVS.LSG.A002.ALBERTO,DISP=SHR

Exemplo : listagem produzida pelo aplicativo


-----------------------------------------------DELETE POR CHAVE PRIMARIA APOS READ DIRETO
-----------------------------------------------FS=00 OPEN OK
FS=00 READ OK
CHAVEP : 00005 CHAVES1 :
FS=00 DELETE OK
CHAVEP : 00005 CHAVES1 :
FS=00 READ OK
CHAVEP : 00015 CHAVES1 :
FS=00 DELETE OK
CHAVEP : 00015 CHAVES1 :
FS=00 CLOSE OK
-----------------------------------------------LIDOS ARQUIVO
= 00002
DELETADOS ARQ.
= 00002
------------------------------------------------

00096 CHAVES2 : 99995


00096 CHAVES2 : 99995
00086 CHAVES2 : 00005
00086 CHAVES2 : 00005

Exemplo : arquivo resultante listado por ordem de chave primria


*************** LISTA POR CHAVE
CHAVE-PRI=00001 CHAVE-S1=00100
CHAVE-PRI=00002 CHAVE-S1=00099
CHAVE-PRI=00003 CHAVE-S1=00098
CHAVE-PRI=00004 CHAVE-S1=00097
CHAVE-PRI=00006 CHAVE-S1=00095
CHAVE-PRI=00007 CHAVE-S1=00094
CHAVE-PRI=00008 CHAVE-S1=00093
CHAVE-PRI=00009 CHAVE-S1=00092
CHAVE-PRI=00010 CHAVE-S1=00091
CHAVE-PRI=00011 CHAVE-S1=00090
CHAVE-PRI=00012 CHAVE-S1=00089
CHAVE-PRI=00013 CHAVE-S1=00088
CHAVE-PRI=00014 CHAVE-S1=00087
CHAVE-PRI=00016 CHAVE-S1=00085
CHAVE-PRI=00017 CHAVE-S1=00084
CHAVE-PRI=00018 CHAVE-S1=00083
CHAVE-PRI=00019 CHAVE-S1=00082
CHAVE-PRI=00020 CHAVE-S1=00081

PRIMARIA ***********
CHAVE-S2=99991 R1=@UR1
CHAVE-S2=99992 R1=@UR1
CHAVE-S2=99993 R1=@UR1
CHAVE-S2=99994 R1=@UR1
CHAVE-S2=99996 R1=@UR1
CHAVE-S2=99997 R1=*CR1
CHAVE-S2=99998 R1=*CR1
CHAVE-S2=99999 R1=*CR1
CHAVE-S2=00000 R1=*CR1
CHAVE-S2=00001 R1=#UR1
CHAVE-S2=00002 R1=#UR1
CHAVE-S2=00003 R1=#UR1
CHAVE-S2=00004 R1=#UR1
CHAVE-S2=00006 R1=$UR1
CHAVE-S2=00007 R1=$UR1
CHAVE-S2=00008 R1=$UR1
CHAVE-S2=00009 R1=$UR1
CHAVE-S2=00010 R1=$UR1

151

R2=@UR2
R2=@UR2
R2=@UR2
R2=@UR2
R2=@UR2
R2=*CR2
R2=*CR2
R2=*CR2
R2=*CR2
R2=#UR2
R2=#UR2
R2=#UR2
R2=#UR2
R2=$UR2
R2=$UR2
R2=$UR2
R2=$UR2
R2=$UR2

CHAVE-PRI=00021
CHAVE-PRI=00501
CHAVE-PRI=00502
CHAVE-PRI=00503
CHAVE-PRI=00504
CHAVE-PRI=00505
CHAVE-PRI=00506
CHAVE-PRI=00507
CHAVE-PRI=00508
CHAVE-PRI=00509
CHAVE-PRI=00510
CHAVE-PRI=00511

CHAVE-S1=00080
CHAVE-S1=00200
CHAVE-S1=00199
CHAVE-S1=00198
CHAVE-S1=00197
CHAVE-S1=00196
CHAVE-S1=00195
CHAVE-S1=00194
CHAVE-S1=00193
CHAVE-S1=00192
CHAVE-S1=00191
CHAVE-S1=00190

CHAVE-S2=00011
CHAVE-S2=90091
CHAVE-S2=90092
CHAVE-S2=90093
CHAVE-S2=90094
CHAVE-S2=90095
CHAVE-S2=90096
CHAVE-S2=90097
CHAVE-S2=90098
CHAVE-S2=90099
CHAVE-S2=90100
CHAVE-S2=90101

R1=*CR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1

R2=*CR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2

Exemplo : arquivo resultante listado por ordem de chave alternada 1


***************
CHAVE-PRI=00021
CHAVE-PRI=00020
CHAVE-PRI=00019
CHAVE-PRI=00018
CHAVE-PRI=00017
CHAVE-PRI=00016
CHAVE-PRI=00014
CHAVE-PRI=00013
CHAVE-PRI=00012
CHAVE-PRI=00011
CHAVE-PRI=00010
CHAVE-PRI=00009
CHAVE-PRI=00008
CHAVE-PRI=00007
CHAVE-PRI=00006
CHAVE-PRI=00004
CHAVE-PRI=00003
CHAVE-PRI=00002
CHAVE-PRI=00001
CHAVE-PRI=00511
CHAVE-PRI=00510
CHAVE-PRI=00509
CHAVE-PRI=00508
CHAVE-PRI=00507
CHAVE-PRI=00506
CHAVE-PRI=00505
CHAVE-PRI=00504
CHAVE-PRI=00503
CHAVE-PRI=00502
CHAVE-PRI=00501

LISTA POR CHAVE ALTERN 1 ***********


CHAVE-S1=00080 CHAVE-S2=00011 R1=*CR1
CHAVE-S1=00081 CHAVE-S2=00010 R1=$UR1
CHAVE-S1=00082 CHAVE-S2=00009 R1=$UR1
CHAVE-S1=00083 CHAVE-S2=00008 R1=$UR1
CHAVE-S1=00084 CHAVE-S2=00007 R1=$UR1
CHAVE-S1=00085 CHAVE-S2=00006 R1=$UR1
CHAVE-S1=00087 CHAVE-S2=00004 R1=#UR1
CHAVE-S1=00088 CHAVE-S2=00003 R1=#UR1
CHAVE-S1=00089 CHAVE-S2=00002 R1=#UR1
CHAVE-S1=00090 CHAVE-S2=00001 R1=#UR1
CHAVE-S1=00091 CHAVE-S2=00000 R1=*CR1
CHAVE-S1=00092 CHAVE-S2=99999 R1=*CR1
CHAVE-S1=00093 CHAVE-S2=99998 R1=*CR1
CHAVE-S1=00094 CHAVE-S2=99997 R1=*CR1
CHAVE-S1=00095 CHAVE-S2=99996 R1=@UR1
CHAVE-S1=00097 CHAVE-S2=99994 R1=@UR1
CHAVE-S1=00098 CHAVE-S2=99993 R1=@UR1
CHAVE-S1=00099 CHAVE-S2=99992 R1=@UR1
CHAVE-S1=00100 CHAVE-S2=99991 R1=@UR1
CHAVE-S1=00190 CHAVE-S2=90101 R1=#IR1
CHAVE-S1=00191 CHAVE-S2=90100 R1=#IR1
CHAVE-S1=00192 CHAVE-S2=90099 R1=#IR1
CHAVE-S1=00193 CHAVE-S2=90098 R1=#IR1
CHAVE-S1=00194 CHAVE-S2=90097 R1=#IR1
CHAVE-S1=00195 CHAVE-S2=90096 R1=#IR1
CHAVE-S1=00196 CHAVE-S2=90095 R1=#IR1
CHAVE-S1=00197 CHAVE-S2=90094 R1=#IR1
CHAVE-S1=00198 CHAVE-S2=90093 R1=#IR1
CHAVE-S1=00199 CHAVE-S2=90092 R1=#IR1
CHAVE-S1=00200 CHAVE-S2=90091 R1=#IR1

R2=*CR2
R2=$UR2
R2=$UR2
R2=$UR2
R2=$UR2
R2=$UR2
R2=#UR2
R2=#UR2
R2=#UR2
R2=#UR2
R2=*CR2
R2=*CR2
R2=*CR2
R2=*CR2
R2=@UR2
R2=@UR2
R2=@UR2
R2=@UR2
R2=@UR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2

Exemplo : arquivo resultante listado por ordem de chave alternada 2


*************** LISTA POR CHAVE
CHAVE-PRI=00010 CHAVE-S1=00091
CHAVE-PRI=00011 CHAVE-S1=00090
CHAVE-PRI=00012 CHAVE-S1=00089
CHAVE-PRI=00013 CHAVE-S1=00088
CHAVE-PRI=00014 CHAVE-S1=00087
CHAVE-PRI=00016 CHAVE-S1=00085

ALTERN 2 ***********
CHAVE-S2=00000 R1=*CR1
CHAVE-S2=00001 R1=#UR1
CHAVE-S2=00002 R1=#UR1
CHAVE-S2=00003 R1=#UR1
CHAVE-S2=00004 R1=#UR1
CHAVE-S2=00006 R1=$UR1

152

R2=*CR2
R2=#UR2
R2=#UR2
R2=#UR2
R2=#UR2
R2=$UR2

CHAVE-PRI=00017
CHAVE-PRI=00018
CHAVE-PRI=00019
CHAVE-PRI=00020
CHAVE-PRI=00021
CHAVE-PRI=00501
CHAVE-PRI=00502
CHAVE-PRI=00503
CHAVE-PRI=00504
CHAVE-PRI=00505
CHAVE-PRI=00506
CHAVE-PRI=00507
CHAVE-PRI=00508
CHAVE-PRI=00509
CHAVE-PRI=00510
CHAVE-PRI=00511
CHAVE-PRI=00001
CHAVE-PRI=00002
CHAVE-PRI=00003
CHAVE-PRI=00004
CHAVE-PRI=00006
CHAVE-PRI=00007
CHAVE-PRI=00008
CHAVE-PRI=00009

CHAVE-S1=00084
CHAVE-S1=00083
CHAVE-S1=00082
CHAVE-S1=00081
CHAVE-S1=00080
CHAVE-S1=00200
CHAVE-S1=00199
CHAVE-S1=00198
CHAVE-S1=00197
CHAVE-S1=00196
CHAVE-S1=00195
CHAVE-S1=00194
CHAVE-S1=00193
CHAVE-S1=00192
CHAVE-S1=00191
CHAVE-S1=00190
CHAVE-S1=00100
CHAVE-S1=00099
CHAVE-S1=00098
CHAVE-S1=00097
CHAVE-S1=00095
CHAVE-S1=00094
CHAVE-S1=00093
CHAVE-S1=00092

CHAVE-S2=00007
CHAVE-S2=00008
CHAVE-S2=00009
CHAVE-S2=00010
CHAVE-S2=00011
CHAVE-S2=90091
CHAVE-S2=90092
CHAVE-S2=90093
CHAVE-S2=90094
CHAVE-S2=90095
CHAVE-S2=90096
CHAVE-S2=90097
CHAVE-S2=90098
CHAVE-S2=90099
CHAVE-S2=90100
CHAVE-S2=90101
CHAVE-S2=99991
CHAVE-S2=99992
CHAVE-S2=99993
CHAVE-S2=99994
CHAVE-S2=99996
CHAVE-S2=99997
CHAVE-S2=99998
CHAVE-S2=99999

R1=$UR1
R1=$UR1
R1=$UR1
R1=$UR1
R1=*CR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=@UR1
R1=@UR1
R1=@UR1
R1=@UR1
R1=@UR1
R1=*CR1
R1=*CR1
R1=*CR1

153

R2=$UR2
R2=$UR2
R2=$UR2
R2=$UR2
R2=*CR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=@UR2
R2=@UR2
R2=@UR2
R2=@UR2
R2=@UR2
R2=*CR2
R2=*CR2
R2=*CR2

13.1.16 Deletar por chave alternada 1

Conceito : leitura de um registro de forma direta (sem ler os anteriores) ; o acesso possvel pois fornecido um
argumento (valor de um campo chave) , o qual consultado nos ndices mantidos pelo mtodo de acesso, e que tem
pointers para sua localizao na rea de dados;

SELECT nome_arquivo
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
FILE STATUS IS variavel_wss
RECORD KEY IS chave_alternada_1

DDs

Procedimentos :
Abrir o arquivo com OPEN INPUT nome_arquivo e testar o file status
File Status = 00 : OK
File Status 00 : erro
Mover o valor da chave que identifica o registro desejado para a rea da ALTERNATE RECORD
KEY na FILE SECTION e em seguida efetuar a leitura com o comando READ nome_arquivo e
testar file status :
File Status = 00 : READ OK. Registro lido
File Status = 02 : READ OK chave duplicada
File Status = 23 : registro no achado
File Status outros : (outro) erro no READ
Fechar o arquivo com CLOSE nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro

//ddname

DD

DISP=SHR,DSN=dsname_cluster.PATH.AIX1

Exemplo : JCL e fonte


//LSG#@DA1 JOB ('ALBERTO'),'ALBERTO',CLASS=1,MSGCLASS=X
//PROCLIB JCLLIB ORDER=(TORI243.T#RPC.SRC)
//*--------------------------------------------------------------//STEP1
EXEC COBCLG,MEMBER=P16DA1
//COMP.SYSIN
DD *
IDENTIFICATION DIVISION.
PROGRAM-ID. P16DA1.
*---------------------------------------------------------------* DELETAR DIRETO POR CHAVE ALTERNADA 1
*---------------------------------------------------------------ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*----------------------------------------------------------------* ARQUIVO

154

*----------------------------------------------------------------SELECT ARQUIVO ASSIGN TO ARQUIVO


ORGANIZATION INDEXED
ACCESS RANDOM
RECORD KEY A-FD-ARQUIVO-CHAVES1
File Status FS-ARQUIVO.
*----------------------------------------------------------------DATA DIVISION.
FILE SECTION.
*----------------------------------------------------------------FD
ARQUIVO.
01
A-FD-ARQUIVO.
05 A-FD-ARQUIVO-CHAVEP
PIC X(05).
05 A-FD-ARQUIVO-RESTO1
PIC X(10).
05 A-FD-ARQUIVO-CHAVES1
PIC X(05).
05 A-FD-ARQUIVO-RESTO2
PIC X(10).
05 A-FD-ARQUIVO-CHAVES2
PIC X(05).
05 A-FD-ARQUIVO-RESTO3
PIC X(10).
05 A-FD-ARQUIVO-RESTO4
PIC X(35).
*----------------------------------------------------------------WORKING-STORAGE SECTION.
01 FS-ARQUIVO
PIC X(02).
01 EOF-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 STOP-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 LEU-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 WW-ULTGRAVADO
PIC 9(5) VALUE ZERO.
01 WW-ARQUIVO
PIC 9(5) VALUE ZERO.
01 WW-CHAVEP
PIC X(5) VALUE SPACES.
01 WW-CHAVES1
PIC X(5) VALUE SPACES.
01 WW-CHAVES2
PIC X(5) VALUE SPACES.
01 LL-ARQUIVO
PIC 9(5) VALUE ZERO.
01 DD-ARQUIVO
PIC 9(5) VALUE ZERO.
*---------------------------------------------------------------PROCEDURE DIVISION.
*---------------------------------------------------------------PROGRAMA SECTION.
*
DISPLAY '------------------------------------------------'
DISPLAY 'DELETE POR CHAVE ALTERNADA 1 APOS READ DIRETO'
DISPLAY '------------------------------------------------'
*
OPEN I-O
ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' OPEN OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' OPEN ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
*
MOVE
'00095' TO WW-CHAVES1
PERFORM LER-DIRETO
IF
LEU-ARQUIVO = 'SIM'
PERFORM DELETAR
END-IF
MOVE
'00085' TO WW-CHAVES1
PERFORM LER-DIRETO
IF
LEU-ARQUIVO = 'SIM'
PERFORM DELETAR

155

END-IF
*
CLOSE ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE ERRO'
END-EVALUATE
*
DISPLAY '------------------------------------------------'
DISPLAY 'LIDOS ARQUIVO
= ' LL-ARQUIVO
DISPLAY 'DELETADOS ARQ.
= ' DD-ARQUIVO
DISPLAY '------------------------------------------------'
STOP RUN.
*---------------------------------------------------------------* (TENTA) LER UM REGISTRO
*---------------------------------------------------------------LER-DIRETO SECTION.
*
MOVE
'NAO'
TO LEU-ARQUIVO
MOVE
WW-CHAVES1
TO A-FD-ARQUIVO-CHAVES1
READ
ARQUIVO
EVALUATE FS-ARQUIVO
WHEN '00'
MOVE
A-FD-ARQUIVO-CHAVEP
TO WW-CHAVEP
MOVE
A-FD-ARQUIVO-CHAVES1 TO WW-CHAVES1
MOVE
A-FD-ARQUIVO-CHAVES2 TO WW-CHAVES2
DISPLAY '
FS=' FS-ARQUIVO ' READ OK
'
' CHAVEP : ' A-FD-ARQUIVO-CHAVEP
' CHAVES1 : ' A-FD-ARQUIVO-CHAVES1
' CHAVES2 : ' A-FD-ARQUIVO-CHAVES2
MOVE
'SIM' TO LEU-ARQUIVO
ADD
1
TO LL-ARQUIVO
WHEN '02'
DISPLAY '
FS=' FS-ARQUIVO ' READ KEYDUP
' WW-CHAVEP
WHEN '23'
DISPLAY '
FS=' FS-ARQUIVO ' READ NOTFOUND ' WW-CHAVEP
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' READ ERRO
' WW-CHAVEP
END-EVALUATE
*
CONTINUE.
SAI-LER-DIRETO. EXIT.
*---------------------------------------------------------------* DELETA REGISTRO LIDO
*---------------------------------------------------------------DELETAR SECTION.
DELETE ARQUIVO
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' DELETE OK
'
' CHAVEP : ' WW-CHAVEP
' CHAVES1 : ' WW-CHAVES1
' CHAVES2 : ' WW-CHAVES2
ADD
1
TO DD-ARQUIVO
WHEN '23'
DISPLAY '
FS=' FS-ARQUIVO ' DELETE NOTFOUND'
' CHAVEP : ' WW-CHAVEP

156

' CHAVES1 : ' WW-CHAVES1


' CHAVES2 : ' WW-CHAVES2
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' READ ERRO
'
' CHAVEP : ' WW-CHAVEP
' CHAVES1 : ' WW-CHAVES1
' CHAVES2 : ' WW-CHAVES2
END-EVALUATE
CONTINUE.
SAI-DELETAR. EXIT.
//GO.SYSPRINT DD SYSOUT=*
//GO.ARQUIVO
DD DSN=DSVAABVS.LSG.A002.ALBERTO.PATH.AIX1,DISP=SHR

Exemplo : listagem produzida pelo aplicativo


-----------------------------------------------DELETE POR CHAVE ALTERNADA 1 APOS READ DIRETO
-----------------------------------------------FS=00 OPEN OK
FS=00 READ OK
CHAVEP : 00006 CHAVES1 :
FS=00 DELETE OK
CHAVEP : 00006 CHAVES1 :
FS=00 READ OK
CHAVEP : 00016 CHAVES1 :
FS=00 DELETE OK
CHAVEP : 00016 CHAVES1 :
FS=00 CLOSE OK
-----------------------------------------------LIDOS ARQUIVO
= 00002
DELETADOS ARQ.
= 00002
------------------------------------------------

00095 CHAVES2 : 99996


00095 CHAVES2 : 99996
00085 CHAVES2 : 00006
00085 CHAVES2 : 00006

Exemplo : arquivo resultante listado por ordem de chave primria


*************** LISTA POR CHAVE
CHAVE-PRI=00001 CHAVE-S1=00100
CHAVE-PRI=00002 CHAVE-S1=00099
CHAVE-PRI=00003 CHAVE-S1=00098
CHAVE-PRI=00004 CHAVE-S1=00097
CHAVE-PRI=00007 CHAVE-S1=00094
CHAVE-PRI=00008 CHAVE-S1=00093
CHAVE-PRI=00009 CHAVE-S1=00092
CHAVE-PRI=00010 CHAVE-S1=00091
CHAVE-PRI=00011 CHAVE-S1=00090
CHAVE-PRI=00012 CHAVE-S1=00089
CHAVE-PRI=00013 CHAVE-S1=00088
CHAVE-PRI=00014 CHAVE-S1=00087
CHAVE-PRI=00017 CHAVE-S1=00084
CHAVE-PRI=00018 CHAVE-S1=00083
CHAVE-PRI=00019 CHAVE-S1=00082
CHAVE-PRI=00020 CHAVE-S1=00081
CHAVE-PRI=00021 CHAVE-S1=00080
CHAVE-PRI=00501 CHAVE-S1=00200
CHAVE-PRI=00502 CHAVE-S1=00199
CHAVE-PRI=00503 CHAVE-S1=00198
CHAVE-PRI=00504 CHAVE-S1=00197
CHAVE-PRI=00505 CHAVE-S1=00196
CHAVE-PRI=00506 CHAVE-S1=00195
CHAVE-PRI=00507 CHAVE-S1=00194
CHAVE-PRI=00508 CHAVE-S1=00193

PRIMARIA ***********
CHAVE-S2=99991 R1=@UR1
CHAVE-S2=99992 R1=@UR1
CHAVE-S2=99993 R1=@UR1
CHAVE-S2=99994 R1=@UR1
CHAVE-S2=99997 R1=*CR1
CHAVE-S2=99998 R1=*CR1
CHAVE-S2=99999 R1=*CR1
CHAVE-S2=00000 R1=*CR1
CHAVE-S2=00001 R1=#UR1
CHAVE-S2=00002 R1=#UR1
CHAVE-S2=00003 R1=#UR1
CHAVE-S2=00004 R1=#UR1
CHAVE-S2=00007 R1=$UR1
CHAVE-S2=00008 R1=$UR1
CHAVE-S2=00009 R1=$UR1
CHAVE-S2=00010 R1=$UR1
CHAVE-S2=00011 R1=*CR1
CHAVE-S2=90091 R1=#IR1
CHAVE-S2=90092 R1=#IR1
CHAVE-S2=90093 R1=#IR1
CHAVE-S2=90094 R1=#IR1
CHAVE-S2=90095 R1=#IR1
CHAVE-S2=90096 R1=#IR1
CHAVE-S2=90097 R1=#IR1
CHAVE-S2=90098 R1=#IR1

157

R2=@UR2
R2=@UR2
R2=@UR2
R2=@UR2
R2=*CR2
R2=*CR2
R2=*CR2
R2=*CR2
R2=#UR2
R2=#UR2
R2=#UR2
R2=#UR2
R2=$UR2
R2=$UR2
R2=$UR2
R2=$UR2
R2=*CR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2

CHAVE-PRI=00509 CHAVE-S1=00192 CHAVE-S2=90099 R1=#IR1


CHAVE-PRI=00510 CHAVE-S1=00191 CHAVE-S2=90100 R1=#IR1
CHAVE-PRI=00511 CHAVE-S1=00190 CHAVE-S2=90101 R1=#IR1

R2=#IR2
R2=#IR2
R2=#IR2

Exemplo : arquivo resultante listado por ordem de chave alternada 1


***************
CHAVE-PRI=00021
CHAVE-PRI=00020
CHAVE-PRI=00019
CHAVE-PRI=00018
CHAVE-PRI=00017
CHAVE-PRI=00014
CHAVE-PRI=00013
CHAVE-PRI=00012
CHAVE-PRI=00011
CHAVE-PRI=00010
CHAVE-PRI=00009
CHAVE-PRI=00008
CHAVE-PRI=00007
CHAVE-PRI=00004
CHAVE-PRI=00003
CHAVE-PRI=00002
CHAVE-PRI=00001
CHAVE-PRI=00511
CHAVE-PRI=00510
CHAVE-PRI=00509
CHAVE-PRI=00508
CHAVE-PRI=00507
CHAVE-PRI=00506
CHAVE-PRI=00505
CHAVE-PRI=00504
CHAVE-PRI=00503
CHAVE-PRI=00502
CHAVE-PRI=00501

LISTA POR CHAVE ALTERN 1 ***********


CHAVE-S1=00080 CHAVE-S2=00011 R1=*CR1
CHAVE-S1=00081 CHAVE-S2=00010 R1=$UR1
CHAVE-S1=00082 CHAVE-S2=00009 R1=$UR1
CHAVE-S1=00083 CHAVE-S2=00008 R1=$UR1
CHAVE-S1=00084 CHAVE-S2=00007 R1=$UR1
CHAVE-S1=00087 CHAVE-S2=00004 R1=#UR1
CHAVE-S1=00088 CHAVE-S2=00003 R1=#UR1
CHAVE-S1=00089 CHAVE-S2=00002 R1=#UR1
CHAVE-S1=00090 CHAVE-S2=00001 R1=#UR1
CHAVE-S1=00091 CHAVE-S2=00000 R1=*CR1
CHAVE-S1=00092 CHAVE-S2=99999 R1=*CR1
CHAVE-S1=00093 CHAVE-S2=99998 R1=*CR1
CHAVE-S1=00094 CHAVE-S2=99997 R1=*CR1
CHAVE-S1=00097 CHAVE-S2=99994 R1=@UR1
CHAVE-S1=00098 CHAVE-S2=99993 R1=@UR1
CHAVE-S1=00099 CHAVE-S2=99992 R1=@UR1
CHAVE-S1=00100 CHAVE-S2=99991 R1=@UR1
CHAVE-S1=00190 CHAVE-S2=90101 R1=#IR1
CHAVE-S1=00191 CHAVE-S2=90100 R1=#IR1
CHAVE-S1=00192 CHAVE-S2=90099 R1=#IR1
CHAVE-S1=00193 CHAVE-S2=90098 R1=#IR1
CHAVE-S1=00194 CHAVE-S2=90097 R1=#IR1
CHAVE-S1=00195 CHAVE-S2=90096 R1=#IR1
CHAVE-S1=00196 CHAVE-S2=90095 R1=#IR1
CHAVE-S1=00197 CHAVE-S2=90094 R1=#IR1
CHAVE-S1=00198 CHAVE-S2=90093 R1=#IR1
CHAVE-S1=00199 CHAVE-S2=90092 R1=#IR1
CHAVE-S1=00200 CHAVE-S2=90091 R1=#IR1

R2=*CR2
R2=$UR2
R2=$UR2
R2=$UR2
R2=$UR2
R2=#UR2
R2=#UR2
R2=#UR2
R2=#UR2
R2=*CR2
R2=*CR2
R2=*CR2
R2=*CR2
R2=@UR2
R2=@UR2
R2=@UR2
R2=@UR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2

Exemplo : arquivo resultante listado por ordem de chave alternada 2


*************** LISTA POR CHAVE
CHAVE-PRI=00010 CHAVE-S1=00091
CHAVE-PRI=00011 CHAVE-S1=00090
CHAVE-PRI=00012 CHAVE-S1=00089
CHAVE-PRI=00013 CHAVE-S1=00088
CHAVE-PRI=00014 CHAVE-S1=00087
CHAVE-PRI=00017 CHAVE-S1=00084
CHAVE-PRI=00018 CHAVE-S1=00083
CHAVE-PRI=00019 CHAVE-S1=00082
CHAVE-PRI=00020 CHAVE-S1=00081
CHAVE-PRI=00021 CHAVE-S1=00080
CHAVE-PRI=00501 CHAVE-S1=00200
CHAVE-PRI=00502 CHAVE-S1=00199
CHAVE-PRI=00503 CHAVE-S1=00198
CHAVE-PRI=00504 CHAVE-S1=00197
CHAVE-PRI=00505 CHAVE-S1=00196
CHAVE-PRI=00506 CHAVE-S1=00195
CHAVE-PRI=00507 CHAVE-S1=00194

ALTERN 2 ***********
CHAVE-S2=00000 R1=*CR1
CHAVE-S2=00001 R1=#UR1
CHAVE-S2=00002 R1=#UR1
CHAVE-S2=00003 R1=#UR1
CHAVE-S2=00004 R1=#UR1
CHAVE-S2=00007 R1=$UR1
CHAVE-S2=00008 R1=$UR1
CHAVE-S2=00009 R1=$UR1
CHAVE-S2=00010 R1=$UR1
CHAVE-S2=00011 R1=*CR1
CHAVE-S2=90091 R1=#IR1
CHAVE-S2=90092 R1=#IR1
CHAVE-S2=90093 R1=#IR1
CHAVE-S2=90094 R1=#IR1
CHAVE-S2=90095 R1=#IR1
CHAVE-S2=90096 R1=#IR1
CHAVE-S2=90097 R1=#IR1

158

R2=*CR2
R2=#UR2
R2=#UR2
R2=#UR2
R2=#UR2
R2=$UR2
R2=$UR2
R2=$UR2
R2=$UR2
R2=*CR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2

CHAVE-PRI=00508
CHAVE-PRI=00509
CHAVE-PRI=00510
CHAVE-PRI=00511
CHAVE-PRI=00001
CHAVE-PRI=00002
CHAVE-PRI=00003
CHAVE-PRI=00004
CHAVE-PRI=00007
CHAVE-PRI=00008
CHAVE-PRI=00009

CHAVE-S1=00193
CHAVE-S1=00192
CHAVE-S1=00191
CHAVE-S1=00190
CHAVE-S1=00100
CHAVE-S1=00099
CHAVE-S1=00098
CHAVE-S1=00097
CHAVE-S1=00094
CHAVE-S1=00093
CHAVE-S1=00092

CHAVE-S2=90098
CHAVE-S2=90099
CHAVE-S2=90100
CHAVE-S2=90101
CHAVE-S2=99991
CHAVE-S2=99992
CHAVE-S2=99993
CHAVE-S2=99994
CHAVE-S2=99997
CHAVE-S2=99998
CHAVE-S2=99999

R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=@UR1
R1=@UR1
R1=@UR1
R1=@UR1
R1=*CR1
R1=*CR1
R1=*CR1

159

R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=@UR2
R2=@UR2
R2=@UR2
R2=@UR2
R2=*CR2
R2=*CR2
R2=*CR2

13.1.17 Deletar por chave alternada 2

Conceito : leitura de um registro de forma direta (sem ler os anteriores) ; o acesso possvel pois fornecido um
argumento (valor de um campo chave) , o qual consultado nos ndices mantidos pelo mtodo de acesso, e que tem
pointers para sua localizao na rea de dados;

SELECT nome_arquivo
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
FILE STATUS IS variavel_wss
RECORD KEY IS chave_alternada_2

DDs

Procedimentos :
Abrir o arquivo com OPEN INPUT nome_arquivo e testar o file status
File Status = 00 : OK
File Status 00 : erro
Mover o valor da chave que identifica o registro desejado para a rea da ALTERNATE RECORD
KEY na FILE SECTION e em seguida efetuar a leitura com o comando READ nome_arquivo e
testar file status :
File Status = 00 : READ OK. Registro lido
File Status = 02 : READ OK chave duplicada
File Status = 23 : registro no achado
File Status outros : (outro) erro no READ
Fechar o arquivo com CLOSE nome_arquivo e testar file status :
File Status = 00 : OK
File Status 00 : erro

//ddname

DD

DISP=SHR,DSN=dsname_cluster.PATH.AIX2

Exemplo : JCL e fonte


//LSG#@D2 JOB ('ALBERTO'),'ALBERTO',CLASS=1,MSGCLASS=X
//PROCLIB JCLLIB ORDER=(TORI243.T#RPC.SRC)
//*--------------------------------------------------------------//STEP1
EXEC COBCLG,MEMBER=P17DA2
//COMP.SYSIN
DD *
IDENTIFICATION DIVISION.
PROGRAM-ID. P17DA2.
*---------------------------------------------------------------* DELETAR DIRETO POR CHAVE ALTERNADA 2
*---------------------------------------------------------------ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*----------------------------------------------------------------* ARQUIVO

160

*----------------------------------------------------------------SELECT ARQUIVO ASSIGN TO ARQUIVO


ORGANIZATION INDEXED
ACCESS RANDOM
RECORD KEY A-FD-ARQUIVO-CHAVES2
File Status FS-ARQUIVO.
*----------------------------------------------------------------DATA DIVISION.
FILE SECTION.
*----------------------------------------------------------------FD
ARQUIVO.
01
A-FD-ARQUIVO.
05 A-FD-ARQUIVO-CHAVEP
PIC X(05).
05 A-FD-ARQUIVO-RESTO1
PIC X(10).
05 A-FD-ARQUIVO-CHAVES1
PIC X(05).
05 A-FD-ARQUIVO-RESTO2
PIC X(10).
05 A-FD-ARQUIVO-CHAVES2
PIC X(05).
05 A-FD-ARQUIVO-RESTO3
PIC X(10).
05 A-FD-ARQUIVO-RESTO4
PIC X(35).
*----------------------------------------------------------------WORKING-STORAGE SECTION.
*
01 FS-ARQUIVO
PIC X(02).
01 EOF-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 STOP-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 LEU-ARQUIVO
PIC X(03) VALUE 'NAO'.
01 WW-ULTGRAVADO
PIC 9(5) VALUE ZERO.
01 WW-ARQUIVO
PIC 9(5) VALUE ZERO.
01 WW-CHAVEP
PIC X(5) VALUE SPACES.
01 WW-CHAVES1
PIC X(5) VALUE SPACES.
01 WW-CHAVES2
PIC X(5) VALUE SPACES.
01 LL-ARQUIVO
PIC 9(5) VALUE ZERO.
01 DD-ARQUIVO
PIC 9(5) VALUE ZERO.
*---------------------------------------------------------------PROCEDURE DIVISION.
*---------------------------------------------------------------PROGRAMA SECTION.
*
DISPLAY '------------------------------------------------'
DISPLAY 'DELETE POR CHAVE ALTERNADA 2 APOS RED DIRETO'
DISPLAY '------------------------------------------------'
*
OPEN I-O
ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' OPEN OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' OPEN ERRO'
MOVE 'SIM' TO STOP-ARQUIVO
END-EVALUATE
*
MOVE
'99997' TO WW-CHAVES2
PERFORM LER-DIRETO
IF
LEU-ARQUIVO = 'SIM'
PERFORM DELETAR
END-IF
MOVE
'00007' TO WW-CHAVES2
PERFORM LER-DIRETO
IF
LEU-ARQUIVO = 'SIM'

161

PERFORM DELETAR
END-IF
*
CLOSE ARQUIVO.
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE OK'
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' CLOSE ERRO'
END-EVALUATE
*
DISPLAY '------------------------------------------------'
DISPLAY 'LIDOS ARQUIVO
= ' LL-ARQUIVO
DISPLAY 'DELETADOS ARQ.
= ' DD-ARQUIVO
DISPLAY '------------------------------------------------'
STOP RUN.
*---------------------------------------------------------------* (TENTA) LER UM REGISTRO
*---------------------------------------------------------------LER-DIRETO SECTION.
*
MOVE
'NAO'
TO LEU-ARQUIVO
MOVE
WW-CHAVES2
TO A-FD-ARQUIVO-CHAVES2
READ
ARQUIVO
EVALUATE FS-ARQUIVO
WHEN '00'
MOVE
A-FD-ARQUIVO-CHAVEP
TO WW-CHAVEP
MOVE
A-FD-ARQUIVO-CHAVES1 TO WW-CHAVES1
MOVE
A-FD-ARQUIVO-CHAVES2 TO WW-CHAVES2
DISPLAY '
FS=' FS-ARQUIVO ' READ OK
'
' CHAVEP : ' A-FD-ARQUIVO-CHAVEP
' CHAVES1 : ' A-FD-ARQUIVO-CHAVES1
' CHAVES2 : ' A-FD-ARQUIVO-CHAVES2
MOVE
'SIM' TO LEU-ARQUIVO
ADD
1
TO LL-ARQUIVO
WHEN '02'
DISPLAY '
FS=' FS-ARQUIVO ' READ KEYDUP
' WW-CHAVEP
WHEN '23'
DISPLAY '
FS=' FS-ARQUIVO ' READ NOTFOUND ' WW-CHAVEP
WHEN OTHER
DISPLAY '
FS=' FS-ARQUIVO ' READ ERRO
' WW-CHAVEP
END-EVALUATE
*
CONTINUE.
SAI-LER-DIRETO. EXIT.
*---------------------------------------------------------------* DELETA REGISTRO LIDO
*---------------------------------------------------------------DELETAR SECTION.
*
DELETE ARQUIVO
EVALUATE FS-ARQUIVO
WHEN '00'
DISPLAY '
FS=' FS-ARQUIVO ' DELETE OK
'
' CHAVEP : ' WW-CHAVEP
' CHAVES1 : ' WW-CHAVES1
' CHAVES2 : ' WW-CHAVES2
ADD
1
TO DD-ARQUIVO
WHEN '23'

162

DISPLAY '
'
'
'
WHEN OTHER
DISPLAY '
'
'
'
END-EVALUATE

FS=' FS-ARQUIVO ' DELETE NOTFOUND'


CHAVEP : ' WW-CHAVEP
CHAVES1 : ' WW-CHAVES1
CHAVES2 : ' WW-CHAVES2
FS=' FS-ARQUIVO ' READ ERRO
CHAVEP : ' WW-CHAVEP
CHAVES1 : ' WW-CHAVES1
CHAVES2 : ' WW-CHAVES2

'

*
CONTINUE.
SAI-DELETAR. EXIT.
//GO.SYSPRINT DD SYSOUT=*
//GO.ARQUIVO
DD DSN=DSVAABVS.LSG.A002.ALBERTO.PATH.AIX2,DISP=SHR

Exemplo : listagem produzida pelo aplicativo


-----------------------------------------------DELETE POR CHAVE ALTERNADA 2 APOS RED DIRETO
-----------------------------------------------FS=00 OPEN OK
FS=00 READ OK
CHAVEP : 00007 CHAVES1 :
FS=00 DELETE OK
CHAVEP : 00007 CHAVES1 :
FS=00 READ OK
CHAVEP : 00017 CHAVES1 :
FS=00 DELETE OK
CHAVEP : 00017 CHAVES1 :
FS=00 CLOSE OK
-----------------------------------------------LIDOS ARQUIVO
= 00002
DELETADOS ARQ.
= 00002
------------------------------------------------

00094 CHAVES2 : 99997


00094 CHAVES2 : 99997
00084 CHAVES2 : 00007
00084 CHAVES2 : 00007

Exemplo : arquivo resultante listado por ordem de chave primria


*************** LISTA POR CHAVE
CHAVE-PRI=00001 CHAVE-S1=00100
CHAVE-PRI=00002 CHAVE-S1=00099
CHAVE-PRI=00003 CHAVE-S1=00098
CHAVE-PRI=00004 CHAVE-S1=00097
CHAVE-PRI=00008 CHAVE-S1=00093
CHAVE-PRI=00009 CHAVE-S1=00092
CHAVE-PRI=00010 CHAVE-S1=00091
CHAVE-PRI=00011 CHAVE-S1=00090
CHAVE-PRI=00012 CHAVE-S1=00089
CHAVE-PRI=00013 CHAVE-S1=00088
CHAVE-PRI=00014 CHAVE-S1=00087
CHAVE-PRI=00018 CHAVE-S1=00083
CHAVE-PRI=00019 CHAVE-S1=00082
CHAVE-PRI=00020 CHAVE-S1=00081
CHAVE-PRI=00021 CHAVE-S1=00080
CHAVE-PRI=00501 CHAVE-S1=00200
CHAVE-PRI=00502 CHAVE-S1=00199
CHAVE-PRI=00503 CHAVE-S1=00198
CHAVE-PRI=00504 CHAVE-S1=00197
CHAVE-PRI=00505 CHAVE-S1=00196
CHAVE-PRI=00506 CHAVE-S1=00195

PRIMARIA ***********
CHAVE-S2=99991 R1=@UR1
CHAVE-S2=99992 R1=@UR1
CHAVE-S2=99993 R1=@UR1
CHAVE-S2=99994 R1=@UR1
CHAVE-S2=99998 R1=*CR1
CHAVE-S2=99999 R1=*CR1
CHAVE-S2=00000 R1=*CR1
CHAVE-S2=00001 R1=#UR1
CHAVE-S2=00002 R1=#UR1
CHAVE-S2=00003 R1=#UR1
CHAVE-S2=00004 R1=#UR1
CHAVE-S2=00008 R1=$UR1
CHAVE-S2=00009 R1=$UR1
CHAVE-S2=00010 R1=$UR1
CHAVE-S2=00011 R1=*CR1
CHAVE-S2=90091 R1=#IR1
CHAVE-S2=90092 R1=#IR1
CHAVE-S2=90093 R1=#IR1
CHAVE-S2=90094 R1=#IR1
CHAVE-S2=90095 R1=#IR1
CHAVE-S2=90096 R1=#IR1

163

R2=@UR2
R2=@UR2
R2=@UR2
R2=@UR2
R2=*CR2
R2=*CR2
R2=*CR2
R2=#UR2
R2=#UR2
R2=#UR2
R2=#UR2
R2=$UR2
R2=$UR2
R2=$UR2
R2=*CR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2

CHAVE-PRI=00507
CHAVE-PRI=00508
CHAVE-PRI=00509
CHAVE-PRI=00510
CHAVE-PRI=00511

CHAVE-S1=00194
CHAVE-S1=00193
CHAVE-S1=00192
CHAVE-S1=00191
CHAVE-S1=00190

CHAVE-S2=90097
CHAVE-S2=90098
CHAVE-S2=90099
CHAVE-S2=90100
CHAVE-S2=90101

R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1
R1=#IR1

R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2

Exemplo : arquivo resultante listado por ordem de chave alternada 1


***************
CHAVE-PRI=00021
CHAVE-PRI=00020
CHAVE-PRI=00019
CHAVE-PRI=00018
CHAVE-PRI=00014
CHAVE-PRI=00013
CHAVE-PRI=00012
CHAVE-PRI=00011
CHAVE-PRI=00010
CHAVE-PRI=00009
CHAVE-PRI=00008
CHAVE-PRI=00004
CHAVE-PRI=00003
CHAVE-PRI=00002
CHAVE-PRI=00001
CHAVE-PRI=00511
CHAVE-PRI=00510
CHAVE-PRI=00509
CHAVE-PRI=00508
CHAVE-PRI=00507
CHAVE-PRI=00506
CHAVE-PRI=00505
CHAVE-PRI=00504
CHAVE-PRI=00503
CHAVE-PRI=00502
CHAVE-PRI=00501

LISTA POR CHAVE ALTERN 1 ***********


CHAVE-S1=00080 CHAVE-S2=00011 R1=*CR1
CHAVE-S1=00081 CHAVE-S2=00010 R1=$UR1
CHAVE-S1=00082 CHAVE-S2=00009 R1=$UR1
CHAVE-S1=00083 CHAVE-S2=00008 R1=$UR1
CHAVE-S1=00087 CHAVE-S2=00004 R1=#UR1
CHAVE-S1=00088 CHAVE-S2=00003 R1=#UR1
CHAVE-S1=00089 CHAVE-S2=00002 R1=#UR1
CHAVE-S1=00090 CHAVE-S2=00001 R1=#UR1
CHAVE-S1=00091 CHAVE-S2=00000 R1=*CR1
CHAVE-S1=00092 CHAVE-S2=99999 R1=*CR1
CHAVE-S1=00093 CHAVE-S2=99998 R1=*CR1
CHAVE-S1=00097 CHAVE-S2=99994 R1=@UR1
CHAVE-S1=00098 CHAVE-S2=99993 R1=@UR1
CHAVE-S1=00099 CHAVE-S2=99992 R1=@UR1
CHAVE-S1=00100 CHAVE-S2=99991 R1=@UR1
CHAVE-S1=00190 CHAVE-S2=90101 R1=#IR1
CHAVE-S1=00191 CHAVE-S2=90100 R1=#IR1
CHAVE-S1=00192 CHAVE-S2=90099 R1=#IR1
CHAVE-S1=00193 CHAVE-S2=90098 R1=#IR1
CHAVE-S1=00194 CHAVE-S2=90097 R1=#IR1
CHAVE-S1=00195 CHAVE-S2=90096 R1=#IR1
CHAVE-S1=00196 CHAVE-S2=90095 R1=#IR1
CHAVE-S1=00197 CHAVE-S2=90094 R1=#IR1
CHAVE-S1=00198 CHAVE-S2=90093 R1=#IR1
CHAVE-S1=00199 CHAVE-S2=90092 R1=#IR1
CHAVE-S1=00200 CHAVE-S2=90091 R1=#IR1

R2=*CR2
R2=$UR2
R2=$UR2
R2=$UR2
R2=#UR2
R2=#UR2
R2=#UR2
R2=#UR2
R2=*CR2
R2=*CR2
R2=*CR2
R2=@UR2
R2=@UR2
R2=@UR2
R2=@UR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2

Exemplo : arquivo resultante listado por ordem de chave alternada 2


***************
CHAVE-PRI=00010
CHAVE-PRI=00011
CHAVE-PRI=00012
CHAVE-PRI=00013
CHAVE-PRI=00014
CHAVE-PRI=00018
CHAVE-PRI=00019
CHAVE-PRI=00020
CHAVE-PRI=00021
CHAVE-PRI=00501
CHAVE-PRI=00502
CHAVE-PRI=00503
CHAVE-PRI=00504
CHAVE-PRI=00505
CHAVE-PRI=00506
CHAVE-PRI=00507
CHAVE-PRI=00508

LISTA POR CHAVE ALTERN 2 ***********


CHAVE-S1=00091 CHAVE-S2=00000 R1=*CR1
CHAVE-S1=00090 CHAVE-S2=00001 R1=#UR1
CHAVE-S1=00089 CHAVE-S2=00002 R1=#UR1
CHAVE-S1=00088 CHAVE-S2=00003 R1=#UR1
CHAVE-S1=00087 CHAVE-S2=00004 R1=#UR1
CHAVE-S1=00083 CHAVE-S2=00008 R1=$UR1
CHAVE-S1=00082 CHAVE-S2=00009 R1=$UR1
CHAVE-S1=00081 CHAVE-S2=00010 R1=$UR1
CHAVE-S1=00080 CHAVE-S2=00011 R1=*CR1
CHAVE-S1=00200 CHAVE-S2=90091 R1=#IR1
CHAVE-S1=00199 CHAVE-S2=90092 R1=#IR1
CHAVE-S1=00198 CHAVE-S2=90093 R1=#IR1
CHAVE-S1=00197 CHAVE-S2=90094 R1=#IR1
CHAVE-S1=00196 CHAVE-S2=90095 R1=#IR1
CHAVE-S1=00195 CHAVE-S2=90096 R1=#IR1
CHAVE-S1=00194 CHAVE-S2=90097 R1=#IR1
CHAVE-S1=00193 CHAVE-S2=90098 R1=#IR1

164

R2=*CR2
R2=#UR2
R2=#UR2
R2=#UR2
R2=#UR2
R2=$UR2
R2=$UR2
R2=$UR2
R2=*CR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2
R2=#IR2

CHAVE-PRI=00509
CHAVE-PRI=00510
CHAVE-PRI=00511
CHAVE-PRI=00001
CHAVE-PRI=00002
CHAVE-PRI=00003
CHAVE-PRI=00004
CHAVE-PRI=00008
CHAVE-PRI=00009

CHAVE-S1=00192
CHAVE-S1=00191
CHAVE-S1=00190
CHAVE-S1=00100
CHAVE-S1=00099
CHAVE-S1=00098
CHAVE-S1=00097
CHAVE-S1=00093
CHAVE-S1=00092

CHAVE-S2=90099
CHAVE-S2=90100
CHAVE-S2=90101
CHAVE-S2=99991
CHAVE-S2=99992
CHAVE-S2=99993
CHAVE-S2=99994
CHAVE-S2=99998
CHAVE-S2=99999

R1=#IR1
R1=#IR1
R1=#IR1
R1=@UR1
R1=@UR1
R1=@UR1
R1=@UR1
R1=*CR1
R1=*CR1

165

R2=#IR2
R2=#IR2
R2=#IR2
R2=@UR2
R2=@UR2
R2=@UR2
R2=@UR2
R2=*CR2
R2=*CR2

13.3 File Status retornados pelas operaes em arquivos VSAM


Exemplo de anlise completa que um programa poderia efetuar.
000100 FILE-CONTROL.
000200
SELECT VSAM-FILE ASSIGN VSAMFILE
000300
ORGANIZATION IS INDEXED
000400
ACCESS MODE IS SEQUENTIAL
000500
RECORD KEY
IS VSAM-RECORD-KEY
000600
FILE STATUS IS VSAM-STATUS-CODE
000700
VSAM-EXTENDED-STATUS-CODE.
000800
000900 DATA DIVISION.
001000 FILE SECTION.
001100
001200 FD VSAM-FILE.
001300 01 VSAM-RECORD.
001400
05 VSAM-RECORD-KEY
PIC X(20).
001500
05 VSAM-EMP-INFO
PIC X(60).
001600
001700 WORKING-STORAGE SECTION.
001800
001900 01 VSAM-STATUS-CODE.
002000
05 VSAM-STATUS-CODE-BYTE1
PIC X.
002100
05 VSAM-STATUS-CODE-BYTE2
PIC X.
002200
002300 01 VSAM-EXTENDED-STATUS-CODE.
002400
05 VSAM-EXTENDED-RETURN-CODE
PIC S9(4) COMP.
002500
05 VSAM-EXTENDED-FUNCTION-CODE PIC S9(4) COMP.
002600
05 VSAM-EXTENDED-FEEDBACK-CODE PIC S9(4) COMP.
002700
002800 EVALUATE-VSAM-STATUS-CODE.
002900*
THIS WILL DISPLAY DIAGNOSTIC MESSAGES
003000*
FOR VSAM STATUS CODES AS WELL AS ORDINARY SEQUENTIAL
003100
DISPLAY 'FILE STATUS CODE:' VSAM-STATUS-CODE
003200
EVALUATE VSAM-STATUS-CODE
003300
WHEN '00' DISPLAY 'SUCCESSFUL COMPLETION'
003400
WHEN '02' DISPLAY 'DUPLICATE KEY, NON UNIQ. ALT INDX'
003500
WHEN '04' DISPLAY 'READ, WRONG LENGTH RECORD'
003600
WHEN '05' DISPLAY 'OPEN, FILE NOT PRESENT'
003700
WHEN '07' DISPLAY 'CLOSE OPTION INCOMPAT FILE DEVICE'
003800
DISPLAY 'OPEN IMPLIES TAPE; TAPE NOT USED'
003900
WHEN '10' DISPLAY 'END OF FILE'
004000
WHEN '14' DISPLAY 'RRN > RELATIVE KEY DATA'
004100
WHEN '20' DISPLAY 'INVALID KEY VSAM KSDS OR RRDS'
004200
WHEN '21' DISPLAY 'SEQUENCE ERROR, ON WRITE'
004300
DISPLAY 'OR CHANGING KEY ON REWRITE'
004400
WHEN '22' DISPLAY 'DUPLICATE KEY'
004500
WHEN '23' DISPLAY 'RECORD OR FILE NOT FOUND'
004600
WHEN '24' DISPLAY 'BOUNDARY VIOLATION.'
004700
DISPLAY 'WRITE PAST END OF KSDS RECORD '
004800
DISPLAY 'COBOL 370: REL: REC# TOO BIG'
004900
DISPLAY 'OUT OF SPACE ON KSDS/RRDS FILE'
005000
WHEN '30' DISPLAY 'PERMANENT DATA ERROR'
005100
DISPLAY 'DATA CHECK, PARITY CHK, HARDW'
005200
WHEN '34' DISPLAY 'BOUNDARY VIOLATION'
005300
DISPLAY 'WRITE PAST END OF ESDS RECORD'
005400
DISPLAY 'OR NO SPACE TO ADD KSDS/RRDS RECORD'

166

005500
DISPLAY 'OUT OF SPACE ON SEQUENTIAL FILE'
005600
WHEN '35' DISPLAY 'OPEN, FILE NOT PRESENT'
005700
WHEN '37' DISPLAY 'OPEN MODE INCOMPAT WITH DEVICE'
005800
WHEN '38' DISPLAY 'OPENING FILE CLOSED WITH LOCK'
005900
WHEN '39' DISPLAY 'OPEN, FILE ATTRIB CONFLICTING'
006000
WHEN '41' DISPLAY 'OPEN, FILE IS OPEN'
006100
WHEN '42' DISPLAY 'CLOSE, FILE IS CLOSED'
006200
WHEN '43' DISPLAY 'DELETE OR REWRITE & NO GOOD READ FIRST'
006300
WHEN '44' DISPLAY 'BOUNDARY VIOLATION/REWRITE REC TOO BIG'
006400
WHEN '46' DISPLAY 'SEQUENTIAL READ WITHOUT POSITIONING'
006500
WHEN '47' DISPLAY 'READING FILE NOT OPEN AS INPUT/IO/EXTEND'
006600
WHEN '48' DISPLAY 'WRITE WITHOUT OPEN IO'
006700
WHEN '49' DISPLAY 'DELETE OR REWRITE WITHOUT OPEN IO'
006800
WHEN '90' DISPLAY 'UNKNOWN'
006900
WHEN '91' DISPLAY 'VSAM - PASSWORD FAILURE'
007000
WHEN '92' DISPLAY 'LOGIC ERROR/OPENING AN OPEN FILE'
007100
DISPLAY 'OR READING OUTPUT FILE'
007200
DISPLAY 'OR WRITE INPUT FILE'
007300
DISPLAY 'OR DEL/REW BUT NO PRIOR READ'
007400
WHEN '93' DISPLAY 'VSAM - VIRTSTOR. RESOURCE NOT AVAILABLE'
007500
WHEN '94' DISPLAY 'VSAM - SEQUENTIAL READ AFTER END OF FILE'
007600
DISPLAY 'OR NO CURRENT REC POINTER FOR SEQ'
007700
WHEN '95' DISPLAY 'VSAM - INVALID FILE INFORMATION'
007800
DISPLAY 'OR OPEN OUTPUT (LOAD) '
007900
DISPLAY
'WITH FILE THAT NEVER CONTNED DATA'
008000
WHEN '96' DISPLAY 'VSAM - MISSING DD STATEMENT IN JCL'
008100
WHEN '97' DISPLAY 'VSAM - OPEN OK, FILE INTEGRITY VERIFIED'
008200
DISPLAY 'FILE SHOULD BE OK'
008300
WHEN OTHER DISPLAY 'UNKNOWN REASON' VSAM-STATUS-CODE
008400
END-EVALUATE.
008800
008900 EVALUATE-VSAM-EXTENDED-RETURN-CODE.
009000
EVALUATE VSAM-EXTENDED-RETURN-CODE
009100
WHEN 0 DISPLAY 'SUCCESSFUL COMPLETION'
009200
WHEN 4 DISPLAY 'ANOTHER REQUEST IS ACTIVE'
009300
WHEN 8 DISPLAY 'THERE IS A LOGICAL ERROR'
009400
PERFORM EVALUATE-LOGICAL-ERROR
009500
WHEN 12 DISPLAY 'THERE IS A PHYSICAL ERROR'
009600
PERFORM EVALUATE-PHYSICAL-ERROR
009700
WHEN OTHER DISPLAY 'UNKNOWN REASON'
009800
END-EVALUATE.
009900
010000 EVALUATE-VSAM-EXTENDED-FUNCTION-CODE.
010100
EVALUATE VSAM-EXTENDED-FUNCTION-CODE
010200
WHEN 0 DISPLAY 'ACCESSING BASE CLUSTER, NO PROBLEM'
010300
WHEN 1 DISPLAY 'ACCESSING BASE CLUSTER, MAY BE A PROBLEM'
010400
WHEN 2 DISPLAY 'ACCESSING ALTERNATE INDEX, NO PROBLEM'
010500
WHEN 3 DISPLAY 'ACCESSING ALTERNATE INDEX, MAY BE A PROBLEM'
010600
WHEN 4 DISPLAY 'UPGRADE PROCESSING, NO PROBLEM'
010700
WHEN 5 DISPLAY 'UPGRADE PROCESSING, MAY BE A PROBLEM'
010800
WHEN OTHER DISPLAY 'UNKNOWN REASON'
010900
END-EVALUATE.
011000
011100 EVALUATE-PHYSICAL-ERROR.
011200*
USE THIS WHEN THERE IS RC 12 IN VSAM-EXTENDED-RETURN-CODE
011300
EVALUATE VSAM-EXTENDED-FEEDBACK-CODE
011400
WHEN 4 DISPLAY 'READ ERROR ON DATA'
011500
WHEN 8 DISPLAY 'READ ERROR ON INDEX'
011600
WHEN 12 DISPLAY 'READ ERROR IN SEQUENCE SET'

167

011700
WHEN 16 DISPLAY 'WRITE ERROR ON DATA'
011800
WHEN 20 DISPLAY 'WRITE ERROR ON INDEX'
011900
WHEN 24 DISPLAY 'WRITE ERROR IN SEQUENCE SET'
012000
WHEN OTHER DISPLAY 'UNKNOWN REASON'
012100
END-EVALUATE.
012200
012300 EVALUATE-LOGICAL-ERROR.
012400*
USE THIS WHEN THERE IS RC 8 IN VSAM-EXTENDED-RETURN-CODE
012500
EVALUATE VSAM-EXTENDED-FEEDBACK-CODE
012600
WHEN
4 DISPLAY 'READ PAST END OF FILE'
012700
WHEN
8 DISPLAY 'DUPLICATE KEY'
012800
WHEN 12 DISPLAY 'KEY SEQUENCE ERROR'
012900
WHEN 16 DISPLAY 'NOT FOUND'
013000
WHEN 20 DISPLAY 'CONTROL INTERVAL IN USE BY OTHER JOB'
013100
WHEN 24 DISPLAY 'VOLUME CANNOT BE MOUNTED'
013200
WHEN 28 DISPLAY 'UNABLE TO EXTEND DATASET'
013300
WHEN 32 DISPLAY 'RBA NOT FOUND'
013400
WHEN 36 DISPLAY 'KEY IS NOT IN A DEFINED KEY RANGE'
013500
WHEN 40 DISPLAY 'INSUFFICIENT VIRTUAL STORAGE'
013600
WHEN 64 DISPLAY 'NO AVAILABLE STRINGS'
013700
WHEN 68 DISPLAY 'OPEN DID NOT SPECIFY PROC TYPE'
013800
WHEN 72 DISPLAY 'KEY ACCESS TO ESDS OR RRDS'
013900
WHEN 76 DISPLAY 'ATTEMPTED INSERT TO WRONG TYPE DATASET'
014000
WHEN 80 DISPLAY 'ATTEMPTED DELETE FROM ESDS'
014100
WHEN 84 DISPLAY 'OPTCD LOC FOR PUT REQUEST'
014200
WHEN 88 DISPLAY 'POSITION NOT ESTABLISHED'
014300
WHEN 92 DISPLAY 'PUT WITHOUT GET FOR UPDATE'
014400
WHEN 96 DISPLAY 'TRYING TO CHANGE PRIMARY KEY'
014500
WHEN 100 DISPLAY 'TRYING TO CHANGE LRECL'
014600
WHEN 104 DISPLAY 'INVALID RPL OPTIONS'
014700
WHEN 108 DISPLAY 'INVALID LRECL'
014800
WHEN 112 DISPLAY 'INVALID KEY LENGTH'
014900
WHEN 116 DISPLAY 'VIOLATED LOAD MODE RESTRICTION'
015000
WHEN 120 DISPLAY 'WRONG TASK SUBMITTING REQUEST'
015100
WHEN 132 DISPLAY 'TRYING TO GET SPANNED REC IN LOC MODE'
015200
WHEN 136 DISPLAY 'TRYING TO GET SPANNED REC BY ADDRESS'
015300
DISPLAY 'IN KSDS'
015400
WHEN 140 DISPLAY 'INCONSISTENT SPANNED REC'
015500
WHEN 144 DISPLAY 'ALT INDEX POINTER WITH NO MATCHING'
015600
DISPLAY 'BASE RECORD'
015700
WHEN 148 DISPLAY 'EXCEEDED MAX POINTERS IN ALT INDEX REC'
015800
WHEN 152 DISPLAY 'INSUFFICIENT BUFFERS AVAILABLE'
015900
WHEN 156 DISPLAY 'INVALID CONTROL INTERVAL'
016000
WHEN 192 DISPLAY 'INVALID RELATIVE REC NUMBER'
016100
WHEN 196 DISPLAY 'ATTEMPTED ADDRESSED REQUEST TO RRDS'
016200
WHEN 200 DISPLAY 'INVALID ACCESS THROUGH A PATH'
016300
WHEN 204 DISPLAY 'PUT IN BACKWARD MODE'
016400
WHEN 208 DISPLAY 'INVALID ENDREQ MACRO'
016500
WHEN OTHER DISPLAY 'UNKNOWN REASON'
016600
END-EVALUATE.
016700

168

VSAM File status codes in COBOL.


STATUS
'00'
'02'
'04'
'05'
'07'
'10'
'14'
'20'
'21'
'22'
'23'
'24'
'30'
'34'
'35'
'37'
'38'
'39'
'41'
'42'
'43'
'44'
'46'
'47'
'48'
'49'
'90'
'91'
'92'
'93'
'94'
'95'
'96'
'97'
OTHER

SIGNIFICADO
'SUCCESSFUL COMPLETION'
'DUPLICATE KEY, NON UNIQ. ALT INDX'
'READ, WRONG LENGTH RECORD'
'OPEN, FILE NOT PRESENT'
'CLOSE OPTION INCOMPAT FILE DEVICE OPEN IMPLIES TAPE; TAPE NOT USED'
'END OF FILE'
'RRN > RELATIVE KEY DATA'
'INVALID KEY VSAM KSDS OR RRDS'
'SEQUENCE ERROR, ON WRITE OR CHANGING KEY ON REWRITE'
'DUPLICATE KEY'
'RECORD OR FILE NOT FOUND'
'BOUNDARY VIOLATION. WRITE PAST END OF KSDS RECORD. COBOL 370: REL: REC# TOO BIG. OUT
OF SPACE ON KSDS/RRDS FILE'
'PERMANENT DATA ERROR. DATA CHECK, PARITY CHK, HARDW'
'BOUNDARY VIOLATION. WRITE PAST END OF ESDS RECORD OR NO SPACE TO ADD KSDS/RRDS RECORD.
OUT OF SPACE ON SEQUENTIAL FILE'
'35' 'OPEN, FILE NOT PRESENT'
'OPEN MODE INCOMPAT WITH DEVICE'
'OPENING FILE CLOSED WITH LOCK'
'OPEN, FILE ATTRIB CONFLICTING'
'OPEN, FILE IS OPEN'
'CLOSE, FILE IS CLOSED'
'DELETE OR REWRITE & NO GOOD READ FIRST'
'BOUNDARY VIOLATION/REWRITE REC TOO BIG'
'SEQUENTIAL READ WITHOUT POSITIONING'
'READING FILE NOT OPEN AS INPUT/IO/EXTEND'
'WRITE WITHOUT OPEN IO'
'DELETE OR REWRITE WITHOUT OPEN IO'
'UNKNOWN'
'VSAM - PASSWORD FAILURE'
'LOGIC ERROR/OPENING AN OPEN FILE OR READING OUTPUT FILE OR WRITE INPUT FILE OR DEL/REW
BUT NO PRIOR READ '
'VSAM - VIRTSTOR. RESOURCE NOT AVAILABLE'
'VSAM - SEQUENTIAL READ AFTER END OF FILE OR NO CURRENT REC POINTER FOR SEQ'
'VSAM - INVALID FILE INFORMATION OR OPEN OUTPUT (LOAD) WITH FILE THAT NEVER CONTAINED
DATA'
'VSAM - MISSING DD STATEMENT IN JCL'
'VSAM - OPEN OK, FILE INTEGRITY VERIFIED FILE SHOULD BE OK'
'UNKNOWN REASON'

VSAM Extended Return Code in COBOL.


Ext. RC
00
04
08
12
Outros

SIGNIFICADO
'SUCCESSFUL COMPLETION'
'ANOTHER REQUEST IS ACTIVE'
'THERE IS A LOGICAL ERROR'
'THERE IS A PHYSICAL ERROR'
'UNKNOWN REASON'

VSAM Extended Function Code in COBOL.


Ext. FC
00
01
02
03
04
05
Outros

SIGNIFICADO
'ACCESSING BASE CLUSTER, NO PROBLEM'
'ACCESSING BASE CLUSTER, MAY BE A PROBLEM'
'ACCESSING ALTERNATE INDEX, NO PROBLEM'
'ACCESSING ALTERNATE INDEX, MAY BE A PROBLEM'
'UPGRADE PROCESSING, NO PROBLEM'
'UPGRADE PROCESSING, MAY BE A PROBLEM'
'UNKNOWN REASON'

169

VSAM Physical Error in COBOL.


Ext. RC
04
08
12
16
20
24
Outros

SIGNIFICADO
'READ ERROR ON DATA'
'READ ERROR ON INDEX'
'READ ERROR IN SEQUENCE SET'
'WRITE ERROR ON DATA'
'WRITE ERROR ON INDEX'
'WRITE ERROR IN SEQUENCE SET'
'UNKNOWN REASON'

VSAM Logical Error Codes


These codes indicate VSAM errors. They appear on the JOB log.
004(04)
008(08)
012(0C)

016(10)
020(14)
024(18)
028(1C)

036(24)
040(28)
044(2A)
064(40)
068(44)
074(4A)
076(4C)
080(50)
084(54)
088(58)

092(5C)
096(60)
100(64)
104(68)
108(6C)

Read past end of file


You attempted to store a record with a Duplicate Key, or there is a duplicate record for an alternate
index with the unique key option.
You attempted to store a record out of Ascending Key Sequence in Skip-Sequential Mode; record
had a Duplicate Key; for Skip-Sequential processing your GET, PUT, and POINT Requests are not
referencing records in Ascending Sequence; or, for Skip-Sequential Retrieval, the key requested is
lower than the previous key requested. For Shared Resources, buffer pool is full.
Record not found.
Record already held in exclusive control by another requester.
Record resides on a volume that cannot be mounted.
Data set cannot be extended because VSAM can't allocate additional Direct-Access Storage
Space. Either there is not enough space left to make the secondary allocation or you attempted to
increase the size of a data set while processing SHROPT=4 and DISP=SHR.
Key Ranges were specified for the data set when it was defined but no range was specified that
includes the record to be inserted.
Insufficient Virtual Storage to complete the request.
Work area too small.
All available strings are in use.
You attempted to use a type of processing (Output or Control-Interval Processing) that was not
specified when the data set was opened.
Trying to use keys on ESDS or RRDS.
You issued an Addressed or Control-Interval PUT to add to a Key-Sequenced data set, or issued a
Control-Interval put to a Relative Record data set.
Trying to delete from ESDS.
Using OPTCODE=LOC for a PUT.
You issued a Sequential GET request without having caused VSAM to be positioned for it, or you
changed from Addressed Access to Keyed Access without causing VSAM to be positioned for
Keyed-Sequential Retrieval; there was no Sequential PUT insert for a Relative Record data set, or
you attempted an illegal switch between forward and backward processing.
A PUT for update or an ERASE was issued without a previous GET for update, or a PUTIX was
issued without a previous GETIX.
Changing the Prime Key or Key of Reference when making an update.
Trying to change record length.
The RPL options are either invalid or conflicting.
RECLEN specified was larger than the maximum allowed, equal to 0, or smaller than the sum of
the length and the displacement of the key field; RECLEN was not equal to record (SLOT) size
specified for a Relative Record data set.
170

112(70)
116(74)
120(78)
132(84)
136(88)
140(8C)
144(90)
148(94)
152(98)
156(9C)
192(C0)
196(C4)
200(C8)
204(CC)
252(FC)

Invalid key length.


Trying to update an empty dataset.
Request was submitted by the wrong task.
An attempt was made in Locate Mode to retrieve a Spanned Record.
You attempted an Addressed GET of a Spanned record in a Key-Sequenced data set.
Inconsistent Spanned record.
Invalid pointer (no associated base record) in an Alternate Index.
Maximum number of Alternate Index pointers exceeded.
Not enough buffers available.
Invalid control interval.
Invalid Relative Record number in a RRDS dataset.
Addressed access to a Relative Record (RRDS) dataset is not allowed.
Addressed Access or Generic Backward processing by Key thru a path is not allowed.
Attempting a PUT in backward mode.
Record mode processing is not allowed for a Linear data set.

VSAM Open error codes


136(88)
144(90)
148(94)
152(98)
164(A4)
168(A8)
176(B0)
180(B4)
184(B8)
188(BC)
192(C0)
232(E8)
236(EC)
244(F4)

Not enough Virtual-Storage Space is available for Work Areas, Control Blocks, or Buffers.
An uncorrectable I/O error occurred while VSAM was Reading or Writing a catalog record.
No record for the data set to be opened was found in the available catalog(s) or an unidentified
error occurred while VSAM was searching the catalog.
Security Verification failed; the password specified in the Access-Method Control Block for a
specified level of access does not match the password in the catalog for that level of access.
An uncorrectable I/O error occurred while VSAM was Reading the Volume Label.
The data set is not available for the type of processing you specify, or an attempt was made to
open a Reusable data set with the Reset option while another user had the data set.
An error occurred while VSAM was attempting to fix a page of Virtual storage in Real storage.
A VSAM catalog specified in JCL either does not exist or is not open, and no record for the data
set to be opened was found in any other catalog.
An uncorrectable I/O error occurred while VSAM was completing an I/O request.
The data set indicated by the Access-Method Control Block is not of the type that may be
specified by an Access-Method Control Block.
An unusable data set was opened for output.
Reset was specified for a nonreusable data set and the data set is not empty.
A permanent Staging error occurred in MSS (Acquire).
The Volume containing the Catalog Recovery area was not mounted and verified for output
processing.

171

APNDICES
APNDICE A - RELAO DE PALAVRAS RESERVADAS
ACCEPT
ACCESS
ACTUAL
ADD
ADDRESS
ADVANCING
AFTER
ALL
ALPHABET
ALPHABETIC
ALPHABETIC-LOWER
ALPHABETIC-UPPER
ALPHANUMERIC
ALPHANUMERIC-EDITED
ALSO
ALTER
ALTERNATE
AND
ANY
APPLY
ARE
AREA
AREAS
ASCENDING
ASSIGN
AT
AUTHOR
AUTO
AUTO-SKIP
AUTOMATIC
BACKGROUND-COLOR
BACKGROUND-COLOUR
BACKWARD
BASIS
BEEP
BEFORE
BEGINNING
BELL
BINARY
BLANK
BLINK
BLOCK
BOTTOM
BY
C01
C02
C03
C04
C05
C06
C07
C08
C09
C10
C11
C12

CALL
CANCEL
CBL
CD
CF
CH
CHAIN
CHIANING
CHANGED
CHARACTER
CHARACTERS
CLASS
CLOCK-UNITS
CLOSE
COBOL
CODE
CODE-SET
COL
COLLATING
COLUMN
COM-REG
COMMA
COMMIT
COMMON
COMMUNICATION
COMP
COMP-0
COMP-1
COMP-2
COMP-3
COMP-4
COMP-5
COMP-6
COMP-X
COMPUTATIONAL
COMPUTATIONAL-0
COMPUTATIONAL-1
COMPUTATIONAL-2
COMPUTATIONAL-3
COMPUTATIONAL-4
COMPUTATIONAL-5
COMPUTATIONAL-6
COMPUTATIONAL-X
COMPUTE
CONFIGURATION
CONSOLE
CONTAINS
CONTENT
CONTINUE
CONTROL
CONTROLS
CONVERT
CONVERTING
COPY
CORE-INDEX
CORR

172

CORRESPONDING
COUNT
CRT
CURRENCY
CURRENT-DATE
CURSOR
DATA
DATE
DATE-COMPILED
DATE-WRITTEN
DAY
DAY-OF-WEEK
DECS
DE
DEBUG
DEBUGGING
DECIMAL-POINT
DECLARATIVES
DELETE
DELIMITED
DELIMITER
DEPENDING
DESCENDING
DESTINATION
DETAIL
DISABLE
DISK
DISP
DISPLAY
DISPLAY-1
DISPLAY-ST
DIVIDE
DIVISION
DOWN
DUPLICATES
DYNAMIC
ECHO
EGCS
EGI
EJECT
ELSE
EMI
EMPTY-CHECK
ENABLE
END
END-ACCEPT
END-ADD
END-CALL
END-CHAIN
END-COMPUTE
END-DELETE
END-DIVIDE
END-EVALUATE
END-IF
END-MULTIPLY
END-OF-PAGE

END-PERFORM
END-READ
END-RECEIVE
END-RETURN
END-REWRITE
END-SEARCH
END-START
END-STRING
END-SUBTRACT
END-UNSTRING
END-WRITE
ENDING
ENTER
ENTRY
ENVIRONMENT
EOL
EOP
EOS
EQUAL
ERASE
ERROR
ESCAPE
ESI
EVALUATE
EVERY
EXAMINE
EXCEPTION
EXCESS-3
EXCLUSIVE
EXEC
EXECUTE
EXHIBIT
EXIT
EXTEND
EXTERNAL
FALSE
FD
FH--FCD
FH--KEYDEF
FILE
FILE-CONTROL
FILE-ID
FILE-LIMIT
FILE-LIMITS
FILLER
FINAL
FIRST
FIXED
FOOTING
FOR
FOREGROUND-COLOR
FOREGROUND-COLOUR
FROM
FULL
GENERATE
GIVING
GLOBAL
GO
GOBACK
GREATER
GRID
GROUP
HEADING
HIGH
HIGH-VALUE
HIGH-VALUES
HIGHLIGHT

I-O
I-O-CONTROL
ID
IDENTIFICATION
IF
IN
INDEX
INDEXED
INDICATE
INITIAL
INITIALIZE
INITIATE
INPUT
INPUT-OUTPUT
INSERT
INSPECT
INSTALLATION
INTO
INVALID
IS
JAPANESE
JUST
JUSTIFIED
KANJI
KEPT
KEY
KEYBOARD
LABEL
LAST
LEADING
LEAVE
LEFT
LEFT-JUSTIFY
LEFTLINE
LENGTH
LENGTH-CHECK
LESS
LIMIT
LIMITS
LIN
LINAGE
LINAGE-COUNTER
LINE
LINES
LINE-COUNTER
LINKAGE
LOCAL-STORAGE
LOCK
LOCKING
LOW
LOW-VALUE
LOW-VALUES
MANUAL
MEMORY
MERGE
MESSAGE
MODE
MODULES
MORE-LABELS
MOVE
MULTIPLE
MULTIPLY
NAME
NAMED
NATIVE
NCHAR
NEGATIVE

173

NEXT
NO
NO-ECHO
NOMINAL
NOT
NOTE
NULL
NUMBER
NUMERIC
NUMERIC-EDITED
OBJECT-COMPUTER
OCCURS
OF
OFF
OMITTED
ON
OPEN
OPTIONAL
OR
ORDER
ORGANIZATION
OTHER
OTHERWISE
OUTPUT
OVERFLOW
OVERLINE
PACKED-DECIMAL
PADDING
PAGE
PAGE-COUNTER
PASSWORD
PERFORM
PF
PH
PIC
PICTURE
PLUS
POINTER
POS
POSITION
POSITIONING
POSITIVE
PREVIOUS
PRINT
PRINTER
PRINTER-1
PRINTING
PROCEDURE
PROCEDURE-POINTER
PROCEDURES
PROCEED
PROCESSING
PROGRAM
PROGRAM-ID
PROMPT
PROTECTED
PURGE
QUEUE
QUOTE
QUOTES
RANDOM
RANGE
RD
READ
READY
RECEIVE
RECORD

RECORD-OVERFLOW
RECORDING
RECORDS
REDEFINES
REEL
REFERENCE
REFERENCES
RELATIVE
RELEASE
RELOAD
REMAINDER
REMARKS
REMOVAL
RENAMES
REORG-CRITERIA
REPLACE
REPLACING
REPORT
REPORTING
REPORTS
REQUIRED
REREAD
RERUN
RESERVE
RESET
RETURN
RETURN-CODE
RETURNING
REVERSE
REVERSE-VIDEO
REVERSED
REWIND
REWRITE
RF
RH
RIGHT
RIGHT-JUSTIFY
ROLLBACK
ROUNDED
RUN
S01
S02
SAME
SCREEN
SD
SEARCH
SECTION
SECURE
SECURITY
SEEK
SEGMENT
SEGMENT-LIMIT
SELECT
SELECTIVE

SEND
SENTENCE
SEPARATE
SEQUENCE
SEQUENTIAL
SERVICE
SET
SIGN
SIZE
SKIP1
SKIP2
SKIP3
SORT
SORT-CONTROL
SORT-MERGE
SOURCE
SOURCE-COMPUTER
SPACE
SPACE-FILL
SPACES
SPECIAL-NAMES
STANDARD
STANDARD-1
STANDARD-2
START
STOP
STORE
STRING
SUB-QUEUE-1
SUB-QUEUE-2
SUB-QUEUE-3
SUBTRACT
SUM
SUPPRESS
SYMBOLIC
SYNC
SYNCRONIZED
SYSIN
SYSIPT
SYSLST
SYSOUT
SYSPUNCH
TAB
TABLE
TALLY
TALLYING
TAPE
TERMINAL
TERMINATE
TEST
TEXT
THAN
THEN
THROUGH

174

THRU
TIME
TIME-OF-DAY
TIMES
TITLE
TO
TOP
TOTALED
TOTALLING
TRACE
TRACK-AREA
TRACK-LIMIT
TRACKS
TRAILING
TRAILING-SIGN
TRANSFORM
TRUE
TYPE
UNDERLINE
UNIT
UNLOCK
UNSTRING
UNTIL
UP
UPDATE
UPON
UPSI-0
UPSI-1
UPSI-2
UPSI-3
UPSI-4
UPSI-5
UPSI-6
UPSI-7
USAGE
USE
USER
USING
VALUE
VALUES
VARIABLE
VARYING
WAIT
WHEN
WHEN-COMPILED
WITH
WORDS
WORKING-STORAGE
WRITE
WRITE-ONLY
ZERO
ZERO-FILL
ZEROES
ZEROS

APNDICE B Abends 0Cx


Conceitos gerais :
0Cx = Interrupo por erro de programa
Principais cdigos :
0C1 = Operation exception = operao invlida
0C4 = Especificao = provavelmente uso incorreto de indexador com vetores e matrizes ou
falta de DD
0C7 = Data exception = dados que deveriam ser numricos no esto numricos
0CB = Diviso por zero

0C7 : Para localizar a instruo em Cobol :


Mensagem no DD CEEDUMP :
CEE3207S The system detected a data exception (System Completion Code=0C7).
From compile unit RPCP310 at entry point RPCP310 at compile unit offset
+0000035E at address 13D01176.
Este endereo importante!!!

Programa Fonte (listagem de compilao)


000011
000012
000013
000014
000015
000016

MOVE HIGH-VALUES TO ERROX.


DISPLAY '-----------------------------------------'.
DISPLAY 'VAI ABENDAR 0C7'
DISPLAY '-----------------------------------------'.
ADD 1 TO ERRON.
STOP RUN.

Mapa da Procedure Division (listagem de compilao)


LINE # HEXLOC VERB
000011 00032C MOVE
000014 00034A DISPLAY

LINE # HEXLOC VERB


000012 000332 DISPLAY
000015 000354 ADD

LINE # HEXLOC VERB


000013 000340 DISPLAY
000016 00036E STOP

Cada instruo na Procedure Division vai de qual endereo at qual endereo ?


175

000011
000012
000013
000014
000015
000016

00032C
000332
000340
00034A
000354
00036E

at
at
at
at
at
at

000331
00033F
000349
000353
00036D
o fim

MOVE
DISPLAY
DISPLAY
DISPLAY
ADD
STOP

O endereo citado na mensagem no DD CEEDUMP (0000035E) est entre 000354 e 00036D.


Portanto : a instruo ADD (comando de nmero 15 para o compilador) que est usando varivel com
dados no numricos. Como a instruo usa somente a varivel ERRON, ela que tem contedo
invlido.
Para corrigir, verificar nas instrues anteriores (executadas anteriormente) ao ADD onde o contedo
de ERRON alterado e recebe dados invlidos.

176

APNDICE C - Grace Murray Hopper - Creator of COBOL


After the war ended, Hopper remained at
Harvard working on the Mark II and Mark III
computing systems. In 1949, she joined the
Eckert-Mauchly Computer Corporation as a
Senior Mathematician. There, she worked on
the UNIVAC computer and designed an
improved compiler, FloMatic (the first English
language data processing compiler) that
allowed computers to do more than simply
solve mathematical equations.
When UNIVAC had an unexplained system
failure, Hopper discovered a moth in the
circuitry and coined the phrase "computer bug."
Hoppers work would lead to the international
standardization of computer compilers and to
the development of the language COBOL
(Common Business-Oriented Language).
She retired from the Navy with the rank of
Commander in 1966, but was quickly called
back to active duty. At age 80, Hopper accepted
the assignment of standardizing the Navys
computer systems, making her the oldest active
duty U.S. Naval officer. After achieving the
rank of Rear Admiral, she retired again in 1986.
Her awards are too numerous to name. The
words of former President George Bush, when
awarding Hopper the National Medal of
Technology in 1991, best sum up Hoppers
phenomenal life "[Hopper] spent a half
century helping keep America on the leading
edge of high technology."

Grace Murray Hopper, a pioneer in the


development of computer technology remains
relatively unknown. Hopper, who coined the
phrase "computer bug" and was the inventor of
the computer language COBOL, studied
mathematics and physics at Vassar College
receiving her BA in 1928. Following
graduation she attended Yale University
receiving a PhD in mathematics in 1934. She
returned to Vassar and began her illustrious
teaching career. When the United States entered
World War II, Hopper was determined to join
the military but was turned down because of her
slight physical frame and the fact that her work
as a mathematician was considered essential to
the war effort.
Her determination to serve her country in a
more direct way paid off in 1943 when she was
accepted into the Naval Reserve and
commissioned a Lieutenant. Hopper was
assigned to the Bureau of Ordnance
Computation Project as the Cruft Laboratories
at Harvard University and would be only the
third person in the world to work on the Mark I
computer, the first large scale automatic
calculator and a precursor to the modern day
computer.
177

APNDICE D First Computer BUG

APNDICE E - Embedded commands (exemplos para SQL)


Fonte codificado
EXEC SQL DECLARE EPCV50A1_PAT_PPT TABLE
( CD_EMP
DECIMAL(5, 0) NOT NULL,
NO_PPT_CRE
DECIMAL(11, 0) NOT NULL,
CD_TPO_VIN_PAT
DECIMAL(3, 0) NOT NULL,
CD_SEQ_TPO_VIN_PAT
DECIMAL(2, 0) NOT NULL,
CD_PAT_CRR
DECIMAL(11, 0) NOT NULL,
CD_TPO_PES
CHAR(1) NOT NULL,
NM_PAT
CHAR(40) NOT NULL,
NO_CPF_CGC
DECIMAL(15, 0) NOT NULL,
TS_INC
TIMESTAMP NOT NULL,
CD_USU_INC
CHAR(8) NOT NULL,
TS_ULT_ATU
TIMESTAMP NOT NULL,
CD_USU_ULT_ATU
CHAR(8) NOT NULL,
CD_PGM_MAN
CHAR(8) NOT NULL
) END-EXEC.

Fonte gerado
******************************************************************
* COBOL DECLARATION FOR TABLE DB2DEPC.EPCV50A1_PAT_PPT
*
******************************************************************
01 EPCV50A1.
10 CD-EMP
PIC S9(5)V USAGE COMP-3.
10 NO-PPT-CRE
PIC S9(11)V USAGE COMP-3.
10 CD-TPO-VIN-PAT
PIC S9(3)V USAGE COMP-3.
10 CD-SEQ-TPO-VIN-PAT
PIC S9(2)V USAGE COMP-3.
10 CD-PAT-CRR
PIC S9(11)V USAGE COMP-3.
10 CD-TPO-PES
PIC X(1).
10 NM-PAT
PIC X(40).
10 NO-CPF-CGC
PIC S9(15)V USAGE COMP-3.
10 TS-INC
PIC X(26).
10 CD-USU-INC
PIC X(8).
10 TS-ULT-ATU
PIC X(26).
10 CD-USU-ULT-ATU
PIC X(8).
10 CD-PGM-MAN
PIC X(8).

Fonte codificado
(na procedure division)
EXEC SQL
INSERT INTO EPCV12A1_HIS_PPT
(CD_EMP,
NO_PPT_CRE,
CD_SEQ_HIS_PPT_CRE,
CD_STA_HIS_PPT_CRE,
DS_HIS_PPT_CRE,
TS_INC,
CD_USU_INC,
TS_ULT_ATU,
CD_USU_ULT_ATU,
CD_PGM_MAN)
VALUES
(:EPCV12A1.CD-EMP,
:EPCV12A1.NO-PPT-CRE,
:EPCV12A1.CD-SEQ-HIS-PPT-CRE,
:EPCV12A1.CD-STA-HIS-PPT-CRE,
:EPCV12A1.DS-HIS-PPT-CRE,
:EPCV12A1.TS-INC,
'MIGRACAO',
:EPCV12A1.TS-ULT-ATU,
'MIGRACAO',
'EPCBX55')
END-EXEC.

Fonte gerado
(na working-storage)
01 SQL-PLIST12.
05 SQL-PLIST-CON
PIC S9(9)
05 SQL-CALLTYPE
PIC S9(4)
05 SQL-PROG-NAME
PIC X(8)
05 SQL-TIMESTAMP-1 PIC S9(9)
05 SQL-TIMESTAMP-2 PIC S9(9)
05 SQL-SECTION
PIC S9(4)
05 SQL-CODEPTR
PIC S9(9)
05 SQL-VPARMPTR
PIC S9(9)
05 SQL-APARMPTR
PIC S9(9)
05 SQL-STMT-NUM
PIC S9(4)
05 SQL-STMT-TYPE
PIC S9(4)
05 SQL-PVAR-LIST12.
10 PRE-SQLDAID PIC X(8)
10 PRE-SQLDABC PIC S9(9)
10 PRE-SQLN
PIC S9(4)
10 PRE-SQLLD
PIC S9(4)
10 PRE-SQLVAR.
12 SQLVAR-BASE1.
15 SQL-PVAR-TYPE1
15 SQL-PVAR-LEN1
15 SQL-PVAR-ADDRS1.
20 SQL-PVAR-ADDR1
20 SQL-PVAR-IND1
15 SQL-PVAR-NAME1.

COMP-4 VALUE +2637824.


COMP-4 VALUE +30.
VALUE 'EPCBX55 '.
COMP-4 VALUE +389353535.
COMP-4 VALUE +379351652.
COMP-4 VALUE +3.
COMP-4.
COMP-4 VALUE +0.
COMP-4 VALUE +0.
COMP-4 VALUE +1343.
COMP-4 VALUE +232.
VALUE 'SQLDA
'.
COMP-4 VALUE +324.
COMP-4 VALUE +7.
COMP-4 VALUE +7.
PIC S9(4) COMP-4 VALUE +484.
PIC S9(4) COMP-4 VALUE +1280.
PIC S9(9) COMP-4.
PIC S9(9) COMP-4.

20 SQL-PVAR-NAMEL1
20 SQL-PVAR-NAMEC1
12 SQLVAR-BASE2.
15 SQL-PVAR-TYPE2
15 SQL-PVAR-LEN2
15 SQL-PVAR-ADDRS2.
20 SQL-PVAR-ADDR2
20 SQL-PVAR-IND2
15 SQL-PVAR-NAME2.
20 SQL-PVAR-NAMEL2
20 SQL-PVAR-NAMEC2
12 SQLVAR-BASE3.
15 SQL-PVAR-TYPE3
15 SQL-PVAR-LEN3
15 SQL-PVAR-ADDRS3.
20 SQL-PVAR-ADDR3
20 SQL-PVAR-IND3
15 SQL-PVAR-NAME3.
20 SQL-PVAR-NAMEL3
20 SQL-PVAR-NAMEC3
12 SQLVAR-BASE4.
15 SQL-PVAR-TYPE4
15 SQL-PVAR-LEN4
15 SQL-PVAR-ADDRS4.
20 SQL-PVAR-ADDR4
20 SQL-PVAR-IND4
15 SQL-PVAR-NAME4.
20 SQL-PVAR-NAMEL4
20 SQL-PVAR-NAMEC4
12 SQLVAR-BASE5.
15 SQL-PVAR-TYPE5
15 SQL-PVAR-LEN5
15 SQL-PVAR-ADDRS5.
20 SQL-PVAR-ADDR5
20 SQL-PVAR-IND5
15 SQL-PVAR-NAME5.
20 SQL-PVAR-NAMEL5
20 SQL-PVAR-NAMEC5
12 SQLVAR-BASE6.
15 SQL-PVAR-TYPE6
15 SQL-PVAR-LEN6
15 SQL-PVAR-ADDRS6.
20 SQL-PVAR-ADDR6
20 SQL-PVAR-IND6
15 SQL-PVAR-NAME6.
20 SQL-PVAR-NAMEL6
20 SQL-PVAR-NAMEC6
12 SQLVAR-BASE7.
15 SQL-PVAR-TYPE7
15 SQL-PVAR-LEN7
15 SQL-PVAR-ADDRS7.
20 SQL-PVAR-ADDR7
20 SQL-PVAR-IND7
15 SQL-PVAR-NAME7.
20 SQL-PVAR-NAMEL7
20 SQL-PVAR-NAMEC7

PIC S9(4) COMP-4 VALUE +0.


PIC X(30) VALUE ' '.
PIC S9(4) COMP-4 VALUE +484.
PIC S9(4) COMP-4 VALUE +2816.
PIC S9(9) COMP-4.
PIC S9(9) COMP-4.
PIC S9(4) COMP-4 VALUE +0.
PIC X(30) VALUE ' '.
PIC S9(4) COMP-4 VALUE +484.
PIC S9(4) COMP-4 VALUE +512.
PIC S9(9) COMP-4.
PIC S9(9) COMP-4.
PIC S9(4) COMP-4 VALUE +0.
PIC X(30) VALUE ' '.
PIC S9(4) COMP-4 VALUE +452.
PIC S9(4) COMP-4 VALUE +2.
PIC S9(9) COMP-4.
PIC S9(9) COMP-4.
PIC S9(4) COMP-4 VALUE +0.
PIC X(30) VALUE ' '.
PIC S9(4) COMP-4 VALUE +452.
PIC S9(4) COMP-4 VALUE +20.
PIC S9(9) COMP-4.
PIC S9(9) COMP-4.
PIC S9(4) COMP-4 VALUE +0.
PIC X(30) VALUE ' '.
PIC S9(4) COMP-4 VALUE +452.
PIC S9(4) COMP-4 VALUE +26.
PIC S9(9) COMP-4.
PIC S9(9) COMP-4.
PIC S9(4) COMP-4 VALUE +0.
PIC X(30) VALUE ' '.
PIC S9(4) COMP-4 VALUE +452.
PIC S9(4) COMP-4 VALUE +26.
PIC S9(9) COMP-4.
PIC S9(9) COMP-4.
PIC S9(4) COMP-4 VALUE +0.
PIC X(30) VALUE ' '.

Fonte gerado
(na procedure division)
PERFORM SQL-INITIAL UNTIL SQL-INIT-DONE
CALL 'DSNHLI' USING SQL-PLIST12.

APNDICE F Comparao dos tipos de variveis C/C++ e Cobol


C/C++ data types
wchar_t
char
Signed char
unsigned char
Short signed int
Short unsigned int
Long int
Long long int
Float
double
enumeration
char(n)
array pointer (*) to type
pointer(*) to function

COBOL data types


USAGE NATIONAL (PICTURE N)
PIC X
No appropriate COBOL equivalent
No appropriate COBOL equivalent
PIC S9-S9(4) COMP-5. Can be COMP, COMP-4, or BINARY if
you use the TRUNC(BIN) compiler option.
PIC 9-9(4) COMP-5. Can be COMP, COMP-4, or BINARY if you
use the TRUNC(BIN) compiler option.
PIC 9(5)-9(9) COMP-5. Can be COMP, COMP-4, or BINARY if
you use the TRUNC(BIN) compiler option.
PIC 9(10)-9(18) COMP-5. Can be COMP, COMP-4, or BINARY if
you use the TRUNC(BIN) compiler option.
COMP-1
COMP-2
Equivalent to level 88, but not identical
PICTURE X(n)
No appropriate COBOL equivalent
PROCEDURE-POINTER or FUNCTION-POINTER

APNDICE G Indentao
O processo de indentao consiste em alinhar comandos, de forma que fique mais fcil ao programador
que estiver analisando o cdigo, visualizar e, por decorrncia, entender o conjunto de instrues.
Algumas instrues trabalham com subconjuntos (blocos) de (outras) instrues; por meio da
indentao coloca-se instrues que faam parte de um mesmo bloco num mesmo alinhamento.
O caso mais comum o das instrues de teste (IF), onde normalmente existe pelo menos um bloco de
instrues que deve ser executado quando a condio testada for satisfeita; e, opcionalmente, outro
bloco de instrues que devem ser executadas quando a condio testada no for satisfeita :
IF condio
bloco para condio satisfeita
ELSE
bloco para condio no satisfeita
END-IF

Visualmente facilita-se bastante se se deslocar os blocos algumas posies direita (duas ou trs
posies so suficientes) , para que fique destacado o ELSE e o END-IF, facilitando a anlise do fonte.
Se o primeiro bloco fosse
A = (B * C ) ** 4
C = A / 0.005
X = 1.2 / B * C

E o segundo bloco fosse


A = (B * C ) ** 5
C = A / 0.015
X = 1.3 / B * C

E a especificao fosse feita sem indentao :


IF condio
A = (B * C ) ** 4
C = A / 0.005
X = 1.2 / B * C
ELSE
A = (B * C ) ** 5
C = A / 0.015
X = 1.3 / B * C
END-IF

Ficaria mais difcil analisar do que se houvesse sido especificado com indentao :
IF condio
A = (B * C ) ** 4
C = A / 0.005
X = 1.2 / B * C
ELSE
A = (B * C ) ** 5
C = A / 0.015
X = 1.3 / B * C
END-IF

A vantagem fica muito mais evidente n seguinte situo, quando houver IFs encadeados :
Sem indentao :

IF condio
IF condicao
A = (B * C ) **
C = A / 0.005
X = 1.2 / B * C
ELSE
A = (B * C ) **
C = A / 0.055
X = 1.8 / B * C
END-IF
ELSE
IF condicao
A = (B * C ) **
C = A / 0.007
X = 1.9 / B * C
ELSE
A = (B * C ) **
C = A / 0.007
X = 1.5 / B * C
END-IF
END-IF

Com indentao :

IF condio
IF condicao
A = (B * C ) **
C = A / 0.005
X = 1.2 / B * C
ELSE
A = (B * C ) **
C = A / 0.055
X = 1.8 / B * C
END-IF
ELSE
IF condicao
A = (B * C ) **
C = A / 0.007
X = 1.9 / B * C
ELSE
A = (B * C ) **
C = A / 0.007
X = 1.5 / B * C
END-IF
END-IF

APNDICE G Pontos
Sintaticamente o ponto necessrio :

Antes de um procedure-name (terminando o pargrafo anterior)

Aps um procedure-name

Quando se deseja indicar o fim de um comando condicional sem especificar o END-xxxxx


respectivo

Guidelines for Procedure Design

A procedure should be designed to perform only one function. All the statements in the procedure should be related
to accomplishing that function.

Choose a name for the procedure that describes its complete functionality.

Procedures can execute other procedures within the program by using the PERFORM statement. A PERFORM
statement causes the program to transfer control to another paragraph, execute all of the statements within that
paragraph, and return to the statement following the PERFORM statement. Repeated execution of another
paragraph can be accomplished with the optional UNTIL phrase that can be associated with the PERFORM
statement.

Keep the procedure easy to understand. A good length for a procedure is about one screen. This allows the
programmer attempting to analyze the program to see the entire procedure at once. This length is just a guideline.
Extremely simple procedures, such as one which moves a series of fields from an input record to a detail line for
printing could be longer than one screen and still be understandable, while extremely complex procedures, such as
one which perform a series of intricate calculations, would be better as a shorter routine especially one with lots of
explanatory comments.

AND / OR / EXEC SQL / EXEC CICS


RETURN / RELEASE

/ ALTER

EXECUTE

/ CONVERT

/ DELETE

/ SORT / MERGE

END
***********************END-ACCEPT
*END-ADD
***********************END-CALL
END-CHAIN
*END-COMPUTE
***********************END-DELETE
*END-DIVIDE
*END-EVALUATE
*END-IF
*END-MULTIPLY
END-OF-PAGE
*END-PERFORM
*END-READ
***********************END-RECEIVE
END-RETURN
*END-REWRITE
END-SEARCH
END-START
*END-STRING
*END-SUBTRACT
*END-UNSTRING
END-WRITE

O comando "EXEC SQL COMMIT", utilizado geralmente para efetivar o commit do DB2 no deve
ser utilizado em ambiente online.
Quando usado recebe-se o response SQL -925 ( COMMIT NOT VALID in CICS environment) ou -926
para ROLLBACK.
Utilize o comando "EXEC CICS SYNCPOINT "

Character Purpose

Notes

Data Representation Characters


Any character May contain any character including special or unprintable characters
Numeric
May contain only the characters 0 through 9
character
Alphabetic
May contain only the characters A - Z, a - z, and space
character
Arithmetic Positioning Characters
Numeric sign Does not use any actual storage space, without this character a numeric item
would be treated as unsigned
Implied
Does not use any actual storage space, separates the integer portion of a
decimal point numeric item from its decimal portion; used to keep track of the decimal point
for arithmetic calculations; this character will not print or display; use the
actual decimal point character, ".", for printing
Numeric place Does not use any actual storage space; used to change precision, e.g. 99PPP
holder
will hold values in amounts of even 1,000 from zero to 99,000 without
actually storing anything for the three lowest order positions; can also be used
to represent positions after the decimal, e.g. PP9 will hold values in amounts
in even thousandths, from 0 to .009 without actually storing anything for the
two highest order positions
Numeric Editing Characters
Minus sign
Used to display a sign in a printed item, the "-" character will be showed only
if the numeric value is negative, the position will be left blank for positive
values
Plus sign
Used to display a sign in a printed item, "-" will be shown for negative values,
"+" will be shown for positive values
Actual decimal Separates the integer portion of a numeric item from its decimal portion; this
point
character cannot be used in an item involved in a calculation; use the implied
decimal point character, "V", for calculations
Zero Suppress Replaces leading zeros with blanks; has no effect on non-zero positions or
zeros not in leading positions
Comma
Inserts a comma into the data item in this position; commonly used as a
separator in numeric data items
Dollar sign
Inserts a dollar sign into the first position in the data item; commonly used for
currency
Asterisk
Replaces leading zeros with asterisks; has no effect on non-zero positions or
zeros not in leading positions; commonly used in check writing
Credit
Used at the end of a PICTURE clause, the CR will appear in the position
indicated if the item is negative; will be blank for a positive number
Debit
Used at the end of a PICTURE clause, the DB will appear in the position
indicated if the item is negative; will be blank for a positive number
Slash
Inserts a slash into the data item in this position; commonly used as a
separator in date fields
Zero
Inserts a zero into the data item in this position; not commonly used

S-ar putea să vă placă și