You are on page 1of 20

14 VETORES

14.1 Exemplos de declarao e alocao das variveis


Exemplo 1

TABELA-SIGLAS-UF-VALIDAS

A C A L A P A M B A C E D F E S G O M A M T M S M G P A P B P R P E P I R J R N R S R O R R S C S P S E T O

SIGLA-OK (27)
...
SIGLA-OK (2)
SIGLA-OK (1)
01

01

TABELA-SIGLAS-UF-VALIDAS.
05 FILLER PIC X(02) VALUE AC.
05 FILLER PIC X(02) VALUE AL.
05 FILLER PIC X(02) VALUE AP.
05 FILLER PIC X(02) VALUE AM.
05 FILLER PIC X(02) VALUE BA.
05 FILLER PIC X(02) VALUE CE.
05 FILLER PIC X(02) VALUE DF.
05 FILLER PIC X(02) VALUE ES.
05 FILLER PIC X(02) VALUE GO.
05 FILLER PIC X(02) VALUE MA.
05 FILLER PIC X(02) VALUE MT.
05 FILLER PIC X(02) VALUE MS.
05 FILLER PIC X(02) VALUE MG.
05 FILLER PIC X(02) VALUE PA.
05 FILLER PIC X(02) VALUE PB.
05 FILLER PIC X(02) VALUE PR.
05 FILLER PIC X(02) VALUE PE.
05 FILLER PIC X(02) VALUE PI.
05 FILLER PIC X(02) VALUE RJ.
05 FILLER PIC X(02) VALUE RN.
05 FILLER PIC X(02) VALUE RS.
05 FILLER PIC X(02) VALUE RO.
05 FILLER PIC X(02) VALUE RR.
05 FILLER PIC X(02) VALUE SC.
05 FILLER PIC X(02) VALUE SP.
05 FILLER PIC X(02) VALUE SE.
05 FILLER PIC X(02) VALUE TO.
TABELA-SIGLAS-UF-VALIDAS-R REDEFINES
TABELA-SIGLAS-UF-VALIDAS.
05 SIGLA-OK PIC X(02 OCCURS 27.

Outra forma de fazer tais declaraes :


01

01

TABELA-SIGLAS-UF-VALIDAS.
05 FILLER PIC X(24) VALUE ACALAPAMBACEDFESGOMAMTMS.
05 FILLER PIC X(24) VALUE MGPAPBPRPEPIRJRNRSRORRSC.
05 FILLER PIC X(06) VALUE SPSETO.
TABELA-SIGLAS-UF-VALIDAS-R REDEFINES
TABELA-SIGLAS-UF-VALIDAS.
05 SIGLA-OK PIC X(02) OCCURS 27.

Exemplo 2
TABELA-UF-E-NOME
A C A C R E

A L A L A G O A S

NOMEUF (1)
SIGLAUF (1)
UF-E-NOME (1)
01

01

A P A M A P A

. . . .

NOMEUF (2)
SIGLAUF (2)
UF-E-NOME (2)

TABELA-UF-E-NOME.
05 FILLER PIC X(21) VALUE ACACRE.
05 FILLER PIC X(21) VALUE ALALAGOAS.
05 FILLER PIC X(21) VALUE APAMAPA.
05 FILLER PIC X(21) VALUE AMAMAZONAS.
05 FILLER PIC X(21) VALUE BABAHIA.
05 FILLER PIC X(21) VALUE CECEARA.
05 FILLER PIC X(21) VALUE DFDISTRITO FEDERAL.
05 FILLER PIC X(21) VALUE ESESPIRITO SANTO.
05 FILLER PIC X(21) VALUE GOGOIAS.
05 FILLER PIC X(21) VALUE MAMARANHAO.
05 FILLER PIC X(21) VALUE MTMATO GROSSO.
05 FILLER PIC X(21) VALUE MSMATA GROSSO DO SUL.
05 FILLER PIC X(21) VALUE MGMINAS GERAIS.
05 FILLER PIC X(21) VALUE PAPARA.
05 FILLER PIC X(21) VALUE PBPARAIBA.
05 FILLER PIC X(21) VALUE PRPARANA.
05 FILLER PIC X(21) VALUE PEPERNAMBUCO.
05 FILLER PIC X(21) VALUE PIPIAUI.
05 FILLER PIC X(21) VALUE RJRIO DE JANEIRO.
05 FILLER PIC X(21) VALUE RNRIO GRANDE DO NORTE.
05 FILLER PIC X(21) VALUE RSRIO GRANDE DO SUL.
05 FILLER PIC X(21) VALUE RORONDONIA.
05 FILLER PIC X(21) VALUE RRRORAIMA.
05 FILLER PIC X(21) VALUE SCSANTA CATARINA.
05 FILLER PIC X(21) VALUE SPSAO PAULO.
05 FILLER PIC X(21) VALUE SESERGIPE.
05 FILLER PIC X(21) VALUE TOTOCANTINS.
TABELA-UF-E-NOME-R REDEFINES
TABELA-UF-E-NOME.
05 UF-E-NOME OCCURS 27.
10 SIGLAUF PIC X(02).
10 NOMEUF PIC X(19).

A tabela ter 567 bytes; ela ser composta por 27 campos denominados UF-E-NOME , cada qual com 21 bytes, alocados na
seguinte sequncia:
SIGLAUF
NOMEUF
SIGLAUF
NOMEUF
...
SIGLAUF
NOMEUF

(1)
(1)
(2)
(2)
(27)
(27)

Exemplo 3

TABELA-UF-E-NOME

A C A L A P A M B A C E D F E S G O M A M . . . . T O A C R E

SIGLA-UF (2)
SIGLA-UF (1)
...
SIGLA-OK (27)
01

A L A G O A S

NOME-UF (1)
NOME-UF (2)
....

TABELA-UF-E-NOME.

*
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10

FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER

PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC

X(02)
X(02)
X(02)
X(02)
X(02)
X(02)
X(02)
X(02)
X(02)
X(02)
X(02)
X(02)
X(02)
X(02)
X(02)
X(02)
X(02)
X(02)
X(02)
X(02)
X(02)
X(02)
X(02)
X(02)
X(02)
X(02)
X(02)

VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE

AC.
AL.
AP.
AM.
BA.
CE.
DF.
ES.
GO.
MA.
MT.
MS.
MG.
PA.
PB.
PR.
PE.
PI.
RJ.
RN.
RS.
RO.
RR.
SC.
SP.
SE.
TO.

10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10

FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER

PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC

X(19)
X(19)
X(19)
X(19)
X(19)
X(19)
X(19)
X(19)
X(19)
X(19)
X(19)
X(19)
X(19)
X(19)
X(19)
X(19)

VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE

ACRE.
ALAGOAS.
AMAPA.
AMAZONAS.
BAHIA.
CEARA.
DISTRITO FEDERAL.
ESPIRITO SANTO.
GOIAS.
MARANHAO.
MATO GROSSO.
MATA GROSSO DO SUL.
MINAS GERAIS.
PARA.
PARAIBA.
PARANA.

10
10
10
10
10
10
10
10
10
10
10
01

FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER
FILLER

PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC
PIC

X(19)
X(19)
X(19)
X(19)
X(19)
X(19)
X(19)
X(19)
X(19)
X(19)
X(19)

VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE
VALUE

PERNAMBUCO.
PIAUI.
RIO DE JANEIRO.
RIO GRANDE DO NORTE.
RIO GRANDE DO SUL.
RONDONIA.
RORAIMA.
SANTA CATARINA.
SAO PAULO.
SERGIPE.
TOCANTINS.

TABELA-UF-E-NOME-R REDEFINES
TABELA-UF-E-NOME.
05 SIGLA-UF PIC X(02) OCCURS 27.
05 NOME-UF PIC X(19) OCCURS 27.

A tabela ter 567 bytes : 54 referentes aos 27 campos de 2 bytes cada (denominados SIGLA-UF) mais 513 referentes aos 27
campos de 19 bytes cada (denominados NOME-UF); tais campos sero alocados da seguinte forma:
SIGLAUF
SIGLAUF
...
SIGLAUF
NOMEUF
NOMEUF
...
NOMEUF

(1)
(2)
(27)
(1)
(2)
(27)

Exemplo 4
TABELA-AGENCIAS
0 0 0 0 1 0 5 3 5 6 0 0 0 5 6 0 5 3 0 0 . . . .
COD-AGE(1)

QTDD-CONTASINATIVAS (1)

QTDD-CONTAS(1)

0 6 7 8 0 0 4 1 9 4 0 0 1 1 1 0 4 0 8 3
COD-AGE(500)

QTDD-CONTASATIVAS (1)

DADOS-AGENCIA(1)

01

TABELA-AGENCIAS.
05 DADOS-AGENCIA OCCURS 500.
10 COD-AGE
PIC
10 QTDD-CONTAS
PIC
10 QTDD-CONTAS-INATIVAS PIC
10 QTDD-CONTAS-ATIVAS
PIC

QTDD-CONTASINATIVAS (500)

QTDD-CONTAS(500)

QTDD-CONTAS-ATIVAS
(500)

DADOS-AGENCIA(500)

9(5).
9(5).
9(5).
9(5).

A tabela ter 10000 bytes alocados na seguinte forma e sequncia: 500 elementos de 20 bytes cada (denominados DADOSAGENCIA, e compostos cada qual por 4 sub-campos : COD-AGE, QTDD-CONTAS, QTDD-CONTAS-INATIVAS e
QTDD-CONTAS ATIVAS.

Exemplo 5
TABELA-AGENCIAS
0 0 0 0 1 ...

0 6 7 8 0 0 5 3 5 6 ...

COD-AGE
(1)

COD-AGE
(500)

0 0 1 1 1 0 5 3 0 0 ...

0 4 0 8 3

QTDD-CONTAS- QTDD-CONTAS-INATIVAS
INATIVAS (1) (500)
QTDD-CONTAS
(1)

01

0 4 1 9 4 0 0 0 5 6 ...

QTDD-CONTAS
(500)

TABELA-AGENCIAS.
10 COD-AGE
10 QTDD-CONTAS
10 QTDD-CONTAS-INATIVAS
10 QTDD-CONTAS-ATIVAS

OCCURS
OCCURS
OCCURS
OCCURS

QTDD-CONTASATIVAS (1)

500
500
500
500

PIC
PIC
PIC
PIC

QTDD-CONTAS-ATIVAS
(500)

9(5).
9(5).
9(5).
9(5).

A tabela ter 10000 bytes alocados da seguinte forma e na seguinte sequncia : 2500 bytes referentes aos 500 elementos de
5 bytes cada denominados COD-AGE , seguidos por 2500 bytes referentes aos 500 elementos de 5 bytes cada denominados
QTDD-CONTAS, mais 2500 bytes referentes aos 500 elementos de 5 bytes cada denominados QTDD-CONTASINATIVAS e finalmente os 2500 bytes referentes aos 500 elementos de 5 bytes cada denominados QTDD-CONTAS
ATIVAS.

Exemplo 6
01

TABELA-AGENCIAS.
10 DADOS-POR-AGENCIA OCCURS 500.
15 DADOS-GERAIS.
20 COD-AGE PIC 9(5).
20 NOME-GERENTE PIC X(30).
15 DADOS-FINANCEIROS.
25 DEBITOS-POR-DIA OCCURS 31 PIC 9(9)V99.
25 CREDITOS-POR-DIA OCCURS 31 PIC 9(9)V99.
25 SALDO-POR-DIA
OCCURS 31 PIC 9(9)V99.

Se definida como acima, a varivel TABELA-AGENCIAS ter


500 elementos com ( (5 + 30) + (31 * 11) + (31 * 11) + (31* 11) ) bytes cada, ou seja :
500 elementos com ( (35) + (341 + 341 + 341) ) bytes cada, ou seja :
500 elementos com ( 35 + 1023) bytes cada, ou seja :
500 elementos com 1058 bytes cada, ou seja :
590.000 bytes
Ela ser composta por 500 campos denominados DADOS-POR-AGENCIA , cada qual com 1058 bytes.
Portanto, se for necessrio referenciar DADOS-POR-AGENCIA deve-se indicar o ndice ou subscritor :
DADOS-POR-AGENCIA
DADOS-POR-AGENCIA
DADOS-POR-AGENCIA
...
...
DADOS-POR-AGENCIA

(1)
(2)
(3)
(500)

Da mesma forma, se for necessrio referenciar DADOS-GERAIS ou DADOS-FINANCEIROS deve-se indicar o ndice ou
subscritor :
5

DADOS-GERAIS
DADOS-GERAIS
DADOS-GERAIS
...
...
DADOS-GERAIS

(1)
(2)
(3)

DADOS-FINANCEIROS
DADOS-FINANCEIROS
DADOS-FINANCEIROS
...
...
DADOS-FINANCEIROS

(500)

(1)
(2)
(3)
(500)

O mesmo acontece com as variveis COD-AGE e NOME-GERENTE.


As variveis DEBITOS-POR-DIA, CREDITOS-POR-DIA e SALDO-POR-DIA, por serem elementos de vetor (elas tem
OCCURS) DENTRO de outro vetor (pertencem a DADOS-POR-AGENCIA, que outro vetor), precisam de dupla
indexao : o primeiro ndice para indicar a qual dos 500 elementos DADOS-POR-AGENCIA , e o segundo ndice para
indicar, dentro do n-simo DADOS-POR-AGENCIA, a qual das 31 ocorrncias deseja-se referir.
DEBITOS-POR-DIA (1, 1)
DEBITOS-POR-DIA (1, 2)
DEBITOS-POR-DIA (1, 3)

CREDITOSD-POR-DIA (1, 1)
CREDITOSD-POR-DIA (1, 2)
CREDITOSD-POR-DIA (1, 3)

SALDO-POR-DIA (1, 1)
SALDO-POR-DIA (1, 2)
SALDO-POR-DIA (1, 3)

DEBITOS-POR-DIA
DEBITOS-POR-DIA
DEBITOS-POR-DIA
DEBITOS-POR-DIA

CREDITOSD-POR-DIA
CREDITOSD-POR-DIA
CREDITOSD-POR-DIA
CREDITOSD-POR-DIA

SALDO-POR-DIA
SALDO-POR-DIA
SALDO-POR-DIA
SALDO-POR-DIA

...

...

31)
1)
2)
3)

