Sunteți pe pagina 1din 64

postila de

Cobol I
ndice
Explanao de um fonte Cobol 2
rea de numerao sequencial 2
rea de indicao 2
rea A e B 3
Identification Diision !
Data Diision !
"rocedure Diision !
Comandos condicionais #
C$lculos aritm%ticos &'
(aos &!
)ari$eis &*
Alfab%tica 2&
+um%rica 2&
Alfanum%rica 22
,corr-ncias 23
Exibindo e aceitando informa.es do
usu$rio 2!
Comunicao entre pro/ramas 20
1ratamento e arma2enamento de
informa.es 3'
3equential 3'
(ine 3equential 32
4elatie 32
Indexed 33
Confi/uration 3ection 3!
Input5,utput 3ection 3!
4A+D,6 7Aleat8rio9 3:
3E;<E+1IA( 73eq=encial9 3:
D>+A6IC 7Din?mico9 3:
6anipulando as informa.es 3@
Araando noas informa.es 30
4e/raando noas informa.es 30
Apa/ando informa.es !'
Consultando informa.es !'
BecCando os arquios !!
,rdenando as informa.es !!
Impresso !:
Ambientes multiusu$rio 74edes9 !0
18picos adicionais #&
1ratamentos de dados alfanum%ricos #&
4ecuperando arquios corrompidos #!
Explanao de um fonte Cobol
Todo programa escrito na linguagem Cobol possua algumas regras rgidas a serem
seguidas como uma redao que possui incio, meio e fim, mas isto j opcional, com o
advento de novas tecnologias possvel escrever um cdigo fonte em free format, ou
seja, no necessrio seguir todas as regras da linguagem. cdigo fonte possui quatro
divis!es que devem ser utili"adas nesta ordem# $%&'T$($C)T$' %$*$+$',
&'*$,'-&'T %$*$+$', %)T) %$*$+$' e .,C&%/,& %$*$+$'.
&stas divis!es devem ser escritas seguindo algumas regras de posicionamento#
0 000 00 0
....0....1....0....2....0....3....0....4....0....5....0....6....0....7....0...
Colunas de 1 a 6# 8rea de numerao sequencial
Coluna 7# 8rea de indicao
Colunas de 9 a 11# 8rea )
Colunas de 12 a 72# 8rea :
.ode;se digitar at a coluna 9< mas tudo que for digitado entre 73 e 9<, ser
considerado como um comentrio.
rea de numerao sequencial
'ormalmente consiste em seis dgitos em ordem crescente que normalmente so
utili"ados para marcas de identificao do fonte. +egundo as regras no )'+95 pode;se
tambm colocar comentrios nesta rea. )lm disso podemos colocar um asterisco na
coluna 1 =um> ou qualquer outro caractere onde sua representao )+C$$ seja menor do
que 2< =&+.)?>, fa"endo com que a lin@a inteira seja considerada como um
comentrio.
rea de indicao
/m @fen =;> nesta posio indica que eAiste uma continuao de uma cadeia de
caracteres que foi iniciada na lin@a anterior, ou seja, quando desejamos atribuir um
valor inicial a uma varivel em sua declarao ou quando desejamos eAibir um teAto
muito eAtenso. pcionalmente podemos colocar o teAto inteiro na lin@a de baiAo para
no termos que quebra-lo.
/m asterisco =B> indica que toda a lin@a deve ser tratada como um comentrio.
/ma barra =C> alm de tratar a lin@a como comentrio far com que ao gerar um arquivo
de listagem =.D+T> ser adicionado um salto de pgina para impress!es.
/m dlar =E> indicar ao compilador que a lin@a ter diretivas de compilao ou
compilao condicional. &stas diretivas so utili"adas para modificar o comportamento
e compatibilidade dos programas no ambiente -erant -icro (ocus.
rea A e B
riginalmente @avia uma separao do que poderia ser escrito na rea ) e na rea :,
com o advento do )'+95 isto no eAiste mais. &sta distino implicava que as divis!es,
se!es, declarao de variveis e pargrafos do programa eram os Fnicos que podiam
utili"ar a rea ) e outros comandos a rea :.
*amos analisar o cdigo fonte a seguir#
....0....1....0....2....0....3....0....4....0....5....0....6....0....7..
identification division.
program;id. Calc)rea.
aut@or. %T+ Datin )merica +oftGare.
B
data division.
GorHing;storage section.
77 largura pic I=<<3> value "eros.
77 altura pic I=<<3> value "eros.
77 area;result pic I=<<6> value "eros.
B
procedure division.
inicio.
displaJ erase
displaJ KCalculo de area =LuadradosC,etangulos>K at <521
displaJ KDargura# K at 1<1<
displaJ K)ltura # K at 121<
accept largura at 1<1I
accept altura at 121I
multiplJ largura bJ altura giving area;result
displaJ K)rea # K at 141< area;result
stop run
.
Identification Diision
%iviso de identificao do programa. &sta diviso possui a seguinte estrutura#
$%&'T$($C)T$' %$*$+$'.
.,M,)-;$%. nome;programa.
)/TN,. comentrio.
$'+T)DD)T$'. comentrio.
%)T&;O,$TT&'. comentrio.
%)T&;C-.$D&%. comentrio.
+&C/,$TP. comentrio.
Todos os comandos que possuem a palavra comentrio na frente, no possuem nen@um
efeito na aplicao, so apenas parQmetros opcionais para documentao do programa,
mas, caso queira utili"ar algum deve ser escrito corretamente para que no cause erro de
compilao. %eve;se optar em deiAar o parQmetro nome;programa com o mesmo nome
eAterno do fonte, pois, este parQmetro ser utili"ado para identificao em memria aps
a primeira carga, ou seja, quando c@amamos um programa, o primeiro local de pesquisa
feita pelo compilador ser em memria e caso no encontre ele ir procurar no disco e
carreg;lo na memria, aps isto, toda ve" em que o programa for c@amado de novo no
ser necessrio a pesquisa em disco, pois, o programa j estar na memria =caso no
ten@a sido cancelado>, agora vejamos o seguinte eAemplo#
.rograma C@amador
.rograma C@amado 1
.rograma C@amado 2
.rograma C@amador =.rincipal.cbl> se trata de um programa :atc@ que ir
eAecutar um processo isolado de tratamento dos dados e ele ir eAecutar o
.rograma C@amado 1 =.rog1.cbl>, quando o .rog1 voltar o controle ao .rincipal este
c@amar o .rograma C@amado 2 =.rog2.cbl> e este .rog2 foi criado a partir de uma
cpia de .rog1 e o programador esqueceu de modificar o seu .rogram;$% deiAando;o
com .rog1, bem, a confuso ir comear quando o .rincipal for c@amar o .rog1
novamente, como o .rog2 possui a mesma referRncia de identificao de .rog1 o
compilador ir eAecutar o .rog2 imaginando que se trata do .rog1.
Data Diision
%iviso voltada Fnica e eAclusivamente S definio de estruturas de registros, variveis
e constantes do programa, ou seja, uma rea de alocao de memria para todo o espao
necessrio ao seu programa.
&sta diviso possui a OorHing;+torage +ection. &sta seo da %ata %ivision voltada
para a declarao das variveis e constantes do programa.
Todos os nomes utili"ados no programa devem ser eAclusivos, eAistem meios de
quebrar esta regra conforme visto posteriormente, e de no mAimo trinta caracteres,
caso o nome de algum elemento ultrapasse estes trinta caracteres simplesmente ter seu
eAcedente ignorado pelo compilador.
77 largura pic I=<<3> value "eros.
&sta lin@a est declarando uma varivel c@amada largura de 3 posi!es numricas e l@e
atribui como valor inicial# "ero. nFmero 77 S frente indica o nvel da varivel. $sto
ser discutido mais S frente.
"rocedure Diision
&sta diviso controla a eAecuo do programa, onde colocamos os comandos a serem
eAecutados em uma ordem lgica. &sta eAecuo controlada por pargrafos =eAiste um
c@amado $'$C$ no programa eAemplo> eles funcionam como identifica!es de blocos
de comandos.
displaJ erase
comando display utili"ado para eAibir informa!es na tela em ambientes caracteres.
) palavra reservada erase utili"ada em conjunto com displaJ para limpar a tela.
displaJ KCalculo de area =LuadradosC,etangulos>K at <521
&sta forma de utili"ao do displaJ ir eAibir na tela a cadeia de caracteres entre as
aspas =T T> na posio especificada por at 0521, ou seja, lin@a 5 e coluna 21 que so
compreendidas entre lin@as de 1 a 25 e colunas de 1 a 9<.
accept largura at 1<1I
&ste comando utili"ado para aceitarmos alguma informao, neste caso estaremos
esperando que usurio informe algo na posio 1<1I =+eguem as mesmas regras do
comando displaJ>, o usurio indica para a aplicao que terminou de fornecer estar
informa!es pressionando a tecla &'T&,.
multiplJ largura bJ altura giving area;result
comando multiply um dos comandos aritmticos da linguagem, ele utili"ado para
fun!es de multiplicao, neste caso ele ir multiplicar o conteFdo numrico da varivel
largura por altura movendo o resultado para a varivel rea-result.
stop run
&ste comando encerra a aplicao, na verdade o run um parQmetro do comando stop
onde podemos substituir o run por uma cadeia de caracteres =string>. .or eAemplo# stop
TTesteUV. &ste comando ir eAibir a mensagem e esperar por um &'T&, para que seja
finali"ado.
Todo pargrafo deve possuir um ponto final ou o Fltimo comando deve possuir um
ponto. &m vers!es anteriores da linguagem o ponto era obrigatrio para cada comando.
&Aerccios#
1W ; %igite o programa ilustrado em um &Aerc1.cbl e eAecute;o.
2W ; )ltere o &Aerc1.cbl fa"endo com que todos os displaJXs e acceptXs fiquem duas
lin@as mais abaiAo na sua apresentao e eAecute;o.
Comandos condicionais
s programas sempre necessitam tomar decis!es sobre que rumo tomar em certas
circunstQncias. .ara que o programa possa fa"er isto eAistem dois comandos
condicionais# o IF e o EVA!A"E#
) estrutura do IF #
comando IF
utili"ado para tomadas
de decis!es simples do
tipo #e for $erdade
fa%a isto #en&o fa%a
aquilo, condition indica
a condio a ser
avaliada e se for
verdade o comando
statement-1 ser eAecutado, caso a avaliao da condio no seja verdadeira o IF
eAecutar o statement-2 caso o mesmo eAista, caso contrrio simplesmente o compilador
ir eAecutar o prAimo comando. .or eAemplo#
...
if nome equal T():$V
displaJ nome
else
displaJ T%escon@ecido...V
end;if
...
'este eAemplo, caso a varivel nome se'a igual a (FA)I*+ ento o comando display
nome ser eAecutado, caso contrrio ser eAecutado o comando display
(,escon-ecido...+. 'ote que neste eAemplo no foi utili"ada a clusula "/E0 pois a
mesma opcional. utro detal@e importante referente ao ponto, caso o programador
opte em adotar um ponto por comando, ele deve se atentar no seguinte#
BY $sto esta erradoZZZ
...
if nome equal T():$V.
displaJ nome.
else.
displaJ T%escon@ecido...V.
end;if.
...
BY $sto esta certoZZZ
...
if nome equal T():$V
displaJ nome
else
displaJ T%escon@ecido...V
end;if.
...
comando IF ir considerar como o fim de seus comandos a clusula E0,-IF ou o
primeiro ponto encontrado.
.ara as condi!es vlidas temos#
Condio Smbolo Clusula
$gual [ E1!A
-enor que \ E## "/A0
-enor igual que \[ E## "/A0 *2 E1!A "*
-aior que Y 32EA"E2 "/A0
-aior igual que Y[ 32EA"E2 "/A0 *2 E1!A "*
%iferente \Y 0*" E1!A ou !0E1!A "*
.ara condi!es de '], ou seja, n&o 4 igual, n&o 4 diferente, basta preceder com a
clusula 'T. Todos os eAemplos a seguir so vlidos#
...
if nome 'T &L/)D T():$V
displaJ nome
end;if
...
...
if nome /'&L/)D T():$V
displaJ nome
end;if
...
...
if nome &L/)D T():$V )'% estado &L/)D T+.V
displaJ nome
end;if
...
...
if nome &L/)D T():$V , estado &L/)D T+.V
displaJ nome
end;if
...
...
if =nome &L/)D T():$V )'% estado &L/)D T+.V> , idade Y 2<
displaJ nome
end;if
...
) estrutura
do
EVA!A"E
#
) clusula
E$aluate
possui um
sofisticado
mecanismo
de anlises
condicionais
, onde
podemos
utili"ar as
mesmas
condi!es
aceitas pela
clusula IF e
alm disso
algumas
clusulas
prprias do
comando.
A#* indica
que
&*)D/)T& dever analisar duas condi!es distintas simultaneamente. .odemos
tambm utili"ar a instruo "2!E e FA#E, que indicaro que a anlise dever ser feita
nas entradas 5/E0. 5/E0 *"/E2 uma alternativa caso nen@uma das condi!es de
5/E0 gere um "2!E na avaliao. Todos os eAemplos a seguir so vlidos#
...
&valuate true
O@en nome equal T():$V
%isplaJ TTeste 1V
O@en nome equal TD&)'%,V
%isplaJ TTeste 2V
O@en nome equal TD&'),%V
%isplaJ TTeste 3V
O@en ot@er
%isplaJ T&rro...V
&nd;evaluate
...
...
&valuate nome
O@en T():$V
%isplaJ TTeste 1V
O@en TD&)'%,V
%isplaJ TTeste 2V
O@en TD&'),%V
%isplaJ TTeste 3V
O@en ot@er
%isplaJ T&rro...V
&nd;evaluate
...
...
&valuate numero
O@en 1
%isplaJ TTeste 1V
O@en 2 t@ru 5
%isplaJ TTeste 2V
O@en 6
%isplaJ TTeste 3V
O@en ot@er
%isplaJ T&rro...V
&nd;evaluate
...
...
&valuate numero also nome
O@en 1 also T():$V
%isplaJ TTeste 1V
O@en 2 t@ru 5 also TD&)'%,V
%isplaJ TTeste 2V
O@en 6 also TD&'),%V
%isplaJ TTeste 3V
O@en ot@er
%isplaJ T&rro...V
&nd;evaluate
...
&Aerccios#
1W ; Copie o &Aerc1.cbl para um &Aerc2.cbl e faa uma condio para quando rea;
result for menor do que 1<< eAiba T)rea =peq>V e caso contrrio T)rea =gnd>V.
Clculos aritmticos
) linguagem Cobol possui rotinas que auAiliam o programador a efetuar clculos
aritmticos, so eles#
A,,# /tili"ado para somar valores, sua sintaAe #
(ormato 1#
(ormato 2#
(ormato 3#
Identifier-16
Identifier-2 e Identifier-7 representam variveis numricas. iteral-1 e iteral-2
representam valores fiAos, ou seja, o nFmero escrito no programa. 2ounded indica ao
comando que os valores decimais devem ser arredondados, caso esta palavra reservada
no seja indicada o compilador ir truncar estes valores, ou seja, um valor 1<.25
truncado ficar como 1<.2. 3IVI03 indica que utili"aremos uma varivel como
repositrio do resultado obtido pela soma de Identifier-1 com Identifier-2, caso 3IVI03
no seja especificado o Identifier-2 ser afetado pelo comando, ou seja, ele ser
utili"ado para o resultado da soma. Imperati$e-statement-1 e Imperati$e-statement-2
indicam que algum comando dever ser eAecutado, desde que este comando no seja de
anlise condicional, por eAemplo, um $(. ' +$^& &,,, ocorrer sempre que o
Indentifier-2 ou Indentifier-7 no comportarem o valor especificado e 'T ' +$^&
&,,, ocorrer na situao de normalidade do processo. 8*22E#9*0,I03
utili"ado para somar uma T):&D) inteira, ou seja, podemos construir tabelas nas
defini!es das variveis e com este recurso do comando somar a tabela de uma Fnica
ve", sem a necessidade da construo de laos para somar item a item. E0,-A,,
opcional. A0#:5 indica que est uma conveno nova e *#V# uma conveno
antiga utili"ada no ;ainFrame.
#!)"2A8"# /tili"ado para subtrair valores, sua sintaAe #
(ormato 1#
(ormato 2#
(ormato 3#
+egue as mesmas
regras do comando
)%%.
;!"I9<# /tili"ado para multiplicar valores, sua sintaAe #
(ormato 1#
(ormato 2#
+egue as mesmas regras do comando )%%.
,IVI,E# /tili"ado para dividir valores, sua sintaAe #
(ormato 1#
(ormato 2#
(ormato 3#
(ormato 4#
(ormato 5#
Luando utili"a;se a
palavra reservada )<
estamos informando
que se trata de uma
diviso do Identifier-1 pelo Identifier-2. /tili"ando a palavra reservada I0"*
invertemos a situao. 2E;AI0,E2 indica que o comando ,IVI,E no dever truncar
o resultado e mover o resto para o Idenfifier-=, desde que o Idenfifier-2 =caso M$*$'M
no seja especificado> ou Identifier-7 no ten@am casas decimais.
8*;9!"E# /tili"ado para calcular valores, sua sintaAe #
(ormato 1#
.odemos utili"ar
qualquer eApresso
aritimtica vlida
=eAcluindo;se
c@aves T_`V e
colc@etes TabV>
para que o
8*;9!"E a
eAecute. s sinais
esperados so#
c )dicionar
+ubtrair
B -ultiplicar
C %ividir
BB &Aponenciao
&sta eApresso tambm poder conter T.arRntesesV = >.
.or eAemplo#
C-./T& resultado [ 2 c 3 B 4 d = 3 c 4 >
Laos
&Aistem basicamente dois tipos de programas, os on-line e batc-, os programas de
denominao on-line so aqueles que funcionam com interao direta e eAclusiva de um
usurio controlando;o. s programas denominados batc- so programas que podem ser
c@amados a partir destes programas on-line =muitos programas on-line no utili"am
programas batc-> mas em sua grande maioria so programas de uso restrito de usurios
de reas responsveis pelo controle e qualidade das informa!es =C.%>, onde estes
programas so iniciados e podem no solicitar nada para eAecutar seus trabal@os e
simplesmente informar apenas o trmino do processo ou solicitar apenas algumas
informa!es essenciais para fa"er o trabal@o. &stes programas inevitavelmente tero que
eAecutar um determinado grupo de comandos e condi!es para cada registro de uma
base de informa!es =base de dados nativa ou bancos de dados>, isto , controlados por
la%os, so dispositivos fornecidos pela linguagem para que possamos eAecutar os
mesmos comandos com dados diferentes at que uma determinada condio seja
satisfeita, por eAemplo, o fim dos registros a serem tratados.
&Aistem dois comandos utili"ados para controle de la%os o 9E2F*2; e o 3* "*, o
comando perform possui mecanismos mais apurados para tratamento de laos e o go to
muito mais simples e tambm con@ecido como o Tpatin-o feio+ entre os
programadores da linguagem 8obol por possibilitar fa"er o desvio da eAecuo de
pargrafo tornando a manuteno de cdigos, muito mais compleAa e trabal@osa.
) diferena mais destacada entre estes dois comandos que quando o 9E2F*2;
eAecuta um pargrafo ele retorna para eAecutar o prAimo comando e o 3* "* no fa"
isto, ele simplesmente desvia a eAecuo.
&Aemplo de um .&,(,-#
BY se o valor de numero for igual a 1 eAecuta o paragrafo;1
BY antes de eAibir T.rocesso oH...V
$f numero not equal 1
.erform paragrafo;1
&nd;if
displaJ T.rocesso oH...V
...
&Aemplo de um M T#
BY se o valor de numero for igual a 1 nao eAibe
BY T.rocesso oH...V
$f numero not equal 1
Mo to paragrafo;1
&nd;if
displaJ T.rocesso oH...V
...
) seguir vamos ver a estrutura do comando 9erform#
(ormato 1#
(ormato 2#
(ormato 3#
(ormato 4#
"/2*!3/ e
"/2! so
equivalentes,
procedure-name-1
e procedure-name-
2 so nomes de
pargrafos a serem
eAecutados. Caso
opte;se em utili"ar
um imperati$e-
statement-1, ou
seja, um comando
a ser eAecutado
vrias ve"es no
pode;se utili"ar o
nome de
pargrafos em
conjunto. E0,-
9E2F*2; indica o trmino dos comandos a serem eAecutados dentro do lao in-line,
logo quando se utili"a algum pargrafo no permitido a utili"ao de E0,-
9E2F*2;. Identifier-1 ou Integer-1 em conjunto com "I;E# indica que o lao deve
ser eAecutado um determinado nFmero de ve"es. 5I"/ "E#" )EF*2E =padro>e
5I"/ "E#" AF"E2 informam ao lao se o testes condicionais devem ser feitos antes
ou depois de uma nova eAecuo. !0"I determina uma condio de trmino do lao,
esta condio respeitar a determinao de 5I"/ "E#" AF"E2, se for especificado
&e$T ao invs de uma condio para /'T$D quando estiver eAecutando um pargrafo
ele s poder ser encerrado com um #"*9 2!0 ou E>I" 92*32A; =este Fltimo
comando tem a mesma funo de #"*9 2!0 para um programa secundrio, ou seja,
eAecutado por outro programa>, quando estamos eAecutando um lao in-line ele s ser
encerrado aps a eAecuo de um E>I" 9E2F*2; ou 3* "*. VA2<I03 far com que
o lao incremente uma varivel numrica identificada por Identifier-2 a partir de
Identifier-7 com um incremento especificado em Identifier-= at que uma condio seja
verdadeira, condio essa especificada em condition-1, esta condio no precisa ter
necessariamente a mesma varivel envolvida em VA2<I03. )(T&, possui as mesmas
caractersticas tcnicas de VA2<I03 com seu funcionamento acionado para cada valor
diferenciado na varivel especificada em VA2<I03.
) seguir, vamos ver a estrutura do comando 3o "o#
(ormato 1#
(ormato 2#
&ste comando fa" um desvio para
outro pargrafo do programa no dando continuidade aos comandos que eAistirem
abaiAo dele no pargrafo onde foi eAecutado. Caso seja utili"ado a clusula
,E9E0,I03 *0 a varivel numrica identificada por identifier ter um nFmero de
correspondRncia de qual pargrafo ser eAecutado, ou seja, se for especificada uma lista
com trRs nomes de pargrafos e a varivel for igual a 3 ento o terceiro pargrafo ser
eAecutado.
&Aemplo de um lao#
identification division.
program;id. Daco.
aut@or. %T+ Datin )merica +oftGare.
B
data division.
GorHing;storage section.
<1 %ata+istema.
1< )no+istema pic I=<<4> value "eros.
1< -es+istema pic I=<<2> value "eros.
1< %ia+istema pic I=<<2> value "eros.
77 Contador pic I=<<3> value "eros.
B
procedure division.
inicio.
displaJ erase
perform pega;data;sistema
perform eAibe;tela
perform varJing contador from 1 bJ 1
until contador Y 1<
displaJ KContador# K contador
end;perform
stop run
.
B
pega;data;sistema.
accept datasistema from date JJJJmmdd
.
B
eAibe;tela.
displaJ K.rograma batc@...K
displaJ K%ata de eAecucao# K diasistema KCK messistema KCK
anosistema
displaJ K K
.
)nlise do fonte#
perform pega;data;sistema
&ste perform ir eAecutar um pargrafo c@amado pega;data;sistema e retornar para o
prAimo comando que outro perform que eAecuta um pargrafo c@amado e?ibe-tela. f
o tipo de perform mais simples.
perform varJing contador from 1 bJ 1
until contador Y 1<
displaJ KContador# K contador
end;perform
&ste um perform in-line, ou seja, todo o processo ser feito sem a eAecuo de um
pargrafo, alm de incrementar o valor de contador, que uma varivel da rea de
5or@ing-#torage a partir de 1 em 1 at que =until> o seu valor seja maior do que 1<.
%urante esta eAecuo sero feitos diversos displays eAibindo o valor da varivel,
encontrando End-9erform indicar o fim dos comandos a serem eAecutados neste lao.
Variveis
<1 %ata+istema.
1< )no+istema pic I=<<4> value "eros.
1< -es+istema pic I=<<2> value "eros.
1< %ia+istema pic I=<<2> value "eros.
&sta declarao ir criar uma varivel numrica c@amado %ata+istema de 9 =oito>
posi!es, mas para tornar a manipulao dos dados, mais fcil, ns a subdividimos em
trRs variveis distintas, desta forma podemos acessar facilmente diferentes posi!es da
varivel. &sta facilidade denominada de Mrupo, um grupo de itens =variveis> pode
conter subgrupos. &stes grupos possuem nFmeros de nveis que identificam seu nvel
dentro do grupo. &stes nveis variam de 1 a 4I, quanto menor o nFmero maior o seu
nvel, por eAemplo#
<1 &ndereco.
1< TeAto pic A=<3<>.
1< 'umero pic I=<<6>.
$sto cria uma varivel c@amada Endere%o que aloca 36 bJtes de memria composta por
duas referRncias, "e?to que acessa os primeiros trinta bJtes de Endere%o que iro
possuir um conteFdo alfanumrico =A> e 0umero com seis bJtes numricos. &Aistem
ainda os nveis especiais 66, 77, 79 e 99.
nvel 66 utili"ado para renomear outras variveis do programa, este nvel utili"ado
da seguinte forma#
$sto Ftil quando
queremos por
eAemplo utili"ar
apenas o mRs e o
dia de uma data#
<1 %ata+istema.
1< )no+istema pic I=<<4> value "eros.
1< -es+istema pic I=<<2> value "eros.
1< %ia+istema pic I=<<2> value "eros.
66 -es%ia+istema renames -es+istema t@ru %ia+istema.
%esta forma acessando a varivel ;es,ia#istema estaremos enAergando o conteFdo das
variveis ;es#istema e ,ia#istema.
nvel 77 utili"ado para declarar variveis que no iro possuir sub;itens, este nvel
utili"ado da mesma forma que o nvel <1.
nvel 79 utili"ado para declarar constantes, ou seja, so referRncias que no podem
ter o seu conteFdo alterado no programa. +ua estrutura #
'esta
declarao
informado o
nome da
constante e
seu valor.
iteral-5
representa
uma string a ser associada. 0E>" indica que esta varivel ter a posio de offset
referente ao segundo bJte da declarao anterior, por eAemplo#
<1 A1 pic A=1<>.
<1 A2 redefines A1 pic A.
79 neAt;offset value neAt.
<1 A3 pic AA.
'este eAemplo, a constante neAt;offset ter em sua representao a referRncia do
segundo bJte da varivel A1.
#"A2" *F data-name-1 indica que a constante ter a posio de offset da varivel
informada em data-name-1.
E03"/ *F data-name-2 indica que a constante ter o taman@o alocado pela varivel
informada em data;name;2.
nvel 99 utili"ado para representa!es de VE2,A,EI2* e FA#*, sua sintaAe#
&ste nvel
utili"ado em itens
de grupo, por
eAemplo#
<1
(orma.agamento pic I=<<1> value "eros.
99 Cartao value 1.
99 %in@eiro value 2.
99 C@eque value 3.
'a situao inicial desta declarao 8art&o, ,in-eiro e 8-eque estaro valendo FA#E,
devido ao $alue Aeros de Forma9agamento, quando queremos que o programa
identifique qual a opo desejada pelo cliente basta mover 1 =por eAemplo> para
(orma.agamento, isto far com que 8art&o fique igual a "2!E e ,in-eiro e 8-eque
fiquem igual a FA#E e no momento em que Forma9agamento for modificado para 3 a
varivel 8-eque se tornar "2!E e 8art&o e ,in-eiro ficaro com FA#E. .ode;se
utili"ar tambm um comando do compilador c@amado #E", por eAemplo# #E" 8A2"B*
"* "2!E. "/2! indica que cada nvel pode abranger uma faiAa de valores para se
tornar verdadeiro. .or eAemplo#
<1 (orma.agamento pic I=<<1> value "eros.
99 Cartao value 1 t@ru 2.
99 %in@eiro value 3 t@ru 4.
99 C@eque value 5 t@ru 6.
5/E0 #E" "* FA#E literal-= indica um valor opcional de falso para a condio. 'a
maioria dos casos este termo no utili"ado, sempre termos um dos itens selecionados
ou Forma9agamentosetado para "ero.
) palavra reservada 9I8 C9I8"!2ED identifica o tipo e o taman@o da varivel. &Aistem
6 classes de variveis# )lfabtica, 'umrica, )lfanumrica e .onto flutuante#
Alfabtica
,epresentado pelo caractere T)V, indica que esta varivel suportar apenas caracteres
alfabticos ou espao. .or eAemplo#
<1 nome .$C )=<1<> value spaces.
.ode;se formatar a varivel com o caractere T:V, desta forma podemos formatar uma
string#
<1 nome .$C )=<<5>:)=<<4> value spaces.
+e movermos TtestenomeV para a varivel nome ela arma"enar Tteste nomeV.
Numrica
,epresentado pelo caractere TIV, indica que esta varivel suportar apenas caracteres de
< a I. )s variveis numricas suportam no mAimo 19 dgitos incluindo as casas
decimais. .or eAemplo#
77 numero .$C I=<<6> value "eros.
.odemos utili"ar alguns mecanismos de formatao das variveis para apresentao ou
arma"enamento, so eles#
T.V utili"ado para economi"ar espao em memria para o arma"enamento de
nFmeros onde cada T.V representa um EE2*, por eAemplo#
77 numero .$C I=<<3>... value "eros.
&sta varivel ser capa" de arma"enar at III<<<, utili"ando apenas trRs bJtes da
memria. Caso o programador coloque este T.V na frente da representao =.$C
...I=<<3>> far com que o compilador interprete os trRs primeiros caracteres como
"eros. &ste tipo de varivel para uso interno da aplicao.
T+V utili"ado para informar ao compilador que a varivel numrica poder
arma"enar um sinal de positi$o ou negati$o. &ste sinal no ir consumir espao em
memria.
77 numero .$C +I=<<6> value "eros.
%esta forma a varivel poder arma"enar a faiAa de valores compreendentes entre d
IIIIII e cIIIIII. .ode;se utili"ar tambm os sinais T;T, TcV, TC,V e T%:V =&stes dois
Fltimos apresentaro dois espaos caso o valor seja positivo e o teAto informado no caso
de valores negativos> isto no ir restringir a varivel a ter eAclusivamente valores
negativos ou positivos, seu comportamento ser o mesmo do T+V.
T*V utili"ado para indicar onde se encontrar o ponto decimal da varivel. )ssim
como o T+V ele no ir consumir espao em memria.
77 numero .$C +I=<<4>*II value "eros.
Com esta declarao estaremos consumindo 6 bJtes de memria com a possibilidade de
guardar se este nFmero negativo ou positivo de quatro posi!es e com duas casas
decimais. .or eAemplo# ;1234.56.
T^V utili"ado para formatar uma apresentao ao usurio, para cada T^V S esquerda
da varivel indica que gostaramos de ignorar a apresentao dos "eros e eAibir espaos
em seu lugar. .or eAemplo#
77 numero .$C +^,^^I.II value "eros.
$sto ir criar uma varivel numrica onde os "eros S esquerda sero substitudos em uma
apresentao em tela.
utros caracteres vlidos na representao numrica so T,V e T.V como visto
anteriormente.
) TCV utili"ada para formao de campos de data, por eAemplo#
77 data;nasc .$C IICIICIIII value "eros.
-as isto no quer di"er que esta varivel ser tratada como uma data visto que
compilador no possui uma varivel especfica para isto.
/m < ="ero> indica uma separao, assim como vimos com o caractere T:V nos
alfabticos.
Alfanumrica
,epresentado pelo caractere TeV, indica que esta varivel suportar todos os caracteres
da tabela )+C$$. .or eAemplo#
<1 nome .$C e=<1<> value spaces.
$sto ir criar uma varivel com 1< caracteres alfanumricos, ou seja, qualquer caractere
da tabela )+C$$ poder ser utili"ada nesta varivel.
Ocorrncias
&m conjunto com estas defini!es pode;se utili"ar a declarao de uma "abela de
*corrFncias =con@ecida tambm como Vetor ou Array>, esta tabela simplifica a
necessidade do programa ter que arma"enar vrias informa!es relacionadas, por
eAemplo, vamos imaginar que o programa ten@a a necessidade de arma"enar quais so
os dias Fteis do mRs para determinar provveis datas de pagamento, este programa pode
possuir uma tabela com 31 ocorrRncias de campos numricos de 1 bJte que possuram <
e 1 para identificar se aquele dia Ftil ou no. *eja o eAemplo#
identification division.
program;id. tabela.
B
data division.
GorHing;storage section.
77 indeAtab pic I=<<2> value "eros.
77 tabmes pic I=<<1> value "eros
occurs 31 times.
<1 datasistema.
1< anosistema pic I=<<4>.
1< messistema pic I=<<2>.
1< diasistema pic I=<<2>.
77 inteirodata pic I=<<9> value "eros.
77 diasmes pic I=<<2> value "eros.
77 diasemana pic I=<<1> value "eros.
77 anobisseAto pic I=<<4>vII value "eros.
77 anobissprova pic I=<<4> value "eros.
B
procedure division.
inicio.
BY identifica o mes
accept datasistema from date JJJJmmdd
BY $dentifica quantos dias eAiste no mes
evaluate messistema
G@en 1
move 31 to diasmes
G@en 2
move 29 to diasmes
move "eros to anobisseAto
divide anosistema bJ 4 giving anobisseAto
move anobisseAto to anobissprova
subtract anobissprova from anobisseAto
if anobisseAto equal "eros
move 2I to diasmes
end;if
G@en 3
move 31 to diasmes
G@en 4
move 3< to diasmes
G@en 5
move 31 to diasmes
G@en 6
move 3< to diasmes
G@en 7
move 31 to diasmes
G@en 9
move 31 to diasmes
G@en I
move 3< to diasmes
G@en 1<
move 31 to diasmes
G@en 11
move 3< to diasmes
G@en 12
move 31 to diasmes
end;evaluate
BY Daco para cada dia do mes
perform varJing indeAtab from 1 bJ 1
until indeAtab Y diasmes
BY %ia a ser analisado
move indeAtab to diasistema
BY ) funcao nao aceita um item de grupo
move datasistema to inteirodata
BY $dentifica o dia da semana
BY 1 [ +egunda;feira
BY 2 [ Terca;feira
BY 3 [ Luarta;feira
BY 4 [ Luinta;feira
BY 5 [ +eAta;feira
BY 6 [ +abado
BY 7 [ %omingo
move function rem=function integer;of;date=inteirodata>, 7>
to diasemana
if diasemana Y[ 1 and
diasemana \[ 5
BY & um dia util
move 1 to tabmes=indeAtab>
end;if
end;perform
stop run
.
&Aerccios#
1W ; (aa um programa =&Aerc3.cbl> que aceite um nFmero e incremente;o de 2 em 2
eAibindo os resultados na tela at que este nFmero seja maior do que 5<. .ara este lao
no utili"e pargrafos.
2W ; ,epita o eAerccio anterior =&Aerc4.cbl> utili"ando pargrafos.
Exibindo e aceitando informa.es do
usu$rio
g vimos os comandos %$+.D)P e )CC&.T, que so utili"ados para intereo com o
usurio. :em, eAiste uma seo da ,ata ,i$ision c@amada #creen #ection. 'esta seo
so especificadas Ss propriedades de telas a serem utili"adas pelo programa para
interagir com o usurio. ) seguir vemos um eAemplo#
identification division.
program;id. Tela.
B
data division.
GorHing;storage section.
77 GrH;opcao pic A=<<1> value spaces.
screen section.
<1 tela;principal.
<2 blanH screen.
<2 line 1 col 1 value K;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; K;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;K.
<2 line 2 col 21 value K-anutencao de Clientes ; -enu .rincipa
; KlK.
<2 line 3 col 1 value K;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; K;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;K.
<2 line 11 col 34 value K1 ; $nclusaoK.
<2 line 12 col 34 value K2 ; )lteracaoK.
<2 line 13 col 34 value K3 ; ConsultarK.
<2 line 14 col 34 value K4 ; &AcluirK.
<2 line 15 col 34 value K5 ; +airK.
<2 line 17 col 34 value Kpcao# = >K.
<2 opcao line 17 col 42 pic A using GrH;opcao auto.
B
procedure division.
inicio.
displaJ tela;principal
accept tela;principal
...
...
&ste programa ir resultar na seguinte apresentao#
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-anutencao de Clientes ; -enu .rincipal
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1 ; $nclusao
2 ; )lteracao
3 ; Consultar
4 ; &Acluir
5 ; +air
pcao# =h>
'ote que alm de eAibir a tela o programa fe" um A88E9". +e verificarmos o cdigo
fonte eAiste a seguinte lin@a#
<2 opcao line 17 col 42 pic A using GrH;opcao auto.
$sto far com que o programa transfira o que for digitado em opcao para Gr@-opcao,
desta forma o programa poder identificar o que foi digitado pelo usurio.
) descri%&o de uma tela na +creen +ection possui a mesma estrutura de um item de
grupo, onde se especifica lin@a a lin@a o que vai ser eAibido e o que vai ser solicitado ao
usurio. ) +creen +ection um recurso opcional para montagem de telas, o programa
pode tranqiilamente montar suas apresenta!es de telas utili"ando comandos de
A88E9" e ,I#9A< logo a utili"ao ou no desta seo fica ao critrio do
programador. /ma coisa que o
programador deve se atentar que esta
estrutura de tela estar consumindo
memria. ) seguir, vemos a estrutura
completa dos itens de uma +creen
+ection#
/m ponto interessante a ser comentado
a utili"ao de cores atravs das
clusulas F*2E32*!0,-8**2 e
)A8H32*!0,-8**2, atravs
destas clusulas o programa pode
especificar quais cores deseja utili"ar,
seguindo a tabela a seguir#
8Idigo 8or
1. .reto
2. )"ul
3. *erde
4. Ciano
5. *ermel@o
6. -agenta
7. -arrom ou amarelo
9. :ranco
)dicionando;se a clusula
N$MND$MNT a estas cores temos uma
combinao de 15 possveis cores, por
eAemplo, o marrom vira amarelo.
0o-ec-o uma clusula para campos de
sen@as, onde o que esta sendo digitado
no pode ser visto na tela.
:oa parte destas clusulas da #creen
#ection pode ser utili"ada em conjunto
com o comando ,I#9A< e A88E9".
&Aerccios#
1W ; (aa um programa =&Aerc5.cbl> similar ao utili"ado no eAemplo.
Comunicao entre pro/ramas
+o % interessante para um pro/ramador ter todas as rotinas em um
Dnico pro/ramaE o primeiro bom motio para que ele no faa isso % a
manutenoE ima/ine um par$/rafo que faa um determinado c$lculo o
qual foi duplicado em 2'' pro/ramas 7FCB(9F A/ora ima/ine o
transtorno no caso de uma pequena alterao deste par$/rafo e a
possibilidade de al/um pro/rama ser esquecidoG Existe uma soluo
paliatia para este casoE o comando COPE em sua forma mais simplesE
temosH
C,"> testeF
,nde teste % o nome de um arquio teste!c"# no diret8rio corrente ou em
al/um diret8rio que esteIa informado em um set de ambiente cCamado
CO$CP 7pertencente ao ambiente 6erant9F "ode informar tamb%m este
um nome de arquio entre aspasE podendo5se adicionar o caminCo inteiro
do arquioF
6as mesmo utili2ando o COP ainda persiste um problemaE as ari$eis
que este par$/rafo utili2a no c$lculoE elas tamb%m deem ser replicadas
em todos os pro/ramasE o COP resoleria isto com a mesma facilidadeE
mas existe um problema mais s%rio aindaE a alocao de mem8ria
indeidaE sem contar o peri/o do esquecimento da atuali2ao de al/uma
ari$el enolida no c$lculo e o alor anterior afetar o resultadoF
)istos todos estes problemas % muito mais pr$tico o uso de sub%
"ro&ramasE desta forma centrali2amos as rotinas comuns a mais de um
pro/rama e facilitamos a manuteno de determinados processosF
, comando utili2ado para cCamar sub5pro/ramas % o CALLE este
comando transfere o fluxo de execuo para outro pro/rama e a/uarda o
seu retorno para dar continuidade nos comandos ap8s a sua utili2aoF
"or exemploH
FFF
call TC@amadoV using 'ome
cancel TC@amadoV
...
Este bloco de comando ir$ executar um pro/rama C'amado passando
como par?metro uma ari$el do pro/ramaE cCamada NomeE este
pro/rama C'amado ir$ possuir uma seo em sua (ata (ivision cCamada
Lin)a&e SectionF Esta seo possuir$ a declarao de uma ari$el para
receber o conteDdo existente em Nome no momento da cCamadaF Esta
ari$el de Lin)a&e no precisa ter o mesmo nome da ari$el passada
para o pro/ramaE apenas o mesmo tipo e tamanCo para que receba o
alor corretamenteF
Este seria um pro/rama C'amadoH
identification division.
program;id. C@amado.
aut@or. %T+ Datin )merica +oftGare.
B
data division.
linHage section.
77 'ome pic A=<4<> value "eros.
B
procedure division using 'ome.
inicio.
displaJ 'ome
eAit program
.
'ote que a .rocedure %ivision recebeu um /+$'M '-&. $sto far com que o seu
programa ten@a acesso aos dados enviados pelo programa 8-amador, podemos
atuali"ar estes dados fa"endo com que o programa 8-amador ten@a consiga ver os
dados alterados. 'ote tambm que este programa utili"ou um E>I" 92*32A; ao invs
de um #"*9 2!0, este comando deve ser utili"ado por programas que iro retornar o
fluAo de eAecuo para algum 8-amador.
'este caso vemos outra grande importQncia do 92*32A;-I,, pois, para que possamos
retirar um programa da memria e liberar todo o espao que estava alocado precisamos
fa"er um 8A08Eprogram-name, este nome de programa referRncia;se ao 92*32A;-
I, do programa a ser cancelado e retirado da memria.
&Aerccios#
1W ; ,epita os procedimentos do &Aerc3.cbl em um &Aerc4.cbl empregando os novos
comandos vistos. = programa c@amado dever se c@amar &Aerc5.cbl>.
*ratamento e arma+enamento de informa,es
, principal fundamento de um pro/rama % a capacidade de saber tratar
e arma2enar informa.es deidamente alidadas e consistentesF Existem
quatro tipos de estruturas de arma2enamentos de dados que o Cobol
utili2a de forma natiaH 3equentialE (ine 3equentialE 4elatie e IndexedF
1odas estas estruturas esto diretamente relacionadas a arquios
arma2enados em discos locais ou na redeF De forma natia tamb%m o
compilador possui controles pr8prios para tratamento em redeF 1odo
arquio % composto por re/istros e cada re/istro % composto por camposF
Estes re/istros possuem a mesma estrutura de um -ru"o da $rea de
.or)in&E onde cada re/istro % composto por $rios campos de diferentes
tiposF
3equential
A expresso seq=encial si/nifica que os re/istros sero arma2enados um
ap8s o outroE ou seIaE assim que termina um re/istro outro ter$ inJcioF "or
exemploH
%efinio do registro#
<1 ,egistro;Clientes.
1< Clientes;'ome pic A=<1<>.
1< Clientes;Telefone pic A=<3<>.
(orma de arma"enamento de dos registros#
,egistro 1 ,egistro 2
....0....1....0....2....0....3....0....4....0....5....0....6....0....7....0...
(abio <55 <11 3<44;5<32 Deandro <55 <11 3<44;5<32
f desta forma que o compilador ir arma"enar os registros na estrutura de arquivo
denominada seqiencial. 'ote que ao somarmos o total de bJtes do registro obtemos 4<,
logo, a cada 4< bJtes temos o incio de um novo registro. arquivo no possui nen@um
caractere especial de terminao.
Line Se/uential
A expressoE linCa seq=encialE si/nifica que os re/istros sero
arma2enados em linCasE ou seIaE ao t%rmino do re/istro existiro
caracteres de controle que indicam a finali2ao dos dadosF +o caso dos
ambientes "CF Este formato de arquio cont%m uma seq=-ncia xK'D'AK
7Carria/e return L (ine feed M E+1E49E esta seq=-ncia de caracteres
far$ com que o pr8ximo re/istro seIa /raado na linCa se/uinteE outro
diferencial deste arquio % que a seq=-ncia xK'D'AK em lo/o depois do
Dltimo bNte diferente de espaoE isto si/nifica que se o re/istro possui #'
caracteres e o pro/rama /raa somente & bNte ento a linCa ter$ o
tamanCo de & bNteE isto afeta si/nificamente no tamanCo do arquioF ,
formato de arquio denominado Line Se/uential % similar ao que
costumeiramente cCamamos de arquio texto 71O19F ,s caracteres de
finali2ao ariam conforme o sistema operacionalF Em ambientes
baseados em <nixE por exemploE os caracteres de finali2ao xK'D'AK so
substituJdos por um simples xK'AKF "or exemploH
%efinio do registro#
<1 ,egistro;Clientes.
1< Clientes;'ome pic A=<1<>.
1< Clientes;Telefone pic A=<3<>.
(orma de arma"enamento de dois registros#
....0....1....0....2....0....3....0....4
(abio <55 <11 3<44;5<32AV<%<)V
Deandro <55 <11 3<44;5<32AV<%<)V
'ote que apesar do registro possuir 4< bJtes ='ome A=1<> c Telefone A=3<>> a
sequRncia AV<%<)V foi adicionada logo aps o Fltimo caractere do registro.
4elatie
) eApresso relativo significa que os registros sero arma"enados em lin@as e sua c@ave
ser a posio relativa em que ele se encontra dentro deste arquivo, ou seja, assim como
um line sequential cada registro estar em uma lin@a com a diferena de que cada
registro preenc@e toda a lin@a, mesmo que o campo com 5< bJtes esteja sendo gravado
com um Fnico bJte o compilador ir preenc@er o restante da lin@a com espaos at
completar os 5< bJtes, em seguida os caracteres de finali"ao AV<%<)V =Dembrando
que em outros ambientes operacionais estes caracteres podem mudar>. %esta forma,
temos um registro de taman@o fiAo e quando di"emos que queremos acessar o registro
relativo 1<, basta o compilador multiplicar o taman@o do registro por 1< e acessar a
posio offset referente ao mesmo.
0nde1ed
f muito importante que um programa possibilite ao usurio um acesso rpido aos
registros desejados, para tanto eAiste um recurso no apenas no Cobol, mas em muitas
outras linguagens e bancos de dados, c@amado 8-a$e. /ma c@ave um campo do
registro que foi eleito como um meio de acesso direto a um determinado registro ou um
conjunto de campos, esta Fltima definio con@ecida com split-@ey ou c@ave;dividida.
&sta c@ave normalmente possui um conteFdo numrico, mas, pode possuir outros
valores. &Aiste tambm a possibilidade de se fa"er uma pesquisa rpida por campos que
no sejam a c@ave primria, estes so c@amados de 8-a$es Alternadas, estas c@aves
podem, opcionalmente, possuir valores repetidos, por eAemplo, um nome.
&ste o tipo de arquivo do compilador Cobol de maior utili"ao, devido aos seus
recursos de pesquisa eAtremamente rpidos. /m arquivo indeAado composto por dois
arquivos# arquivo de dados e o arquivo de ndice. &ste arquivo auAiliar de ndice
possui mecanismos para encontrar os registros rapidamente atravs de uma referRncia
do valor da c-a$e com sua posio dentro do arquivo. &sta c-a$e pode possuir duas
caractersticas# 2E8*2, HE< e A"E20A"E HE<, onde a 2E8*2, HE<
referenciada a um campo do registro o qual ir possuir valores que nunca se repetiro, j
a c@ave A"E20A"E HE< possui esta mesma caracterstica mas possui artifcios para
permitir a duplicao de valores. .odemos pesquisar pelas duas c@aves, mas uma de
cada ve".
*eja o seguinte eAemplo#
identification division.
program;id. )ccess(ile.
aut@or. %T+ Datin )merica +oftGare.
B
environment division.
configuration section.
input;output section.
file;control.
select clientes assign to Kclientes.datK
organi"ation is indeAed
access mode is dJnamic
record HeJ is clientes;codigo
alternate HeJ is clientes;nome Git@ duplicates
file status is fs;clientes.
B
data division.
file section.
fd clientes.
<1 reg;clientes.
1< clientes;codigo pic I=<<6>.
1< clientes;nome pic A=<5<>.
1< clientes;data;nasc.
2< clientes;data;nasc;ano pic I=<<4>.
2< clientes;data;nasc;mes pic I=<<2>.
2< clientes;data;nasc;dia pic I=<<2>.
1< clientes;telefone pic A=<3<>.
1< clientes;endereco pic A=<5<>.
1< clientes;bairro pic A=<3<>.
1< clientes;cidade pic A=<3<>.
1< clientes;estado pic A=<<2>.
1< clientes;cep pic I=<<9>.
1< clientes;e;mail pic A=<5<>.
B
GorHing;storage section.
<1 fs;clientes.
1< fs;clientes;1 pic A=<<1>.
1< fs;clientes;2 pic A=<<1>.
1< fs;clientes;r redefines fs;clientes;2 pic II comp;A.
B
...
...
'ote que neste trec@o de cdigo vemos a E0VI2*0;E0" ,IVI#I*0, esta diviso foi
comentada anteriormente e vamos disseca;la. &sta diviso possui a seguinte estrutura#
&'*$,'-&'T %$*$+$'.
C'($M/,)T$' +&CT$'.
+/,C&;C-./T&,.
:g&CT;C-./T&,.
+.&C$)D;')-&+.
$'./T;/T./T +&CT$'.
($D&;C'T,D.
$; C'T,D.
&sta diviso composta de duas se!es#
Confi&uration Section
&sta seo destina;se a configurao do ambiente, ela composta por trRs partes#
#*!28E-8*;9!"E26 *)JE8"-8*;9!"E2 e #9E8IA-0A;E#. /ma identifica o
computador onde foi confeccionado o programa e a segunda identifica o computador do
ambiente de produo, ambas servem apenas para comentrios @aja visto que ambas
deiAaram de ser obrigatrias mas caso o programador opte em utili"a;las deve escrever
sua sintaAe corretamente para no causar erros de compilao. #9E8IA-0A;E#
especfica o sinal monetrio, escol@e o tipo de ponto decimal, especfica caracteres
simblicos e possibilitar adaptar o programa para se comunicar com programas de
outras linguagens.
0n"ut%Out"ut Section
&sta seo destina;se a configurao do ambiente de eitura e 3ra$a%&o, ela possui
duas partes# FIE-8*0"2* e I-*-8*0"2*. ) primeira destina;se a especificao
dos arquivos que o programa ir acessar. ) segunda foi descontinuada nas vers!es mais
atuais do compilador, valendo apenas para os ambientes de ;ainframe.
B
environment division.
configuration section.
input;output section.
file;control.
select clientes assign to Kclientes.datK
organi"ation is indeAed
access mode is dJnamic
record HeJ is clientes;codigo
alternate HeJ is clientes;nome Git@ duplicates
file status is fs;clientes.
B
'este eAemplo, o programa no fa" referRncias as clusulas +/,C&;C-./T&,,
:g&CT;C-./T&, e +.&C$)D;')-&+, as duas primeiras por no serem
obrigatrias e a terceira pelo fato do programa no precisar, por eAemplo, identificar
que as casas decimais sero identificadas por uma vrgula.
Como ele ir tratar um arquivo, temos a seo I09!"-*!"9!" #E8"I*0, a referRncia
desta seo opcional, podemos escrever diretamente a clusula FIE-8*0"2*.
comando #EE8" utili"ado para declarar um arquivo no programa, todos os arquivos
que o programa ir manipular devem possuir uma #EE8".
) clusula #EE8" ter a seguinte estrutura para arquivos seqKenciais#
+&D&CT nome-arqui$o )++$M' T nome-e?terno
,M)'$^)T$' $+ +&L/&'T$)D
)CC&++ -%& $+ +&L/&'T$)D
($D& +T)T/+ $+ fs-arqui$o.
0ome-arqui$o indica o nome que ser referenciado internamente pelo programa. 0ome-
e?terno indica onde os dados sero gravados, ou seja, o nome do arquivo, caso no seja
especificado o camin@o do arquivo ser considerado o diretrio corrente. .ode;se
substituir este nome-e?terno por ,I#H e especificar o nome;eAterno na (% =ser visto
mais S frente> e se mesmo assim o nome;eAterno no for informado o compilador ir
criar no diretrio corrente de eAecuo um arquivo com o mesmo nome-arqui$o.
*23A0IEA"I*0 I# #E1!E0"IA indica o tipo de organi"ao do arquivo. A88E##
;*,E I# #E1!E0"IA o tipo de acesso =sendo que este o Fnico tipo de acesso
permitido para esta organi"ao>. FIE #"A"!# I# fs-arqui$o representa uma referRncia
de um campo da 5or@ing-#torage section que ser atuali"ada a cada operao feita no
arquivo, indicando qual a situao atual do arquivo, desta forma que o programa
pode fa"er testes para saber se pode ou no continuar a eAecuo sem problemas.
) clusula #EE8" ter a seguinte estrutura para arquivos de lin@as seqKenciais#
+&D&CT nome-arqui$o )++$M' T nome-e?terno
,M)'$^)T$' $+ D$'& +&L/&'T$)D
)CC&++ -%& $+ +&L/&'T$)D
($D& +T)T/+ $+ fs-arqui$o.
'ote que a Fnica mudana na organi"ao do arquivo I0E #E1!E0"IA. Todas as
outras informa!es so idRnticas ao #E1!E0"IA.
) clusula #EE8" ter a seguinte estrutura para arquivos randjmicos#
+&D&CT nome-arqui$o )++$M' T nome-e?terno
,M)'$^)T$' $+ ,&D)T$*&
)CC&++ -%& $+ ,)'%-C+&L/&'T$)DC%P')-$C a,&D)T$*& k&P $+
c@ave;randomicab
($D& +T)T/+ $+ fs-arqui$o.
'esta #EE8" temos uma modificao na organi"ao que agora 2EA"IVE e temos
a possibilidade escol@er entre trRs tipos de acesso#
2AN(O3 4Aleat5rio6
programa pode via c-a$e-randLmica ir para qualquer registro, informando apenas o
nFmero do registro que se deseja acessar.
S7897N*0AL 4Se/:encial6
programa ir acessar este arquivo apenas para leituras seqiRncias, ou seja, ir avanar
a leitura registro a registro at o fim de todos os registros que esto no arquivo.
(NA30C 4(in;mico6
programa pode fa"er acessos do tipo 2A0,*; e tambm do tipo #E1!E0"IA, ou
seja, o programa pode alternar o tipo de acesso no momento que for oportuno.
) clusula #EE8" ter a seguinte estrutura para arquivos indeAados#
+&D&CT nome-arqui$o )++$M' T nome-e?terno
,M)'$^)T$' $+ $'%&e&%
)CC&++ -%& $+ ,)'%-C+&L/&'T$)DC%P')-$C
,&C,% k&P $+ nome;campoCc@ave;separada
)DT&,')T& k&P $+ nome;campoCc@ave;separada aO$TN %/.D$C)T&+b
($D& +T)T/+ $+ fs-arqui$o.
'esta organi"ao indeAada temos duas novas clusulas 2E8*2, HE< e A"E20A"E
HE<, elas referenciam;se aos campos do registros pelo qual ser criado o ndice,
opcionalmente a A"E20A"E HE< pode possuir valores duplicados, ou seja, mais de
um registro onde o campo referenciado como uma c@ave alternada ter um valor
repetido.
&Aerccios#
1. %efinio de um arquivo indeAado com a seguinte estrutura =&Aerc6.cbl>#
Clientes
Codigo numrico de seis posi!es =C@ave>
'ome alfanumrico de 5< posi!es =C@ave alternada com
duplica!es>
%ata de nascimento numrico de 9 posi!es
Telefone alfanumrico de 3< posi!es
&ndereco alfanumrico de 5< posi!es
'umero numrico de seis posi!es
Complemento alfanumrico de 3< posi!es
:airro alfanumrico de 3< posi!es
Cidade alfanumrico de 3< posi!es
Cep numrico de 9 posi!es
&stado alfanumrico de 2 posi!es
&;mail alfanumrico de 5< posi!es
Crie parte de um programa com todas as defini!es necessrias para este arquivo,
utili"ando a $%&'T$($C)T$', &'*$,'-&'T e %)T) %$*$+$'. &ste
programa se c@amar ).D$C.C:D.
3ani"ulando as informa,es
)t agora foram vistas todas as divis!es do programa, suas principais se!es, seus tipos
de arquivos nativos, seus tipos de variveis e alguns comandos de 92*8E,!2E, agora
iremos ver os comandos utili"ados para tratar os arquivos e os dados contidos neles.
)ntes de tratar qualquer dado dos registros de um arquivo precisamos abri-lo e ento
comear a manipular os registros. comando para abrir um arquivo o *9E0 e sua
estrutura #
(ormato 1 =.ara arquivos seqiRncias somente>
(ormato 2
=.ara todos os
arquivos>
comando
*9E0 ir disponibili"ar um canal com o arquivo para que o programa faa as opera!es
necessrias. I09!" indica que o programa poder apenas fa"er leituras no arquivo no
podendo fa"er nen@uma gravao, para tanto o arquivo dever ter sido criado
anteriormente. *!"9!" indica que o programa poder apenas gravar no arquivo, no
podendo fa"er leituras, o arquivo no poder eAistir, caso eAista ele ser sobreposto por
um arquivo va"io. I-* possibilitar ao programa fa"er as opera!es de leituraCgravao,
este o tipo de acesso mais utili"ado. E>"E0, tem a mesma funcionalidade de
*!"9!" com o diferencial de no sobrepor o arquivo os registros eAistentes, mas
complementando;o, ou seja, quando o arquivo for aberto o ponteiro de registros ser
posicionado logo aps o Fltimo registro eAistente e adicionar ao arquivo os registros
gravados. 2EVE2#E, far com que os registros sero acessados do Fltimo para o
primeiro. 5I"/ *8H destina;se ao tratamento do arquivo em rede, isto ser visto mais
S frente.
%epois de abrir o arquivo, ns podemos introdu"ir novas informa!es, atuali"ar
informa!es eAistentes, apagar informa!es e ainda consultar os dados eAistentes. .ara
cada uma dessas a!es eAistem comandos especficos, conforme vistos a seguir#
-ravando novas informa,es
comando utili"ado para gravar novos registros em um arquivo o 52I"E este
comando insere um novo registro no arquivo baseado nas informa!es contidas no
registro informado. &ste comando utili"ado da seguinte forma#
O,$T& registro;arquivo
registro-arqui$o referRncia;se ao item de grupo informado como sendo o registro do
arquivo especificado na #EE8" do programa. 'o caso de arquivos com estrutura
#E1!E0"IA, I0E #E1!E0"IA e ,&D)T$*& o comando ir gravar o registro e
caso alguma coisa de errado acontea ento ser retornada um FIE #"A"!# diferente
de "eros. f sempre muito importante verificar o status do arquivo afim de constatar se
est tudo bem. 'o caso do I0,E>E, alm de uma verificao idRntica S anterior ser
constatado se no eAistem uma situao de c-a$e duplicada, esta situao ir acontecer
caso o programa tente gravar um registro onde o valor do campo definido como
2E8*2, HE< seja idRntico ao de um registro j gravado no arquivo. &sta mesma
situao pode ocorrer para campo que ten@am sido definidos como c@aves do tipo
A"E20A"E HE< com um diferencial, caso o programador deseje pode eAistir uma
c@ave duplicada, basta que a A"E20A"E HE< deste campo ten@a a clusula 5I"/
,!9I8A"E#, desta forma obteremos um FIE #"A"!# que indicar que o registro foi
gravado com sucesso com uma de suas c@aves alternadas duplicadas.
2e&ravando novas informa,es
+empre eAistir a necessidade de um programa atualiAar os registros de um arquivo,
esta atuali"ao feita com o seguinte comando#
,&O,$T& registro;arquivo
)ntes de se utili"ar estes comandos deveremos carregar este registro para nossa rea
de F,, ou seja, no caso de arquivos indeAados devemos ler o registro que dever ser
atuali"ado, fa"er as modifica!es necessrias e ento regrav;los. $sto deve ser feito
para se evitar a perda de informa!es, por eAemplo#
,egistro original#
C% '-& &+T)%
<<<<<1():$ (&,,&$,) C+T) +.
+ituao da rea de F, aps o *9E0#
C% '-& &+T)%
$magine que este o registro que est atualmente gravado em disco e o programa dever
alterar o nome que est arma"enado, pois bem, ao abrirmos o arquivo o nosso registro
possivelmente valer espaos, o programa j sabe o cdigo do registro a ser alterado e
sabe que o nome deve ser alterado para ():$ C+T) mas no sabe qual o valor de
estado, logo o registro deve ser lido para que todas estas informa!es estejam na rea
de F,, assim o programa pode alterar o nome e regravar o registro sem nen@um perigo
de perder alguma informao previamente gravada.
A"a&ando informa,es
/m arquivo Ss ve"es necessita ser limpo, ou seja, registros que no interessam mais
estarem no cadastro devem ser removidos, isto fa" parte da manuten%&o de cadastro e o
comando a seguir eAecuta esta operao#
%&D&T& arquivo
comando ,EE"E ir remover o registro que est atualmente apontado pelo ponteiro
de registros, ou seja, devemos primeiro fa"er uma leitura do registro assim como
necessrio para o comando 2E52I"E. 'o caso de arquivos indeAados podemos
simplesmente mover o valor da c@ave a ser removida e eAecutar o comando. Caso o
registro informado no seja encontrado, ser devolvido um FIE #"A"!# indicando
que no foi possvel encontrar o registro.
Consultando informa,es
.ara termos acesso aos registros contidos nos arquivos devemos ler estes registros, para
tanto utili"amos o seguinte comando#
,&)% arquivo a'&eTC.,&*$/+b
comando 2EA, ir carregar o registro para a rea de F, definida da FIE
#E8"I*0. .ara todas as estruturas de arquivos podemos eAecutar um 2EA, arqui$o
0E>" fa"endo uma leitura do prAimo registro, somente para arquivos relativos e
indeAados, podemos fa"er um 2EA, arqui$o 92EVI*!# que permitir o acesso do
registro anterior ao atual. .ara arquivos indeAados podemos mover o valor para sua
c@ave e efetuar um simples 2EA, arquivo, isto ir posicionar o ponteiro de registros.
&Aistem situa!es em que precisamos saltar alguns registros para processarmos um lote
especfico de registros, por eAemplo, o programa deve processar todos os registros em
que o estado seja igual a T+.V. .ara esta tarefa utili"amos o comando #"A2", sua
sintaAe #
(ormato 1 =)rquivos relativos>#
.ara os arquivos
de estrutura
2EA"IVE o
data-name-1
indica a posio
relativa do
registro a ser
encontrado.
'ote que o
#"A2" aceita
condi!es de
pesquisa assim
como o IF.
(ormato 2
=)rquivos
indeAados>#
.ara arquivos
indeAados o data-
name-1 ou a split-
@ey-name-1
representam as
c@aves do arquivos
especificados na
#EE8" do
programa. /ma
observao
importante sobre o
comando #"A2"
que ele sempre se
utili"a de c@aves
para posicionar os
registros, no pode;
se utili"ar campos
que no sejam
2E8*2, HE< ou
A"E20A"E HE<.
eAemplo a seguir
vemos um arquivo
onde o campo
estado foi definido
na +&D&CT como
uma c@ave alternada
com duplica!es permitidas =caso contrrio no poderamos ter mais do que um registro
por estado> e o objetivo do programa eAibir todos os registros onde estado seja igual a
T+.V#
identification division.
program;id. DistaClientes.
aut@or. %T+ Datin )merica +oftGare.
B
environment division.
configuration section.
input;output section.
file;control.
select clientes assign to Kclientes.datK
organi"ation is indeAed
access mode is dJnamic
record HeJ is clientes;codigo
alternate HeJ is clientes;estado Git@ duplicates
file status is fs;clientes.
B
data division.
file section.
fd clientes.
<1 reg;clientes.
1< clientes;codigo pic I=<<6>.
1< clientes;nome pic A=<5<>.
1< clientes;data;nasc.
2< clientes;data;nasc;ano pic I=<<4>.
2< clientes;data;nasc;mes pic I=<<2>.
2< clientes;data;nasc;dia pic I=<<2>.
1< clientes;telefone pic A=<3<>.
1< clientes;endereco pic A=<5<>.
1< clientes;bairro pic A=<3<>.
1< clientes;cidade pic A=<3<>.
1< clientes;estado pic A=<<2>.
1< clientes;cep pic I=<<9>.
1< clientes;e;mail pic A=<5<>.
B
GorHing;storage section.
<1 fs;clientes.
1< fs;clientes;1 pic A=<<1>.
1< fs;clientes;2 pic A=<<1>.
1< fs;clientes;r redefines fs;clientes;2 pic II comp;A.
B
procedure division.
inicio.
open input clientes
move K+.K to clientes;estado
start clientes HeJ is equal clientes;estado
if fs;clientes equal "eros
read clientes neAt
perform until fs;clientes equal K1<K or
clientes;estado unequal K+.K
displaJ clientes;codigo K;K clientes;nome
read clientes neAt
end;perform
end;if
close clientes
stop run
.
&m todos os comandos vistos para tratamento de registros dos arquivos de estrutura
2EA"IVE e I0,E>E, eAiste uma clusula opcional c@amada I0VAI, HE<
comando. &sta clusula eAecutar o comando, sempre que eAistir um erro na c@ave do
registro =duplicado ou no encontrado>. .ode;se eAecutar todos os comandos da
linguagem eAceto os comandos condicionais IF e EVA!A"E.
<ec'ando os ar/uivos
%epois de terminar de tratar os registros dos arquivos necessrio fec@ar este arquivo.
.ara tanto utili"amos o comando 8*#E, conforme sintaAe a seguir#
Caso seja
especificada a
clusula 5I"/
*8H, o programa no poder reabrir este arquivo durante a sua eAecuo. &sta
clusula 5I"/ *8H no tem nen@uma referRncia com tratamento de rede.
&Aerccios#
1W ; Crie um pequeno sistema que faa o controle do registro do &Aerc6.cbl para que o
mesmo faa o tratamento completo =$ncluso, )lterao, Consulta e &Acluso> do
arquivo de clientes.
Ordenando as informa,es
&m certas situa!es eAiste a necessidade do programa listar as informa!es ordenadas
por campos que no esto especificados como c@aves do arquivo, para que isto seja
possvel eAiste um mecanismo c@amado #*2". #*2" um mtodo da linguagem
onde podemos ordenar determinados campos em ordem ascendente ou descendente por
qualquer campo ou grupo de campos. *amos pegar o arquivo anterior como eAemplo e
supor que necessitssemos listar os registros ordenados pelo e;mail. *eja o eAemplo a
seguir#
identification division.
program;id. DistaClientes.
aut@or. %T+ Datin )merica +oftGare.
B
environment division.
configuration section.
input;output section.
file;control.
select clientes assign to KclientesK
organi"ation is indeAed
access mode is dJnamic
record HeJ is clientes;codigo
alternate HeJ is clientes;estado Git@ duplicates
file status is fs;clientes.
select ord;clientes assign to Ksortcli.datK
sort status is ss;clientes.
B
data division.
file section.
fd clientes.
<1 reg;clientes.
1< clientes;codigo pic I=<<6>.
1< clientes;nome pic A=<5<>.
1< clientes;data;nasc.
2< clientes;data;nasc;ano pic I=<<4>.
2< clientes;data;nasc;mes pic I=<<2>.
2< clientes;data;nasc;dia pic I=<<2>.
1< clientes;telefone pic A=<3<>.
1< clientes;endereco pic A=<5<>.
1< clientes;bairro pic A=<3<>.
1< clientes;cidade pic A=<3<>.
1< clientes;estado pic A=<<2>.
1< clientes;cep pic I=<<9>.
1< clientes;e;mail pic A=<5<>.
sd ord;clientes.
<1 sort;reg;clientes.
1< sort;clientes;codigo pic I=<<6>.
1< sort;clientes;nome pic A=<5<>.
1< sort;clientes;e;mail pic A=<5<>.
B
GorHing;storage section.
<1 ss;clientes.
1< ss;clientes;1 pic A=<<1>.
1< ss;clientes;2 pic A=<<1>.
1< ss;clientes;r redefines ss;clientes;2 pic II comp;A.
<1 fs;clientes.
1< fs;clientes;1 pic A=<<1>.
1< fs;clientes;2 pic A=<<1>.
1< fs;clientes;r redefines fs;clientes;2 pic II comp;A.
B
procedure division.
inicio.
sort ord;clientes ascending sort;clientes;e;mail
input procedure sortin;clientes
output procedure sortout;clientes
stop run
.
B
sortin;clientes.
open input clientes
read clientes neAt
perform until fs;clientes equal K1<K
move clientes;codigo to sort;clientes;codigo
move clientes;nome to sort;clientes;nome
move clientes;e;mail to sort;clientes;e;mail
release sort;reg;clientes
read clientes neAt
end;perform
close clientes
.
B
sortout;clientes.
perform pega;reg;sort
perform lista;clientes until ss;clientes equal K1<K
.
B
lista;clientes.
displaJ sort;clientes;codigo
displaJ sort;clientes;nome
displaJ sort;clientes;e;mail
displaJ K;;;;;;;;;;;;;;;;;;;K
perform pega;reg;sort
.
B
pega;reg;sort.
return ord;clientes
at end move K1<K to ss;clientes
.
0m"resso
) impresso dos dados pelo programa C:D tambm muito simples, basta o
programa possuir uma referRncia de um arquivo de estrutura D$'& +&L/&'T$)D
associado a um de$ice vlido para impresso. ) partir de ento utili"amos os mesmos
comandos de tratamento de arquivo para tratar a impresso. f claro, o comando ,&)%
no ter efeito sobre este tipo de arquivo. comando O,$T& provido de alguns
mecanismos para a impresso das lin@as, conforme sintaAe vista a seguir#
'ote que nesta
estrutura do
52I"E eAistem as
clusulas )EF*2E
e AF"E2 que
indicam ao
compilar como
deve fa"er a
impresso da nova
lin@a. A" E0,-
*F-9A3E
eAecutar um
comando quando
atingir o fim da
pgina, por
eAemplo um
9E2F*2; para
imprimir um cabeal@o. ) seguir temos um eAemplo de impresso.
identification division.
program;id. $mpressao.
aut@or. %T+ Datin )merica +oftGare.
B
environment division.
configuration section.
file;control.
select clientes assign to Kclientes.datK
organi"ation is indeAed
access mode is dJnamic
record HeJ is clientes;codigo
alternate HeJ is clientes;estado Git@ duplicates
file status is fs;clientes.
B
select impressao assign to KD.T1K
B YYY )s duas lin@as abaiAo tambem sao validas \\\
B select impressao assign to K+)$%).TeTK
B select impressao assign to Kll&stacaol$mpressoraK
organi"ation is line sequential
access mode is sequential
file status is fs;impressao.
B
data division.
file section.
fd clientes.
<1 reg;clientes.
1< clientes;codigo pic I=<<6>.
1< clientes;nome pic A=<5<>.
1< clientes;data;nasc.
2< clientes;data;nasc;ano pic I=<<4>.
2< clientes;data;nasc;mes pic I=<<2>.
2< clientes;data;nasc;dia pic I=<<2>.
1< clientes;telefone pic A=<3<>.
1< clientes;endereco pic A=<5<>.
1< clientes;bairro pic A=<3<>.
1< clientes;cidade pic A=<3<>.
1< clientes;estado pic A=<<2>.
1< clientes;cep pic I=<<9>.
1< clientes;e;mail pic A=<5<>.
fd impressao linage is 66 lines Git@ footing at 64
lines at top 2 lines at bottom 1.
<1 reg;impressao.
1< impressao;filler pic A=<9<>.
B
GorHing;storage section.
77 .agina pic I=<<6> value "eros.
<1 fs;clientes.
1< fs;clientes;1 pic A=<<1>.
1< fs;clientes;2 pic A=<<1>.
1< fs;clientes;r redefines fs;clientes;2 pic II comp;A.
<1 fs;impressao.
1< fs;impressao;1 pic A=<<1>.
1< fs;impressao;2 pic A=<<1>.
1< fs;impressao;r redefines fs;impressao;2 pic II comp;A.
<1 Din@a;cabecal@o.
1< filler pic A=<31> value spaces.
1< filler pic A=<17> value KDista de Client
; KesK.
<1 Din@a;cabecal@o;labels.
1< filler pic A=<<6> value KCodigoK.
1< filler pic A=<<1>.
1< filler pic A=<5<> value K'omeK.
1< filler pic A=<<1>.
1< filler pic A=<1<> value K'asc.K.
1< filler pic A=<<1>.
1< filler pic A=<3<> value KTelefoneK.
<1 Din@a;cabecal@o;lin@a.
1< filler pic A=<<6> value all K[K.
1< filler pic A=<<1>.
1< filler pic A=<5<> value all K[K.
1< filler pic A=<<1>.
1< filler pic A=<1<> value all K[K.
1< filler pic A=<<1>.
1< filler pic A=<3<> value all K[K.
<1 Din@a;detal@e.
1< detal@e;codigo pic "=<<6>.
1< filler pic A=<<1>.
1< detal@e;nome pic A=<5<>.
1< filler pic A=<<1>.
1< detal@e;nasc.
2< detal@e;dia pic I=<<2>.
2< filler pic A=<<1> value KCK.
2< detal@e;mes pic I=<<2>.
2< filler pic A=<<1> value KCK.
2< detal@e;ano pic I=<<4>.
1< filler pic A=<<1>.
1< detal@e;telefone pic A=<3<>.
<1 Din@a;rodape.
1< filler pic A=<66> value spaces.
1< filler pic A=<<9> value K.agina# K.
1< rodape;pagina pic "=<<6> value "eros.
B
procedure division.
inicio.
open input clientes
open output impressao
read clientes neAt
if fs;clientes equal "eros
perform imprime;cabecal@o
perform until fs;clientes equal K1<K
move clientes;codigo to detal@e;codigo
move clientes;nome to detal@e;nome
move clientes;data;nasc;dia to detal@e;dia
move clientes;data;nasc;mes to detal@e;mes
move clientes;data;nasc;ano to detal@e;ano
move clientes;telefone to detal@e;telefone
perform imprime;lin@a
read clientes neAt
end;perform
end;if
close clientes impressao
stop run
.
B
imprime;cabecal@o.
Grite reg;impressao from Din@a;cabecal@o
before advancing 3 line
Grite reg;impressao from Din@a;cabecal@o;labels
before advancing 1 line
Grite reg;impressao from Din@a;cabecal@o;lin@a
before advancing 1 line
.
B
imprime;lin@a.
Grite reg;impressao from Din@a;detal@e
before advancing 1 line
at end;of;page
perform imprime;rodape
perform imprime;cabecal@o
.
B
imprime;rodape.
add 1 to pagina
move pagina to rodape;pagina
Grite reg;impressao from spaces
before advancing 1 line
Grite reg;impressao from Din@a;rodape
before advancing page
.
&Aerccios#
1W ; Complemente o sistema anterior adicionando ao sistema uma opo para impresso
da lista de clientes cadastrados.
Ambientes multiusurio 42edes6
&m ambientes multiusurio a aplicao deve se preocupar com uma situao que no
ocorre quando esta trabal@ando so"in@a com o arquivo# acessos simultMneos. &Aistem
dois tipos de acessos simultQneos# )rquivos e ,egistros. &stes acessos devem ser
controlados pelo programa de acordo com as a!es que da aplicao. .or eAemplo,
quando a aplicao necessita alterar alguns dados de um determinado registro
importante que o programa faa um *8H =bloqueio> do registro, garantindo assim que
outros usurios no faam altera!es antes dele.
bloqueio pode ser feito ao nvel de arquivo ou ao nvel de registro. &nquanto sua
aplicao, esta com o arquivo ou registro bloqueado, no ser possvel que outros
usurios da rede possam acessar aquela informao. s bloqueios podem ser feitos por
mtodos automticos e manuais. s mtodos automticos garantem uma maior
segurana as altera!es no registro, pois, no @ como ocorrer os riscos do programador
esquecer de bloquear os registros com os quais ir trabal@ar.
.ara que uma aplicao possa ser capa" de bloquear um registro, ela deve possuir a
seguinte clusula na #EE8" do arquivo#
Luando o tipo de loc@
;A0!A, estamos
informando que o
programa ir fa"er o
bloqueio e o
desbloqueio, para tanto quando o programa for ler um registro, por eAemplo, pode;se
adicionar a clusula 5I"/ CHE9"D *8H#
read clientes Git@ Hept locH
$sto ir bloquear o registro para que outros usurios no possam alterar este registro.
.ara desbloquear o registro, utili"amos o /'DCk#
unlocH clientes records
Caso o programa ten@a a clusula A!"*;A"I8 no ser necessrio a utili"ao do
bloqueio no 2EA,, para cada leitura feita ser feito um bloqueio automtico e o registro
anteriormente bloqueado ser desbloqueado, agora, se a aplicao necessitar bloquear
mais do que um registro ento utili"a;se a clusula 5I"/ *8H *0 ;!"I9E
2E8*2,#, j que o padro 5I"/ *8H *0 2E8*2,. E>8!#IVE o padro, mas
pode;se especifica;lo. 2*)A8H utili"ada junto com um produto da ;erant ;icro
Focus c@amado File#-are, que possibilita S aplicao desfa"er a gravao de registros
se necessrio.
&Aerccios#
1W ; )ltere o programa &Aerc6.cbl para que o mesmo faa o controle para ambientes
multiusurio.
*5"icos adicionais
*ratamentos de dados alfanumricos
&Aistem trRs comandos de grande utilidade para o tratamento de cadeias de caracteres
ou strings, so eles# I0#9E8", #"2I03 e !0#"2I03. ) estrutura do comandos
I0#9E8" #
(ormato 1#
(ormato 2#
(ormato 3#
(ormato 4#
comando
I0#9E8"
possui vrios
recursos para
a manipulao de strings, dentre estes recursos os mais utili"ados so os recursos para
identificao de um determinado caractere ou string em uma varivel ou ainda substituir
caracteres de uma varivel. comando a seguir pesquisa a eAistRncia do caractere TaV
dentro da varivel nome#
$nspect nome tallJing eAiste for all TaV
Caso eAista algum caractere TaV dentro da varivel nome a varivel e?iste ter o seu
valor modificado para a quantidade de ocorrRncias de TaV dentro da varivel nome.
comando a seguir substitui as ocorrRncias de T#V por TmV#
$nspect lin@a replacing all T#V bJ TmV
comando #"2I03 utili"ado para unificar o conteFdo de variveis. +ua sintaAe
vista a seguir#
&ste comando muito
utili"ado quando
desejamos, por
eAemplo, montar o
nome completo de um
cliente a partir dos
campos 9rimeiro-0ome
e !ltimo-0ome, por
eAemplo#
+tring primeironome
delimited bJ spaces
T T delimited bJ si"e
segundonome delimited bJ spaces
into nomecompleto
'este eAemplo a varivel primeironome possui TfabioV e segundonome possui TcostaV,
desta forma nomecompleto ir possuir Tfabio costaV. )s clusulas ,EI;I"E, )<
indicam ao comando #"2I03 o que deve ser considerado para delimitar os caracteres
unificados. .ode;se informar uma string para ,EI;I"E, )<, por eAemplo#
+tring primeironome delimited bJ TaV
T T delimited bJ si"e
segundonome delimited bJ ToV
into nomecompleto
0omecompleto ser igual a TfcV.
comando !0#"2I03 possui as caractersticas inversas de #"2I03. +ua sintaAe #
) diferena
bsica entre
+T,$'M e
/'+T,$'M,
que o primeiro,
une os bJtes informados em uma varivel e /'+T,$'M desune os bJtes em vrias
variveis.
2ecu"erando ar/uivos corrom"idos
&m certas circunstQncias pode ocorrer uma corrupo dos arquivos indeAados. &sta
corrupo pode ocorrer quando o programa est fa"endo alguma operao de gravao e
por algum motivo esta operao encerrada no meio do processo. Luando se grava um
registro em um arquivo indeAado, o programa deve atuali"ar o arquivo de dados e
depois o arquivo de ndice, se ocorrer a situao em que o arquivo de dados atuali"ado
e o de ndice no, ir eAistir a corrupo do ndice, ou seja, o arquivo de ndice deiAar
de estar equali"ado com o arquivo de dados. .ara corrigir estes problemas eAiste um
utilitrio c@amado 2E)!I,. &ste utilitrio foi desenvolvido eAclusivamente para
corrigir estes problemas e oferece uma srie de recursos, onde pode se reconstruir o
ndice a partir do arquivo de dados simplesmente. +ua sintaAe mais simples #
2E)!I, arqui$o.dat.
55=55>
' Coment$rios
Descrio
C:D
1a/s
C:D
EstatJsticas
3:&0 visitas
0! doGnloads
' comentrios
Arquios 3emelCantes

c
apostila

lin/ua/em C
apostila

Banco de dados
apostila

Banco de dados
apostila

Peb desi/ner
)postila

Computao Cientifica
)postila

Apostila sobre os m%todosH Qust5in51imeE Rai2en e 3Ci/eo 3Cin/o


)postila

tecnicas 5 para 5 falar 5 em 5 publico


).+T$D)

apostila /eobra
apostila

4aciocinio lo/ico OI
)postila
(iros 4elacionados

6ec?nica )etorial para En/enCeiros 5 Est$tica


Com conceitos precisos e completos e se!es especiais de resolu!es de
problemas, o livro de...

Criatiidade em "ropa/anda
/m livro que p!e o crebro do leitor em movimento. $ncrivelmente absorvente
do primeiro ao...

A Arte da Auerra
'esta edio, alm dos tre"e captulos completos, o leitor vai se aprofundar no
tema com a...
Pesquisar
EbaC uma rede social dedicada eAclusivamente ao campo acadRmico e tem como
principal objetivo o compartil@amento de informao e materiais entre alunos e
professores.
+aiba mais n
3obre o EbaCH
que o &ba@o
)jude;nos a mel@orar
$mprensa
%ireitos )utorais
Termos e .rivacidade
Trabal@e no &ba@
CursosH
)grrias
)rtes
:iolgicas
&ngen@arias
&Aatas
Numanas e +ociais
Bique li/adoH
(acebooH
rHut
TGitter
Mooglec
ebaC )lguns direitos reservados.
p 2<<6;2<13

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