Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila Formação Programador Ansi COBOL
Apostila Formação Programador Ansi COBOL
EDIO N 1 - 2007
___________________________________________________________________
Apoio
Gesto e Execuo
Contedo e Tecnologia
Apresentao
Este livro didtico contm a disciplina de COBOL. Seu objetivo treinar
pessoas que tenham noo de lgica de programao para que, ao final do curso,
estejam capacitadas a desenvolver programas bsicos nessa poderosa e eficaz
ferramenta de desenvolvimento de sistemas.
Para a execuo dos exerccios, construo e compilao dos programasexemplo contidos nestas pginas, utilizaremos basicamente duas ferramentas: um
editor de textos com marcao de linha e coluna (EDIT do MS-DOS) e o
compilador COBOL. Todos os exemplos de programas e de trechos de programas
sero escritos com fonte Courier New, cujo tamanho fixo de letras facilita o
entendimento da linguagem que trabalha com linhas e colunas.
Atualmente, existem muitas variaes do COBOL, principalmente para o
desenvolvimento em ambiente grfico, como veremos no captulo A EVOLUO
DO COBOL. Sendo assim, esta disciplina no tratar o COBOL em termos
grficos. Por outro lado, para facilitar a compreenso do aluno, o assunto foi
dividido em duas partes. Na primeira, so apresentados os conceitos bsicos do
COBOL, suas caractersticas principais, as estruturas, definies, comandos e
interface com o usurio. Na segunda, sero abordados os processos de criao e
manuteno de dados em arquivos e tambm em banco de dados. Esse ltimo
tpico, hoje, talvez uma das principais necessidades do mercado que busca
profissionais conhecedores do COBOL.
Lembre-se de que a sua passagem por esta disciplina ser tambm
acompanhada pelo Sistema de Ensino Virtual Tupy, seja por correio postal, fax,
telefone, e-mail ou Ambiente Virtual de Aprendizagem. Entre sempre em contato
conosco quando surgir alguma dvida ou dificuldade. Participe dos bate-papos
(chats) marcados e envie suas dvidas pelo Tira-Dvidas.
SUMRIO
Carta do Professor
Cronograma de Estudos
Acompanhe no cronograma abaixo os contedos das aulas, e atualize as
possveis datas de realizao de aprendizagem e avaliaes.
Semana Carga horria
Aula
Data/ Avaliao
_/_ a _/_
_/_ a _/_
As divises do COBOL
_/_ a _/_
Tipos de variveis
_/_ a _/_
14
Principais comandos
_/_ a _/_
10
Compilao e Linkedio
_/_ a _/_
14
_/_ a _/_
12
_/_ a _/_
16
_/_ a _/_
22
_/_ a _/_
_/_ a _/_
Plano de Estudos
Ementa
Abordagem sobre histria do COBOL e sua evoluo; estrutura do fonte COBOL;
palavras reservadas; compilao; divises do COBOL; tipos de variveis; comandos
bsicos; interface com usurio (tela); arquivos nativos; desenvolvimento de uma
aplicao; e trabalhar com banco de dados.
Objetivos da Disciplina
Geral
Especficos
Aula 1
Objetivos da Aula
Ao final desta aula, voc dever ser capaz de:
Apresentar dados sobre o surgimento da linguagem de programao COBOL;
Descrever a evoluo do COBOL.
Contedos da Aula
Acompanhe os assuntos desta aula, se preferir, ao
terminar, assinale o contedo j estudado.
Histria do COBOL
Evoluo do COBOL
Exerccios propostos
Seja bem-vindo(a) a nossa primeira aula sobre a Linguagem de Programao COBOL. Primeiramente abordaremos a
Histria e a Evoluo do COBOL, para que seja entendida a
importncia da utilizao dessa ferramenta.
Bons Estudos!
1 HISTRIA DO COBOL
A histria do COBOL inicia em 1959, dentro do Pentgono, quando Grace
Hopper e uma equipe de especialistas vindos da indstria de computadores,
universidades e do Departamento de Defesa dos Estados Unidos iniciaram o
trabalho das primeiras especificaes de uma nova linguagem dirigida diretamente
ao foco dos negcios, independente da plataforma especfica e capaz de ser
flexvel ao ponto de suportar desenvolvimento e mudanas contnuas. As
especificaes iniciais do COBOL surgiram em abril de 1960.
O termo COBOL significa Common Business Oriented Language
(linguagem de programao comum orientada a negcios). Apesar de considerada
ultrapassada por muitos, normalmente aqueles que no conhecem seu potencial
ou no acompanharam sua evoluo, a linguagem de programao que possui o
maior nmero de aplicaes comerciais ativas, sendo executada ao redor do
planeta, pois seus usurios so principalmente Governos, Instituies Bancrias,
Seguradoras, Companhias areas, grandes indstrias, entre outros.
Estima-se que, para converter toda base instalada de programas COBOL
para outra linguagem de alto nvel, seja necessrio cerca de 10% do PIB
Americano.
Qual o porqu de tanto sucesso depois de vrias dcadas? Para quem
conhece COBOL, a resposta fcil. Ele estruturado, robusto, estvel e de
simples aprendizado.
2 EVOLUO DO COBOL
Normalmente, quando o assunto COBOL, os menos esclarecidos j
pensam em mainframes, museus, dinossauros, espcies em extino e coisas do
gnero. Esse preconceito formado em torno do COBOL, pelos profissionais de TI,
de certa forma tem uma razo para existir.
Durante muitos anos, principalmente no final da dcada de 80, a linguagem
COBOL perdeu terreno para outras linguagens, que tiveram maior evoluo. O
Clipper um exemplo dessas linguagens que j vinham com diversas bibliotecas
de apoio ao desenvolvimento, o que facilitava a vida dos programadores iniciantes,
10
impressoras
fiscais,
etc.),
entre
outros,
tambm
poderia
ser
Sntese
Nessa aula, vimos a histria do COBOL, ferramenta que iniciou seu ciclo de
vida a partir de 1960, continua evoluindo e atualmente existem vrios fabricantes
que distribuem produtos COBOL com tecnologia de ponta.
Exerccios propostos
1.
Qual foi o principal fator que fez com que a linguagem de programao
11
___________________________________________________________________
___
3.
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___
4.
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___
Aula 2
Objetivos da Aula
Ao final desta aula, voc dever ser capaz de:
Compreender a estrutura geral do COBOL;
Definir os usos de palavras no COBOL;
Reconhecer as Palavras Reservadas em COBOL;
Determinar as diretrizes a serem seguidas na Linguagem de
Programao COBOL.
Contedos da Aula
Acompanhe os assuntos desta aula, se preferir,
ao terminar, assinale o contedo j estudado.
Conjunto de Caracteres
Palavras em COBOL
Codificando um Fonte COBOL
Exerccios propostos
12
13
1 CONJUNTO DE CARACTERES
Para escrevemos um programa na linguagem COBOL, existem algumas regras
rgidas a serem seguidas, tal qual uma redao que possui incio, meio e fim.
Cada linguagem usa um conjunto de instrues ou comandos que tem um
significado. Por exemplo, todos os livros em portugus, usam combinao de 26
letras do alfabeto, 10 dgitos numricos e sinais de pontuao.
De forma semelhante, os programas em COBOL so escritos usando um
conjunto de caracteres formado pelas 26 letras do alfabeto (Maisculas e Minsculas),
os dez dgitos numricos (de 0 a 9) e os smbolos mostrados na Tabela 1:
Tabela 1 - Smbolos utilizados pelo COBOL
ESPAO
+
ESPAO
Mais
Menos
Multiplicador
Divisor
Igual
Dlar
Ponto
Vrgula
Ponto e Vrgula
Aspas
Apstrofe
Abre Parnteses
Fecha Parnteses
>
Maior que
<
Menor que
Dois Pontos
14
( ) , exceto
REGISTRO-BANCOS
BANCO1-DAT
BANCO1-TXT
ROTINA-DE-GRAVACAO
rotina-de-gravacao
15
16
17
DIVIDE
INPUT-OUTPUT
SELECT
AFTER
DIVISION
INSERT
SEQUENTIAL
ALL
DUPLICATES
INSPECT
SIZE
ALPHANUMERIC
DYNAMIC
INTO
SORT
ALTER
ELSE
LAST
SPACE
ALTERNATE
END
LESS
SPACES
AND
ENVIRONMENT
LINE
START
ASCENDING
EQUAL
LINKAGE
STOP
ASSIGN
ESCAPE
MOVE
STRING
AUTHOR
EVALUATE
MULTIPLY
THRU
BY
FD
NAME
TRUE
CALL
FILE
NEXT
UNLOCK
CANCEL
FILE-CONTROL
NUMERIC
UNSTRING
COMP
FILE-ID
OCCURS
UNTIL
COMP-3
FILLER
OR
USING
COMPUTE
FROM
PERFORM
VALUES
CONFIGURATION
GIVING
PICTURE
WHEN
COPY
I-O
PROCEDURE
WITH
CURRENT-DATE
IDENTIFICATION
PROGRAM-ID
WRITE
DELETE
IF
READ
ZERO
DELIMITED
INDEXED
REDEFINES
ZEROS
DISK
INITIALIZE
RELATIVE
ZEROES
18
Essa
coluna
chamada
rea
de
ainda
respeitam
os
padres,
por
garantirem
melhor
19
20
Sntese
Nessa aula vimos como funcionam a definio e o uso de palavras em COBOL.
Vimos tambm as principais palavras reservadas da linguagem e as diretrizes de
posicionamento dos caracteres a serem seguidas, na construo de um fonte
COBOL.
21
Exerccios Propostos
1.Cite no mnimo cinco smbolos suportados pelo COBOL, alm das letras e
nmeros:
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___
2.Qual o
tamanho
EM
COBOL? E
qual a
22
reas A e B
_______________________________________________________________
_______________________________________________________________
__
Aula 3
DIVISES DO COBOL
Objetivos da Aula
Ao final da aula, voc dever ser capaz de:
Identificar cada diviso do COBOL;
Distinguir os procedimentos para cada diviso no COBOL;
Definir as principais clusulas existentes no COBOL.
Contedos da Aula
Acompanhe os assuntos desta aula, se preferir, ao
terminar, assinale o contedo j estudado.
Identification Division
Environment Division
Data Division
Procedure Division
Exerccios propostos
23
24
1 IDENTIFICATION DIVISION
a diviso inicial da linguagem, que identifica o programa em todas as suas
etapas de desenvolvimento. Nela podem ser includos a data do programa, a data da
compilao, o nome do autor, comentrios, etc.
Seu formato o seguinte:
IDENTIFICATION DIVISION.
PROGRAM-ID.
AUTHOR.
DATE-WRITTEN.
(comentrios)
DATE-COMPILED
(comentrios)
IDENTIFICATION DIVISION.
PROGRAM-ID.
MENU.
AUTHOR.
SOCIESC.
DATE-WRITTEN.
01/04/07.
25
DATE-COMPILED.
*
*
*
IDENTIFICATION DIVISION.
PROGRAM-ID.
CADPESSOA.
AUTHOR.
SOCIESC.
DATE-WRITTEN.
02/04/07.
DATE-COMPILED.
*
*
Cadastro de Clientes
2 ENVIRONMENT DIVISION
a diviso de ambiente, que descreve o ambiente operacional e os perifricos
que sero utilizados no programa. Ela pode ser subdividida em duas sees:
CONFIGURATION SECTION - Responsvel pela configurao do ambiente.
subdividida em trs clusulas opcionais:
o SOURCE-COMPUTER Identifica o computador no qual foi confeccionado
o programa.
o OBJECT-COMPUTER Identifica o computador do ambiente de execuo.
o SPECIAL-NAMES Especifica vrios parmetros, como sinal monetrio,
tipo de ponto decimal, caracteres simblicos e possibilita adaptar o
programa para se comunicar com programas de outras linguagens.
26
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES. DECIMAL POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*
* NESTE ESPAO SO INSERIDAS AS ESPECIFICAES DOS
* ARQUIVOS UTILIZADOS PELO PROGRAMA
*
Declaramos a clusula
27
DATA DIVISION.
FILE SECTION.
[Construo da Tela]
As sees da DATA DIVISION tornam-se obrigatrias apenas se o programa
utilizar seus recursos. Por exemplo, caso o programa em questo no manipule
arquivos, no necessita declarar a seo FILE SECTION, que se torna obrigatria.
Essa regra prevalece para as demais sees.
28
4 PROCEDURE DIVISION
A ltima diviso do COBOL responsvel pela especificao das aes
necessrias para o processamento dos dados em geral: controle de execuo,
entrada e sada, movimento dos dados, etc. Em resumo, nesta diviso que a lgica
do programa propriamente dita desenvolvida.
Os procedimentos descritos na PROCEDURE DIVISION so escritos em
STATEMENTS e esto, geralmente, agrupados em pargrafos ou sees, criados
pelo programador.
4.1 Estrutura da Procedure Division
PROCEDURE DIVISION.
[Nome de Seo]
[Nome de Pargrafo]
[Sentenas]...]...]...
Como mostra o exemplo, o STATEMENT a aula bsica da Diviso de
Procedimentos. Existem dois tipos de pargrafos de STATEMENTS: condicionais
e imperativos. Uma sentena composta por um ou mais statements, terminando
sempre por um ponto seguido de espao. As sentenas podem ser agrupadas para
formar um pargrafo. Um ou mais pargrafos formam uma seo, que iniciada por
um nome de seo seguida da palavra section e por um ponto.
Recapitulando nossa aula 02, o nome da seo deve iniciar na rea A (coluna
08). Uma seo termina imediatamente antes do prximo nome de seo ou pelo
trmino do programa.
Vejamos o exemplo abaixo da PROCEDURE DIVISION, preocupando-nos,
nesse momento, no com os comandos e sim com sua estrutura:
PROCEDURE DIVISION.
INICIO-SECTION.
ABRE-ARQUIVO.
OPEN INPUT ARQALUNOS.
29
TO IMP-NOME.
30
Sntese
Nessa aula aprendemos sobre as quatro divises do COBOL. Suas definies
de estrutura, o conceito de seo, pargrafos e sentenas. Evidenciamos que nem
todas as divises so obrigatrias, mas podem tornar-se medida que seu uso seja
requisitado no programa.
Exerccios Propostos
1.
DIVISION:
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___
2.
diretiva:
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___
3.
existentes:
31
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
__
4.
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___
Aula 4
TIPOS DE VARIVEIS
Objetivos da Aula
Ao final da aula, voc dever ser capaz de:
Identificar os principais tipos de variveis do COBOL;
Diferenciar os principais tipos de variveis do COBOL;
Definir o tipo e o tamanho de varivel aplicvel em cada
programa.
Contedos da Aula
Acompanhe os assuntos desta aula, se preferir, ao terminar,
assinale o contedo j estudado.
Conceito de Nveis
Tipo de Dados
Variveis Editadas
Clusula Redefines
Exerccios propostos
32
33
1 CONCEITO DE NVEIS
Como vimos na Aula anterior, todos os dados, registros e valores processados
por um programa devem estar definidos na DATA DIVISION do programa,
normalmente na seo de armazenamento de trabalho (WORKING-STORAGE
SECTION) ou ento, caso sejam dados de arquivos gerenciados pela prpria
linguagem, na FILE SECTION.
Todas as definies de variveis, sejam as temporrias ou as de arquivos,
devem seguir um formato padro, iniciando com um nmero de nvel que, por sua
vez,
01 REGISTRO-ALUNO.
02 NOME-ALUNO.
03 PRIMEIRONOME
PIC A(020).
03 SOBRENOME
PIC X(030).
02 ENDERECO-ALUNO.
03
LOGRADOURO
PIC X(003).
03
NOME-DA-RUA
PIC X(040).
03
NUMERO-DA-RUA
PIC 9(005).
03
03
BAIRRO-ALUNO
PIC X(030).
03
CIDADE-ALUNO
PIC X(030).
03
ESTADO-ALUNO
PIC A(002).
02 DATA-NASCIMENTO-ALUNO.
03
DIA-NASCIMENTO
PIC 9(002).
03
MS-NASCIMENTO
PIC 9(002).
03
ANO-NASCIMENTO
PIC 9(004).
34
Vamos supor que nosso programa esteja lendo um arquivo de alunos, definido
com a estrutura acima. Repare que, ao registro do arquivo, associamos o nvel 01, o
maior ou o mais resumido.
Veja agora o Nome do Aluno. Dentro do item elementar REGISTRO-ALUNO,
definimos um item de grupo, chamado NOME-ALUNO, sem atribuio nenhuma,
contudo, nas duas linhas seguintes, dividimos os campos em dois outros itens de
grupo: PRIMEIRONOME e SOBRENOME, o primeiro com 20 caracteres de tamanho
e o segundo com 30. Na linha seguinte, o nmero do nvel voltou para um valor mais
alto, indicando que o item de grupo anterior acabou e ali est iniciando outro item.
Da mesma forma o item de grupo ENDERECO-ALUNO foi tambm subdividido
em outros itens de grupo: LOGRADOURO, NOME-DA-RUA, NUMERO-DA-RUA e
assim por diante, at o prximo item de grupo com nvel inferior, DATANASCIMENTO-ALUNO.
Os nmeros de nvel, nessas condies, podem variar de 01 at 49. Na
programao profissional, normalmente usam-se intervalos maiores entre os nveis
superiores a 01 para as subdivises, como de 02 em 02, ou 03 em 03. Usando
intervalo de 02, teramos:
01 REGISTRO-ALUNO.
03 NOME-ALUNO.
05 PRIMEIRONOME
PIC A(020).
05 SOBRENOME
PIC X(030).
03 ENDERECO-ALUNO.
05
LOGRADOURO
PIC X(003).
05
NOME-DA-RUA
PIC X(040).
05
NUMERO-DA-RUA
PIC 9(005).
05
05
CEP-ALUNO
PIC 9(008).
05
BAIRRO-ALUNO
PIC X(030).
05
CIDADE-ALUNO
PIC X(030).
05
ESTADO-ALUNO
PIC A(002).
03 DATA-NASCIMENTO-ALUNO.
05
DIA-NASCIMENTO
PIC 9(002).
05
MS-NASCIMENTO
PIC 9(002).
05
ANO-NASCIMENTO
PIC 9(004).
35
77
RESULTADO-OPERACAO
PIC 9(007)V99.
77
TITULO-RELATORIO
PIC X(050).
01
01
ESTADO-CIVIL
PIC X(001).
88
CASADO
VALUE C.
88
SOLTEIRO
VALUE S.
88
DIVORCIADO
VALUE D.
SEXO-ALUNO
PIC X(001).
88
MASCULINO
VALUE M.
88
FEMININO
VALUE F.
36
Vamos supor agora que, em algum programa, iremos trabalhar com os 3 tipos
de dados (numrico, alfanumrico e alfabtico), conforme mostra a tabela 3:
Tabela 3 - Tipos de variveis
NOME DA VARIVEL
CONTEDO
NUMERICA-1
251666
NUMERICA-2
ALFABETICA-1
ALFANUMERICA-1
TIPO
Numrica
750,33
Numrica
SOCIESC
Alfabtica
sociesc123@sociesc.com.br Alfanumrica
NUMERICA-1
PIC 9(006)
VALUE 251666
77
NUMERICA-2
PIC 9(003)V99
VALUE 750,33
77
ALFABETICA-1
PIC A(007)
VALUE SOCIESC.
77
ALFANUMERICA-1
PIC X(020)
VALUE sociesc123@sociesc.com.br
Ou dessa forma:
01
NUMERICA-1
PIC 9(006)
VALUE 251666
01
NUMERICA-2
PIC 9(003)V99
VALUE 750,33
01
ALFABETICA-1
PIC A(007)
VALUE SOCIESC.
01
ALFANUMERICA-1
PIC X(020)
VALUE sociesc123@sociesc.com.br
37
Note que as variveis podem tanto ser representadas pelo nvel especial 77,
que independente, como pelo nvel elementar 01, quando este no est associado
a itens de grupo.
Se voc observar atentamente, tambm ver que introduzimos uma nova
clusula na definio das variveis (VALUE), ou seja, atribumos um valor inicial
para cada uma, que poder permanecer dessa forma (conceito de constante) ou
poder ser modificado no decorrer do programa, de acordo com a lgica
estabelecida.
3 VARIVEIS EDITADAS
As variveis que utilizamos apenas para processamento interno de clculos e
execuo de procedimentos, ou para definio da estrutura de dados em arquivos,
normalmente esto no estado original do tipo de dado no editado. A partir do
momento que as informaes necessitam ser exibidas ao usurio final de um
sistema, na forma de consulta em vdeo ou relatrio, normalmente precisam ser
editadas, para melhor apresentao. nessa hora que aplicamos o conceito das
Variveis Editadas, ou seja, tiramos a varivel de seu estado original (no editado) e
damos a ele um estado de apresentao mais refinado.
Imaginemos o registro de um arquivo de notas fiscais, conforme estrutura
definida abaixo:
01 REGISTRO-NOTAFISCAL.
03 NUMERO-NOTAFISCAL
PIC 9(009).
03 CPF-CLIENTE-NOTAFISCAL
PIC 9(011).
03 VALOR-NOTAFISCAL
PIC 9(011)V99.
03 DATA-NOTAFISCAL.
05
DIA-NOTAFISCAL
PIC 9(002).
05
MS-NOTAFISCAL
PIC 9(002).
05
ANO-NOTAFISCAL
PIC 9(004).
38
variveis, porm, a partir do momento que seja necessria uma sada de dados, seja
por consulta ou relatrio, devemos melhorar o modo de apresentao dos dados.
Vejamos agora como ficaria a consulta de algumas notas fiscais gravadas no
arquivo, se apresentssemos as variveis no editadas, conforme mostra tabela 4.
Contedo do Registro:
Tabela 4 - Variveis no editadas
N.NOTA FISCAL
CPF DO CLIENTE
DATA DA NOTA
000000589
12345678900
00000001598,50
01012007
000000590
44561345699
00000000077,99
10022008
Vejamos agora como ficaria essa mesma consulta, com o uso de variveis editadas,
como mostra tabela 5.
Tabela 5- Variveis editadas
N.NOTA FISCAL
CPF DO CLIENTE
DATA DA NOTA
589
123.456.789.00
1.598,50
01/01/2007
590
445.613.456.99
77,99
10/02/2008
PIC 9(009).
03 VALOR-NOTAFISCAL
PIC 9(011)V99.
39
PIC ZZZZZZZZ9.
03 VALOR-NOTAFISCAL-EDIT
PIC ZZ.ZZZ.ZZZ.ZZ9,99.
PIC 9(011).
03 DATA-NOTAFISCAL.
05
DIA-NOTAFISCAL
PIC 9(002).
05
MS-NOTAFISCAL
PIC 9(002).
05
ANO-NOTAFISCAL
PIC 9(004).
PIC 999.999.999.99.
03 DATA-NOTAFISCAL-EDIT
PIC 99/99/9999.
40
01 REGISTRO-NOTAFISCAL.
03 NUMERO-NOTAFISCAL
PIC 9(009).
03 CPF-CLIENTE-NOTAFISCAL
PIC 9(011).
03 VALOR-NOTAFISCAL
PIC 9(011)V99.
03 DATA-NOTAFISCAL.
05
DIA-NOTAFISCAL
PIC 9(002).
05
MS-NOTAFISCAL
PIC 9(002).
05
ANO-NOTAFISCAL
PIC 9(004).
03 NUMERO-NOTAFISCAL-EDIT
PIC ZZZZZZZZ9.
PIC ZZ.ZZZ.ZZZ.ZZ9,99.
03 DATA-NOTAFISCAL-EDIT
PIC 99/99/9999.
MOVE NUMERO-NOTAFISCAL
TO NUMERO-NOTAFISCAL-EDIT.
TO VALOR-NOTAFISCAL-EDIT.
MOVE DATA-NOTAFISCAL
TO DATA-NOTAFISCAL-EDIT.
DISPLAY NUMERO-NOTAFISCAL-EDIT
AT 0101.
AT 0132.
DISPLAY DATA-NOTAFISCAL-EDIT
AT 0152.
4 CLUSULA REDEFINES
Essa uma clusula opcional na definio de variveis. Como o prprio nome
sugere, permite a redefinio de qualquer varivel, subdividindo-a em nveis
menores ao da varivel que est sendo redefinida. Vejamos:
03
DATA-COMPRA
03
REDEFINES DATA-COMPRA.
PIC 9(008).
05
DIA-COMPRA
PIC 9(002).
05
MS-COMPRA
PIC 9(002).
05
ANO-COMPRA
PIC 9(004).
03
HORARIO-COMPRA
03
REDEFINES HORARIO-COMPRA.
41
PIC 9(004).
05
HORA-COMPRA
PIC 9(002).
05
MIN-COMPRA
PIC 9(002).
Podemos notar que essa clusula acaba se tornando bastante til e prtica
para os programadores, pois permite que se trabalhe tanto com o item principal
(DATA-COMPRA e HORARIO-COMPRA) como tambm permite o uso das variveis
redefinidas.
Vamos supor que o programa necessite efetuar sempre uma consistncia
sobre o ms da compra o programador no precisa desenvolver nenhuma lgica
mirabolante para extrair o ms de dentro da varivel DATA-COMPRA, basta usar
diretamente a varivel MES-COMPRA. A nica regra que prevalece numa
redefinio a de que a soma dos bytes das variveis redefinidas deve equivaler ao
total de bytes da varivel original.
03
HORARIO-COMPRA
PIC 9(004).
03
REDEFINES HORARIO-COMPRA.
05
HORA-COMPRA
PIC 9(002).
05
MIN-COMPRA
PIC 9(003).
42
indique sua posio, alm de indicar qual dado ser utilizado: Por exemplo, uma
tabela de meses:
01
01
TABELA-MESES.
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
REDEFINES TABELA-MESES.
03
MES-EXTENSO
Nesse caso, o ndice subscrito ser o ms (entre parnteses) que define qual a
ocorrncia selecionada.
Para que voc possa ter idia da reduo de linhas de cdigo com o uso
apropriado da clusula OCCURS, vejamos um exemplo utilizando esse recurso de
forma apropriada e outro exemplo que no utiliza o recurso:
Uso do Occurs
*
*...5....0....5....0....5....0....5....0....5....0....5....0....5...
43
*
IDENTIFICATION DIVISION.
PROGRAM-ID.
AUTHOR.
PROGR2.
SOCIESC.
*
* Programa Exemplo de Ocorrncias
*
DATA DIVISION.
WORKING-STORAGE SECTION.
01
01
TABELA-MESES.
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
REDEFINES TABELA-MESES.
03
MES-EXTENSO
01
DATA1
01
REDEFINES DATA1.
03
DIA1
PIC 9(002).
03
MES1
PIC 9(002).
03
ANO1
PIC 9(004).
01
DATA2
01
REDEFINES DATA2.
03
DIA2
PIC 9(002).
03
MES2
PIC 9(002).
03
ANO2
PIC 9(004).
PROCEDURE DIVISION.
INICIO-SECTION.
DISPLAY ERASE AT 0101.
*
*
44
e SETEMBRO
*
DISPLAY MES-EXTENSO(MES1)
AT 1010.
DISPLAY MES-EXTENSO(MES2)
AT 1110.
STOP RUN.
PROGR2.
SOCIESC.
*
* Programa Exemplo sem uso de Ocorrencias
*
DATA DIVISION.
WORKING-STORAGE SECTION.
01
DATA1
01
REDEFINES DATA1.
03
DIA1
PIC 9(002).
03
MES1
PIC 9(002).
03
ANO1
PIC 9(004).
01
DATA2
01
REDEFINES DATA2.
03
DIA2
PIC 9(002).
03
MES2
PIC 9(002).
03
ANO2
PIC 9(004).
PROCEDURE DIVISION.
INICIO-SECTION.
DISPLAY ERASE AT 0101.
IF
MES1 = 01
DISPLAY JANEIRO AT 1010
END-IF
IF
MES1 = 02
DISPLAY FEVEREIRO AT 1010
END-IF
IF
MES1 = 03
DISPLAY MARO AT 1010
END-IF
IF
MES1 = 04
DISPLAY ABRIL AT 1010
END-IF
IF
MES1 = 05
DISPLAY MAIO AT 1010
END-IF
IF
MES1 = 06
DISPLAY JUNHO AT 1010
END-IF
IF
MES1 = 07
DISPLAY JULHO AT 1010
END-IF
IF
MES1 = 08
DISPLAY AGOSTO AT 1010
END-IF
IF
MES1 = 09
DISPLAY SETEMBRO AT 1010
END-IF
IF
MES1 = 10
DISPLAY OUTUBRO AT 1010
END-IF
IF
MES1 = 11
DISPLAY NOVEMBRO AT 1010
END-IF
IF
MES1 = 12
DISPLAY DEZEMBRO AT 1010
END-IF
IF
MES2 = 01
DISPLAY JANEIRO AT 1110
END-IF
IF
MES2 = 02
DISPLAY FEVEREIRO AT 1110
END-IF
IF
MES2 = 03
DISPLAY MARO AT 1110
END-IF
IF
MES2 = 04
DISPLAY ABRIL AT 1110
END-IF
IF
MES2 = 05
DISPLAY MAIO AT 1110
END-IF
IF
MES2 = 06
DISPLAY JUNHO AT 1110
45
46
END-IF
IF
MES2 = 07
DISPLAY JULHO AT 1110
END-IF
IF
MES2 = 08
DISPLAY AGOSTO AT 1110
END-IF
IF
MES2 = 09
DISPLAY SETEMBRO AT 1110
END-IF
IF
MES2 = 10
DISPLAY OUTUBRO AT 1110
END-IF
IF
MES2 = 11
DISPLAY NOVEMBRO AT 1110
END-IF
IF
MES2 = 12
DISPLAY DEZEMBRO AT 1110
END-IF
STOP RUN.
Sntese
47
Exerccios Propostos
1.
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___
2.
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___
4.
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___
5.
48
___________________________________________________________________
__
6.
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
__
7.
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___
8.
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___
9.
de um programa:
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___
Aula 5
PRINCIPAIS COMANDOS
Objetivos da Aula
Ao final desta aula, voc dever ser capaz de:
Identificar os principais comandos da Linguagem COBOL;
Definir os comandos adequados a cada situao no desenvolmento de um programa;
Adquirir habilidades para aplicar os vrios formatos dos comandos utilizados pelo COBOL.
Contedos da Aula
Acompanhe os assuntos desta aula, se preferir, ao
terminar, assinale o contedo j estudado.
Comandos Bsicos
Comandos Condicionais
Comandos de Desvio
Comandos Especiais
Exerccios propostos
49
50
1 COMANDOS BSICOS
Como vamos falar de comandos, aqui vai uma regrinha bsica: todo pargrafo
ou seo deve possuir um ponto final ou o ltimo comando executado deve
possuir um ponto. Parece um detalhe sem importncia no? Pois veremos, a partir
de agora, que trabalharemos muito mais na PROCEDURE DIVISION, que um ponto
fora do lugar pode complicar muito a vida do programador.
Veja a seguir os principais comandos utilizados pelo COBOL, e suas
aplicaes:
2 DISPLAY
Comando utilizado para exibir informaes na tela, em ambiente caracter. Seu
uso em conjunto com a palavra reservada ERASE limpa a tela. Alguns exemplos de
formatos:
DISPLAY ERASE AT 0101
51
3 ACCEPT
Comando utilizado para aceitar entrada de dados nos programas. atravs
dele que os dados digitados pelos usurios na tela retornaro ao programa. Possui
vrios formatos, vamos ver os principais:
ACCEPT NOME-ALUNO AT 1020
ACCEPT DATA-ADMISSAO AT 1020 WITH AUTO-SKIP
ACCEPT SENHA AT 1830 WITH NO-ECHO
ACCEPT RESPOSTA AT 1020 ON ESCAPE <sentena>
52
4 MOVE
Esse um dos comandos mais utilizados em COBOL, pois o responsvel
pela transferncia de dados, ou seja, associa um determinado valor fixo ou de uma
varivel a uma ou mais variveis.
MOVE 18 TO IDADE-MINIMA.
MOVE DATA-ATUAL TO DATA-RELATORIO.
MOVE 1 TO A1, A2, A3.
MOVE ALL * TO LINHA-RELATORIO.
No primeiro exemplo, transferimos um valor fixo (18) para a varivel IDADEMINIMA. No segundo, transferimos o contedo de DATA-ATUAL para a varivel
DATA-RELATORIO. No terceiro, movemos o valor 1, simultaneamente, para 3
variveis (A1, A2 e A3). Por fim, no ltimo exemplo, com a clusula ALL, movemos o
caracter asterisco (*) para o tamanho exato em bytes da varivel LINHARELATORIO.
Observe que, no uso da declarao MOVE, todas as variveis envolvidas
devem ser do mesmo tipo de dado.
Note que, entre os elementos da declarao MOVE existe a palavra reservada
TO em destaque, fazendo parte da sintaxe do comando.
5 STOP RUN
Comando utilizado para encerrar a aplicao. No possui variaes.
Vejamos agora uma variao do programa da aula anterior, utilizando todos os
comandos bsicos, comentados linha por linha:
53
*
*...5....0....5....0....5....0....5....0....5....0....5....0....5....0
*
IDENTIFICATION DIVISION.
PROGRAM-ID.
AUTHOR.
PROGR3.
SOCIESC.
*
* Programa Exemplo dos Comandos Bsicos
*
DATA DIVISION.
WORKING-STORAGE SECTION.
01
01
TABELA-MESES.
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
REDEFINES TABELA-MESES.
03
MES-EXTENSO
01
DATA1
01
REDEFINES DATA1.
01
03
DIA
PIC 9(002).
03
MES
PIC 9(002).
03
ANO
PIC 9(004).
DATA-EDIT
PIC 99/99/9999.
PROCEDURE DIVISION.
INICIO-SECTION.
DISPLAY ERASE AT 0101.
* A linha acima limpou a tela.
DISPLAY "Digite a Data (DD/MM/AAAA) - " AT 1010.
* A linha acima exibiu o contedo entre as , na linha 10,
* coluna 10
ACCEPT DATA1 AT 1040.
* A linha acima est aguardando o usurio entrar com dados
54
55
Add
Subtract
Multiply
Divide
Compute
6.1 Add
Utilizado para somar valores, entre variveis e literais (nmeros inteiros fixos
escritos no programa).
ADD 10 TO CONTADOR-LINHAS.
ADD TOTAL-FALTAS-MES TO TOTAL-FALTAS-SEMESTRE.
No primeiro exemplo, somamos um literal de valor 10 na varivel CONTADORLINHAS. No segundo exemplo, somamos duas variveis.
Note que, entre os elementos da soma, existe a palavra reservada TO em
destaque. Ela faz parte da sintaxe do comando.
6.2 Subtract
Utilizado para subtrair valores, segue as mesmas regras do comando ADD.
56
6.3 Multiply
Utilizado para multiplicar valores. Temos trs formatos:
MULTIPLY 100 BY TAXA-JUROS - Nesse primeiro formato, o literal
(100) multiplicado pela varivel TAXA-JUROS, que vai receber o
resultado desta multiplicao.
MULTIPLY HORAS-TRABALHADAS BY TOTAL - No segundo
formato, existe a multiplicao entre variveis e a segunda varivel
armazenar o resultado da multiplicao.
MULTIPLY HORAS-TRABALHADAS BY SALARIO-HORA GIVING
SALARIO-MS - Nesse terceiro formato, temos a clusula GIVING
muito til quando queremos o resultado da multiplicao numa varivel
em separado. Nesse caso, o resultado ser armazenado na varivel
SALARIO-MES.
Ateno Aluno!
Este comando MULTIPLY TAXA-JUROS BY 100 no ser aceito pelo
compilador, pois se no for especificada a clusula GIVING, o resultado
sempre vai para o 2 elemento, que deve ser ento varivel, no um literal.
Note que entre os elementos da multiplicao existe a palavra reservada BY
em destaque. Ela faz parte da sintaxe do comando.
6.4 Divide
Utilizado para dividir valores. Embora possua vrios formatos, vamos nos ater
ao principal deles, que segue a mesma regra do terceiro formato do comando
MULTIPLY.
57
Nesse caso, o resultado da diviso ser armazenado na varivel SALARIOHORA, preservando o valor original das outras variveis envolvidas na diviso.
6.5 Compute
o comando mais utilizado para clculos no COBOL. Podemos utilizar
qualquer expresso aritmtica vlida (excluindo-se chaves {} e colchetes []) para
que o COMPUTE a execute. Os sinais esperados no comando compute so os
demonstrados na tabela 6:
Tabela 6 - Sinais esperados no comando COMPUTE.
+
Adicionar
Subtrair
Multiplicar
Dividir
**
Exponenciao
- 1
58
59
IF
NOME-ALUNO = SPACES
DISPLAY Nome Aluno Desconhecido... AT 1010
ELSE
DISPLAY NOME-ALUNO AT 1010
END-IF
NOME-ALUNO = SPACES.
DISPLAY Nome Aluno Desconhecido... AT 1010.
ELSE.
DISPLAY NOME-ALUNO AT 1010.
END-IF.
NOME-ALUNO = SPACES
DISPLAY Nome Aluno Desconhecido... AT 1010
ELSE
DISPLAY NOME-ALUNO AT 1010
END-IF.
60
comando
IF,
existem
condies
vlidas
SMBOLO
CLUSULA
Igual
EQUAL
Menor que
<
LESS
<=
NOT GREATER
Maior que
>
GREATER
>=
NOT LESS
Diferente
<>
NOT EQUAL
IF
NOME-ALUNO = Joo
DISPLAY NOME-ALUNO AT 1010
END-IF
IF
END-IF
IF
END-IF
IF
END-IF
Vimos at agora o IF com condies simples. Pode ser utilizado tambm com
condies complexas - associao de condies simples com operadores lgicos,
que podem ser:
61
AND Uma condio AND ser verdadeira quando todos os itens nela
IF
IDADE >= 18
OR AUTORIZACAO-VIAGEM = S
DISPLAY Aluno Autorizado a Viajar com a Escola! AT 0510
END-IF.
IF
MEDIA-ALUNO < 4
DISPLAY Aluno Reprovado... AT 1120
ELSE
IF
MEDIA-ALUNO < 7
DISPLAY Aluno em Recuperao... AT 1120
ELSE
DISPLAY Aluno Aprovado... AT 1120
END-IF
END-IF
62
EVALUATE MEDIA-ALUNO
63
WHEN 0
WHEN 1
WHEN 2
WHEN 3 DISPLAY Aluno Reprovado AT 1020
WHEN 4
WHEN 5
WHEN 6 DISPLAY Aluno em Recuperao AT 1020
WHEN OTHER DISPLAY Aluno Aprovado AT 1010
END-EVALUATE
EVALUATE SIGLA-ESTADO
WHEN SC DISPLAY SANTA CATARINA AT 1020
WHEN PR DISPLAY PARANA AT 1020
WHEN SP DISPLAY SO PAULO AT 1020
...
WHEN OTHER DISPLAY ESTADO INVLIDO AT 1020
END-EVALUATE
EVALUATE NUMERO
WHEN 1 ADD 10 TO NUMERO
DISPLAY NUMERO AT 1015
WHEN 2 ADD 20 TO NUMERO
IF
ELSE
DISPLAY Numero Excedeu Limite AT 1015
END-IF
END-EVALUATE
8 COMANDO DE DESVIOS
comum, em lgicas complexas e extensas, que o programa, durante o
desenvolvimento, tenha que ser, por muitas vezes, desviado para processar outras
rotinas, retornando ao ponto de partida - ou ainda, dependendo da condio que ,
aps o desvio, no retorne ao ponto original, e continue executando as instrues do
programa deste ponto em diante.
Existem dois comandos para controle dos desvios: o Comando PERFORM e
o COMANDO GO TO.
64
...
IF IDADE >= 18
PERFORM LISTA-TIT-ELEITOR-SECT
ELSE
DISPLAY Titulo no Obrigatrio AT 1215
END-IF
...
EVALUATE TIPO-SALARIO-PROFESSOR
WHEN Por Hora
PERFORM SALARIO-HORA-SECT
PERFORM SALARIO-MENSAL-SECT
END-EVALUATE
...
PROCEDURE DIVISION.
INICIO.
DISPLAY ERASE AT 0101.
PERFORM ABRE-ARQUIVOS-SECT.
* A linha acima provoca um desvio no programa para abrir
* arquivos que sero necessrios execuo do mesmo.
* Note que se voc fizer o exerccio de entender o PERFORM
* como uma ordem, ou seja, EXECUTE A SEO ABRE-ARQUIVOS-SECT
* o entendimento desta declarao ser muito mais fcil.
* Aps executar a seo, o programa retorna o controle ao
* ponto de partida, continuando a execut-lo a partir da
* prxima linha vlida.
IF ABRIU-ARQUIVOS = Com Erro
STOP RUN
END-IF
65
PERFORM PROCESSA-CALCULO-SECT.
* Novo desvio para executar a seo PROCESSA-CALCULO-SECT.
* Ao finalizar a execuo da seo, o controle do programa volta
* a este ponto, continuando a lgica novamente a partir da
* prxima linha vlida. ISSO UMA CONSTANTE NO USO DESTE
* FORMATO DO PERFORM.
PERFORM FECHA-ARQUIVOS-SECT.
* Por fim, desviamos o programa para executar a seo
* que fecha os arquivos abertos no inicio do mesmo.
STOP RUN.
PROCEDURE DIVISION.
INICIO.
PERFORM HISTORICO-COBOL-SECT.
PERFORM ESTRUTURA-FONTE-SECT.
PERFORM DIVISOES-COBOL-SECT.
PERFORM TIPOS-VARIAVEIS-SECT.
PERFORM PRINCIPAIS-COMANDOS-SECT.
...
PERFORM CONCLUSAO-CURSO-SECT.
STOP RUN.
66
8.1.2 Formato 2
Execuo de Procedimentos ou Sees com repeties, atravs da clusula
TIMES (vezes). O literal especificado antes da clusula TIMES pode ser fixo ou uma
varivel. Vejamos os exemplos abaixo:
TO COD-ALUNO-EDIT
67
Nesse outro exemplo, o PERFORM ser executado at que a condio QTDEALUNOS seja = a ZERO. Nesse formato do PERFORM, para fins de padronizao,
utilizamos clusula END-PERFORM, indicando o encerramento da declarao.
8.2 Comando Go To
Essa declarao desvia a execuo do programa do ponto onde foi inserida,
mas no retorna mais a esse ponto. a principal diferena entre os dois comandos
de desvio. O PERFORM executa a rotina e retorna ao ponto de partida: ao passo
que o GO TO no retorna em hiptese alguma: ele faz o desvio para outro pargrafo
do programa, sem dar continuidade aos comandos que existirem abaixo dele.
Vejamos:
PROCEDURE DIVISION.
INICIO.
PERFORM ABRE-ARQUIVOS-SECT.
IF ABRIU-ARQUIVOS = Com Erro
GO TO FINAL
END-IF.
PROCESSAMENTO.
DISPLAY ERASE AT 0101.
PERFORM PROCESSA-CALCULO-SECT.
RESPOSTA.
DISPLAY Processar Novamente? (S/N) AT 1001.
68
9 COMANDOS ESPECIAIS
Os comandos especiais no COBOL so os seguintes:
Exit
Initialize
String
Unstring
Call
Exit Program
9.1 Exit
Declarao utilizada para encerrar uma seo.
PROCESSA-FOLHA-SECT SECTION.
69
PROCESSA-INICIO.
...
[Procedimentos da Seo]
...
PROCESSA-FIM.
EXIT.
9.2 Initialize
Declarao utilizada para inicializar variveis, de acordo com seu tipo de dado
(numrico, alfanumrico ou alfabtico). Recurso muito til quando a lgica do
programa desenvolvido permite que o processamento seja refeito ou que um bloco
de variveis seja utilizado para vrios fins dentro do mesmo programa. As variveis
da WORKING-STORAGE SECTION, principalmente, devem iniciar um segundo
processo com seus valores zerados, exatamente como se fosse a primeira execuo
da rotina. Vejamos:
01
VARIAVEIS-NUMERICAS.
03
VALOR1
PIC 9(009)V99.
03
VALOR2
PIC 9(009)V99.
03
TOTAL-JUROS-MES
PIC 9(003)V99.
03
03
QTDE-CLIENTES-EM-DIA
PIC 9(005).
70
9.2 String
Efetua a concatenao de duas ou mais cadeias de caracteres.
Sua sintaxe a seguinte:
STRING [Identificador-1] DELIMITED BY [Identificador-2 ou SIZE]
INTO [Identificador-3]
END-STRING
9.3 Unstring
Declarao inversa da STRING, que serve para repartir cadeias de caracteres
em itens de dados separados. A sintaxe mais extensa do que o comando STRING.
Vamos nos ater a uma sintaxe mais reduzida:
UNSTRING <Varivel-que-sera-repartida>
DELIMITED BY <caracteres-para-repartio-das-variveis>
INTO <variavel-1> <variavel-2> ...<variavel-N>
COUNT IN <varivel-contagem-bytes> (opcional)
71
END-UNSTRING
<SENTENCA>
72
GO TO FIM-PROGRAMA.
9(006).
9(002).
9(002).
9(002).
03 DATA-1
03 REDEFINES DATA-1.
05 DIA-1
05 MES-1
05 ANO-1
05 REDEFINES ANO-1.
07 ANO-FIXO
07 ANO-VARIAVEL
03 DATA-SISTEMA-EDIT
03 PERIODO-CURSO
88 SEMESTRAL
88 ANUAL
03 RESPOSTA
03 NOTAS.
05 NOTA1
05 NOTA2
05 NOTA3
05 NOTA4
05 MEDIA-GERAL
73
PIC 9(008).
PIC 9(002).
PIC 9(002).
PIC 9(004).
PIC 9(002).
PIC 9(002).
PIC 99/99/9999.
PIC X(001).
VALUE "S".
VALUE "A".
PIC X(001).
PIC
PIC
PIC
PIC
PIC
9(002)V99.
9(002)V99.
9(002)V99.
9(002)V99.
9(002)V99.
PROCEDURE DIVISION.
INICIO.
DISPLAY ERASE AT 0101.
DISPLAY "SOCIESC *--- AVALIACAO DE NOTAS ---*" AT 0212
WITH HIGHLIGHT.
* A prxima sentena vai executar uma seo para buscar
* a data do sistema
PERFORM DATA-SISTEMA-SECT.
CURSO.
* A prxima sentena vai perguntar na tela ao usurio se o
* Perodo do Curso Semestral ou Anual, guardando a
* informao na varivel PERIODO-CURSO. Caso o usurio
* tecle ENTER sem informar nada (SPACE), o programa ser
* desviado com GO TO para um pargrafo FIM-PROGRAMA
*
DISPLAY "Perodo Curso: (S)emestral ou (A)nual - " AT 0520.
ACCEPT PERIODO-CURSO AT 0561.
IF PERIODO-CURSO = SPACE
GO TO FIM-PROGRAMA
END-IF
* A prxima sentena no permite que o usurio informe nada
* diferente do exigido pelo programa no caso S para semestral
* ou A para Anual informando algo diferente, volta ao pargrafo
* CURSO, at que seja dado um ENTER ou informada a opo correta.
IF
*
*
*
*
*
*
*
*
*
*
*
74
GO TO INICIO
END-IF.
FIM-PROGRAMA.
DISPLAY FIM DE EXECUCAO! AT 2330 WITH REVERSE-VIDEO.
STOP RUN.
DATA-SISTEMA-SECT SECTION.
DATA-INICIO.
ACCEPT DATA-SISTEMA FROM DATE.
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
DIA-SISTEMA
MES-SISTEMA
20
ANO-SISTEMA
TO
TO
TO
TO
DIA-1
MES-1
ANO-FIXO
ANO-VARIAVEL
ANO-1 = 0000
ANO-FIXO ANO-VARIAVEL
*
* A declarao EXIT indica fim da seo - o Controle do Programa
* retorna para o ponto de partida, na linha seguinte ao comando
* PERFORM DATA-SISTEMA-SECT (pargrafo CURSO, neste caso).
*
NOTAS-SEMESTRE-SECT SECTION.
NOTAS-SEM.
DISPLAY "Informe a Nota 1 - " AT 0820
ACCEPT NOTA1 AT 0839.
IF NOTA1 > 10
GO TO NOTAS-SEM
END-IF.
NOTAS-SEM-2.
DISPLAY "Informe a Nota 2 - " AT 0920
ACCEPT NOTA2 AT 0939.
IF NOTA2 > 10
GO TO NOTAS-SEM-2
END-IF
COMPUTE MEDIA-GERAL = (NOTA1 + NOTA2) / 2
PERFORM EXIBE-MENSAGEM-SECT.
NOTAS-SEM-FIM.
EXIT.
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
75
76
PROGRAM-ID.
AUTHOR.
77
PROG4.
SOCIESC.
*
* Programa Exemplo com Comandos Bsicos, Aritmticos e de Desvios.
*
ENVIRONMENT DIVISION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 VARIAVEIS-TEMPORARIAS.
03 DATA-SISTEMA
PIC 9(006).
03 REDEFINES DATA-SISTEMA.
05 ANO-SISTEMA
PIC 9(002).
05 MES-SISTEMA
PIC 9(002).
05 DIA-SISTEMA
03 DATA-1
PIC 9(002).
PIC 9(008).
03 REDEFINES DATA-1.
05 DIA-1
PIC 9(002).
05 MES-1
PIC 9(002).
05 ANO-1
PIC 9(004).
05 REDEFINES ANO-1.
07 ANO-FIXO
PIC 9(002).
07 ANO-VARIAVEL
PIC 9(002).
03 DATA-SISTEMA-EDIT
PIC 99/99/9999.
03 PERIODO-CURSO
PIC X(001).
88 SEMESTRAL
VALUE "S".
88 ANUAL
VALUE "A".
03 RESPOSTA
PIC X(001).
03 NOTAS.
05 NOTA1
PIC 9(002)V99.
05 NOTA2
PIC 9(002)V99.
05 NOTA3
PIC 9(002)V99.
05 NOTA4
PIC 9(002)V99.
05 MEDIA-GERAL
PIC 9(002)V99.
PROCEDURE DIVISION.
INICIO.
DISPLAY ERASE AT 0101.
DISPLAY "SOCIESC *--- AVALIACAO DE NOTAS ---*" AT 0212
WITH HIGHLIGHT.
PERFORM DATA-SISTEMA-SECT.
CURSO.
DISPLAY "Perodo Curso: (S)emestral ou (A)nual - " AT 0520.
ACCEPT PERIODO-CURSO AT 0561.
IF
78
PERIODO-CURSO = SPACE
GO TO FIM-PROGRAMA
END-IF
IF
END-IF
IF
PERIODO-CURSO = "S"
PERFORM NOTAS-SEMESTRE-SECT
ELSE
PERFORM NOTAS-ANO-SECT
END-IF.
DISPLAY "Outra Avaliao? (S)im - " AT 2020.
ACCEPT RESPOSTA AT 2046.
IF
RESPOSTA = "S"
INITIALIZE PERIODO-CURSO NOTAS
GO TO INICIO
END-IF.
FIM-PROGRAMA.
DISPLAY FIM DE EXECUCAO! AT 2330 WITH REVERSE-VIDEO.
STOP RUN.
DATA-SISTEMA-SECT SECTION.
DATA-INICIO.
ACCEPT DATA-SISTEMA FROM DATE.
MOVE DIA-SISTEMA TO DIA-1
MOVE MES-SISTEMA TO MES-1
MOVE 20
TO ANO-FIXO
NOTA1 > 10
GO TO NOTAS-SEM
END-IF.
NOTAS-SEM-2.
DISPLAY "Informe a Nota 2 - " AT 0920
ACCEPT NOTA2 AT 0939.
IF
NOTA2 > 10
GO TO NOTAS-SEM-2
END-IF
NOTA1 > 10
GO TO NOTAS-ANO
END-IF.
NOTAS-ANO-2.
DISPLAY "Informe a Nota 2 - " AT 0920
ACCEPT NOTA2 AT 0939.
IF
NOTA2 > 10
GO TO NOTAS-ANO-2
END-IF.
NOTAS-ANO-3.
DISPLAY "Informe a Nota 3 - " AT 1020
ACCEPT NOTA3 AT 1039.
IF
NOTA3 > 10
GO TO NOTAS-ANO-3
END-IF.
NOTAS-ANO-4.
DISPLAY "Informe a Nota 4 - " AT 1120
ACCEPT NOTA4 AT 1139.
IF
NOTA4 > 10
GO TO NOTAS-ANO-4
END-IF
COMPUTE MEDIA-GERAL = (NOTA1 + NOTA2 + NOTA3 + NOTA4) / 4
PERFORM EXIBE-MENSAGEM-SECT.
NOTAS-ANO-FIM.
EXIT.
EXIBE-MENSAGEM-SECT SECTION.
EXIBE-INICIO.
IF
MEDIA-GERAL < 4
DISPLAY "CARO ALUNO! VC REPROVOU - MEDIA = " AT 1520
DISPLAY MEDIA-GERAL AT 1554
ELSE
IF
MEDIA-GERAL < 7
DISPLAY "CARO ALUNO! RECUPERACAO - MEDIA = " AT 1520
DISPLAY MEDIA-GERAL AT 1553
ELSE
79
80
Sntese
Exerccios Propostos
1.
dados diferentes.
(
MULTIPLY e COMPUTE.
(
81
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
__
3. Complete as sentenas.
a)
b)
seo.
c)
Aula 6
COMPILAO E LINKEDIO
Objetivos da Aula
Ao final desta aula, voc dever ser capaz de:
Utilizar o compilador COBOL MicroSoft 4.5, desde a configurao
das variveis de ambiente at a compilao dos programas e
gerao dos executveis.
Contedos da Aula
Acompanhe os assuntos desta aula, se preferir, ao
terminar, assinale o contedo j estudado.
Animando Programas
Exerccios Propostos
Bem-vindo(a) a nossa sexta aula. Nessa aula vamos
conhecer o compilador do COBOL MicroSoft 4.5. Como
82
83
84
85
COBOL PROG1.CBL;
O smbolo ponto e vrgula ; faz com que a compilao seja direta, sem a
necessidade de entrada de outros parmetros. Vejamos o exemplo da compilao
na figura 12:
86
LINK/F PROG1.OBJ+ADIS+ADISINIT+ADISKEY+EXTFH;
87
88
89
90
Podemos notar que esse arquivo semelhante ao programa fonte, porm com
uma srie de marcaes e controles da linguagem e, nas linhas vlidas, o contador
seqencial da Coluna 01 at a 06. Vamos agora simular um erro no PROG1.CBL,
para verificar a mensagem do compilador.
Caro Aluno, favor abrir o arquivo PROG1.CBL pelo EDIT e, na linha DISPLAY
ERASE AT 0101, informe DIPLAY ERAS AT 0101. Salve o arquivo e compile o
programa novamente.
O resultado ser o erro que mostrado na figura 17:
91
ANIMATE PROG1
Agora voc dever digitar o programa abaixo no EDIT e salv-lo com o nome
externo PROG3.CBL, na pasta C:\COBOL\BINR esse programa servir de base
para executarmos o ANIMATE.EXE, pois o mesmo no apresentar erros de
compilao. Existe, porm, uma sentena mal formulada no meio da rotina,
provocando erro no resultado final apresentado.
PROG3.
SOCIESC.
*
* Programa Exemplo de uso do DISPLAY/ACCEPT/MOVE
*
DATA DIVISION.
WORKING-STORAGE SECTION.
01
01
TABELA-MESES.
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
REDEFINES TABELA-MESES.
03
MES-EXTENSO
01
DATA1
01
REDEFINES DATA1.
01
92
03
DIA
PIC 9(002).
03
MES
PIC 9(002).
03
ANO
PIC 9(004).
DATA-EDIT
PIC 99/99/9999.
PROCEDURE DIVISION.
INICIO-SECTION.
DISPLAY ERASE AT 0101.
DISPLAY "Digite a Data (DD/MM/AAAA) - " AT 1010.
CAMPO-DATA.
ACCEPT DATA1 AT 1040 ON ESCAPE
DISPLAY "VC TECLOU ESC" AT 2460 WITH BLINK
GO TO FIM.
IF
END-IF.
DISPLAY MES-EXTENSO(MES) AT 1510.
MOVE DATA1 TO DATA-EDIT.
DISPLAY DATA-EDIT AT 1530.
DISPLAY SPACES AT 1601.
FIM.
STOP RUN.
93
END-IF.
END-IF.
Sendo assim, como o erro est na lgica, podemos nos valer da animao para
encontr-lo de forma mais rpida. Vamos compilar o PROG3 e anim-lo, conforme
mostramos nas linhas abaixo.
COBOL PROG3 ANIM;
LINK PROG3;
ANIMATE PROG3
94
95
96
97
Sntese
Nessa aula aprendemos a configurar o ambiente para execuo do COBOL
MicroSoft. Tambm aprendemos como compilar e linkar os programas, bem como
tambm vimos o recurso para depurao de erros disponvel na ferramenta.
98
Exerccios Propostos
1.
Aula 7
Objetivos da Aula
Ao final da aula, voc dever ser capaz de:
Definir a forma de construo e aplicao de telas no COBOL;
Alterar os atributos de cores das telas.
Contedos da Aula
Acompanhe os assuntos desta aula, se preferir, ao
terminar, assinale o contedo j estudado.
Exerccios Propostos
99
100
IDENTIFICATION DIVISION.
PROGRAM-ID.
AUTHOR.
MENU.
SOCIESC.
OPCAO
SCREEN SECTION.
01 TELA-PRINCIPAL.
02 BLANK SCREEN.
02 LINE 01 COL 21 VALUE "*----------------------------------*".
02 LINE 02 COL 21 VALUE "*
*".
*".
*".
*".
1 - Inclusao
*".
2 - Alteracao
*".
3 - Exclusao
*".
4 - Consulta
*".
5 - Relatorio
*".
6 - Sair
*".
*".
Opcao: ( )
*".
*".
*".
101
INITIALIZE OPCAO
GO TO INICIO
END-IF
EVALUATE OPCAO
WHEN 1
WHEN 2
WHEN 3 CALL "CADALUNO" USING OPCAO ON OVERFLOW
PERFORM MENSAGEM-SECT
WHEN 4 CALL "CONALUNO" ON OVERFLOW
PERFORM MENSAGEM-SECT
WHEN 5 CALL "RELALUNO" ON OVERFLOW
PERFORM MENSAGEM-SECT
WHEN 6 GO TO FIM-PROGRAMA
END-EVALUATE.
FIM-PROGRAMA.
DISPLAY "FIM DE EXECUCAO" AT 2335 WITH REVERSE-VIDEO.
STOP RUN.
MENSAGEM-SECT SECTION.
MENSAGEM.
DISPLAY "Rotinas nao Disponiveis!" AT 2230 WITH HIGHLIGHT.
STOP " ".
MENSAGEM-FIM.
EXIT.
102
Isso far com que o programa transfira o que for digitado para OPCAO, dessa
forma, o programa poder identificar o que foi digitado pelo usurio.
A descrio de uma tela na SCREEN SECTION possui a mesma estrutura de
um item de grupo (iniciando no nvel 01), onde se especifica linha a linha o que vai
ser exibido e o que vai ser solicitado ao usurio. Todavia, a SCREEN SECTION
um recurso opcional para montagem de telas, ausente em nossos outros programas,
como podemos constatar. A montagem da tela pode ser confeccionada diretamente
na PROCEDURE DIVISION, com o uso de comandos ACCEPT e DISPLAY logo,
a utilizao ou no da seo fica a critrio do programador.
Principais itens de uma SCREEN SECTION:
BLANK SCREEN Limpa a tela. Equivale ao DISPLAY ERASE AT
0101. A diferena que o DISPLAY um comando direto da
PROCEDURE, enquanto essa clusula s pode ser usada na definio
de uma tela via SCREEN SECTION.
LINE / COL Clusulas que especificam a linha e coluna do contedo
declarado aps a especificao VALUE.
02 LINE 03 COL 21 VALUE "* MANUTENCAO ALUNOS-Menu Principal *".
103
Preto
Azul
Verde
Ciano
Vermelho
Magenta
Marrom ou Amarelo
Branco
PROGRAM-ID.
MENUCOR.
104
COR-F ser a varivel com a cor do fundo da tela e COR-C, a cor de frente, ou
seja, dos caracteres da tela.
Sntese
105
Exerccios Propostos
1.
Modifique o programa MENUCOR para que, antes de exibir a TELAPRINCIPAL, solicite no incio duas variveis, uma para cor de fundo e outra para
cor dos caracteres, de forma que, a cada execuo, o programa possa vir com
cores diferenciadas.
106
107
Aula 8
Linkage Section
Exerccios Propostos
108
109
LINKAGE SECTION.
01 AREA-TESTE-DATA.
03 DATA-TESTE
PIC 9(008).
03 STATUS-DATA
PIC X(001).
88 DATA-VALIDA
VALUE S.
88 DATA-INVALIDA VALUE N.
110
PIC 9(008).
03 STATUS-DATA
PIC X(001).
88 DATA-VALIDA
VALUE S.
88 DATA-INVALIDA VALUE N.
LINKAGE SECTION.
01 AREA-TESTE-DATA.
03 DATA-TESTE
PIC 9(008).
03 STATUS-DATA
PIC X(001).
88 DATA-VALIDA
VALUE S.
88 DATA-INVALIDA VALUE N.
01 SENHA-ALUNO
PIC X(010).
Vamos nos ater chamada com um item, de acordo com o primeiro exemplo.
Supondo que o nome do programa de validao de datas seja VALDATA.CBL,
qualquer programa chamador que necessite testar a data, dever cham-lo da
seguinte forma:
CALL VALDATA USING AREA-TESTE-DATA.
111
j aprendemos uma srie de novos recursos desde aquela aula, faremos algumas
adaptaes, mas a principal delas ser a demonstrao da chamada do
subprograma VALDATA, que vai testar a data e retornar um campo com o status da
operao (data vlida ou invlida).
Programa PROG3.CBL modificado com relao aula 3, as modificaes
esto destacadas em azul e tudo que envolve a comunicao com o subprograma,
em vermelho.
*
*...5....0....5....0....5....0....5....0....5....0....5....0....5....0..
*
IDENTIFICATION DIVISION.
PROGRAM-ID.
AUTHOR.
PROG3.
SOCIESC.
*
* Programa Exemplo chamando SUBPROGRAMAS
*
DATA DIVISION.
WORKING-STORAGE SECTION.
01
01
TABELA-MESES.
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
03
FILLER
REDEFINES TABELA-MESES.
03
MES-EXTENSO
01
DATA1
01
REDEFINES DATA1.
01
03
DIA
PIC 9(002).
03
MES
PIC 9(002).
03
ANO
PIC 9(004).
DATA-EDIT
PIC 99/99/9999.
01
112
AREA-TESTE-DATA.
03
DATA-TESTE
PIC 9(008).
03
STATUS-DATA
PIC X(001).
88
DATA-VALIDA
VALUE "S".
88
DATA-INVALIDA
VALUE "N".
SCREEN SECTION.
01
TELA-PRINCIPAL.
|".
02 LINE 05 COL 20 VALUE "+-------------------------------------
-"----+".
02 LINE 06 COL 20 VALUE "|
-"
|".
02 LINE 07 COL 20 VALUE "|
-"
|".
02 LINE 08 COL 20 VALUE "|
-"
|".
02 LINE 09 COL 20 VALUE "|
-"
|".
02 LINE 10 COL 20 VALUE "|
-"
Data (DD/MM/AAAA) -
|".
02 LINE 11 COL 20 VALUE "|
-"
|".
02 LINE 12 COL 20 VALUE "|
-"
|".
02 LINE 13 COL 20 VALUE "|
-"
|".
02 LINE 14 COL 20 VALUE "|
-"
|".
02 LINE 15 COL 20 VALUE "|
-"
|".
02 LINE 16 COL 20 VALUE "|--------------- MENSAGEM ------------
-"----|".
02 LINE 17 COL 20 VALUE "|
-"
|".
02 LINE 18 COL 20 VALUE "+-------------------------------------
-"----+".
PROCEDURE DIVISION.
INICIO.
DISPLAY TELA-PRINCIPAL.
113
STATUS-DATA = "N"
DISPLAY "DATA DIGITADA NAO E VALIDA!" AT 1723
STOP " "
GO TO INICIO
END-IF
DISPLAY MES-EXTENSO(MES) AT 1327 WITH REVERSE-VIDEO.
MOVE DATA1 TO DATA-EDIT.
DISPLAY DATA-EDIT AT 1341 WITH REVERSE-VIDEO.
DISPLAY "TECLE <ENTER> PARA ENCERRAR" AT 1727
WITH REVERSE-VIDEO.
STOP " ".
FIM-PROGRAMA.
DISPLAY "FIM DA ROTINA!" AT 2430 WITH REVERSE-VIDEO.
STOP RUN.
AREA-TESTE-DATA.
03
DATA-TESTE
PIC 9(008).
03
STATUS-DATA
PIC X(001).
88
DATA-VALIDA
VALUE "S".
88
DATA-INVALIDA
VALUE "N".
114
STATUS-DATA = "N"
DISPLAY "DATA DIGITADA NAO E VALIDA!" AT 1723
STOP " "
GO TO INICIO
END-IF
115
PROG3, existem trs sentenas declaradas junto esta clusula (DISPLAY, STOP
e GO TO) at que o programa encontre o ponto, indicando o final da sentena ON
OVERFLOW.
CALL "VALDATA" USING AREA-TESTE-DATA ON OVERFLOW
DISPLAY "PROGRAMA VALDATA.EXE NAO ENCONTRADO!"
AT 1723 WITH REVERSE-VIDEO
STOP " "
GO TO FIM-PROGRAMA.
STATUS-DATA = "N"
DISPLAY "DATA DIGITADA NAO E VALIDA!" AT 1723
STOP " "
GO TO INICIO
END-IF
Caro Aluno!
hora de digitar PROG3.CBL e compil-lo. O resultado dever ser o o que
mostramos na figura 33, enquanto no desenvolvermos o subprograma
VALDATA:
116
VALDATA.
AUTHOR.
SOCIESC.
*
* Rotina que Valida Datas
*
DATA DIVISION.
WORKING-STORAGE SECTION.
01
RESULTADO
01
REDEFINES RESULTADO.
03
VALOR-INTEIRO
PIC 9(003).
03
RESTO
PIC 9(002).
01
DATA-1
01
REDEFINES DATA-1.
03
DIA-1
PIC 9(008)
PIC 9(002).
VALUE ZEROS.
01
117
03
MES-1
PIC 9(002).
03
ANO-1
PIC 9(004).
ANO-BISSEXTO
PIC X(001)
88
E-ANO-BISSEXTO
VALUE "S".
88
NAO-E-ANO-BISSEXTO
VALUE "N".
VALUE SPACE.
LINKAGE SECTION.
01
AREA-TESTE-DATA.
03
DATA-TESTE
PIC 9(008).
03
STATUS-DATA
PIC X(001).
88
DATA-VALIDA
VALUE "S".
88
DATA-INVALIDA
7 "N".
MES-1 = 02
PERFORM TESTA-BISSEXTO-SECT
END-IF.
*
* DESVIAMOS A ROTINA ACIMA QUANDO O MS FOR FEVEREIRO PARA A SEO
* TESTA-BISSEXTO-SECT, QUE DIR SE O ANO INFORMADO OU NO
* BISSEXTO. A INFORMAO SER ARMAZENADA NA VARIVEL DA WORKING
* ANO-BISSEXTO (QUE FICAR COM CONTEDO S OU N).
*
VALIDA-MES.
IF
END-IF.
*
* ACIMA, EFETUAMOS A VALIDAO DO MS ENTRE 01 E 12
* CASO ESTEJA INCORRETO, CARREGAMOS A VARIVEL DA LINKAGE
* STATUS-DATA COM N (DATA INVALIDA)
*
VALIDA-DIA.
IF
DIA-1 < 1
MOVE "N" TO STATUS-DATA
118
GO TO FIM-ROTINA
END-IF.
*
* ACIMA, EFETUAMOS A VALIDAO DO DIA = 0
* CASO ESTEJA INCORRETO, CARREGAMOS A VARIVEL DA LINKAGE
* STATUS-DATA COM N (DATA INVALIDA)
*
EVALUATE MES-1
WHEN 01
WHEN 03
WHEN 05
WHEN 07
WHEN 08
WHEN 10
WHEN 12 IF DIA-1 > 31
MOVE "N" TO STATUS-DATA
GO TO FIM-ROTINA
END-IF
WHEN 04
WHEN 06
WHEN 09
WHEN 11 IF DIA-1 > 30
MOVE "N" TO STATUS-DATA
GO TO FIM-ROTINA
END-IF
WHEN 02 IF
ANO-BISSEXTO = "S"
IF
DIA-1 > 29
MOVE "N" TO STATUS-DATA
GO TO FIM-ROTINA
END-IF
ELSE
IF
DIA-1 > 28
MOVE "N" TO STATUS-DATA
GO TO FIM-ROTINA
END-IF
END-IF
END-EVALUATE.
*
* ACIMA, VALIDAMOS O DIA FINAL DE CADA MS DO ANO
* CASO ESTEJA INCORRETO, CARREGAMOS A VARIVEL DA LINKAGE
* STATUS-DATA COM N (DATA INVALIDA)
*
VALIDA-ANO.
IF
119
END-IF
*
* ACIMA, VALIDAMOS O ANO DE 1900 EM DIANTE
* CASO ESTEJA INCORRETO, CARREGAMOS A VARIVEL DA LINKAGE
* STATUS-DATA COM N (DATA INVALIDA)
*
MOVE "S" TO STATUS-DATA.
*
* POR FIM, SE DIA, MS E ANO FORAM VALIDADOS, CARREGAMOS A
* VARIVEL DA LINKAGE STATUS-DATA COM S (DATA VALIDA)
*
FIM-ROTINA.
EXIT PROGRAM.
TESTA-BISSEXTO-SECT SECTION.
TESTA.
COMPUTE RESULTADO = ANO-1 / 4
IF
RESTO = ZEROS
MOVE "S" TO ANO-BISSEXTO
ELSE
MOVE "N" TO ANO-BISSEXTO
END-IF.
TESTA-FIM.
EXIT.
*
* PARA SABERMOS SE O ANO EM QUESTAO BISSEXTO,
* DIVIDIMOS POR 4, GUARDANDO O RESULTADO EM
* OUTRA VARIAVEL REDEFINIDA COM VALORES INTEIROS E DECIMAIS.
*
*
*
* SE FOSSE 2003, FICARIA RESULTADO = 2003 / 4
* RESULTADO = 50075 REDEFINIDO EM VALOR-INTEIRO = 500
*
RESTO
75
*
* SE FOSSE 2004, FICARIA RESULTADO = 2004 / 4
* RESULTADO = 50100 REDEFINIDO EM VALOR-INTEIRO = 501
*
RESTO
00
*
* SE O RESULTADO DA DIVISAO TIVER RESTO = ZERO, ENTAO
* O ANO BISSEXTO. CASO CONTRARIO, NO BISSEXTO.
*
120
121
Sntese
Nessa aula conceituamos programa principal e subprogramas. Aprendemos
tambm que podemos passar e receber informaes entre os programas, usando a
rea de comunicao do COBOL, a Linkage Section. Ficou evidenciado que a
construo de subprogramas, como os de validao, por exemplo, otimizam a
construo de um aplicativo.
Exerccios Propostos
1)
a)
122
b)
DICAS:
a) A rea de comunicao dos programas dever ser a seguinte:
01 AREA-CORES.
03 CODIGO-COR
PIC 9(001).
03 DESCRICAO-COR
PIC X(020).
ATENO!
No ser permitida a exibio da cor diretamente pelo programa chamador. A
informao dever voltar atualizada do subprograma, conforme o exemplo
visto Nessa aula.
Aula 9
Contedos da Aula
Acompanhe os assuntos desta aula, se preferir, ao
terminar, assinale o contedo j estudado.
Tipos Arquivos
Declarao COPY
Tratamento Multi-usurio
Exerccios Propostos
Bem-vindo(a) a nossa nona aula, para estudarmos as
regras que envolvem o tratamento de entrada e sada de
123
124
1 TIPOS DE ARQUIVOS
Os tipos de arquivos que podem ser gerados diretamente pelo COBOL so:
Arquivos Seqenciais
Arquivos Relativos
Arquivos de Linhas Seqenciais
Arquivos Indexados
Estudaremos Nessa aula os dois ltimos tipos, atualmente so os formatos
mais utilizados nas aplicaes COBOL que trabalham com sistema de arquivos.
2 DEFINIO DA ESTRUTURA
Para utilizarmos arquivos nos programas COBOL, temos duas regras bsicas,
vlidas para qualquer verso:
a) Devemos declarar o arquivo utilizado na seo INPUT-OUTPUT
SECTION da ENVIRONMENT DIVISION, aps a clusula FILECONTROL. Tal declarao feita com a diretiva SELECT.
b) Devemos definir a estrutura do arquivo utilizado na DATA DIVISION,
dentro da seo FILE SECTION, com a diretiva FD (FILE
DESCRIPTION).
Vejamos, agora, o formato geral da clusula SELECT:
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT
nome-arquivo
ASSIGN TO nome-externo
ORGANIZATION
IS
ACCESS
IS {SEQUENTIAL,DYNAMIC}
MODE
{LINE SEQUENTIAL,INDEXED}
125
DUPLICATES
nome-campo-file-status
ser
utilizado
seqenciais.
para
arquivos
de
linhas
126
o DYNAMIC ser
permitem
acesso
utilizado
seqencial
ou
randmico,
que
conforme
necessidade do programador.
RECORD KEY IS especifica a chave primria (campo nico
identificador do registro) em um arquivo de organizao indexada.
Pode conter um ou mais campos.
ALTERNATE RECORD KEY IS especifica a chave secundria em
um arquivo de organizao indexada. Essa clusula no obrigatria e
possui a opo de aceitar valores duplicados (WITH DUPLICATES).
FILE STATUS IS varivel utilizada para indicar o retorno de qualquer
operao ocorrida com o arquivo (gravao, leitura, excluso, etc).
Deve ser definida na WORKING-STORAGE SECTION (tabela 9), com
duas posies alfanumricas PIC X(002).
10
Fim de arquivo
21
22
23
Registro no encontrado
24
30/35
Arquivo no encontrado
91
94
127
IS SEQUENTIAL
FILE STATUS
IS SIT-ARQUIVO.
IS DYNAMIC
RECORD KEY
IS CODIGO-ALUNO
FILE STATUS
IS SIT-ARQUIVO.
LIVROS.DAT
ALUNOS.IDX
LIVROS.IDX
FD nome-arquivo
LABEL RECORD
IS
{OMITTED, STANDARD}
128
nome-campo ou FILLER
PIC tipo(tamanho).
REDEFINES nome-campo
FD
DEPBANCO.
01
DEP-REGISTRO.
03
DEP-CODIGO-BANCO
PIC 9(003).
03
DEP-CODIGO-AGE
PIC 9(004).
03
DEP-CODIGO-CONTA
PIC 9(009).
03
DEP-VALOR-DEPOSITO
PIC 9(009)V99.
03
DEP-DATA-DEPOSITO.
PIC 9(008).
03
129
REDEFINES DEP-DATA-DEPOSITO.
05
DEP-DIA-DEPOSITO
PIC 9(002).
05
DEP-MES-DEPOSITO
PIC 9(002).
05
DEP-ANO-DEPOSITO
PIC 9(004).
Note que no utilizamos as clusulas LABEL RECORD IS e VALUE OF FILEID. A primeira, porque no sendo um arquivo de relatrio, torna-se opcional e a
segunda, porque nosso SELECT no usou a diretiva ASSIGN TO DISK.
Vejamos agora um exemplo de declarao da FD, para um arquivo INDEXED
(utilizaremos o mesmo arquivo declarado no exemplo da estrutura SELECT para
arquivos indexados).
FD
CAD-ALUNO.
01
ALU-REGISTRO.
03
CODIGO-ALUNO
PIC 9(007).
03
NOME-ALUNO
PIC X(050).
03
DATA-NASC-ALUNO
PIC 9(008).
03
REDEFINES DATA-NASC-ALUNO.
03
03
05
DIA-NASC
PIC 9(002).
05
MES-NASC
PIC 9(002).
05
ANO-NASC
PIC 9(004).
TIPO-CURSO
88
SISTEMAS-INFORMACAO
VALUE I.
88
MECANICA
VALUE M.
88
CIENCIAS-CONTABEIS
VALUE C.
88
ECONOMIA
VALUE E.
TIPO-TURMA
PIC X(001).
88
SEMESTRAL
VALUE S.
88
ANUAL
VALUE A.
03
NUM-PERIODO-ATUAL
03
CONTATOS.
PIC 9(002).
05
TELEF-RESID-ALUNO
05
REDEFINES TELEF-RESID-ALUNO.
PIC 9(010).
07
DDD-RESID-ALUNO
PIC 9(002).
07
05
TELEF-CEL-ALUNO
05
REDEFINES TELEF-CEL-ALUNO.
05
03
PIC X(001).
PIC 9(010).
07
DDD-CEL-ALUNO
PIC 9(002).
07
FONE-CEL-ALUNO
PIC 9(008).
EMAIL-ALUNO
FILLER
PIC X(100).
130
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CAD-ALUNO ASSIGN TO ALUNOS.DAT
ORGANIZATION IS INDEXED
ACCESS MODE
IS DYNAMIC
RECORD KEY
IS CODIGO-ALUNO
IS SIT-ARQUIVO.
DATA DIVISION.
FILE SECTION.
FD
CAD-ALUNO.
01
ALU-REGISTRO.
03
CODIGO-ALUNO
PIC 9(007).
03
NOME-ALUNO
PIC X(050).
03
DATA-NASC-ALUNO
PIC 9(008).
03
REDEFINES DATA-NASC-ALUNO.
03
03
05
DIA-NASC
05
MES-NASC
PIC 9(002).
05
ANO-NASC
PIC 9(004).
TIPO-CURSO
PIC 9(002).
PIC X(001).
88
SISTEMAS-INFORMACAO
VALUE I.
88
MECANICA
VALUE M.
88
CIENCIAS-CONTABEIS
VALUE C.
88
ECONOMIA
VALUE E.
TIPO-TURMA
PIC X(001).
88
SEMESTRAL
VALUE S.
88
ANUAL
VALUE A.
03
NUM-PERIODO-ATUAL
03
CONTATOS.
PIC 9(002).
05
TELEF-RESID-ALUNO
PIC 9(010).
05
REDEFINES TELEF-RESID-ALUNO.
131
07
DDD-RESID-ALUNO
PIC 9(002).
07
05
TELEF-CEL-ALUNO
05
REDEFINES TELEF-CEL-ALUNO.
05
03
PIC 9(010).
07
DDD-CEL-ALUNO
PIC 9(002).
07
FONE-CEL-ALUNO
PIC 9(008).
EMAIL-ALUNO
FILLER
PIC X(100).
Para cada arquivo a ser utilizado pelo programa, dever haver sempre
uma clusula SELECT e uma clusula FD.
FILE-CONTROL
SELECT ARQUIVO-1
...
SELECT ARQUIVO-2
...
FILE SECTION.
FD ARQUIVO-1
...
FD ARQUIVO-2
...
132
3 A DECLARAO COPY
comum que um sistema com vrios programas, que execute as mais
variadas rotinas, tenha alguns blocos repetitivos, seja na declarao de variveis
temporrias, na declarao das estruturas de arquivos (SELECT e FD) ou mesmo na
lgica desenvolvida na PROCEDURE DIVISION. Imagine um sistema de folha de
pagamento, composto por 300 programas aproximadamente. Os arquivos mais
acessados, com certeza, sero o de funcionrios e o de movimento mensal, em
cerca de 90% dos programas. O programador certamente teria muitas dificuldades e
perderia muito tempo se tivesse que declarar em 270 programas a SELECT e a FD
desses arquivos.
Felizmente existe o recurso da declarao COPY, permitindo que um bloco
de instrues ou variveis seja inserido no programa a partir de um arquivo texto
externo, que contenha as regras e sintaxes da Linguagem COBOL. A insero de
um arquivo com COPY deve ocorrer a partir da posio que as instrues nele
contidas se encaixem na lgica do programa.
Vamos tomar como exemplo a SELECT e a FD do arquivo CAD-ALUNO. Na
prtica, poderamos salvar o contedo do SELECT num arquivo externo chamado
ALUNOS.SEL e o contedo da FD num arquivo chamado ALUNOS.FD para inserilos em nosso programa, teramos a seguinte declarao:
SELECT DIRETO NO PROGRAMA:
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CAD-ALUNO ASSIGN TO ALUNOS.DAT
ORGANIZATION IS INDEXED
ACCESS MODE
IS DYNAMIC
RECORD KEY
IS CODIGO-ALUNO
IS SIT-ARQUIVO.
133
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
COPY ALUNOS.SEL.
DATA DIVISION.
FILE SECTION.
COPY ALUNOS.FD.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
COPY CLIENTES.SEL.
COPY NOTAS.SEL.
COPY DUPLICATAS.SEL.
COPY IMPOSTOS.SEL.
COPY PEDIDOS.SEL.
DATA DIVISION.
FILE SECTION.
COPY CLIENTES.FD.
COPY NOTAS.FD.
134
COPY DUPLICATAS.FD.
COPY IMPOSTOS.FD.
COPY PEDIDOS.FD.
COPY.
Vejamos pela figura 36, o programa da aula 7 novamente, com a clusula
COPY sendo utilizada em dois locais diferentes, evidenciados em azul:
135
136
137
138
IS SEQUENTIAL
FILE STATUS
IS SIT-ARQUIVO.
...
...
READ DEPBANCO NEXT.
IF SIT-ARQUIVO = 10 (VER TABELA DE CDIGOS. 10 =FIM ARQUIVO).
GO TO FIM-PROGRAMA
END-IF.
Onde se l:
NEXT L seqencialmente sempre o prximo registro.
PREVIOUS L seqencialmente o registro anterior.
RECORD Utilizado para leitura randmica (direta), quando carregamos a chave
primria do registro antes do READ.
139
INITIALIZE ALU-REGISTRO.
MOVE 9700 TO CODIGO-ALUNO.
READ CAD-ALUNO RECORD.
IF SIT-ARQUIVO = 00
DISPLAY LEITURA DO ALUNO 9700 OK AT 1010
ELSE
IF SIT-ARQUIVO = 23
DISPLAY Cdigo no Cadastrado! AT 1010
END-IF
END-IF.
140
WRITE DEP-REGISTRO.
WRITE ALU-REGISTRO.
Importante!
Para utilizar os comandos WRITE, REWRITE e DELETE, o
arquivo
no pode estar aberto apenas com INPUT (leitura) dever estar aberto com
opo I-O (Leitura e Gravao).
141
quisermos
ler
ordem
*
* Nesse START, posicionamos o arquivo de alunos para leitura pela
* chave alternativa NOME-ALUNO.
PERFORM LEITURA-ALUNOS-SECT.
...
...
STOP RUN.
*
*
INITIALIZE ALU-REGISTRO.
MOVE 5000 TO CODIGO-ALUNO.
START CAD-ALUNO KEY IS > CODIGO-ALUNO.
alfabtica,
142
Podemos notar que a seo de leitura, aps o START, a mesma para os dois
exemplos. Significa que o READ vai efetuar as leituras de acordo com o
posicionamento realizado no arquivo anteriormente, independente de qual seja.
Essa outra regra bsica para trabalho com arquivos em COBOL. Um comando
READ seqencial (seja NEXT ou PREVIOUS) independe de como o START foi
executado (se pela chave principal, ou pela chave alternativa). claro que o
posicionamento realizado com o START no deve possuir erros de lgica, seno o
READ no vai encontrar nenhum registro.
Vejamos um exemplo de START incorreto na lgica, no na sintaxe:
143
144
Importante!
Quando trabalhamos com acesso a banco de dados, o tipo de tratamento
gerenciado pelo prprio banco, no sendo necessrio seu controle pelo
programa COBOL.
Programa CADCURSO.CBL:
IDENTIFICATION DIVISION.
PROGRAM-ID.
CADCURSO.
AUTHOR.
SOCIESC.
*
* Programa Exemplo - Trabalhando com Arquivos
*
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT CURSOS
ASSIGN TO "CURSOS.DAT"
ORGANIZATION IS INDEXED
ACCESS MODE
IS DYNAMIC
RECORD KEY
IS CURSO-CHAVE
= CODIGO-CURSO
IS SIT-ARQUIVO.
DATA DIVISION.
FILE SECTION.
FD
CURSOS.
01
145
CURSO-REGISTRO.
03
CODIGO-CURSO
PIC 9(005).
03
DESCR-CURSO
PIC X(030).
03
VALUE "M".
88 TARDE
VALUE "T".
88 NOITE
VALUE "N".
WORKING-STORAGE SECTION.
01
CODIGO-EDIT
PIC ZZZZ9
VALUE ZEROS.
77
SIT-ARQUIVO
77
RESPOSTA
77
MENSAGEM
SCREEN SECTION.
01 TELA-CURSOS.
02 BLANK SCREEN FOREGROUND-COLOR 1 REVERSE-VIDEO
BACKGROUND-COLOR 7 HIGHLIGHT.
02 LINE 05 COL 20 VALUE "+---------------------------------+".
02 LINE 06 COL 20 VALUE "|
|".
|".
|".
|".
|".
|".
|".
|".
|".
|".
|".
146
END-IF
OPEN OUTPUT CURSOS
CLOSE CURSOS
OPEN I-O CURSOS
GO TO ACESSO
ELSE
IF
ELSE
DISPLAY "Erro na Abertura de CURSOS.DAT - " AT 0520
DISPLAY SIT-ARQUIVO AT 0553
STOP RUN
END-IF
END-IF.
ACESSO.
INITIALIZE RESPOSTA.
DISPLAY "Deseja Acessar o Cadastro ? (S/N) - " AT 0520
WITH HIGHLIGHT.
ACCEPT RESPOSTA AT 0556 WITH HIGHLIGHT AUTO-SKIP.
IF
RESPOSTA = "S"
PERFORM CADASTRO-SECT
END-IF.
FECHA-ARQUIVO.
CLOSE CURSOS.
FIM-PROGRAMA.
DISPLAY "FIM DA ROTINA" AT 2430 WITH HIGHLIGHT.
STOP RUN.
CADASTRO-SECT SECTION.
CADASTRO.
INITIALIZE CURSO-REGISTRO CODIGO-EDIT MENSAGEM RESPOSTA.
DISPLAY TELA-CURSOS.
ACCEPT CODIGO-EDIT AT 0922 WITH REVERSE-VIDEO ON ESCAPE
GO TO CADASTRO-FIM.
147
CODIGO-CURSO = ZEROS
GO TO CADASTRO
END-IF.
CA100-LEITURA.
READ CURSOS RECORD.
IF
SIT-ARQUIVO = "00"
PERFORM MANUTENCAO-CURSO-SECT
GO TO CADASTRO
ELSE
IF
SIT-ARQUIVO = "23"
MOVE "CODIGO NAO EXISTE, INCLUIR? - " TO MENSAGEM
DISPLAY MENSAGEM AT 1822 WITH HIGHLIGHT
ACCEPT RESPOSTA
IF
RESPOSTA = "S"
PERFORM INCLUSAO-CURSO-SECT
END-IF
END-IF
END-IF
GO TO CADASTRO.
CADASTRO-FIM.
EXIT.
MANUTENCAO-CURSO-SECT SECTION.
MANUTENCAO.
DISPLAY DESCR-CURSO
PERFORM ALTERACAO-CURSO-SECT
WHEN "E"
PERFORM EXCLUSAO-CURSO-SECT
WHEN "V"
GO TO MANUTENCAO-FIM
148
DESCR-CURSO = SPACES
GO TO INCLUSAO
END-IF.
PERIODO.
DISPLAY PERIODO-CURSO AT 1522 WITH REVERSE-VIDEO.
MOVE "(M)anha (T)arde (N)oite" TO MENSAGEM.
DISPLAY MENSAGEM AT 1822 WITH HIGHLIGHT.
ACCEPT PERIODO-CURSO
IF
END-IF.
CONFIRMACAO.
INITIALIZE RESPOSTA MENSAGEM.
MOVE "Confirma Inclusao ? (S)im - " TO MENSAGEM
DISPLAY MENSAGEM AT 1822 WITH HIGHLIGHT.
ACCEPT RESPOSTA
IF
END-IF.
GRAVAR.
WRITE CURSO-REGISTRO.
IF
SIT-ARQUIVO = "00"
MOVE "Inclusao OK !" TO MENSAGEM
PERFORM MOSTRA-MSG-SECT
ELSE
MOVE SPACES TO MENSAGEM
STRING "ERRO na Inclusao: Status= "
SIT-ARQUIVO
DELIMITED BY SIZE
INTO MENSAGEM
END-STRING
PERFORM MOSTRA-MSG-SECT
STOP RUN
END-IF.
INCLUSAO-FIM.
EXIT.
ALTERACAO-CURSO-SECT SECTION.
ALTERACAO.
MOVE "Alterando Registro..." TO MENSAGEM.
DISPLAY MENSAGEM AT 1822 WITH HIGHLIGHT.
ACCEPT DESCR-CURSO AT 1222 WITH REVERSE-VIDEO
ON ESCAPE GO TO ALTERACAO-FIM.
IF
149
DESCR-CURSO = SPACES
GO TO ALTERACAO
END-IF.
PERIODO.
DISPLAY PERIODO-CURSO AT 1522 WITH REVERSE-VIDEO.
MOVE "(M)anha (T)arde (N)oite" TO MENSAGEM.
DISPLAY MENSAGEM AT 1822 WITH HIGHLIGHT.
ACCEPT PERIODO-CURSO AT 1522
IF
END-IF.
CONFIRMACAO.
INITIALIZE RESPOSTA.
MOVE "Confirma Alteracao ? (S)im - " TO MENSAGEM
DISPLAY MENSAGEM AT 1822 WITH HIGHLIGHT.
ACCEPT RESPOSTA
IF
END-IF.
REGRAVAR.
REWRITE CURSO-REGISTRO.
IF
SIT-ARQUIVO = "00"
MOVE "Alteracao OK !" TO MENSAGEM
PERFORM MOSTRA-MSG-SECT
ELSE
MOVE SPACES TO MENSAGEM
STRING "ERRO na Alteracao: Status= "
SIT-ARQUIVO
DELIMITED BY SIZE
INTO MENSAGEM
END-STRING
PERFORM MOSTRA-MSG-SECT
STOP RUN
END-IF.
ALTERACAO-FIM.
EXIT.
EXCLUSAO-CURSO-SECT SECTION.
EXCLUSAO.
DELETE CURSOS RECORD
IF
SIT-ARQUIVO = "00"
MOVE "Exclusao OK !" TO MENSAGEM
PERFORM MOSTRA-MSG-SECT
ELSE
150
1.
151
3.
152
ACESSO.
INITIALIZE RESPOSTA.
DISPLAY "Deseja Acessar o Cadastro ? (S/N) - " AT 0520
WITH HIGHLIGHT.
ACCEPT RESPOSTA AT 0556 WITH HIGHLIGHT AUTO-SKIP.
IF
RESPOSTA = "S"
PERFORM CADASTRO-SECT
END-IF.
153
Se o usurio teclar ESC, o sistema vai ser desviado para o final da seo e o
programa ser finalizado. Se o usurio digitar ZERO no cdigo, no ser aceito
e aguardar um valor vlido. Quando for digitado um valor vlido, o programa
transfere o seu contedo (que est numa varivel editada) para o campo da
chave primria do cadastro de cursos (CODIGO-CURSO) para efetuar a leitura,
verificando se um registro com essa chave j existe no arquivo ou no. Caso j
exista o registro (status 00) o programa desviado para a seo
MANUTENCAO-CURSO-SECT, onde sero apresentadas ao usurio as opes
Alterao, Excluso ou Voltar. Caso o registro no exista (status 23), o
programa questiona o usurio, se deseja cri-lo. Em caso afirmativo, o programa
desviado para a seo INCLUSAO-CURSO-SECT.
CODIGO-CURSO = ZEROS
GO TO CADASTRO
END-IF.
CA100-LEITURA.
READ CURSOS RECORD.
IF
SIT-ARQUIVO = "00"
PERFORM MANUTENCAO-CURSO-SECT
GO TO CADASTRO
ELSE
IF
SIT-ARQUIVO = "23"
154
RESPOSTA = "S"
PERFORM INCLUSAO-CURSO-SECT
END-IF
END-IF
END-IF
155
6.
DESCR-CURSO = SPACES
GO TO INCLUSAO
END-IF.
PERIODO.
DISPLAY PERIODO-CURSO AT 1522 WITH REVERSE-VIDEO.
MOVE "(M)anha (T)arde (N)oite" TO MENSAGEM.
DISPLAY MENSAGEM AT 1822 WITH HIGHLIGHT.
ACCEPT PERIODO-CURSO
IF
END-IF.
CONFIRMACAO.
INITIALIZE RESPOSTA MENSAGEM.
156
END-IF.
GRAVAR.
WRITE CURSO-REGISTRO.
IF
SIT-ARQUIVO = "00"
MOVE "Inclusao OK !" TO MENSAGEM
PERFORM MOSTRA-MSG-SECT
ELSE
MOVE SPACES TO MENSAGEM
STRING "ERRO na Inclusao: Status= "
SIT-ARQUIVO
DELIMITED BY SIZE
INTO MENSAGEM
END-STRING
PERFORM MOSTRA-MSG-SECT
STOP RUN
END-IF.
INCLUSAO-FIM.
EXIT.
7.
157
DESCR-CURSO = SPACES
GO TO ALTERACAO
END-IF.
PERIODO.
DISPLAY PERIODO-CURSO AT 1522 WITH REVERSE-VIDEO.
MOVE "(M)anha (T)arde (N)oite" TO MENSAGEM.
DISPLAY MENSAGEM AT 1822 WITH HIGHLIGHT.
ACCEPT PERIODO-CURSO AT 1522
IF
END-IF.
CONFIRMACAO.
INITIALIZE RESPOSTA.
MOVE "Confirma Alteracao ? (S)im - " TO MENSAGEM
DISPLAY MENSAGEM AT 1822 WITH HIGHLIGHT.
ACCEPT RESPOSTA
IF
END-IF.
REGRAVAR.
REWRITE CURSO-REGISTRO.
IF
SIT-ARQUIVO = "00"
MOVE "Alteracao OK !" TO MENSAGEM
PERFORM MOSTRA-MSG-SECT
ELSE
MOVE SPACES TO MENSAGEM
STRING "ERRO na Alteracao: Status= "
SIT-ARQUIVO
DELIMITED BY SIZE
INTO MENSAGEM
158
END-STRING
PERFORM MOSTRA-MSG-SECT
STOP RUN
END-IF.
ALTERACAO-FIM.
EXIT.
SIT-ARQUIVO = "00"
MOVE "Exclusao OK !" TO MENSAGEM
PERFORM MOSTRA-MSG-SECT
ELSE
MOVE SPACES TO MENSAGEM
STRING "ERRO na Exclusao: Status= "
SIT-ARQUIVO
DELIMITED BY SIZE
159
INTO MENSAGEM
END-STRING
PERFORM MOSTRA-MSG-SECT
STOP RUN
END-IF.
EXCLUSAO-FIM.
EXIT.
160
Caro Aluno!
Compile esse programa com as diretivas de animao e execute-o linha por
linha, utilizando a tecla S (Step) e a tecla F2 (para mostrar a tela). Assim voc
poder entender ainda mais toda a lgica do programa CADCURSO. Voc pode
repetir o processo quantas vezes achar necessrio.
Vamos relembrar as diretivas de compilao para animao de programas:
COBOL CADCURSO.CBL ANIM;
LINK CARCURSO.OBJ;
ANIMATE CADCURSO
161
Sntese
Nessa aula aprendemos a trabalhar com arquivos nativos do COBOL.
Evidenciamos os dois tipos mais utilizados, o arquivo texto (seqencial) e o arquivo
indexado. Tambm descrevemos detalhadamente as sintaxes dos comandos para
manipulao dos dados, desde a criao do arquivo, passando pelos comandos de
leitura, gravao, excluso, posicionamento do arquivo para consultas e relatrios,
finalizando com a definio do tratamento multi-usurio dos registros, necessrio
para o controle dos dados em ambientes de rede.
162
Exerccios Propostos
1. Monte uma SELECT para um arquivo de Livros. O cdigo do livro deve ser a
chave principal e o nome do livro a chave alternativa. O nome externo do arquivo
ser "LIVROS.DAT" e a varivel de controle do STATUS dever ser LIV-STATUS.
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___
2. Monte a FD do arquivo Livros com os seguintes campos (os tamanhos dos
campos esto definidos entre os parnteses):
Cdigo Livro (07) - Nome Livro (50) - Data Edio (08) - Gnero Livro (1)
Sendo que:
a) A data dever ser desmembrada em dia, ms e ano.
b) O Gnero poder assumir os valores: I=INFORMATICA F=FICCAO
e
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___
3.Complete as frases:
a) Para cada arquivo a ser utilizado pelo programa, haver sempre uma clusula
_________ e __________.
b) A declarao ______ permite que um bloco de ____________ ou variveis seja
inserido no programa a partir de um _____________
linguagem COBOL.
4.Assinale Verdadeiro ou Falso:
163
seqenciais.
(
) OPEN I-O ARQUIVO significa que estamos abrindo o arquivo para leitura e
gravao de dados.
(
Aula 10
Contedos da Aula
Acompanhe os assuntos desta aula, se preferir, ao
terminar, assinale o contedo j estudado.
Estrutura do Arquivo
Exerccios Propostos
Bem-vindo (a) a nossa dcima aula. Nessa aula vamos
procurar repassar como se desenvolve uma aplicao
164
165
1 ESTRUTURA DO ARQUIVO
Nosso arquivo de clientes ter nome externo CLIENTES.DAT, sua chave
principal ser o Cdigo do Cliente e a chave alternativa ser o Nome do Cliente.
Vejamos como ficou a declarao SELECT:
SELECT CLIENTES ASSIGN
TO "CLIENTES.DAT"
ORGANIZATION IS INDEXED
ACCESS MODE
IS DYNAMIC
RECORD KEY
IS CLI-CHAVE
= COD-CLIENTE
IS SIT-ARQUIVO.
Esse SELECT dever ser salvo em nossa pasta de trabalho, com o nome
CLIENTES.SEL, pois ser utilizado em outros programas de nossa aplicao.
Vejamos agora a definio dos campos de nosso arquivo de clientes na FD:
*
* Declarao dos Dados do Arquivo de Clientes
*
FD
CLIENTES.
01
REGISTRO-CLIENTE.
03
COD-CLIENTE
PIC 9(007).
03
NOME-CLIENTE
PIC X(040).
03
DATA-NASC-CLIENTE
PIC 9(008).
03
REDEFINES DATA-NASC-CLIENTE.
03
03
05
DIA-NASC
PIC 9(002).
05
MES-NASC
PIC 9(002).
05
ANO-NASC
PIC 9(004).
EST-CIVIL-CLIENTE
PIC X(001).
88
SOLTEIRO
VALUE "S".
88
CASADO
VALUE "C".
88
DIVORCIADO
VALUE "D".
DADOS-DE-RESIDENCIA.
05
ENDERECO-CLIENTE
PIC X(050).
05
BAIRRO-CLIENTE
PIC X(030).
05
CIDADE-CLIENTE
PIC X(030).
05
ESTADO-CLIENTE
PIC X(002).
05
TELEFONE-CLIENTE
PIC 9(010).
05
REDEFINES TELEFONE-CLIENTE.
07
NUM-DDD
PIC 9(002).
07
NUM-FONE
PIC 9(008).
05
166
EMAIL-CLIENTE
PIC X(050).
03
DATA-1A-COMPRA-CLIENTE
PIC 9(008).
03
REDEFINES DATA-1A-COMPRA-CLIENTE.
05
DIA-1A-COMPRA
PIC 9(002).
05
MES-1A-COMPRA
PIC 9(002).
05
ANO-1A-COMPRA
PIC 9(004).
FILLER
PIC X(050).
03
quando
definimos
uma
aplicao,
iniciamos
seu
MENUCLI.
AUTHOR.
SOCIESC.
*
* Menu Principal da Aplicao de Clientes
*
DATA DIVISION.
WORKING-STORAGE SECTION.
01
OPCAO-MENU
PIC Z(001).
01
OPCAO
SCREEN SECTION.
01 TELA-PRINCIPAL.
02 BLANK SCREEN.
02 LINE 05 COL 21 VALUE "*----------------------------------*".
167
*".
CLIENTES - MENU PRINCIPAL
*".
*".
*".
*".
1 - Inclusao
*".
2 - Alteracao
*".
3 - Exclusao
*".
4 - Consulta
*".
5 - Relatorio
*".
6 - Sair
*".
*".
Opcao: ( )
*".
*".
*".
PROCEDURE DIVISION.
INICIO.
DISPLAY TELA-PRINCIPAL.
ACCEPT OPCAO-MENU AT 1941 WITH AUTO-SKIP.
MOVE OPCAO-MENU TO OPCAO
IF
END-IF
EVALUATE OPCAO
WHEN 1
WHEN 2
WHEN 3 CALL "CADCLI" USING OPCAO ON OVERFLOW
PERFORM MENSAGEM-SECT
WHEN 4 CALL "CONCLI" ON OVERFLOW
PERFORM MENSAGEM-SECT
WHEN 5 CALL "RELCLI" ON OVERFLOW
PERFORM MENSAGEM-SECT
WHEN 6 GO TO FIM-PROGRAMA
END-EVALUATE.
INITIALIZE OPCAO-MENU.
GO TO INICIO.
FIM-PROGRAMA.
DISPLAY "FIM DE EXECUCAO" AT 2335 WITH REVERSE-VIDEO.
STOP RUN.
168
MENSAGEM-SECT SECTION.
MENSAGEM.
DISPLAY "Rotinas nao Disponiveis!" AT 2230 WITH HIGHLIGHT.
STOP " ".
MENSAGEM-FIM.
EXIT.
Caro aluno!
Antes de prosseguirmos, compile o programa MENUCLI.CBL com nosso modo
habitual de compilao.
A compilao ocorrendo sem erros, execute o mesmo. O resultado dever
ser o que mostra na figura 50:
169
LINK
170
NOME-PROGRAMA;
01 TELA-CLIENTE.
02 BLANK SCREEN.
02 LINE 2 COL 2 BACKGROUND-COLOR 1 HIGHLIGHT VALUE "+----------"----------------------------------------------------------------"-+".
02 LINE 3 COL 2 BACKGROUND-COLOR 1 HIGHLIGHT VALUE "|
-"
MANUTENCAO DE CLIENTES
-" |".
02 LINE 4 COL 2 BACKGROUND-COLOR 1 HIGHLIGHT VALUE "+----------"----------------------------------------------------------------"-+".
02 LINE 5 COL 2 HIGHLIGHT VALUE "|".
02 COL 78 HIGHLIGHT VALUE "|".
02 LINE 6 COL 2 HIGHLIGHT VALUE "|".
02 COL 12 HIGHLIGHT VALUE "Codigo:".
02 COL 78 HIGHLIGHT VALUE "|".
02 LINE 7 COL 2 HIGHLIGHT VALUE "|".
171
172
Visto que a tela possui muitas informaes e tem partes definidas com cores
diferenciadas, a mesma j se encontra disponvel em sua pasta de trabalho com o
nome CLIENTES.TEL, para insero em nosso programa atravs da declarao
COPY.
Os campos solicitados na tela so os mesmos da FD CLIENTES.
Vejamos agora o programa de manuteno do arquivo de clientes, que dever
ser salvo em nossa pasta de trabalho com o nome CADCLI.CBL.
Programa CADCLI.CBL
IDENTIFICATION DIVISION.
PROGRAM-ID.
CADCLI.
AUTHOR.
SOCIESC.
*
* Manuteno do Arquivo de Cliente
*
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
COPY CLIENTES.SEL.
DATA DIVISION.
FILE SECTION.
COPY CLIENTES.FD.
WORKING-STORAGE SECTION.
01
01
VARIAVEIS-TEMPORARIAS.
03
CODIGO-EDIT
PIC ZZZZZZ9.
03
DATA-NASC-EDIT
PIC 99/99/9999.
03
DATA-1COMPRA-EDIT
PIC 99/99/9999.
03
RESPOSTA
PIC X(001).
03
MENSAGEM
PIC X(064).
AREA-TESTE-DATA.
03
DATA-TESTE
PIC 9(008).
03
STATUS-DATA
PIC X(001).
88
DATA-VALIDA
VALUE "S".
88
DATA-INVALIDA
VALUE "N".
77
MENSAGEM-INCLUSAO
173
MENSAGEM-ALTERACAO
MENSAGEM-EXCLUSAO
SIT-ARQUIVO
PIC X(002)
VALUE SPACE.
LINKAGE SECTION.
01
OPCAO
PIC 9(001).
SCREEN SECTION.
COPY CLIENTES.TEL.
PROCEDURE DIVISION USING OPCAO.
INICIO.
DISPLAY ERASE AT 0101.
PERFORM ABRE-ARQUIVO-SECT.
INITIALIZE VARIAVEIS-TEMPORARIAS
*
* PODEMOS NOTAR QUE LOGO NO INCIO, O PROGRAMA
* J EXECUTA UMA SEO PARA ABRIR O ARQUIVO DE CLIENTES...
* NA SEQUENCIA, LOGO ABAIXO, ELE TESTA A OPO PASSADA
* VIA LINKAGE SECTION PELO PROGRAMA PRINCIPAL
* DEPOIS DE EXECUTAR A SEO CONFORME A OPCAO
* O PROGRAMA FECHA O ARQUIVO DE CLIENTES
* E RETORNA PARA O PROGRAMA CHAMADOR, ATRAVS DO EXIT PROGRAM
*
EVALUATE OPCAO
WHEN 1 PERFORM INCLUSAO-SECT
WHEN 2 PERFORM ALTERACAO-SECT
WHEN 3 PERFORM EXCLUSAO-SECT
END-EVALUATE
CLOSE CLIENTES.
EXIT PROGRAM.
INCLUSAO-SECT SECTION.
INCLUSAO.
INITIALIZE REGISTRO-CLIENTE VARIAVEIS-TEMPORARIAS.
DISPLAY ERASE AT 0101.
DISPLAY TELA-CLIENTE.
174
COD-CLIENTE = ZEROS
GO TO INCLUSAO-FIM
END-IF.
LEITURA-ARQUIVO.
READ CLIENTES RECORD.
IF
SIT-ARQUIVO = "00"
MOVE "Cliente ja Existe-Tente outro codigo." TO MENSAGEM
PERFORM EXIBE-MSG-SECT
GO TO INCLUSAO
ELSE
IF
SIT-ARQUIVO = "23"
PERFORM ENTRADA-DADOS-SECT
IF
END-IF
END-IF
END-IF.
GRAVAR.
MOVE SPACES TO MENSAGEM
MOVE "Confirma Inclusao ? (S)im - " TO MENSAGEM
DISPLAY MENSAGEM AT 1914
ACCEPT RESPOSTA
IF
END-IF.
WRITE REGISTRO-CLIENTE.
IF
SIT-ARQUIVO = "00"
MOVE "Inclusao efetuada com Sucesso !" TO MENSAGEM
PERFORM EXIBE-MSG-SECT
ELSE
MOVE SPACES TO MENSAGEM
STRING "ERRO na Inclusao: Status= "
SIT-ARQUIVO
DELIMITED BY SIZE
INTO MENSAGEM
END-STRING
PERFORM EXIBE-MSG-SECT
STOP RUN
END-IF.
GO TO INCLUSAO.
INCLUSAO-FIM.
175
EXIT.
ALTERACAO-SECT SECTION.
ALTERACAO.
INITIALIZE REGISTRO-CLIENTE VARIAVEIS-TEMPORARIAS.
DISPLAY ERASE AT 0101.
DISPLAY TELA-CLIENTE.
DISPLAY MENSAGEM-ALTERACAO AT 1914
ACCEPT CODIGO-EDIT AT 0620 WITH HIGHLIGHT ON ESCAPE
GO TO ALTERACAO-FIM.
MOVE CODIGO-EDIT TO COD-CLIENTE.
IF
COD-CLIENTE = ZEROS
GO TO ALTERACAO-FIM
END-IF.
LEITURA-ARQUIVO.
READ CLIENTES RECORD.
IF
SIT-ARQUIVO = "23"
MOVE "Cliente nao Cadastrado !!!" TO MENSAGEM
PERFORM EXIBE-MSG-SECT
GO TO ALTERACAO
ELSE
IF
SIT-ARQUIVO = "00"
PERFORM MOSTRA-DADOS-SECT
PERFORM ENTRADA-DADOS-SECT
IF
END-IF
END-IF
END-IF.
REGRAVAR.
MOVE SPACES TO MENSAGEM, RESPOSTA
MOVE "Confirma Alteracao ? (S)im - " TO MENSAGEM
DISPLAY MENSAGEM AT 1914
ACCEPT RESPOSTA
IF
END-IF.
REWRITE REGISTRO-CLIENTE.
IF
SIT-ARQUIVO = "00"
MOVE "Alteracao efetuada com Sucesso !" TO MENSAGEM
PERFORM EXIBE-MSG-SECT
ELSE
MOVE SPACES TO MENSAGEM
STRING "ERRO na Inclusao: Status= "
SIT-ARQUIVO
DELIMITED BY SIZE
176
INTO MENSAGEM
END-STRING
PERFORM EXIBE-MSG-SECT
STOP RUN
END-IF.
GO TO ALTERACAO.
ALTERACAO-FIM.
EXIT.
*
* PODEMOS NOTAR QUE TANTO A SECAO DE INCLUSAO COMO A DE ALTERACAO,
* UTILIZAM A SEO ABAIXO, QUE FAZ A ENTRADA DOS DADOS NA TELA
*
* NA SEO ABAIXO, A TECLA ESC FAZ COM QUE O PROGRAMA RETORNE
* SEMPRE DO CAMPO ATUAL PARA O CAMPO ANTERIOR AT QUE ESTEJA NO
* PRIMEIRO CAMPO DA TELA ONDE ENTO ELE ABANDONA A ROTINA
*
* OUTRA CARACTERSTICA DESSE PROGRAMA A UTILIZAO
* DO SUBPROGRAMA VALDATA, PARA VALIDAO DE DATAS
*
ENTRADA-DADOS-SECT SECTION.
ENTRADA.
MOVE SPACES TO RESPOSTA.
ACCEPT NOME-CLIENTE AT 0720 WITH HIGHLIGHT
ON ESCAPE
MOVE "C" TO RESPOSTA
GO TO ENTRADA-FIM.
IF
NOME-CLIENTE = SPACES
GO TO ENTRADA
END-IF.
NASCIMENTO.
MOVE SPACES TO MENSAGEM.
DISPLAY MENSAGEM AT 1914
ACCEPT DATA-NASC-EDIT AT 0820 WITH HIGHLIGHT AUTO-SKIP
ON ESCAPE
GO TO ENTRADA.
MOVE DATA-NASC-EDIT TO DATA-TESTE
CALL "VALDATA" USING AREA-TESTE-DATA
IF
END-IF.
MOVE DATA-TESTE TO DATA-NASC-CLIENTE.
ESTADOCIVIL.
177
END-IF.
ENDERECO.
MOVE SPACES TO MENSAGEM.
DISPLAY MENSAGEM AT 1914.
ACCEPT ENDERECO-CLIENTE AT 1120 WITH HIGHLIGHT
ON ESCAPE
GO TO ESTADOCIVIL.
BAIRRO.
ACCEPT BAIRRO-CLIENTE AT 1220 WITH HIGHLIGHT
ON ESCAPE
GO TO ENDERECO.
CIDADE.
ACCEPT CIDADE-CLIENTE AT 1320 WITH HIGHLIGHT
ON ESCAPE
GO TO BAIRRO.
ESTADO.
ACCEPT ESTADO-CLIENTE AT 1355 WITH HIGHLIGHT AUTO-SKIP
ON ESCAPE
GO TO CIDADE.
DDD.
ACCEPT NUM-DDD AT 1364 WITH HIGHLIGHT AUTO-SKIP
ON ESCAPE
GO TO ESTADO.
FONE.
ACCEPT NUM-FONE AT 1368 WITH HIGHLIGHT AUTO-SKIP
ON ESCAPE
GO TO DDD.
EMAIL.
ACCEPT EMAIL-CLIENTE AT 1420 WITH HIGHLIGHT
ON ESCAPE
GO TO FONE.
PRIMEIRACOMPRA.
MOVE SPACES TO MENSAGEM.
DISPLAY MENSAGEM AT 1914.
ACCEPT DATA-1COMPRA-EDIT AT 1620 WITH HIGHLIGHT AUTO-SKIP
ON ESCAPE
GO TO EMAIL.
MOVE DATA-1COMPRA-EDIT TO DATA-TESTE
CALL "VALDATA" USING AREA-TESTE-DATA
IF
178
END-IF.
MOVE DATA-TESTE TO DATA-1A-COMPRA-CLIENTE.
ENTRADA-FIM.
EXIT.
*
* A SEO ABAIXO EXIBE OS DADOS NA TELA QUANDO O CLIENTE
* J EST CADASTRADO, E UTILIZADA POR DUAS SEES: ALTERACAO E
* EXCLUSO
*
MOSTRA-DADOS-SECT SECTION.
MOSTRA.
MOVE DATA-NASC-CLIENTE
TO DATA-NASC-EDIT
AT 0720
DISPLAY DATA-NASC-EDIT
AT 0820
AT 1120
DISPLAY BAIRRO-CLIENTE
AT 1220
DISPLAY CIDADE-CLIENTE
AT 1320
DISPLAY ESTADO-CLIENTE
AT 1355
DISPLAY NUM-DDD
AT 1364
DISPLAY NUM-FONE
AT 1368
DISPLAY EMAIL-CLIENTE
AT 1420
COD-CLIENTE = ZEROS
GO TO EXCLUSAO-FIM
END-IF.
LEITURA-ARQUIVO.
READ CLIENTES RECORD.
IF
179
SIT-ARQUIVO = "23"
MOVE "Cliente nao Cadastrado !!!" TO MENSAGEM
PERFORM EXIBE-MSG-SECT
GO TO EXCLUSAO
ELSE
IF
SIT-ARQUIVO = "00"
PERFORM MOSTRA-DADOS-SECT
END-IF
END-IF.
EXCLUIR.
MOVE SPACES TO MENSAGEM, RESPOSTA
MOVE "Confirma Exclusao ? (S)im - " TO MENSAGEM
DISPLAY MENSAGEM AT 1914
ACCEPT RESPOSTA
IF
END-IF.
DELETE CLIENTES RECORD
IF
SIT-ARQUIVO = "00"
MOVE "Exclusao efetuada com Sucesso !" TO MENSAGEM
PERFORM EXIBE-MSG-SECT
ELSE
MOVE SPACES TO MENSAGEM
STRING "ERRO na Exclusao: Status= "
SIT-ARQUIVO
DELIMITED BY SIZE
INTO MENSAGEM
END-STRING
PERFORM EXIBE-MSG-SECT
STOP RUN
END-IF.
GO TO EXCLUSAO.
EXCLUSAO-FIM.
EXIT.
EXIBE-MSG-SECT SECTION.
EXIBE.
DISPLAY MENSAGEM AT 1914.
STOP " ".
EXIBE-FIM.
EXIT.
*
* AQUI TEMOS A SEO QUE ABRE O ARQUIVO. SE ELE NO EXISTE,
* CRIADO (OPEN OUTPUT) E DEPOIS ABERTO NOVAMENTE NO MODO
* I-O (INPUT / OUTPUT), OU SEJA, PARA LEITURA E GRAVAO.
180
*
ABRE-ARQUIVO-SECT SECTION.
ABRE.
OPEN INPUT CLIENTES.
IF
ELSE
IF
SIT-ARQUIVO = "00"
CLOSE CLIENTES
ELSE
DISPLAY "Erro na Abertura de CLIENTES.DAT - " AT 0520
DISPLAY SIT-ARQUIVO AT 0555
STOP RUN
END-IF
END-IF.
OPEN I-O CLIENTES.
ABRE-FIM.
EXIT.
181
-" |".
02 LINE 4 COL 2 BACKGROUND-COLOR 1 HIGHLIGHT VALUE "+----------"----------------------------------------------------------------"-+".
02 LINE 5 COL 2 HIGHLIGHT VALUE "|".
02 COL 78 HIGHLIGHT VALUE "|".
02 LINE 6 COL 2 HIGHLIGHT VALUE "|".
182
183
Essa tela tambm est disponvel em sua pasta de trabalho com o nome
CONCLI.TEL, para insero em nosso programa atravs da declarao COPY.
Nosso programa de consulta dever ser salvo na pasta de trabalho, com o
nome CONCLI.CBL.
Programa CONCLI.CBL
IDENTIFICATION DIVISION.
PROGRAM-ID.
AUTHOR.
CONCLI.
SOCIESC.
*
* Consulta Arquivos de Clientes
*
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
COPY CLIENTES.SEL.
DATA DIVISION.
FILE SECTION.
COPY CLIENTES.FD.
WORKING-STORAGE SECTION.
01
77
VARIAVEIS-TEMPORARIAS.
03
CODIGO-EDIT
03
DATA-NASC-EDIT
PIC 99/99/9999.
03
DESCR-EST-CIVIL
PIC X(010).
03
MENSAGEM
PIC X(064).
03
LINHA-EM-BRANCO
PIC X(075).
03
LINHAS-POR-TELA
PIC 9(001).
03
NUM-LIN
PIC 9(002).
03
RESPOSTA
PIC X(001).
03
TPO-CONSULTA
PIC X(001).
03
LETRA-CONSULTA
PIC X(001).
SIT-ARQUIVO
PIC ZZZZZZ9.
PIC X(002)
VALUE SPACE.
SCREEN SECTION.
COPY CONCLI.TEL.
PROCEDURE DIVISION.
184
INICIO.
DISPLAY ERASE AT 0101.
INITIALIZE VARIAVEIS-TEMPORARIAS
OPEN INPUT CLIENTES.
IF
SIT-ARQUIVO = "00"
PERFORM CONSULTA-CLIENTES-SECT
END-IF
CLOSE CLIENTES
EXIT PROGRAM.
CONSULTA-CLIENTES-SECT SECTION.
CONSULTA.
INITIALIZE REGISTRO-CLIENTE VARIAVEIS-TEMPORARIAS.
DISPLAY ERASE AT 0101.
DISPLAY TELA-CONSULTA.
ACCEPT TPO-CONSULTA AT 0640 WITH AUTO-SKIP HIGHLIGHT
ON ESCAPE GO TO CONSULTA-FIM.
IF
TPO-CONSULTA = SPACES
GO TO CONSULTA-FIM
END-IF.
IF
END-IF.
IF
TPO-CONSULTA = "C"
GO TO POSICIONA-ARQUIVO
END-IF.
INICONSULTA.
ACCEPT LETRA-CONSULTA AT 0674 WITH AUTO-SKIP HIGHLIGHT
ON ESCAPE GO TO CONSULTA.
POSICIONA-ARQUIVO.
*
* O PROGRAMA PERMITE A CONSULTA POR ORDEM NUMRICA OU
* ALFABTICA. DE ACORDO COM A ESCOLHA DO USURIO, O
* ARQUIVO DE CLIENTES POSICIONADO PELA CHAVE PRIMARIA
* (CODIGO CLIENTE) OU PELA ALTERNATIVA (NOME-CLIENTE)
* AS DEFINIES DE CLI-CHAVE E CLI-CHAVE-1 ESTO NA SELECT
* DO ARQUIVO DE CLIENTES
*
IF
TPO-CONSULTA = "C"
START CLIENTES KEY IS >= CLI-CHAVE
ELSE
MOVE LETRA-CONSULTA TO NOME-CLIENTE
START CLIENTES KEY IS >= CLI-CHAVE-1
END-IF
MOVE 8 TO NUM-LIN
PERFORM CARREGA-CONSULTA-SECT.
185
CONSULTA-FIM.
EXIT.
CARREGA-CONSULTA-SECT SECTION.
CARREGA.
READ CLIENTES NEXT.
IF
END-IF.
*
* A CONSULTA LIMITA 8 CLIENTES POR TELA, CONTROLADA PELA
* VARIVEL LINHAS-POR-TELA SE EXISTIREM MAIS QUE 8
* REGISTROS, O PROGRAMA AGUARDA O USURIO ESCOLHER A PROXIMA
* AO - <ENTER>=CONTINUA <A>=ABANDONA)
*
* EM CASO DO USURIO ESCOLHER CONTINUAR, A VARIVEL LINHAS-POR-TELA
* VOLTA A TER VALOR 1, E A TELA SER LIMPA PARA APRESENTACAO DE
* MAIS OITO REGISTROS NA CONSULTA, OU AT QUE TERMINEM OS REGISTROS.
*
ADD 1 TO LINHAS-POR-TELA NUM-LIN.
IF
LINHAS-POR-TELA > 8
DISPLAY "<ENTER>=CONTINUA <A>=ABANDONA" AT 1914
ACCEPT RESPOSTA AT 1945
IF
RESPOSTA = "A"
GO TO CARREGA-FIM
END-IF
MOVE 1 TO LINHAS-POR-TELA
MOVE 9 TO NUM-LIN
PERFORM LIMPA-TELA-SECT 8 TIMES
MOVE 9 TO NUM-LIN
END-IF.
PERFORM MOSTRA-DADOS-SECT.
GO TO CARREGA.
CARREGA-FIM.
EXIT.
MOSTRA-DADOS-SECT SECTION.
MOSTRA.
MOVE COD-CLIENTE
TO CODIGO-EDIT
MOVE DATA-NASC-CLIENTE
TO DATA-NASC-EDIT
EVALUATE EST-CIVIL-CLIENTE
WHEN "S" MOVE "Solteiro"
TO DESCR-EST-CIVIL
TO DESCR-EST-CIVIL
186
DISPLAY NOME-CLIENTE
DISPLAY DATA-NASC-EDIT
DISPLAY DESCR-EST-CIVIL
MOSTRA-FIM.
EXIT.
LIMPA-TELA-SECT SECTION.
LIMPA.
MOVE SPACES TO LINHA-EM-BRANCO.
DISPLAY LINHA-EM-BRANCO AT LINE NUM-LIN COL 03.
ADD 1 TO NUM-LIN.
LIMPA-FIM.
EXIT.
187
Figura 54 Execuo de CONCLI com opo por nome, sem definio de letra
inicial.
Como temos 10 clientes cadastrados, podemos notar que apenas os 8
primeiros vieram para a tela, conforme foi definido na lgica do programa. Se o
usurio teclar ENTER, a tela ser limpa e os outros dois sero carregados. Voc
pode verificar isto teclando ENTER no seu programa.
Vejamos agora o resultado da consulta por nome, iniciando a partir da letra P
como mostra a figura 55:
188
Figura 55 Execuo de CONCLI com opo por nome, iniciando a partir da letra
P.
6 CRIANDO PROGRAMA DE RELATRIO
Existem muitas formas de se gerar relatrios em COBOL. Nas verses mais
atualizadas, como o NETEXPRESS da MicroFocus, temos como construir relatrios
grficos diretamente pelo COBOL ou podemos integrar o COBOL com vrios
geradores de relatrios existentes no mercado, atravs de DLLs. Essa situao vai
variar muito de empresa para empresa, e de aplicao para aplicao.
Vamos demonstrar aqui uma forma muito comum de gerao de relatrio, que
a gravao do mesmo em formato TXT. Ou seja, ao invs de enviar o relatrio
diretamente para a impressora, gravamos o mesmo em disco.
Quando se trata da gerao de relatrios em COBOL, acessando arquivos,
existe uma declarao que auxilia muito os programadores a criarem suas listagens,
classificando as informaes nos formatos mais variados a declarao SORT.
Ento, antes de apresentarmos o programa RELCLI.CBL, vamos conhecer
essa declarao e o que ela pode fazer.
6.1 Declarao Sort
Normalmente, quando trabalhamos com arquivos indexados, podemos
classificar as informaes de forma direta, apenas pelos campos definidos como
chave primria e chave alternativa.
Nosso programa anterior de consulta mostra bem essa situao, posicionando
o arquivo de clientes para leitura, hora pela chave principal CLI-CHAVE, hora pela
chave alternativa CLI-CHAVE-1.
E se surgir a necessidade de gerar algum relatrio classificado por um campo
do arquivo que no conste na definio das chaves? No programa que veremos a
seguir, temos a opo de listar os clientes por ordem de UF. Mas como podemos
fazer isso, se as chaves do arquivo contemplam apenas COD-CLIENTE e NOMECLIENTE? nessa hora que usamos o recurso da declarao SORT, um utilitrio
do COBOL que serve para que seja possvel classificar as informaes de um
arquivo em qualquer formato, tanto em Ordem Crescente como Decrescente.
SOCIESC Sociedade Educacional de Santa Catarina
189
ASSIGN
TO DISK
CLIESTADO.
01
SCLI-REGISTRO.
03
SCLI-ESTADO
PIC X(002).
03
SCLI-CODIGO
PIC 9(007).
03
SCLI-NOME
PIC X(040).
03
SCLI-DATA-NASC
PIC 9(008).
KEY IS <CAMPO-1,CAMPO-2,...>
IS <SEO-DE-CLASSIFICAO>
OUTPUT-PROCEDURE IS <SEO-DE-IMPRESSO>.
190
IS CLASSIFICA-SORT-SECT
RELATORIO DE CLIENTES
|".
191
Caro Aluno!
A tela tambm est disponvel em sua pasta de trabalho com o nome
RELCLI.TEL, para insero em nosso programa atravs da declarao COPY.
Programa RELCLI.CBL
IDENTIFICATION DIVISION.
PROGRAM-ID.
AUTHOR.
RELCLI.
SOCIESC.
*
* Relatorio do Cadastro de Clientes
*
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
COPY CLIENTES.SEL.
SELECT RELAT
ASSIGN
TO "CLIENTES.TXT"
SELECT CLIESTADO
FILE STATUS
IS SIT-ARQUIVO.
ASSIGN
TO DISK
FD
RELAT.
01
RELAT-REGISTRO.
03
FILLER
SD
CLIESTADO.
01
SCLI-REGISTRO.
192
PIC X(080).
03
SCLI-ESTADO
PIC X(002).
03
SCLI-CODIGO
PIC 9(007).
03
SCLI-NOME
PIC X(040).
03
SCLI-DATA-NASC
PIC 9(008).
WORKING-STORAGE SECTION.
01
77
VARIAVEIS-TEMPORARIAS.
03
CODIGO-EDIT
PIC ZZZZZZ9.
03
DATA-NASC-EDIT
PIC 99/99/9999.
03
MENSAGEM
PIC X(050).
03
RESPOSTA
PIC X(001).
03
TPO-RELATORIO
PIC X(001).
03
LINHAS-IMPRESSAS
PIC 9(002).
SIT-ARQUIVO
PIC X(002)
VALUE SPACES.
*
* OS GRUPOS DE VARIVEIS ABAIXO QUE COMEAM COM A PALAVRA LINHA,
* ESTO DEFININDO O LAYOUT DE NOSSO RELATRIO.
* LINHA-CABECALHO-1 E LINHA-CABECALHO-2 SERO UTILIZADOS NO
* CABECALHO DE NOSSO RELATORIO. LINHA-DETALHE A LINHA
* USADA PARA IMPRESSO DOS DADOS DOS CLIENTES.
*
01
LINHA-CABECALHO-1.
03
FILLER
PIC X(010)
VALUE SPACES.
03
FILLER
PIC X(040)
VALUE
LIN-TPO-RELATORIO
FILLER
PIC X(010).
PIC X(020)
VALUE SPACES.
PIC X(015)
VALUE
PIC X(036)
VALUE SPACES.
PIC X(029)
VALUE
LINHA-CABECALHO-2.
03
"
FILLER
Codigo
Nome ".
03
FILLER
03
FILLER
Estado ".
01
193
LINHA-DETALHE.
03
03
FILLER
LIN-COD-CLIENTE
03
03
FILLER
LIN-NOME-CLIENTE
03
03
FILLER
LIN-DATA-NASC
03
03
FILLER
LIN-ESTADO
PIC X(001)
VALUE SPACE.
PIC ZZZZZZ9.
PIC X(002)
VALUE SPACE.
PIC X(040).
PIC X(002)
VALUE SPACE.
PIC 99/99/9999.
PIC X(005)
VALUE SPACE.
PIC X(002).
SCREEN SECTION.
COPY RELCLI.TEL.
PROCEDURE DIVISION.
INICIO.
DISPLAY ERASE AT 0101.
INITIALIZE VARIAVEIS-TEMPORARIAS
OPEN INPUT CLIENTES.
IF
SIT-ARQUIVO = "00"
PERFORM IMPRIME-CLIENTES-SECT
END-IF
CLOSE CLIENTES
EXIT PROGRAM.
IMPRIME-CLIENTES-SECT SECTION.
IMPRIME.
INITIALIZE REGISTRO-CLIENTE VARIAVEIS-TEMPORARIAS.
DISPLAY ERASE AT 0101.
DISPLAY TELA-RELATORIO.
ACCEPT TPO-RELATORIO AT 0647 WITH AUTO-SKIP HIGHLIGHT
ON ESCAPE GO TO IMPRIME-FIM.
IF
TPO-RELATORIO = SPACES
GO TO IMPRIME-FIM
END-IF.
IF
END-IF.
ARQUIVO-RELATORIO.
*
* LOGO ABAIXO, O PROGRAMA VAI CRIAR O ARQUIVO TXT DO RELATRIO,
* COM OUTPUT EM SEGUIDA, O PROGRAMA DESVIADO
* PARA UMA SEO ONDE SER MONTADO O CABECALHO.
* ACONSELHVEL QUE SE TENHA SEMPRE A SECAO DE CABECALHO
* SEPARADA, POIS A CADA QUEBRA DE PGINA O CABECALHO
* SERA NOVAMENTE IMPRESSO.
194
*
OPEN OUTPUT RELAT.
PERFORM CABECALHO-SECT.
EVALUATE TPO-RELATORIO
WHEN "C" START CLIENTES KEY IS >= CLI-CHAVE
PERFORM LISTA-CLIENTES-SECT
WHEN "N" START CLIENTES KEY IS >= CLI-CHAVE-1
PERFORM LISTA-CLIENTES-SECT
WHEN "E" SORT CLIESTADO ON ASCENDING KEY SCLI-ESTADO
INPUT PROCEDURE
IS CLASSIFICA-SORT-SECT
SIT-ARQUIVO = "10"
MOVE "FIM DE EXECUCAO !!!" TO MENSAGEM
DISPLAY MENSAGEM AT 1014
STOP " "
IF
LINHAS-IMPRESSAS > 0
MOVE "RELATORIO GRAVADO NO ARQUIVO CLIENTES.TXT!"
TO MENSAGEM
DISPLAY MENSAGEM AT 1014
STOP " "
END-IF
GO TO LISTA-FIM
END-IF.
ADD 1 TO LINHAS-IMPRESSAS
*
* AQUI TEMOS A VARIVEL LINHAS-IMPRESSAS CONTROLANDO A QUANTIDADE
* DE LINHAS POSSVEIS POR PGINA NESTE PROGRAMA USAMOS 60 LINHAS
* POR PGINA COMO PADRO. QUANTO ESTE VALOR ESTOURAR, O PROGRAMA
* VAI GRAVAR UMA INSTRUO BEFORE PAGE E VAI LISTAR O CABECALHO
* NOVAMENTE.
*
IF
LINHAS-IMPRESSAS > 60
195
TO LIN-COD-CLIENTE.
MOVE NOME-CLIENTE
TO LIN-NOME-CLIENTE.
TO LIN-ESTADO.
MOVE LINHA-DETALHE
TO RELAT-REGISTRO.
SIT-ARQUIVO = "10"
GO TO CLASSIFICA-FIM
END-IF.
INITIALIZE SCLI-REGISTRO.
MOVE ESTADO-CLIENTE
TO SCLI-ESTADO.
MOVE COD-CLIENTE
TO SCLI-CODIGO.
MOVE NOME-CLIENTE
TO SCLI-NOME.
196
*
IF
SIT-ARQUIVO = "10"
MOVE "FIM DE EXECUCAO !!!" TO MENSAGEM
DISPLAY MENSAGEM AT 1014
STOP " "
IF
LINHAS-IMPRESSAS > 0
MOVE "RELATORIO GRAVADO NO ARQUIVO CLIENTES.TXT!"
TO MENSAGEM
DISPLAY MENSAGEM AT 1014
STOP " "
END-IF
GO TO EMITE-FIM
END-IF.
ADD 1 TO LINHAS-IMPRESSAS
IF
LINHAS-IMPRESSAS > 60
MOVE SPACES TO RELAT-REGISTRO
WRITE RELAT-REGISTRO BEFORE PAGE
PERFORM CABECALHO-SECT
END-IF.
MONTA-LINHA.
MOVE SCLI-CODIGO
TO LIN-COD-CLIENTE.
MOVE SCLI-NOME
TO LIN-NOME-CLIENTE.
MOVE SCLI-DATA-NASC
TO LIN-DATA-NASC.
MOVE SCLI-ESTADO
TO LIN-ESTADO.
MOVE LINHA-DETALHE
TO RELAT-REGISTRO.
TO LIN-TPO-RELATORIO
TO LIN-TPO-RELATORIO
END-EVALUATE
MOVE LINHA-CABECALHO-1 TO RELAT-REGISTRO.
WRITE RELAT-REGISTRO BEFORE 1.
MOVE ALL "-" TO RELAT-REGISTRO.
WRITE RELAT-REGISTRO BEFORE 1.
MOVE LINHA-CABECALHO-2 TO RELAT-REGISTRO.
WRITE RELAT-REGISTRO BEFORE 1.
197
198
199
Voc obter os resultados expostos acima, selecionando cada uma das opes
do relatrio e abrindo o arquivo cursos.txt via Editor de Textos.
Sntese
Nessa aula visualizamos a construo de uma aplicao completa, desde a
definio do programa principal (MENUCLI), seus subprogramas diretos (CADCLI,
CONCLI, RELCLI) e indiretos, como o validador de datas (VALDATA). Aplicamos
praticamente todo o conhecimento repassado at o momento, na montagem desta
aplicao.
Exerccios Propostos
1. Assinale as alternativas verdadeiras:
(
datas).
(
200
Aula 11
Contedos da Aula
Acompanhe os assuntos desta aula, se preferir,
ao terminar, assinale o contedo j estudado.
O que SQL?
Conceituando ODBC
Configurando ODBC
Criando Tabela
Excluindo Tabela
Exerccios Propostos
201
202
203
1 O QUE SQL?
SQL (STRUCTURED QUERY LANGUAGE) uma linguagem estruturada para
consulta e manipulao de dados, que traz resultados rpidos e tem um formato
simples para uso. Seu surgimento data dos anos 80, em computadores de grande
porte. Gradativamente foi sendo introduzida nos ambientes de pequenas redes
(LANS) e desktops. Atualmente o padro para acesso a banco de dados mais
utilizado no mundo.
2 CONCEITUANDO ODBC
Os bancos de dados mais utilizados no mercado atualmente (Oracle, SQLServer, Postgree, Mysql, Firebird, etc.) podem ser acessados pelo COBOL, usando
de um driver ODBC. Voc sabe o que ODBC? Vamos conceituar o termo:
ODBC (OPEN DATA BASE CONNECTIVITY) uma tecnologia padro de
programao para acesso a banco de dados por meio de uma biblioteca de funes
pr-definida, criada pelo SQL Access Group. Basicamente, ODBC oferece uma
interface padronizada de funes ao programador (como uma API do Windows),
suportada por meio de um middleware apropriado alm de ser independente de
linguagem.
3 CONFIGURANDO ODBC
Como vamos trabalhar nos exemplos com banco de dados Mysql, vamos
verificar como configurar o ODBC do mesmo para que o COBOL (leia-se neste caso
NETEXPRESS) possa acess-lo sem problemas de comunicao.
Devemos acessar o Painel de Controle do Windows e, logo em seguida,
Ferramentas Administrativas. L teremos a opo para configurar o ODBC,
conforme podemos acompanhar na figura 60:
204
janela que
mostraremos na figura 61
205
Aps clicar no boto Adicionar, surgir uma nova janela onde dever ser
escolhida qual nova fonte de dados ser criada. Vejamos na figura 62:
206
207
208
Notem que essa clusula possui incio (BEGIN DECLARE) e fim (END
DECLARE). Entre as clusulas, devero ser declaradas as variveis para uso com
comandos SQL, como por exemplo, as variveis HOST.
Variveis HOST so variveis intermedirias, declaradas para uso pelo
COBOL, que recebem as informaes do banco de dados ou as transferem para o
banco de dados - pois o COBOL no consegue manipular diretamente um campo de
uma tabela do banco de dados. Para efetuar esta comunicao existem as variveis
HOST, como veremos mais adiante nos programas exemplo.
Estudaremos os comandos SQL mais utilizados. Temos um programa exemplo
para cada comando. Voc lembra do arquivo de cursos da aula nove? Pois bem.
Vamos trabalhar nessa aula tomando como base o mesmo arquivo de cursos, que
agora vai se tornar uma tabela de cursos dentro do Mysql, com os campos
Codigo_curso, Descr_curso e Per_curso.
Para visualizar os resultados prticos dos comandos SQL executados (criao
de tabelas, insero de registros, excluso de registros, etc.), utilizamos um software
gerenciador de banco de dados MYSQL.
5 CRIANDO TABELA
Vamos agora iniciar com o programa exemplo do comando CREATE TABLE.
Todas as sentenas e diretivas SQL estaro destacadas em azul.
Programa CREATE.CBL (criao da tabela de cursos).
$SET SQL(dbman=odbc)
$SET SQL(autocommit)
IDENTIFICATION DIVISION.
PROGRAM-ID.
CREATE.
AUTHOR.
209
SOCIESC.
DATE-WRITTEN.
20/04/07.
*
* Programa Exemplo para Criao de Tabelas no MYSQL
* NetExpress 3.0 - MicroFocus
*
WORKING-STORAGE SECTION.
EXEC SQL INCLUDE SQLCA END-EXEC
EXEC SQL BEGIN DECLARE SECTION END-EXEC
*
* LOGO ABAIXO ESTO DECLARADAS AS VARIVEIS HOST, QUE SERO
* UTILIZADAS NA COMUNICAO COM OS CAMPOS DA TABELA DE CURSOS
* CRIADA NO MYSQL
*
01
DCL-TABCUR.
03
HCODIGO-CURSO
03
HDESCR-CURSO
PIC X(030).
03
HPER-CURSO
PIC X(001).
SQLCODE < 0
PERFORM TA000-ERRO-SECT
END-IF.
DISPLAY "CONEXAO AO BANCO OK!" AT 0510 WITH HIGHLIGHT.
CRIACAO-TABELA.
EXEC SQL
CREATE TABLE TABCUR (
CODIGO_CURSO NUMERIC (5,0) NOT NULL
,DESCR_CURSO
VARCHAR (30)
BINARY
,PER_CURSO
210
CHAR (1)
BINARY
SQLCODE < 0
DISPLAY ERASE AT 0101
DISPLAY "ERRO SQL - " AT 1010
DISPLAY SQLCODE AT 1021
STOP RUN
END-IF.
TA999-EXIT.
EXIT.
211
212
INSERT.
SOCIESC.
20/04/07.
*
* Programa Exemplo para Insero de Registro no MYSQL
* atravs dos comandos SQL
* NetExpress 3.0 - MicroFocus
*
* OS REGISTROS QUE SERO INSERIDOS, SO OS QUE ESTO NO
* ARQUIVO CURSOS.TXT
*
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*
SELECT ARQCUR ASSIGN
TO "CURSOS.TXT"
IS SIT-ARQUIVO.
*
DATA DIVISION.
FILE SECTION.
FD ARQCUR.
01 TXT-REGISTRO.
03 TXT-COD-CURSO
PIC 9(005).
03 FILLER
PIC X(001).
03 TXT-DES-CURSO
PIC X(030).
03 FILLER
PIC X(001).
213
03 TXT-PER-CURSO
PIC X(001).
03 FILLER
PIC X(001).
WORKING-STORAGE SECTION.
77 SIT-ARQUIVO
DCL-TABCUR.
03
HCODIGO-CURSO
03
HDESCR-CURSO
PIC X(030).
03
HPER-CURSO
PIC X(001).
SQLCODE < 0
PERFORM TA000-ERRO-SECT
END-IF.
DISPLAY "CONEXAO AO BANCO OK!" AT 0510 WITH HIGHLIGHT.
OPEN INPUT ARQCUR.
INSERCAO-TABELA.
READ ARQCUR NEXT.
IF
SIT-ARQUIVO = "10"
GO TO FINAL-PROGRAMA
END-IF
*
* LOGO ABAIXO UM EXEMPLO DE TRANSFERNCIA DOS DADOS
* DO ARQUIVO CURSOS.TXT PARA AS VARIVEIS HOST, QUE
* CRIAMOS INICIANDO COM A LETRA H PARA FACILITAR O
* ENTENDIMENTO. NOTE MAIS ABAIXO QUE DENTRO DO COMANDO
* INSERT, EXISTE A CLUSULA VALUES, QUE VAI GRAVAR
* ATUALIZAR OS DADOS NOS CAMPOS DA TABELA TABCUR.
* OS CAMPOS USADOS APS A DECLARAO VALUES SO TODOS
* VARIVEIS HOST
*
MOVE TXT-COD-CURSO TO HCODIGO-CURSO
214
SQLCODE < 0
PERFORM TA000-ERRO-SECT
END-IF
END-IF
GO TO INSERCAO-TABELA.
FINAL-PROGRAMA.
DISPLAY "INSERCOES REALIZADAS COM SUCESSO!" AT 1010
WITH HIGHLIGHT.
CLOSE ARQCUR
EXEC SQL
DISCONNECT CURRENT
END-EXEC
STOP RUN.
TA000-ERRO-SECT SECTION.
TA000-ERRO.
IF
SQLCODE < 0
DISPLAY ERASE AT 0101
DISPLAY "ERRO SQL - " AT 1010
DISPLAY SQLCODE AT 1021
STOP RUN
END-IF.
TA999-EXIT.
EXIT.
215
216
217
ALTERAR.
AUTHOR.
SOCIESC.
DATE-WRITTEN.
20/04/07.
*
* Programa Exemplo para Alterao de Registro no MYSQL
* atravs dos comandos SQL
* NetExpress 3.0 - MicroFocus
*
WORKING-STORAGE SECTION.
EXEC SQL INCLUDE SQLCA END-EXEC
EXEC SQL BEGIN DECLARE SECTION END-EXEC
01
DCL-TABCUR.
03
HCODIGO-CURSO
03
HDESCR-CURSO
PIC X(030).
03
HPER-CURSO
PIC X(001).
SQLCODE < 0
PERFORM TA000-ERRO-SECT
END-IF.
DISPLAY "CONEXAO AO BANCO OK!" AT 0510 WITH HIGHLIGHT.
ALTERACAO-TABELA.
*
* VAMOS ALTERAR O NOME DO CURSO DE RECURSOS HUMANOS PARA
* CLCULOS TRABALHISTAS - E SEU PERODO DE "T" PARA "N"
* COMO O CDIGO DO CURSO 8, VAMOS CARREGAR A VARIVEL
* HOST (HCODIGO-CURSO) COM ESTE VALOR
*
MOVE 08
TO HCODIGO-CURSO
218
TO HPER-CURSO
EXEC SQL
UPDATE TABCUR SET
CODIGO_CURSO = :HCODIGO-CURSO
,DESCR_CURSO
= :HDESCR-CURSO
,PER_CURSO
= :HPER-CURSO
SQLCODE < 0
PERFORM TA000-ERRO-SECT
END-IF.
FINAL-PROGRAMA.
DISPLAY "ALTERACAO REALIZADA COM SUCESSO!" AT 1010
WITH HIGHLIGHT.
EXEC SQL
DISCONNECT CURRENT
END-EXEC
STOP RUN.
TA000-ERRO-SECT SECTION.
TA000-ERRO.
IF
SQLCODE < 0
DISPLAY ERASE AT 0101
DISPLAY "ERRO SQL - " AT 1010
DISPLAY SQLCODE AT 1021
STOP RUN
END-IF.
TA999-EXIT.
EXIT.
219
EXCLUIR.
AUTHOR.
SOCIESC.
DATE-WRITTEN.
20/04/07.
*
* Programa Exemplo para Exclusao de Registro no MYSQL
* atravs dos comandos SQL
* NetExpress 3.0 - MicroFocus
*
WORKING-STORAGE SECTION.
220
DCL-TABCUR.
03
HCODIGO-CURSO
03
HDESCR-CURSO
PIC X(030).
03
HPER-CURSO
PIC X(001).
PIC X(500).
SQLCODE < 0
PERFORM TA000-ERRO-SECT
END-IF.
DISPLAY "CONEXAO AO BANCO OK!" AT 0510 WITH HIGHLIGHT.
DELECAO-REGISTROS.
*
* ELIMINANDO O CURSO DE CDIGO = 4
*
MOVE 04 TO HCODIGO-CURSO
EXEC SQL
DELETE FROM TABCUR
WHERE ( CODIGO_CURSO = :HCODIGO-CURSO )
END-EXEC
IF
SQLCODE < 0
PERFORM TA000-ERRO-SECT
END-IF.
FINAL-PROGRAMA.
DISPLAY "EXCLUSAO REALIZADA COM SUCESSO!" AT 1010
WITH HIGHLIGHT.
EXEC SQL
221
DISCONNECT CURRENT
END-EXEC
STOP RUN.
TA000-ERRO-SECT SECTION.
TA000-ERRO.
IF
SQLCODE < 0
DISPLAY ERASE AT 0101
DISPLAY "ERRO SQL - " AT 1010
DISPLAY SQLCODE AT 1021
STOP RUN
END-IF.
TA999-EXIT.
EXIT.
222
SELECAO.
AUTHOR.
SOCIESC.
DATE-WRITTEN.
20/04/07.
*
* Programa Exemplo para seleo de registro no MYSQL
* atraves de comandos SQL (a declarao do CURSOR estar em destaque)
* NetExpress 3.0 - MicroFocus
*
WORKING-STORAGE SECTION.
01 LINHA
01 COLUNA
DCL-TABCUR.
03
HCODIGO-CURSO
03
HDESCR-CURSO
PIC X(030).
03
HPER-CURSO
PIC X(001).
223
PIC X(500).
REGISTRO-CURSO.
03
03
DESCR-CURSO
PIC X(030).
03
PER-CURSO
PIC X(001).
PROCEDURE DIVISION.
AA000-INICIO-SECT SECTION.
AA000-INICIO.
EXEC SQL
CONNECT TO 'TUPY' USER 'root.root'
END-EXEC
IF
SQLCODE < 0
PERFORM TA000-ERRO-SECT
END-IF
DISPLAY ERASE AT 0101
EXEC SQL
DECLARE CURSOR-1 DYNAMIC CURSOR FOR DYNAMIC_SQL
END-EXEC
IF
224
SQLCODE = 0
MOVE HCODIGO-CURSO
TO CODIGO-CURSO
MOVE HDESCR-CURSO
TO DESCR-CURSO
MOVE HPER-CURSO
TO PER-CURSO
ADD
MOVE 10
TO LINHA
TO COLUNA
TO COLUNA
DISPLAY DESCR-CURSO
ADD 30
TO COLUNA
DISPLAY PER-CURSO
END-IF
END-PERFORM
IF
EXEC SQL
CLOSE CURSOR-1
END-EXEC
EXEC SQL
DISCONNECT CURRENT
END-EXEC
STOP RUN.
AA999-EXIT.
EXIT.
TA000-ERRO-SECT SECTION.
TA000-ERRO.
IF
SQLCODE < 0
DISPLAY ERASE AT 0101
DISPLAY "ERRO SQL - " AT 1010
DISPLAY SQLCODE AT 1021
STOP RUN
END-IF.
TA999-EXIT.
EXIT.
225
SELECAO1.
AUTHOR.
SOCIESC.
DATE-WRITTEN.
20/04/07.
*
* Programa Exemplo para seleo de registro no MYSQL
* atraves de comandos SQL
* NetExpress 3.0 - MicroFocus
*
WORKING-STORAGE SECTION.
01 LINHA
01 COLUNA
DCL-TABCUR.
03
HCODIGO-CURSO
03
HDESCR-CURSO
PIC X(030).
03
HPER-CURSO
PIC X(001).
226
01 SQL-TEXTO
PIC X(500).
REGISTRO-CURSO.
03
03
DESCR-CURSO
PIC X(030).
03
PER-CURSO
PIC X(001).
PROCEDURE DIVISION.
AA000-INICIO-SECT SECTION.
AA000-INICIO.
EXEC SQL
CONNECT TO 'TUPY' USER 'root.root'
END-EXEC
IF
SQLCODE < 0
PERFORM TA000-ERRO-SECT
END-IF
DISPLAY ERASE AT 0101
EXEC SQL
DECLARE CURSOR-1 DYNAMIC CURSOR FOR DYNAMIC_SQL
END-EXEC
IF
227
,:HPER-CURSO
END-EXEC
IF
SQLCODE = 0
MOVE HCODIGO-CURSO
TO CODIGO-CURSO
MOVE HDESCR-CURSO
TO DESCR-CURSO
MOVE HPER-CURSO
TO PER-CURSO
ADD
TO LINHA
MOVE 10
TO COLUNA
TO COLUNA
DISPLAY DESCR-CURSO
ADD 30
TO COLUNA
DISPLAY PER-CURSO
END-IF
END-PERFORM
IF
EXEC SQL
CLOSE CURSOR-1
END-EXEC
EXEC SQL
DISCONNECT CURRENT
END-EXEC
STOP RUN.
AA999-EXIT.
EXIT.
TA000-ERRO-SECT SECTION.
TA000-ERRO.
IF
SQLCODE < 0
DISPLAY ERASE AT 0101
DISPLAY "ERRO SQL - " AT 1010
DISPLAY SQLCODE AT 1021
STOP RUN
END-IF.
TA999-EXIT.
EXIT.
228
229
10 EXCLUINDO TABELA
Vamos agora acompanhar a excluso da tabela tabcur, usando o comando
SQL DROP TABLE.
Programa DROP.CBL (excluso da tabela de cursos).
$SET SQL(dbman=odbc)
$SET SQL(autocommit)
IDENTIFICATION DIVISION.
PROGRAM-ID.
DROP.
AUTHOR.
SOCIESC.
DATE-WRITTEN.
20/04/07.
*
*
*
WORKING-STORAGE SECTION.
EXEC SQL INCLUDE SQLCA END-EXEC
EXEC SQL BEGIN DECLARE SECTION END-EXEC
01
DCL-TABCUR.
03
HCODIGO-CURSO
03
HDESCR-CURSO
PIC X(030).
03
HPER-CURSO
PIC X(001).
SQLCODE < 0
PERFORM TA000-ERRO-SECT
END-IF.
DISPLAY "CONEXAO AO BANCO OK!" AT 0510 WITH HIGHLIGHT.
EXEC SQL
DROP TABLE TABCUR
230
END-EXEC
IF
SQLCODE < 0
DISPLAY ERASE AT 0101
DISPLAY "ERRO SQL - " AT 1010
DISPLAY SQLCODE AT 1021
STOP RUN
END-IF.
TA999-EXIT.
EXIT.
231
Sntese
Nessa aula vimos como efetuar a comunicao do COBOL com banco de
dados, fazendo conexo com o driver ODBC. Evidenciamos tambm o uso de
clusulas especiais declaradas no programa fonte COBOL, para que o compilador
reconhea o uso de comando SQL.
Exerccios Propostos
1. Assinale Verdadeiro ou Falso:
(
Ferramentas Administrativas.
(
Source Name serve apenas como comentrio no ser utilizado em nenhum lugar
pela linguagem de programao.
(
232
3. Cite qual a linha de comando que efetuou a conexo com o banco de dados,
em todos os nossos programas de exemplo:
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___
233
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___
CONCLUSO
A linguagem de programao COBOL, criada na chamada terceira gerao
(anos 60), continua sendo largamente utilizada no mercado.
Muitas pessoas desinformadas e preconceituosas tecem comentrios com
base em informaes de 15, 20 anos atrs, mas tampouco sabem que existem
verses do COBOL que fazem o que qualquer linguagem mais nova pode fazer.
Nosso ltimo estudo, acerca do acesso a banco de dados via COBOL,
comprova bem esta tese. Muitas so as linguagens que pararam no tempo ou
realmente morreram, mas o COBOL continua evoluindo.
Acessando na INTERNET o site do grupo AMBEV, por exemplo, quem
arriscaria dizer que foi construdo com a utilizao da ferramenta NetExpress da
MicroFocus?
234
REFERNCIAS
CARVALHO, Jos Eduardo M. de. Microsoft COBOL 4.0 Microsoft COBOL 3.0
Microsoft COBOL 2.2 COBOL. So Paulo, 1991 Makron Books.
Clube do COBOL
Disponvel em: < http//www.clubecobol.com.br >
Acesso em: 06 abr 2007 s 21 h.
Infonet Manual de COBOL
Disponvel em: < http//www.infonet.com.br/users.htm >
Acesso em: 05 abr 2007 s 20 h.
Linguagem de Programao COBOL
Disponvel em: <http//www.lcobol.com.br
Acesso em: 04 abrl 2007 21 h.
MICROFOCUS, Apostila de Treinamento NETEXPRESS 3.1. DTS Latin Amrica
Software, 1999.
____________, Apostila de Treinamento NETEXPRESS 3.1 INTERNET /
INTRANET. DTS Latin Amrica Software, 2000.
Portal Software
Disponvel em: < http//www.portal.inf.br/COBOL.htm >
Acesso em: 30 mar 2007 s 13 h.
PRICE, Wilson. Elements of COBOL Web Programing. Orinda-California, 1999
Object-Z Publishing.
SOUZA, Marcos Antonio de. NETEXPRESS 3.1 Dialog System Florianpolis,
2002 Visual Books.
TASCA, Joo Carlos. UMA ANLISE DA EVOLUO DA LINGUAGEM COBOL.
SOCIESC Sociedade Educacional de Santa Catarina
235
236
Aula 2
1.
Cite no mnimo cinco smbolos suportados pelo COBOL, alm das letras e
nmeros:
+ - * / = $ < > . ( ) :
2.
4.
Aula 3
1.
DIVISION:
237
diretiva:
3.
ABRE-ARQUIVO
LEITURA.
FINAL.
5.
3.
238
6.
PIC X(001).
88 BRASILEIRO
VALUE B.
88 ESTRANGEIRO
VALUE E.
8.
um programa:
Essa clusula elimina a necessidade de descries separadas para sentenas
repetitivas. Em outras palavras, especifica o nmero de vezes que um item se
repete com o mesmo formato.
239
Aula 5
comparao deve ser feita com base na idade legal do Brasil, 18 anos.
IF IDADE-ALUNO < 18
DISPLAY ALUNO MENOR DE IDADE
ELSE
DISPLAY ALUNO MAIOR DE IDADE
END-IF.
3. Complete as sentenas.
a)A palavra que melhor traduz a declarao PERFORM seria EXECUTE.
b)Recomenda-se o uso do comando GO TO apenas dentro da mesma seo.
c)O comando CALL utilizado para chamar outros programas dentro da
aplicao atual.
4. No programa exemplo (PROG4), qual a linha do programa que solicita ao usurio
que digite o perodo do curso (Semestral ou Anual):
ACCEPT PERIODO-CURSO AT 0561.
240
Aula 6
1. Com base em PROG3.CBL e PROG4.CBL, crie um novo programa
PROG5.CBL, com as seguintes especificaes:
a) O programa dever pedir na tela a Idade do Aluno. Se for menor de 16 ou
maior de 70, dever exibir mensagem afirmando que as Datas esto fora do
limite permitido para cursar a faculdade.
b) O programa dever pedir na tela a informao sobre o Estado Civil do Aluno
(solteiro, casado, divorciado), testando a primeira letra de cada situao (S, C, ou
D). Qualquer parmetro que no atenda essa especificao, o sistema no
dever seguir em frente.
c) Os campos pedidos na tela devero ter a possibilidade de deixar o usurio sair
teclando ESC
d) Quando o Estado Civil for Divorciado, se a idade do aluno for > 40 no aceitar.
Voltar o programa ao seu incio.
e) Para os outros casos, exibir mensagem PARABENS, SEU PERFIL FOI
APROVADO! na ltima linha da tela e finalizar o programa.
IDENTIFICATION DIVISION.
PROGRAM-ID.
AUTHOR.
EXERC6.
SOCIESC.
*
* Programa Exemplo - Resposta da Aula 06
*
ENVIRONMENT DIVISION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
DATA DIVISION.
WORKING-STORAGE SECTION.
01
VARIAVEIS-TEMPORARIAS.
241
03
ESTADO-CIVIL
PIC X(001).
03
IDADE-ALUNO
PIC 9(002).
PROCEDURE DIVISION.
INICIO.
DISPLAY ERASE AT 0101.
CAMPO-IDADE.
DISPLAY "Idade do Aluno - " AT 0520.
ACCEPT IDADE-ALUNO AT 0537 ON ESCAPE
GO TO FIM-PROGRAMA.
IF
END-IF.
CAMPO-EC.
DISPLAY "Estado Civil: (S) (C) (D) - " AT 0720.
ACCEPT ESTADO-CIVIL AT 0748 ON ESCAPE
GO TO FIM-PROGRAMA.
IF
END-IF
IF
Aula 7
1.
PRINCIPAL, solicite no incio duas variveis, uma para cor de fundo e outra para cor
dos caracteres, de forma que, a cada execuo o programa possa vir com cores
diferenciadas.
IDENTIFICATION DIVISION.
PROGRAM-ID.
MENUCOR.
AUTHOR.
SOCIESC.
DATA DIVISION.
WORKING-STORAGE SECTION.
01
OPCAO
242
01
COR-F
01
COR-C
SCREEN SECTION.
01 TELA-PRINCIPAL.
02 BLANK SCREEN BACKGROUND-COLOR COR-F FOREGROUND-COLOR COR-C.
02 LINE 01 COL 21 VALUE "*----------------------------------*".
02 LINE 02 COL 21 VALUE "*
*".
*".
*".
*".
1 - Inclusao
*".
2 - Alteracao
*".
3 - Exclusao
*".
4 - Consulta
*".
5 - Relatorio
*".
6 - Sair
*".
*".
Opcao: ( )
*".
*".
*".
END-IF
EVALUATE OPCAO
WHEN 1
WHEN 2
WHEN 3 CALL "CADALUNO" USING OPCAO ON OVERFLOW
PERFORM MENSAGEM-SECT
WHEN 4 CALL "CONALUNO" ON OVERFLOW
PERFORM MENSAGEM-SECT
WHEN 5 CALL "RELALUNO" ON OVERFLOW
PERFORM MENSAGEM-SECT
WHEN 6 GO TO FIM-PROGRAMA
END-EVALUATE.
FIM-PROGRAMA.
243
Aula 8
1.
EXERC8.
SOCIESC.
PIC 9(001).
03 DESCRICAO-COR
244
PIC X(020).
PROCEDURE DIVISION.
INICIO.
INITIALIZE AREA-CORES.
DISPLAY ERASE AT 0101.
DISPLAY "Informe o Codigo da COR - " AT 0510.
ACCEPT CODIGO-COR AT 0536 ON ESCAPE GO TO FIM-PROGRAMA.
IF
CODIGO-COR > 7
GO TO INICIO
END-IF
CALL "PROGCOR" USING AREA-CORES ON OVERFLOW
DISPLAY "PROGRAMA PROGCOR.EXE NAO ENCONTRADO!"
AT 2010 WITH HIGHLIGHT
STOP " "
GO TO FIM-PROGRAMA.
DISPLAY DESCRICAO-COR AT 1520 WITH REVERSE-VIDEO.
FIM-PROGRAMA.
DISPLAY "FIM DA ROTINA!" AT 2130 WITH HIGHLIGHT.
STOP RUN.
IDENTIFICATION DIVISION.
PROGRAM-ID.
PROGCOR.
AUTHOR.
SOCIESC.
PIC 9(001).
03 DESCRICAO-COR
PIC X(020).
TO DESCRICAO-COR
TO DESCRICAO-COR
TO DESCRICAO-COR
TO DESCRICAO-COR
TO DESCRICAO-COR
TO DESCRICAO-COR
TO DESCRICAO-COR
END-EVALUATE.
FIM-ROTINA.
245
EXIT PROGRAM.
Aula 9
1. Monte uma SELECT para um arquivo de Livros. O cdigo do livro deve ser a
chave principal e o nome do livro a chave alternativa. O nome externo do arquivo
ser "LIVROS.DAT" e a varivel de controle do STATUS dever ser LIV-STATUS.
SELECT LIVROS ASSING TO "LIVROS.DAT"
ORGANIZATION
IS INDEXED
ACCESS MODE
IS DYNAMIC
RECORD KEY
IS CODIGO-LIVRO
FILE STATUS
IS LIV-STATUS.
Gnero
poder
assumir
os
valores:
LIV-REGISTRO.
03
CODIGO-LIVRO
PIC 9(007).
03
NOME-LIVRO
PIC X(050).
03
DATA-EDICAO
PIC 9(008).
03
REDEFINES DATA-EDICAO.
03
05
DIA-EDICAO
PIC 9(002).
05
MES-EDICAO
PIC 9(002).
05
ANO-EDICAO
PIC 9(004).
GENERO-LIVRO
PIC X(001).
88
INFORMATICA
VALUE "I".
88
FICCAO
VALUE "F".
I=INFORMATICA
F=FICCAO
88
SOCIOLOGIA
246
VALUE "S".
3.Complete as frases:
a) Para cada arquivo a ser utilizado pelo programa, haver sempre uma clusula
SELECT e FD.
b) A declarao COPY permite que um bloco de instrues ou variveis seja
inserido no programa a partir de um arquivo texto que contenha as regras da
linguagem COBOL.
247
IF SIT-ARQUIVO = "23".
Significa que o registro lido nao foi encontrado.
7.Quando o programa pede o perodo do curso, no precisamos teclar ENTER para
o programa continuar. Ele pula automaticamente para a prxima sentena. A que
clusula atribumos isso no ACCEPT ?
AUTO-SKIP
8.Analisando a sentena "IF
Aula 10
datas).
( X ) Numa aplicao em COBOL, no necessrio compilar subprogramas com as
mesmas diretivas compiladas no programa principal.
( X ) A diretiva ON OVERFLOW ser executada, caso o programa constante na
chamada CALL no consiga ser executada.
(
248
LINHAS-POR-TELA > 8
DISPLAY "<ENTER>=CONTINUA <A>=ABANDONA" AT 1914
ACCEPT RESPOSTA AT 1945
IF
RESPOSTA = "A"
GO TO CARREGA-FIM
END-IF
LINHAS-
IMPRESSAS.
Aula 11
1. Assinale Verdadeiro ou Falso:
( F ) A tecnologia ODBC no tem um padro estabelecido, varia de linguagem para
linguagem e de acordo com o banco de dados utilizado.
( V ) A configurao de um driver ODBC feita usando a opo Painel de Controle,
Ferramentas Administrativas.
249