DEBITOS-POR-DIA
DEBITOS-POR-DIA
DEBITOS-POR-DIA
DEBITOS-POR-DIA

(2,
(3,
(3,
(3,

31)
1)
2)
3)

DEBITOS-POR-DIA
...
...
...
DEBITOS-POR-DIA
DEBITOS-POR-DIA
DEBITOS-POR-DIA

(3, 31)

CREDITOSD-POR-DIA (3, 31)

SALDO-POR-DIA (3, 31)

(500, 1)
(500, 2)
(500, 3)

CREDITOSD-POR-DIA (500, 1)
CREDITOSD-POR-DIA (500, 2)
CREDITOSD-POR-DIA (500, 3)

SALDO-POR-DIA (500, 1)
SALDO-POR-DIA (500, 2)
SALDO-POR-DIA (500, 3)

...

...

...

DEBITOS-POR-DIA (500, 31)

CREDITOSD-POR-DIA (500, 31)

SALDO-POR-DIA (500, 31)

...

(1,
(2,
(2,
(2,

31)
1)
2)
3)

(2,
(3,
(3,
(3,

31)
1)
2)
3)

...

(1,
(2,
(2,
(2,

...

...

(1)
(1)
(1,
(1,
(1,
(1,

1)
2)
3)
4)

(1,
(1,
(1,
(1,
(1,

31)
1)
2)
3)
4)

(1,
(1,
(1,
(1,

31)
1)
2)
3)

31)
1)
2)
3)

(2,
(3,
(3,
(3,

31)
1)
2)
3)

...

CREDITOSD-POR-DIA
CREDITOSD-POR-DIA
CREDITOSD-POR-DIA
CREDITOSD-POR-DIA

...

As variveis estaro alocadas na memria da seguinte forma (na sequncia indicada) :


COD-AGE
NOME-GERENTE
DEBITOS-POR-DIA
DEBITOS-POR-DIA
DEBITOS-POR-DIA
DEBITOS-POR-DIA
...
DEBITOS-POR-DIA
CREDITOS-POR-DIA
CREDITOS-POR-DIA
CREDITOS-POR-DIA
CREDITOS-POR-DIA
...
CREDITOS-POR-DIA
SALDO-POR-DIA
SALDO-POR-DIA
SALDO-POR-DIA

(1,
(2,
(2,
(2,

SALDO-POR-DIA
SALDO-POR-DIA
SALDO-POR-DIA
SALDO-POR-DIA

...

SALDO-POR-DIA
...
SALDO-POR-DIA
COD-AGE
NOME-GERENTE
DEBITOS-POR-DIA
DEBITOS-POR-DIA
DEBITOS-POR-DIA
DEBITOS-POR-DIA
...
DEBITOS-POR-DIA
CREDITOS-POR-DIA
CREDITOS-POR-DIA
CREDITOS-POR-DIA
CREDITOS-POR-DIA
...
CREDITOS-POR-DIA
SALDO-POR-DIA
SALDO-POR-DIA
SALDO-POR-DIA
SALDO-POR-DIA
...
SALDO-POR-DIA
...
...
...
...
COD-AGE
NOME-GERENTE
DEBITOS-POR-DIA
DEBITOS-POR-DIA
DEBITOS-POR-DIA
DEBITOS-POR-DIA
...
DEBITOS-POR-DIA
CREDITOS-POR-DIA
CREDITOS-POR-DIA
CREDITOS-POR-DIA
CREDITOS-POR-DIA
...
CREDITOS-POR-DIA
SALDO-POR-DIA
SALDO-POR-DIA
SALDO-POR-DIA
SALDO-POR-DIA
...
SALDO-POR-DIA

(1, 4)
(1,
(2)
(2)
(2,
(2,
(2,
(2,

31)

(2,
(2,
(2,
(2,
(2,

31)
1)
2)
3)
4)

(2,
(2,
(2,
(2,
(2,

31)
1)
2)
3)
4)

1)
2)
3)
4)

(2, 31)

(500)
(500)
(500,
(500,
(500,
(500,

1)
2)
3)
4)

(500,
(500,
(500,
(500,
(500,

31)
1)
2)
3)
4)

(500,
(500,
(500,
(500,
(500,

31)
1)
2)
3)
4)

(500, 31)

Exemplo 7
Anlogo ao exemplo anterior, mas o OCCURS de DADOS-FINANCEIROS no est em cada uma das variveis que o
compem, mas no prprio DADOS-FINANCEIROS:
01

TABELA-AGENCIAS.
10 DADOS-POR-AGENCIA OCCURS 500.
15 DADOS-GERAIS.
20 COD-AGE PIC 9(5).
20 NOME-GERENTE PIC X(30).
15 DADOS-FINANCEIROS OCCURS 31.
25 DEBITOS-POR-DIA PIC 9(9)V99.
25 CREDITOS-POR-DIA PIC 9(9)V99.
25 SALDO-POR-DIA
PIC 9(9)V99.

Se definida como acima, a varivel TABELA-AGENCIAS tambm ter 590.000 bytes :


500 elementos com ( (5 + 30) + (31 * (11 + 11 + 11) ) ) bytes cada, ou seja :
500 elementos com ( (35) + (31 * 33) ) bytes cada, ou seja :
500 elementos com ( 35 + 1023) bytes cada, ou seja :
500 elementos com 1058 bytes cada, ou seja :
590.000 bytes
Neste caso, a alocao das variveis fica da seguinte forma :
COD-AGE
NOME-GERENTE
DEBITOS-POR-DIA
CREDITOS-POR-DIA
SALDO-POR-DIA
DEBITOS-POR-DIA
CREDITOS-POR-DIA
SALDO-POR-DIA
DEBITOS-POR-DIA
CREDITOS-POR-DIA
SALDO-POR-DIA
...
...
DEBITOS-POR-DIA
CREDITOS-POR-DIA
SALDO-POR-DIA
COD-AGE
NOME-GERENTE
DEBITOS-POR-DIA
CREDITOS-POR-DIA
SALDO-POR-DIA
DEBITOS-POR-DIA
CREDITOS-POR-DIA
SALDO-POR-DIA
DEBITOS-POR-DIA
CREDITOS-POR-DIA
SALDO-POR-DIA
...
...
DEBITOS-POR-DIA
CREDITOS-POR-DIA
SALDO-POR-DIA

(1)
(1)
(1,
(1,
(1,
(1,
(1,
(1,
(1,
(1,
(1,
(1,
(1,
(1,
(2)
(2)
(2,
(2,
(2,
(2,
(2,
(2,
(2,
(2,
(2,

1)
1)
1)
2)
2)
2)
3)
3)
3)
31)
31)
31)
1)
1)
1)
2)
2)
2)
3)
3)
3)

(2, 31)
(2, 31)
(2, 31)

COD-AGE
NOME-GERENTE
DEBITOS-POR-DIA
CREDITOS-POR-DIA
SALDO-POR-DIA
DEBITOS-POR-DIA
CREDITOS-POR-DIA
SALDO-POR-DIA
DEBITOS-POR-DIA
CREDITOS-POR-DIA
SALDO-POR-DIA
...
...
DEBITOS-POR-DIA
CREDITOS-POR-DIA
SALDO-POR-DIA
...
...
...
...
...
COD-AGE
NOME-GERENTE
DEBITOS-POR-DIA
CREDITOS-POR-DIA
SALDO-POR-DIA
DEBITOS-POR-DIA
CREDITOS-POR-DIA
SALDO-POR-DIA
DEBITOS-POR-DIA
CREDITOS-POR-DIA
SALDO-POR-DIA
...
...
DEBITOS-POR-DIA
CREDITOS-POR-DIA
SALDO-POR-DIA

(3)
(3)
(3,
(3,
(3,
(3,
(3,
(3,
(3,
(3,
(3,

1)
1)
1)
2)
2)
2)
3)
3)
3)

(3, 31)
(3, 31)
(3, 31)

(500)
(500)
(500,
(500,
(500,
(500,
(500,
(500,
(500,
(500,
(500,

1)
1)
1)
2)
2)
2)
3)
3)
3)

(500, 31)
(500, 31)
(500, 31)

14.2 Exemplos de uso de vetores


Os exemplos de inicializao e construo baseada em leitura de arquivo sequencial so baseados nos vetores dos exemplos
4 e 5 do tem anterior:
01

01

TABELA-AGENCIAS.
05 DADOS-AGENCIA OCCURS 500.
10 COD-AGE
PIC
10 QTDD-CONTAS
PIC
10 QTDD-CONTAS-INATIVAS PIC
10 QTDD-CONTAS-ATIVAS
PIC
TABELA-AGENCIAS.
10 COD-AGE
10 QTDD-CONTAS
10 QTDD-CONTAS-INATIVAS
10 QTDD-CONTAS-ATIVAS

OCCURS
OCCURS
OCCURS
OCCURS

9(5).
9(5).
9(5).
9(5).
500
500
500
500

PIC
PIC
PIC
PIC

9(5).
9(5).
9(5).
9(5).

Initializao
(formatao colocando mesmo contedo em todas as variveis)

Com comando INITIALIZE (ver comando)


INITIALIZE TABELA-AGENCIAS.

Usando loop : qualquer um dos loops a seguir pode ser usado em qualquer um dos 2 vetores:
Loop com GO TO :
MOVE 1 TO IND.
VOLTA.
IF IND > 500
GO TO ACABOU.
MOVE ZERO TO COD-AGE (IND).
MOVE ZERO TO QTDD-CONTAS (IND).
MOVE ZERO TO QTDD-CONTAS-INATIVAS (IND).
MOVE ZERO TO QTDD-CONTAS-ATIVAS (IND).
ADD 1 TO IND.
GO TO VOLTA.
ACABOU.
...

Loop com PERFORM UNTIL:


MOVE 1 TO IND.
PERFORM UNTIL IND > 500
MOVE ZERO TO COD-AGE (IND)
MOVE ZERO TO QTDD-CONTAS (IND)
MOVE ZERO TO QTDD-CONTAS-INATIVAS (IND)
MOVE ZERO TO QTDD-CONTAS-ATIVAS (IND)
ADD 1 TO IND
END-PERFORM
...

10

Construo com dados lidos em um arquivo


(formatao colocando contedos oriundos de registros de um arquivo)
PROCEDURE DIVISION.
*-------------------------------------------ROTINA-PRINCIPAL SECTION.
OPEN INPUT ARQ-SEQ
MOVE ZERO TO IND
PERFORM UNTIL EOF-ARQ-SEQ = SIM
PERFORM LER-ARQ-SEQ
IF EOF-ARQ-SEQ = NO
PERFORM JOGA-DADOS-NO-VETOR
END-IF
END-PERFORM
CLOSE ARQ-SEQ
STOP RUN.
*-------------------------------------------LER-ARQ-SEQ SECTION.
READ ARQ-SEQ
AT END MOVE SIM TO EOF-ARQ-SEQ
END-READ
SAI-LER-ARQ-SEQ. EXIT.
*-------------------------------------------JOGA-DADOS-NO-VETOR SECTION.
ADD 1 TO IND
IF IND > 500
DISPLAY ESTOURO CAPACIDADE DO VETOR !
STOP RUN
END-IF
MOVE AL-COD-AGE TO COD-AGE
(IND)
MOVE AL-QTDD-CO TO QTDD-CONTAS
(IND)
MOVE AL-QTDD-CI TO QTDD-CONTAS-INATIVAS (IND)
MOVE AL-QTDD-CA TO QTDD-CONTAS-ATIVAS
(IND)
SAI-JOGA-DADOS-NO-VETOR. EXIT.
*--------------------------------------------

Pesquisa direta
(busca de dados num vetor acessando diretamente o elemento desejado)
S possvel se :
houver um campo chave
os elementos estiverem classificados por esse campo chave
houver elementos (ou espao vazio) para TODAS as chaves possveis (ex.: se o campo chave tiver 5 bytes e for
numrico, o vertor deve ter 99999 elementos); por isso, normalmente no se usa este processo para chaves
alfanumricas; somente para chaves numricas inteiras.
01
01

COD-CLI-ACHAR PIC 9(5).


TAB-CLI.
05 CLIENTE-BOM-RUIM PIC X OCCURS 99999.

...
...
MOVE 12388 TO COD-CLI-ACHAR
IF CLIENTE-BOM-RUIM (COD-CLI-ACHAR) = R
MOVE RUIM TO TIPO-CLI
ELSE
MOVE BOM TO TIPO-CLI

11

END-IF

Pesquisa (busca) sequencial


(busca de dados num vetor analisando elemento por elemento, sequencialmente, at encontrar o desejado; ou varrer todo o
vetor e descobrir que o elemento desejado no est presente; os elementos podem estar em qualquer ordem).
01
01
01

COD-CLI-ACHAR PIC 9(5).


FLAG-ACHOU-OU-NO PIC X(3).
TAB-CLI.
05 CLIENTE-ID-E-JEITO OCCURS 10000.
10 COD-CLI
PIC 99999.
10 BOM-RUIM PIC X.

...
...
MOVE 12388 TO COD-CLI-ACHAR
MOVE NAO' TO FLAG-ACHOU-OU-NAO
MOVE 1 TO IND.
PERFORM UNTIL IND > 10000
IF COD-CLI-ACHAR = COD-CLI (IND)
MOVE SIM TO FLAG-ACHOU-OU-NAO
MOVE BOM-RUIM (IND) TO TIPO-CLI
MOVE 10001 TO IND
END-IF
END-PERFORM
...
...

Pesquisa (busca) binria


(busca de dados num vetor analisando o contedo de metade do vetor de cada vez; para isso os elementos devem,
obrigatoriamente, estar classificados)
...
...
...
...

12

15 QUEBRA
15.1 Quebra de 1 nvel
Supondo um arquivo de entrada que tenha em cada registro lgico o codigo de cliente (chave) e o valor das compras , e
cujos registros sejam os a seguir (para facilitar a anlise, todos os valores das compras esto = 1,00) :
CLIENTE
VALOR
00001 00000000100
00001 00000000100
00001 00000000100
00001 00000000100
00001 00000000100
00001 00000000100
00002 00000000100
00002 00000000100
00002 00000000100
00002 00000000100
00004 00000000100
00004 00000000100
00005 00000000100
00011 00000000100

Se quisermos totalizar / sumarizar por CLIENTE (mais o Total Geral) num relatrio, deveremos imprimir algo como :
CODIGO

VALOR

00001
00002
00004
00005
00011

6,00
4,00
2,00
1,00
1,00

GERAL

14,00

O cdigo poderia ser algo como :


*-------------------------------------------DATA DIVISION.
WORKING-STORAGE SECTION.
01 AL-ARQ.
05 COD-CLI
PIC 9(5).
05 FILLER
PIC X.
05 VALCOMPRA PIC 9(9)V99.
05 FILLER
PIC X(3).
01 AI-CAB.
05 FILLER
PIC X.
05 FILLER
PIC X(22) VALUE CODIGO
01 AI-DET.
05 FILLER
PIC X.
05 I-COD-CLI PIC 9(5).
05 FILLER
PIC XXX.
05 I-VALCOMP PIC ZZZ.ZZZ.ZZ9,99.
01 AI-TOT.
05 FILLER
PIC X.
05 FILLER
PIC X(5) VALUE GERAL.
05 FILLER
PIC XXX.

13

VALOR.

05 I-T-VALCOMP PIC ZZZ.ZZZ.ZZ9,99.


01 CLI-ANT
PIC 9(5).
01 TOT-VALCOMP PIC 9(9)V99 VALUE ZERO.
01 TOT-VALTUDO PIC 9(9)V99 VALUE ZERO.
*-------------------------------------------PROCEDURE DIVISION.
ROTINA-PRINCIPAL SECTION.
OPEN INPUT ARQ-SEQ
OPEN OUTPUT ARQ-REL
PERFORM UNTIL EOF-ARQ-SEQ = SIM
PERFORM LER-ARQ-SEQ
IF EOF-ARQ-SEQ = NAO
PERFORM PROCESSA-REG
END-IF
MOVE COD-CLI TO CLI-ANT
END-PERFORM
PERFORM QUEBRA-CLIENTE
MOVE TOT-VALTUDO TO I-T-VALCOMP
WRITE AI-FD FROM AI-TOT BEFORE 1
CLOSE ARQ-SEQ
STOP RUN.
*-------------------------------------------LER-ARQ-SEQ SECTION.
READ ARQ-SEQ INTO AL-ARQ
AT END MOVE SIM TO EOF-ARQ-SEQ
END-READ.
SAI-LER-ARQ-SEQ. EXIT.
*-------------------------------------------PROCESSA-REG SECTION.
IF COD-CLI NOT = CLI-ANT
PERFORM QUEBRA-CLIENTE
END-IF
ADD VALCOMPRA TO TOT-VALCOMP.
SAI-PROCESSA-REG. EXIT.
*-------------------------------------------QUEBRA-CLIENTE SECTION.
IF W-LINS > 50
PERFORM CABEC
END-IF
MOVE CLI-ANT TO I-COD-CLI
MOVE TOT-VALCOMP TO I-VALCOMP
WRITE AI-FD FROM AI-DET BEFORE 1
MOVE SPACES TO AI-FD
WRITE AI-FD FROM AI-DET BEFORE 1
ADD 2 TO W-LINS
ADD TOT-VALCOMP TO TOR-VALTUDO
MOVE ZERO TO TOT-VALCOMP.
SAI-QUEBRA-CLIENTE. EXIT.
*-------------------------------------------CABEC SECTION.
WRITE AI-FD FROM AI-CAB BEFORE PAGE
MOVE ZERO TO W-LINS.
SAI-QUEBRA-CLIENTE. EXIT.

14

15.2 Quebra de 2 nveis


Supondo um arquivo de entrada que tenha em cada registro lgico o codigo da filial e cdigo do cliente (ambos formando o
campo chave) e o valor das compras , e cujos registros sejam os a seguir (para facilitar a anlise, todos os valores das
compras da filial 001 esto = 1,00 e os da filial 002 esto = 2,00) :
FILIAL
001
001
001
001
001
001
001
001
001
001
001
001
001
001
002
002
002
002
002
002
002
002
002
002
002
002
002
002

CLIENTE
VALOR
00001 00000000100
00001 00000000100
00001 00000000100
00001 00000000100
00001 00000000100
00001 00000000100
00002 00000000100
00002 00000000100
00002 00000000100
00002 00000000100
00004 00000000100
00004 00000000100
00005 00000000100
00011 00000000100
00001 00000000200
00001 00000000200
00001 00000000200
00001 00000000200
00001 00000000200
00001 00000000200
00003 00000000200
00003 00000000200
00003 00000000200
00003 00000000200
00003 00000000200
00003 00000000200
00004 00000000200
00005 00000000200

Se quisermos totalizar / sumarizar por FILIAL E CLIENTE (mais o Total Geral) num relatrio, deveremos imprimir algo
como :
FILIAL CLIENTE
001
001
001
001
001

00001
00002
00004
00005
00011

001
002
002
002
002
002

VALOR
6,00
4,00
2,00
1,00
1,00
14,00

00001
00003
00004
00005

TOTAL FILIAL

12,00
12,00
2,00
2,00
28,00

TOTAL FILIAL

42,00

TOTAL GERAL

15

O cdigo poderia ser algo como :


*-------------------------------------------DATA DIVISION.
WORKING-STORAGE SECTION.
01 AL-ARQ.
05 COD-FIL
PIC 9(3).
05 FILLER
PIC X.
05 COD-CLI
PIC 9(5).
05 FILLER
PIC X.
05 VALCOMPRA
PIC 9(9)V99.
05 FILLER
PIC X(14).
01 AI-CAB.
05 FILLER
PIC X.
05 FILLER
PIC X(29)
VALUE
FILIAL CODIGO
VALOR.
05 FILLER
PIC X(14)
VALUE SPACES.
01 AI-DET.
05 FILLER
PIC X.
05 I-COD-FIL
PIC 9(3).
05 FILLER
PIC XXXX
VALUE SPACES.
05 I-COD-CLI
PIC 9(5).
05 FILLER
PIC XXX
VALUE SPACES.
05 I-VALCOMP
PIC ZZZ.ZZZ.ZZ9,99.
05 FILLER
PIC X(14)
VALUE SPACES.
01 AI-TOT.
05 FILLER
PIC X.
05 FILLER
PIC X(5)
VALUE GERAL.
05 FILLER
PIC XXX
VALUE SPACES.
05 I-T-VALCOMP PIC ZZZ.ZZZ.ZZ9,99.
05 I-QUALTOT
PIC X(14)
VALUE SPACES.
01 CHAVE-ATU.
05 FIL-ATU
PIC 9(3).
05 CLI-ATU
PIC 9(5).
01 CHAVE-ANT.
05 FIL-ANT
PIC 9(3).
05 CLI-ANT
PIC 9(5).
01 TOT-VCOMP-CLI PIC 9(9)V99 VALUE ZERO.
01 TOT-VCOMP-FIL PIC 9(9)V99 VALUE ZERO.
01 TOT-VCOMP-GER PIC 9(9)V99 VALUE ZERO.
*-------------------------------------------PROCEDURE DIVISION.
ROTINA-PRINCIPAL SECTION.
OPEN INPUT ARQ-SEQ
OPEN OUTPUT ARQ-REL
PERFORM UNTIL EOF-ARQ-SEQ = SIM
PERFORM LER-ARQ-SEQ
IF EOF-ARQ-SEQ = NAO
PERFORM PROCESSA-REG
END-IF
MOVE CHAVE-ATU TO CHAVE-ANT
END-PERFORM
PERFORM QUEBRA-CLIENTE
PERFORM QUEBRA-FILIAL
PERFORM QUEBRA-GERAL
CLOSE ARQ-SEQ
STOP RUN.
*--------------------------------------------

16

LER-ARQ-SEQ SECTION.
READ ARQ-SEQ INTO AL-ARQ
AT END MOVE SIM TO EOF-ARQ-SEQ
END-READ
MOVE COD-FIL TO FIL-ATU
MOVE COD-CLI TO CLI-ATU.
SAI-LER-ARQ-SEQ. EXIT.
*-------------------------------------------PROCESSA-REG SECTION.
IF CHAVE-ATU NOT = CHAVE-ANT
PERFORM QUEBRA-CLIENTE
MOVE COD-CLI TO CLI-ATU
END-IF
IF CHAVE-ATU NOT = CHAVE-ANT
PERFORM QUEBRA-FILIAL
MOVE COD-FIL TO FIL-ATU
END-IF
ADD VALCOMPRA TO TOT-VCOMP-CLI.
SAI-PROCESSA-REG. EXIT.
*-------------------------------------------QUEBRA-CLIENTE SECTION.
IF W-LINS > 50
PERFORM CABEC
END-IF
MOVE TOT-VCOMP-CLI TO I-T-VALCOMP
WRITE AI-FD FROM AI-TOT BEFORE 1
MOVE SPACES TO AI-FD
WRITE AI-FD FROM AI-TOT BEFORE 1
ADD 2 TO W-LINS
ADD TOT-VCOMP-CLI TO TOT-VCOMP-FIL.
MOVE ZERO TO TOT-VCOMP-CLI.
SAI-QUEBRA-CLIENTE. EXIT.
*-------------------------------------------QUEBRA-FILIAL SECTION.
IF W-LINS > 50
PERFORM CABEC
END-IF
MOVE TOT-VCOMP-FIL TO I-T-VALCOMP
WRITE AI-FD FROM AI-TOT BEFORE 1
MOVE SPACES TO AI-FD
WRITE AI-FD FROM AI-TOT BEFORE 1
ADD 2 TO W-LINS
ADD TOT-VCOMP-FIL TO TOT-VCOMP-GER
MOVE ZERO TO TOT-VCOMP-FIL.
SAI-QUEBRA-FILIAL. EXIT.
*-------------------------------------------QUEBRA-GERAL SECTION.
IF W-LINS > 50
PERFORM CABEC
END-IF
MOVE TOT-VCOMP-GER TO I-T-VALCOMP
WRITE AI-FD FROM AI-TOT BEFORE 1
SAI-QUEBRA-GERAL. EXIT.
*-------------------------------------------CABEC SECTION.
WRITE AI-FD FROM AI-CAB BEFORE PAGE
MOVE ZERO TO W-LINS.
SAI-CABEC. EXIT.

17

15.3 Quebra de 3 nveis


Supondo um arquivo de entrada que tenha em cada registro lgico o codigo da filial e cdigo do cliente (ambos formando o
campo chave) e o valor das compras , e cujos registros sejam os a seguir (para facilitar a anlise, todos os valores das
compras da filial 001 esto = 1,00 e os da filial 002 esto = 2,00) :
EMPRESA FILIAL CLIENTE
001
001
001
001
001
001
001
001
001
001
001
001
001
001
001
001
001
001
001
001
001
001
001
001
001
001
001
001
002
002
002
002
002
002
002
002
002
002
002
002
002
002
002
002
002
002
002
002
002
002
002
002
002
002
002
002

001
001
001
001
001
001
001
001
001
001
001
001
001
001
002
002
002
002
002
002
002
002
002
002
002
002
002
002
001
001
001
001
001
001
001
001
001
001
001
001
001
001
002
002
002
002
002
002
002
002
002
002
002
002
002
002

00001
00001
00001
00001
00001
00001
00002
00002
00002
00002
00004
00004
00005
00011
00001
00001
00001
00001
00001
00001
00003
00003
00003
00003
00003
00003
00004
00005
00001
00001
00001
00001
00001
00001
00002
00002
00002
00002
00004
00004
00005
00011
00001
00001
00001
00001
00001
00001
00003
00003
00003
00003
00003
00003
00004
00005

VALOR

00000000100
00000000100
00000000100
00000000100
00000000100
00000000100
00000000100
00000000100
00000000100
00000000100
00000000100
00000000100
00000000100
00000000100
00000000200
00000000200
00000000200
00000000200
00000000200
00000000200
00000000200
00000000200
00000000200
00000000200
00000000200
00000000200
00000000200
00000000200
00000000100
00000000100
00000000100
00000000100
00000000100
00000000100
00000000100
00000000100
00000000100
00000000100
00000000100
00000000100
00000000100
00000000100
00000000200
00000000200
00000000200
00000000200
00000000200
00000000200
00000000200
00000000200
00000000200
00000000200
00000000200
00000000200
00000000200
00000000200

18

Se quisermos totalizar / sumarizar por EMPRESA e FILIAL e CLIENTE (mais o Total Geral) num relatrio, deveremos
imprimir algo como :
EMPRESA FILIAL CLIENTE
001
001
001
001
001

001
001
001
001
001

00001
00002
00004
00005
00011

001
001
001
001
001

002
002
002
002

00001
00003
00004
00005

001
001
001
001
001
001

00001
00002
00004
00005
00011

001
002
002
002
002

002
002
002
002

6,00
4,00
2,00
1,00
1,00
14,00

002

002
002
002
002
002

VALOR

12,00
12,00
2,00
2,00
28,00

TOTAL FILIAL

42,00

TOTAL EMPRESA

6,00
4,00
2,00
1,00
1,00
14,00

00001
00003
00004
00005

002
002

TOTAL FILIAL

TOTAL FILIAL

12,00
12,00
2,00
2,00
28,00

TOTAL FILIAL

42,00

TOTAL EMPRESA

84,00

TOTAL GERAL

O cdigo poderia ser algo como :


*-------------------------------------------DATA DIVISION.
WORKING-STORAGE SECTION.
01 AL-ARQ.
05 COD-EMP
PIC 9(3).
05 FILLER
PIC X.
05 COD-FIL
PIC 9(3).
05 FILLER
PIC X.
05 COD-CLI
PIC 9(5).
05 FILLER
PIC X.
05 VALCOMPRA
PIC 9(9)V99.
05 FILLER
PIC X(14).
01 CHAVE-ATU.
05 EMP-ATU
PIC 9(3).
05 FIL-ATU
PIC 9(3).
05 CLI-ATU
PIC 9(5).

19

01

CHAVE-ANT.
05 EMP-ANT
PIC 9(3).
05 FIL-ANT
PIC 9(3).
05 CLI-ANT
PIC 9(5).
01 TOT-VCOMP-CLI PIC 9(9)V99 VALUE ZERO.
01 TOT-VCOMP-FIL PIC 9(9)V99 VALUE ZERO.
01 TOT-VCOMP-EMP PIC 9(9)V99 VALUE ZERO.
01 TOT-VCOMP-GER PIC 9(9)V99 VALUE ZERO.
*-------------------------------------------PROCEDURE DIVISION.
ROTINA-PRINCIPAL SECTION.
OPEN INPUT ARQ-SEQ
OPEN OUTPUT ARQ-REL
PERFORM UNTIL EOF-ARQ-SEQ = SIM
PERFORM LER-ARQ-SEQ
IF EOF-ARQ-SEQ = NAO
PERFORM PROCESSA-REG
END-IF
MOVE CHAVE-ATU TO CHAVE-ANT
END-PERFORM
PERFORM QUEBRA-CLIENTE
PERFORM QUEBRA-FILIAL
PERFORM QUEBRA-EMPRESA
PERFORM QUEBRA-GERAL
CLOSE ARQ-SEQ
STOP RUN.
*-------------------------------------------LER-ARQ-SEQ SECTION.
READ ARQ-SEQ INTO AL-ARQ
AT END MOVE SIM TO EOF-ARQ-SEQ
END-READ
MOVE COD-EMP TO EMP-ATU
MOVE COD-FIL TO FIL-ATU
MOVE COD-CLI TO CLI-ATU.
SAI-LER-ARQ-SEQ. EXIT.
*-------------------------------------------PROCESSA-REG SECTION.
IF CHAVE-ATU NOT = CHAVE-ANT
PERFORM QUEBRA-CLIENTE
MOVE COD-CLI TO CLI-ATU
END-IF
IF CHAVE-ATU NOT = CHAVE-ANT
PERFORM QUEBRA-FILIAL
MOVE COD-FIL TO FIL-ATU
END-IF
IF CHAVE-ATU NOT = CHAVE-ANT
PERFORM QUEBRA-EMPRESA
MOVE COD-FIL TO FIL-ATU
END-IF
ADD VALCOMPRA TO TOT-VCOMP-CLI.
SAI-PROCESSA-REG. EXIT.
*--------------------------------------------

20

You might also like