Documente Academic
Documente Profesional
Documente Cultură
Microsoft, MS, MS-DOS, Windows, Windows 95 Windows NT, Word, Project, Access, Excel, PowerPoint e logo do Windows so de propriedade da Microsoft Corporation nos Estados Unidos e/ou outros pases. COBOL de propriedade da IBM Corporation nos Estados Unidos e/ou outros pases.
Captulo 1 - Prefcio
Este Material...
Este material foi desenvolvido para os participantes do curso de Introduo Linguagem COBOL. Neste voc ir encontrar os principais e mais abrangentes recursos sobre este produto, e estar baseado na configurao padro de instalao do Software indicado pelo fabricante. Buscou-se na criao deste manual, o uso de uma linguagem simples e clara, sendo escrito em funo da execuo de Tarefas e a descrio das mesmas atravs de passos que sero identificados com uma numerao seqencial. O objetivo desse treinamento habilitar os participantes : Conhecimento do ambiente de Programao de Linguagens de Computao Conhecimento do ambiente de Lgica de Programao
Pr-Requisito
Esse treinamento requer que os participantes possuam os seguintes prrequisitos : Conhecimentos bsicos de programao TSO e JCL
Caracteres
Numricos - 0 a 9 Espao (branco) Sinal negativo ou Hfen Barra ou Diviso / Cifro $ Ponto. Abre parnteses ( Maior que > Alfabticos - A a Z Sinal positivo ou Soma + Asterisco ou Multiplicao * Sinal de Igual Vrgula, Apstrofo ' Fecha parnteses ) Menor que < =
Palavras em Cobol
Dividimos em dois grupos: Palavras Reservadas Palavras definidas pelo programador
Palavras em Cobol
Palavras Reservadas So aquelas que tem um significado especfico para o compilador COBOL, e no pode ser utilizada fora de sua finalidade dentro de um programa COBOL. IDENTIFICATION RECORD WRITE LABEL READ DATA
Palavras em Cobol
Tipos de Palavras Reservadas: Palavras Chaves So essenciais s especificaes de um programa. A omisso dessas palavras acarretar resultados errneos na compilao. Palavras Opcionais So palavras no obrigatrias, servindo apenas para um melhor entendimento do programa. Dependendo do programador querer usa-las ou no.
Constantes
Constantes tambm chamadas de literais, isto , Constante e Literal so sinnimos, neste curso usaremos os dois termos para acostumar com ambos. Existem trs tipos de Literais ou Constantes: Literal Numrico uma constante definida pelo programador, constituda pelos caracteres numricos de 0 a 9, sinais positivos (+), negativo (-) e vrgula decimal (, ). Regras de formao: No mximo 18 caracteres numricos Uso de apenas um sinal (+ ou -), e quando usado deve ser posicionado na extremidade esquerda do literal. A omisso do sinal significar que o nmero positivo Uso de uma vrgula decimal, podendo aparecer em qualquer posio do nmero, exceto na extremidade direita. Constantes sem vrgula decimal so considerados nmeros inteiros. Exemplos: 3824 +30,273 -14,5 55,7
Constantes Figurativas
Possuem significado especfico para o compilador. No deve ser escrita entre apstrofos, para no ser considerada uma constante no numrica. ZERO ZEROS ZEROES
Representa uma ou mais ocorrncias do caracter numrico 0, dependendo do contexto pode tambm ser numrico ou no numrico. MOVE ZERO TO DATA-NAME1 ou MOVE ZEROS TO DATA-NAME1 SPACE SPACES
Representa uma ou mais posies em branco (ou espaos), tratadas como um item alfanumrico. MOVE SPACE TO DATA-NAME1 ou MOVE SPACES TO DATA-NAME1
Representa uma ou mais ocorrncias do caractere apstrofo (') movidas para um item no numrico. MOVE QUOTE TO DATA-NAME1 ou MOVE QUOTES TO DATA-NAME1 HIGH-VALUE HIGH-VALUES
Representa uma ou mais ocorrncias do caractere X'FF' (representao em hexadecimal do maior valor na seqncia de caracteres na representao EBCDIC). A constante figurativa HIGH-VALUE tratado como um literal no numrico. MOVE HIGH-VALUE TO DATA-NAME1
Representa uma ou mais ocorrncias do caractere X'00' (representao em hexadecimal do menor valor na seqncia de caracteres na representao EBCDIC). A constante figurativa LOW-VALUE tratado como um literal no numrico. MOVE LOW-VALUE TO DATA-NAME1 MOVE LOW-VALUES TO DATA-NAME1 ALL (literal) Representa uma ou mais ocorrncias da cadeia de caracteres que compe o literal que no deve ser numrico. Quando uma constante figurativa usada, a palavra ALL redundante. MOVE ALL ' ' TO DATA-NAME1 ou MOVE SPACES TO DATA-NAME1 MOVE ALL '*' TO DATA-NAME1
IDENTIFICATION DIVISION
Documenta o programa, identifica o nome do programa fonte, datas de codificao e compilao, e outras informaes. Esta diviso no formada por nenhuma seo, apenas, por pargrafos que veremos mais adiante.
ENVIRONMENT DIVISION
Esta a segunda diviso de um programa COBOL com o objetivo de especificar o ambiente de compilao e execuo, associar cada arquivo no programa com um arquivo externo, especificar sua organizao, modo de acesso e outras informaes. A ENVIRONMENT DIVISION est subdividida em duas sees opcionais, isto , que devero ser escritas ou no, dependendo da necessidade do programa, a saber: CONFIGURATION SECTION. INPUT-OUTPUT SECTION.
DATA DIVISION
Descrever os dados que o programa manipular quer para entrada ou sada, assim como os dados constantes e intermedirios do programa. A DATA DIVISION constituda na maioria dos casos por trs sees: FILE SECTION. WORKING-STORAGE SECTION. LINKAGE SECTION
PROCEDURE DIVISION
a quarta e ltima diviso de um programa COBOL, descreve todos os procedimentos a serem executados pelo programa, tais como operaes e manipulaes de dados, controles, etc. formada geralmente por diversas sees e pargrafos dependendo da necessidade do problema.
Colunas
O compilador COBOL possui caractersticas posicionais, isto , se de um lado necessitamos ordenao de palavras, divises e sees, por outro lado necessrio usar uma estrutura definida da maneira de escrever. Essa estrutura ou formato permitem ao processador identificar determinadas informaes. A maneira grfica de representar o formato por intermdio da folha de programao. Nesta folha encontramos todas as especificaes de formatos j prefixados. Colunas de 1 a 6 Usadas para numerar as linhas de um programa. A numerao em ordem crescente. Opcionalmente podem deixar de serem preenchidas.
Colunas (Cont.)
Coluna 7 usada para um "hfen", que significa continuao de literais no numricos, e o smbolo * (asterisco) usado para comentrios. Coluna 8 a 72 Usadas para as entradas (palavras ou literais) do programa. Estas colunas esto agrupadas em duas margens: margem A (colunas 8 a 11) e margem B (colunas 12 a 72). Colunas 73 a 80 So destinadas opcionalmente identificao do programa, ou das alteraes efetuadas
MARGENS
Estas colunas so agrupadas em duas margens: A - (colunas 8 a 11) Nomes de divises Nomes de sees Nomes de pargrafos Descrio de arquivos (encontrados na DATA DIVISION que comeam com palavras reservadas de duas letras chamadas indicadores de nvel", tais como FD; o indicador de nvel escrito na margem A; o restante da descrio deve ser escrito na margem B). Ttulos especiais, na Procedure Division. Os nmeros de nvel podem ser escritos na margem A, como por exemplo o nvel 77. B - (colunas 12 a 72). Comear-se- a escrever qualquer outra entrada que no est relacionada acima.
EXEMPLO
Para uma melhor visualizao, deve-se comear as entradas de um programa em linhas separadas. Entretanto, caso no seja possvel, a nova entrada dever ser separada da primeira por pelo menos um espao. Se uma entrada for grande demais para caber em uma linha, ela deve continuar na segunda linha na margem B, no importando se a primeira comeou na margem A ou B.
EXEMPLO (Cont.)
Exemplo de um Programa escrito em COBOL IDENTIFICATION DIVISION. PROGRAM-ID. EXEMPLO. AUTHOR. BARTO. REMARKS. ESTE PROGRAMA E UM EXEMPLO. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. DECIMAL-POINT IS COMMA. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT CADCONTA ASSIGN TO CADCONTA. SELECT LISTAREL ASSIGN TO LISTAREL.
EXEMPLO (Cont.)
DATA DIVISION. FILE SECTION. FD CADCONTA LABEL RECORD IS STANDARD. 01 REG-CADCONTA. 05 CO-CHAVE. 10 CO-REGIAO 10 CO-SUBCENTRO 10 CO-AGENCIA 10 CO-NUMERO 05 CO-SALDO 05 CO-DATA-ABERT 05 CO-DATA-ULT-MOV 05 CO-LIMITE-CRED 05 CO-RESTRICAO 05 FILLER FD LISTAREL LABEL RECORD IS OMITTED. 01 REG-LISTAREL. 05 CONTROLE 05 LINHA PIC X(001). PIC X(132).
PIC X(03). PIC X(03). PIC 9(04). PIC 9(07). PIC S9(11)V99 PIC 9(08). PIC 9(08). PIC S9(05)V99 PIC X(01). PIC X(25).
COMP-3. COMP-3.
EXEMPLO (Cont.)
WORKING-STORAGE SECTION. 01 FLAG-EOF PIC X(001) 88 CONDICAO-EOF 01 CB10-CABECALHOS.. 05 CB11-CABEC01. 10 FILLER 10 FILLER 10 FILLER 10 CB11-PAG 05 CB12-CABEC02. 10 FILLER REGIAO SUBCENTRO 10 FILLER 01 LD50-LINHAS-DETALHE. 05 LD51-LINHA01. 10 FILLER 10 LD51-REGIAO 10 FILLER ........ ......... 05 LD52-LINHA02. 10 FILLER ........ ........ 01 AC100-ACUMULADORES. 05 AC100-LIN 05 AC100-PAG ........ VALUE SPACES. VALUE HIGH-VALUES. PIC PIC PIC PIC X(30) X(90). X(05) ZZ9. VALUE BRADESCO *****. VALUE RELACAO DE....... VALUE PAG..
PIC X(80) VALUE AGENCIA C.CORRENTE ..... PIC X(42). VALUE S A L D O. PIC X(05) PIC X(03). PIC X(04) PIC X(10) PIC 9(02) PIC 9(03) VALUE SPACES. VALUE SPACES. VALUE SPACES. VALUE 99. VALUE ZEROS.
EXEMPLO (Cont.)
PROCEDURE DIVISION. A000-00-PRINCIPAL. PERFORM B000-00-ABERTURA THRU B999-99-FIM. PERFORM C000-00-PROCESSAMENTO UNTIL CONDICAO-EOF. PERFORM X000-00-FINAL THRU X999-99-FIM. A999-99-FIM. GOBACK. B000-00-ABERTURA. OPEN INPUT CADCONTA OUTPUT LISTAREL. PERFORM D000-00-LE-CONTA. B999-99-FIM. EXIT. C000-00-PROCESSAMENTO. IF CO-REGIAO = ABC MOVE S TO LD51-RESTRICAO ELSE MOVE N TO LD51-RESTRICAO END-IF. PERFORM I000-00-IMPRIME PERFORM D000-00-LE-CONTA. C999-99-FIM. EXIT.
EXEMPLO (Cont.)
D000-00-LE-CONTA. READ CAD-CONTA AT END MOVE HIGH-VALUES TO FLAG-EOF. D999-99-FIM. EXIT I000-00-IMPRIME. IF AC100-LIN IS GREATER 55 PERFORM I500-00-CABEC. MOVE CO-REGIAO TO LD51-REGIAO .. MOVE LD51-LINHA01 TO LINHA WRITE REG-LISTAREL AFTER 1 LINE. ADD 1 TO AC100-LIN. GO TO I999-99-FIM. I500-00-CABEC. ADD 1 TO AC100-PAG MOVE AC100-PAG TO CB11-PAG WRITE REG-LISTAREL FROM CB11-CABEC01 AFTER PAGE ..... MOVE 0 TO AC100-LIN. I999-99-FIM. EXIT X000-00-FINAL. CLOSE X999-99-FIM. CAD-CONTA LISTAREL. EXIT.
Notaes de Formatos
A seguir so descritas as notaes utilizadas para descrever os formatos de um programa COBOL, nesta apostila. As palavras reservadas so escritas em letras maisculas, no devendo ser abreviadas e nem ter a ortografia errnea. As palavras reservadas no sublinhadas so opcionais (uso no obrigatrio), porm quando utilizadas no devem conter erros de ortografia. As palavras reservadas sublinhadas so as palavras chaves. As informaes a serem escritas pelos programadores esto em letras minsculas. As partes entre [ ] (colchetes) so opcionais, utilizando-as conforme a necessidade. As partes entre { } (chaves) indicam que obrigatoriamente devemos escolher a alternativa mais adequada. Partes do formato que podem ser repetidas qualquer nmero de vezes, so seguidas por trs pontos (...) sucessivos. Se esses pontos seguem uma palavra, eles se aplicam somente aquela palavra. Caso esses pontos sigam colchetes ou chaves, eles se referem parte toda entre colchetes ou chaves do formato. Exemplo: OPEN { INPUT / OUTPUT } arquivo1 [arquivo2]...
Clusulas Especiais
No COBOL existem clusulas especiais dirigidas ao compilador, indicando que execute certos procedimentos durante a compilao.
EJECT
Especifica que a prxima instruo no programa fonte dever ser impressa no incio da prxima pgina da listagem do programa fonte. EJECT. Formato:
A clusula SKIP1/2/3 especifica que a prxima instruo no programa fonte dever ser impressa precedida de linhas em branco, de acordo SKIP1/2/3 com a clusula codificada. Formato: SKIP1. Ou SKIP 3. Especifica um ttulo a ser impresso no incio de cada pgina da listagem do programa fonte durante a compilao. Caso a clusula TITLE no seja encontrada, um ttulo contento a identificao do compilador e o nvel do release atual ser gerada. A clusula TITLE no permite continuao em outra linha. Formato: TITLE literal [.] Ocorrncias so produzidas pela clusula TITLE:Fora uma nova pgina imediatamente; No impressa na listagem do programa fonte; No tem outro efeito na compilao; No tem efeito sobre a execuo do programa.
TITLE
As clusulas: EJECT, SKIP1, SKIP2, SKIP3 e TITLE, podem ser codificadas em quaisquer das divises do programa, e nenhuma outra clusula pode aparecer na mesma linha. Estas clusulas podem comear tanto na margem A como B, terminando ou no por um ponto.
Informaes
A IDENTIFICATION DIVISION deve ser a primeira diviso no programa Cobol. Nesta diviso identifica-se o programa, Nome, Autor, data em que foi feito, comentrios sobre o que faz o programa, etc. As informaes escritas na IDENTIFICATION DIVISION so tratadas pelo compilador COBOL como comentrios para documentao, no afetando portanto o significado do programa e no sendo traduzidos em linguagem de mquina.
Informaes (Cont.)
IDENTIFICATION DIVISION. O nome da diviso IDENTIFICATION DIVISION deve ser escrito a partir da margem A, seguido por ponto. A ou abreviao ID DIVISION pode substituir a forma por extenso, e os pargrafos opcionais podem estar ID DIVISION. codificados a seguir em qualquer ordem. Os comentrios em qualquer pargrafo opcional podem ser quaisquer combinao de caracteres EBCDIC, escritos na margem B em uma ou mais linhas sendo invlido o uso do hfen na coluna 7 para indicar continuao. PROGRAM-ID. Nome do programa. nico pargrafo obrigatrio na IDENTIFICATION DIVISION, cujo objetivo dar nome ao programa. O sistema usar as oito primeiras posies para identificar o nome do programa. O nome do programa deve comear com letra, caso contrrio haver converso de caractere da seguinte forma: o dgito 0 ser convertido para J e dgitos de 1 9 para A I. Se houver um hfen das posies de 2 a 8, ser convertido para o dgito 0.
Informaes (Cont.)
AUTHOR . Nome do autor. [...] Opcional. Este pargrafo bem como os demais restantes serve para documentao. Este pargrafo tem como finalidade identificar o autor do programa (o nome do programador). Empresa. [...]- Opcional Identificamos aqui o nome da empresa ou localizao. DD/MM/AA. - Opcional Identifica a data da codificao do programa. No preencher. [...] Identifica a data de compilao do programa. Podemos aqui escrever apenas o nome do pargrafo seguido por um ponto, e quando o programa for compilado, o compilador COBOL se encarregar de escrever a data de compilao. Comentrio do programa - Opcional Documentar qualquer medida de segurana a ser tomada quanto ao programa e/ou dos arquivos utilizados pelo programa. Lembrese que isto no gerar nenhuma ao a ser tomada por parte do sistema, servindo apenas como parte da documentao do programa. Use tambm para documentar as alteraes efetuadas.
SECURITY.
Informaes (Cont.)
Exemplo: ID DIVISION. PROGRAM-ID. AUTHOR. INSTALLATION. DATE-WRITTEN. DATE-COMPILED. XPTO999. BARTOLOMEU. ARO/DSAG/CSDS BRADESCO. AGOSTO-95.
* COM ASTERISCO VIRA COMENTARIO. * OUTROS COMENTRIOS PODERAO SER ACRESCENTADOS / ESTA LINHA SAIRA NA PROXIMA PAGINA DA COMPILACAO E COMENTARIO.
Sees
ENVIRONMENT DIVISION. Vem logo aps a IDENTIFICATION, esta diviso indica qual o computador e os arquivos a serem utilizados pelo programa, associando cada arquivo com os seus respectivos perifricos de entrada e sada. utilizada para fornecer informaes sobre o computador, e est divida em trs pargrafos: Nome do computador [WITH DEBUGGING MODE]. Este pargrafo serve para identificar o computador que compilar o programa COBOL.: Nome do computador. [MEMORY SIZE integer{WORDS / CHARACTERS / MODULES}] [PROGRAM COLLATING SEQUENCE IS alphabet-name]. [SEGMENT-LIMIT IS priority-number]. Este pargrafo serve para identificar o computador no qual ser executado o programa COBOL. [function-name-1 is mnemonic-name ...] [CURRENCY SIGN IS literal-1] [DECIMAL-POINT IS COMMA]. O pargrafo SPECIAL-NAMES tem por objetivo relacionar funes existentes no compilador COBOL com nomes simblicos dados pelo programador. Deve ser usado sempre que precisar inverter o ponto decimal para a virgula.
OBJECT-COMPUTER.
SPECIAL-NAMES.
Exemplo
ENVIRONMENT CONFIGURATION SOURCE-COMPUTER. OBJECT-COMPUTER. SPECIAL-NAMES. DECIMAL-POINT IS COMMA. DIVISION. SECTION. IBM3090. IBM3090.
Sees
INPUT-OUTPUT SECTION. Define os arquivos utilizados pelo programa. Assim como efetiva as ligaes entre o programa e os perifricos. FILE-CONTROL Estabelece o relacionamento entre os nomes e outros dados associados a arquivos com perifricos externos. A expresso FILE CONTROL aparece somente uma nica vez no incio do pargrafo, e deve ser codificado na margem A. O formato a seguir serve tanto para arquivos de mtodos de acesso QSAM como VSAM ESDS. usada para dar nomes aos arquivos utilizados no programa e associ-los com seus respectivos perifricos. Os nomes dos arquivos so definidos pelo programador, criando o nome que quiser, desde que obedea s regras de formao das palavras definidas pelo programador. Regras para formao de nomes de arquivos: De 1 at 30 caracteres; Nenhum caractere especial, exceto hfen; Nenhum caractere branco no meio; Pelo menos um caractere alfabtico. Nome: De 1 a 8 caracteres especificando o nome do arquivo externo requerido. Este precisa ser o nome especificado no comando DD de JCL para este arquivo. Este nome no pode ser uma palavra reservada (exemplo SYSIN, SYSOUT, SYSPUNCH). Especifica quando devem ser efetuados "checkpoints" e compartilhamento de reas de memria para os diferentes arquivos. Este pargrafo opcional num programa COBOL
SELECT [OPTIONAL]file-Name ASSIGN TO assignmentname-1 ... RESERVE Integer AREA ORGANIZATION IS SEQUENTIAL / INDEXED ACCESS MODE IS SEQUENTIAL / RANDOM FILE STATUS IS dataname-2 ...
I-O-CONTROL.
FILE SECTION. FD CADCONTA RECORDING LABEL RECORD ARE RECORD CONTAINS DATA RECORD
01 REG-CADCONTA. 05 CO-CHAVE. 10 CO-REGIAO PIC X(03). 10 CO-SUBCENTRO PIC X(03). 10 CO-AGENCIA PIC 9(04). 10 CO-NUMERO PIC 9(07). 05 CO-SALDO PIC S9(11)V99 COMP-3. 05 CO-DATA-ABERT PIC 9(08). 05 CO-DATA-ULT-MOV PIC 9(08). 05 CO-LIMITE-CRED PIC S9(05)V99 COMP-3. 05 CO-RESTRICAO PIC X(01). 05 FILLER PIC X(25).
Nveis Especiais
Os nmeros de nveis especiais identificam itens que no estruturam registros. Estes nveis especiais so:
77 Identifica um item independente da WORKING-STORAGE ou LINKAGE SECTION que no so subdivises de outros itens, e que tambm no so subdivididos. Sua definio deve comear na margem A. 88 Identifica qualquer entrada de nome de condio que est associada a um valor particular de uma varivel condicional. Veremos maiores detalhes na considerao da clusula VALUE.
FILLER
Um registro sempre iniciado pelo nmero de nvel 01 que indica ser o maior agrupamento e medida que se detalhem os dados, os nmeros de nveis crescem. Pode-se utilizar para um nmero de nvel o valor mximo que 49. O nmero de nvel no necessita crescer de uma forma contnua mas manter a ordem de grandeza. FILLER e Data-Name O Data-Name (nome de dado) aquele nome atribudo ao campo a ser utilizado no programa, isto , define os campos do registro. Um nome de dado pode ter no mximo 30 caracteres de especificao. FILLER um nome genrico atribudo a campos que no tem necessidade de serem especificados, pois no sero utilizados no processamento. No ambiente IBM, o FILLER pode ser tanto um item de grupo, como item elementar.
FILLER (Cont.)
Exemplo: FD CADCONTA LABEL RECORD IS STANDARD. 01 REG-CADCONTA. 05 CO-CHAVE. 10 CO-REGIAO PIC X(03). 10 CO-SUBCENTRO PIC X(03). 10 CO-AGENCIA PIC 9(04). 10 CO-NUMERO PIC 9(07). 05 CO-SALDO PIC S9(11)V99 COMP-3. 05 CO-DATA-ABERT PIC 9(08). 05 CO-DATA-ULT-MOV PIC 9(08). 05 CO-LIMITE-CRED PIC S9(05)V99 COMP-3. 05 CO-RESTRICAO PIC X(01). 05 FILLER PIC X(25).
Regras Sintticas
O nome de dado ou FILLER devem ser escritos logo aps o nmero de nvel. O nome de dado que criado pelo programador deve obedecer s regras de formao das palavras definidas pelo programador. A palavra reservada FILLER utilizada para denominar aqueles campos de informao que no tenham necessidade de serem referenciados no programa. Os nomes de dados definidos na WORKING-STORAGE SECTION e LINKAGE SECTION, devem ser nicos, porque no podem ser qualificados.
A palavra IS opcional. Para se evitar repetio prolongada do mesmo caractere (imagine representar 20 posies ou mais dessa forma), porem, pode-se valer do seguinte artifcio: PIC X(5) onde o nmero entre parnteses representa o nmero de ocorrncias do sinal X. No h espao entre o sinal de PIC e os parnteses e nem entre esses e o nmero.
PIC X(03). PIC X(03). PIC 9(04). PIC 9(07). PIC S9(11)V99 COMP-3. PIC 9(08). PIC 9(08). PIC S9(05)V99 COMP-3. PIC X(01). PIC X(25).
Sinais de PICTURE
Os sinais de PICTURE, que sero abaixo descritos, podem ser divididos em dois grupos: PICTURE de leitura PICTURE de edio ou mscara PICTURE de leitura Os sinais que podemos usar so os seguintes: 9, X, V, S, A. Dentro desse tipo de PICTURE , podemos ainda classificar os tipos de itens (campos) que elas definem: So configurados pelos caracteres 9, S e V. O caractere de PICTURE 9, indica a presena de um caractere numrico (de 0 9) naquela posio do campo. O caractere de PICTURE S, indica a presena do sinal aritmtico (+ ou ) em um campo de informaes. Dever ser colocado no incio de uma configurao de caracteres de PIC. Exemplo: PIC S9(04) Indica campo numrico de quatro posies com sinal. O caractere de PICTURE V, indica o posicionamento de uma vrgula decimal implcita. Exemplo: PIC S9(03)V9(02) S e V no ocupam espao na memria.
Numricos
Campos Alfanumricos
Sinais de PICTURE
Resumindo temos:
X A indica campo alfanumrico indica campo alfabtico 9 V S indica campo numrico indica vrgula decimal implcita indica sinal algbrico
Exemplos: O smbolo "V" na coluna armazenamento na memria significa uma vrgula decimal implcita.
PICTURE de edio
A PICTURE de edio refere-se preparao de dados para impresso. Somente campos numricos so passveis de edio. O formato representado por qualquer combinao dos seguintes caracteres: 9 V , Z * B $ + . CR DB. Os caracteres 9 e V so usados do mesmo modo j visto. O caractere "," (vrgula decimal) quando usado, inserido na posio indicada. O valor do item ser automaticamente alinhado por esta vrgula. As posies direita da vrgula devem ser constitudas apenas por caracteres do tipo: 9 Z * . $ + CR DB Z: indica a supresso de zeros no significativos (zeros esquerda). No possvel colocar-se Z direita de um caractere 9. "*": usado como proteo do nmero impresso. Os zeros esquerda sero substitudos por asteriscos. _ esquerda dos asteriscos poderemos usar apenas os smbolos ". , $ + ".
Exemplo
Arquivo de Entrada: CADCONTA Arquivo de Sada: LISTAREL Nome do registro: REG-LISTAREL DATA DIVISION. FILE SECTION. FD CADCONTA LABEL RECORD IS STANDARD DATA RECORD IS REG-CADCONTA. 01 REG-CADCONTA. 05 CO-CHAVE. 10 CO-REGIAO PIC X(03). 10 CO-SUBCENTRO PIC X(03). 10 CO-AGENCIA PIC 9(04). 10 CO-NUMERO PIC 9(07). 05 CO-SALDO PIC S9(11)V99 05 CO-DATA-ABERT PIC 9(08). 05 CO-DATA-ULT-MOV PIC 9(08). 05 CO-LIMITE-CRED PIC S9(05)V99 05 CO-RESTRICAO PIC X(01). 05 FILLER PIC X(25). FD LISTAREL LABEL RECORD ARE OMITTED DATA RECORD IS LINHA. 01 REG-LISTAREL. 05 FILLER PIC X(001). 05 LD-REGIAO PIC X(003). 05 FILLER PIC X(005). 05 LD-SUBCENTRO PIC X(003). 05 FILLER PIC X(005). 05 LD-SALDO PIC ZZZ.ZZ9,99.
COMP-3. COMP-3.
Tipos de Campos
Zonado Campo zonado aquele onde um algarismo representado em um byte no formato zona e dgito. O tamanho mximo de dgitos deste tipo de campo 18 que ser representado em 18 bytes. Para informar na definio que o campo zonado, basta no codificar a clusula USAGE, ou seja aps o "TAMANHO" colocar o ponto. Exemplo: 05 CPO-ZONADO PIC 9(10).
VALUE
VALUE IS literal Para se especificar os valores iniciais de constantes e contadores usar a clusula VALUE. Todo item definido com a clusula VALUE na WORKINGSTORAGE SECTION receber o valor especificado pelo literal para seu valor inicial, podendo ser mudado na PROCEDURE DIVISION. A clusula VALUE no deve ser especificada para descries de dados que tenham a clusula OCCURS ou sejam subordinadas a itens que contenham a clusula OCCURS. A clusula VALUE pode ter um segundo formato que usado para descrever um nome de condio. Cada nome de condio normalmente necessita de um nmero de nvel 88 para sua definio; entretanto, a clusula VALUE no seu segundo formato associa valor, valores ou faixa de valores a um determinado nome de condio. Quando a opo THRU utilizada, os valores que delimitam os intervalos devem estar em ordem crescente. O tipo de literal usado na clusula VALUE deve ser coerente com a descrio do campo que lhe associado.
VALUE (Cont.)
Exemplo: 01 TESTA-ESTADOS. 05 TA-ESTADO SPACES. 88 RIO-DE-JANEIRO 88 SAO-PAULO 88 MINAS-GERAIS PIC X(02) VALUE
A seguir veremos um exemplo de codificao da DATA DIVISION, apenas para efeito didtico. Note que usamos a clusula VALUE e os valores iniciais dos campos que a possuem so as que essa clusula define.
Exemplo
DIVISION.
SECTION.
PIC X(01). PIC X(50). PIC X(10). PIC X(50). PIC 9(02) PIC 9(03) VALUE 99. VALUE ZERO.
PIC X(10) VALUE SPACES. PIC X(15) VALUE 'SAO PAULO'. PIC X(15). PIC X(02).
REDEFINES
A clusula REDEFINES utilizada para re-escrever uma rea ou de um arquivo ou da WORKING-STORAGE, de modo que os caracteres pertencentes a rea possam ser referenciados por outros nomes. 01 REG-ARQMOV. 05 MO-CHAVE. 10 MO-REGIAO 10 MO-SUBCENTRO 10 ... 05 MO-TIPO-MOV 05 RMO-TIPO-MOV REDEFINES MO-TIPO-MOV
No exemplo anterior, a rea descrita para MO-TIPO-MOV a mesma que descrita para RMO-TIPO-MOV. Contudo, um numrico o outro e alfanumrico.
REDEFINES (Cont.)
Outra forma redefinir o item de grupo, a diviso de campos para esses itens de grupo no a mesma, porm o tamanho total deve ser igual. 01 REG-ARQMOV. 05 MO-CHAVE. 10 MO-REGIAO 10 MO-SUBCENTRO 05 RMO-CHAVE REDEFINES MO-CHAVE. 10 MO-PRIMEIRA 10 MO-SEGUNDA 10 .... 10 MO-SEXTA 05 ....
PIC X(03). PIC X(03). PIC X(01). PIC X(01). PIC X(01).
De maneira geral, a clusula REDEFINES permite a referenciao da mesma rea de memria do computador para conter itens de dados diferentes ou agrupamento alternativo da mesma informao. Isto , a clusula REDEFINES permite a redefinio da rea de memria, e no dos itens que ocupam aquela rea.
Linkage Section
utilizada para ligar o programa principal em COBOL a outros programas, muito utilizado em programao modular, para comunicao entre o programa principal e as subrotinas passando parmetros.
LINKAGE SECTION
O seu funcionamento parecido com o da Working, com a diferena que os dados aqui declarados sero compartilhados com outro programa, podendo tanto enviar como receber dados nessa rea. ( uma rea comum entre programas).
ROGRAMAO ESTRUTURADA
O COBOL MORREU... VIVA O COBOL! Apesar de todo ano aparecerem notcias sobre sua morte, o Cobol resiste bravamente. Estima-se que existam cerca de 65 bilhes de linhas de cdigo Cobol do mundo inteiro, crescendo a um ritmo de 5 bilhes de linhas anualmente. Se considerarmos que cada programa Cobol patrimnio da empresa, e que o valor de cada linha eqivale a U$ 15,00 (estudo feito pelo Gartner Group), temos o equivalente a U$ 975.000.000.000,00 (novecentos e setenta e cinco bilhes de dlares) em patrimnio, escritos em linguagem Cobol no mundo inteiro Um patrimnio considervel, que no ser abandonado da noite para o dia! O seu universo de programadores deve provavelmente chegar a mais de 2 milhes de profissionais usando esta linguagem, principalmente mantendo Legacy Systems, alguns com mais de 20 anos de idade. Isso significa que sair do Cobol no uma tarefa muito simples e para muitas empresas manter essa linguagem uma questo de
EVOLUO DO COBOL
O Cobol vem evoluindo nos ltimos anos, e a verso 85, conhecida como Structured Cobol (na verso IBM o Cobol/II) j quebrou o paradigma de programa monoltico das antigas verses, e incorporou construes similares s encontradas em linguagem como Pascal. Podemos citar as construes. IF / END-IF READ / END-READ Evolues do PERFORM, que passa a se comportar como Do-while e Do-until etc. Infelizmente, os velhos hbitos continuam arraigados e a maioria dos programas Cobol escritos hoje em dia no aproveitam adequadamente o conceito de estrutura embutido na linguagem. O mesmo problema poder acontecer com a verso OO. Sem uma conceituada slida nos fundamentos deste paradigma, os desenvolvedores continuaro a usar o Cobol nos conceitos antigos, hoje sem dvida anacrnicas. por esta razo que inclumos este capitulo de PROGRAMAO ESTRUTURADA neste curso, onde abordaremos os principais objetivos desta tcnica, e tambm novos conceitos para melhorar a qualidade dos programas como ACOPLAMENTO e COESO. Alm disso, apresentamos uma nova
Construes de Controle
SEQNCIA
Quando o controle de execuo do tipo SEQUNCIA usado, os comandos so executados um aps o outro, na mesma ordem em que eles aparecem na codificao fonte. Ex: MOVE COMPUTE MOVE A TO B. C = B* 12 C TO Y.
Quando se usa a estrutura de SELEO (IF/ELSE), uma condio testada. Se a condio verdadeira (IF), executa-se um conjunto de instrues. Seno (ELSE), executa-se outro conjunto. No final, os dois conjuntos se encontram em um ponto comum para continuidade de execuo chamado Terminator (END-IF). Quando uma das duas portas possveis, SE (IF) e SENO (ELSE), no tiver instrues para ser executada, deve-se mesmo assim codific-lo
Case-1 function
Case-2 function
Case-3 function
Case-4 function
= m Case-m function
Na estrutura SELEO (CASE), a estrutura aplicada de forma que uma, entre um conjunto de alternativas, seja escolhida com base em um teste de condio. No VS COBOL II representa-se esta estrutura atravs do comando EVALUATE.
REPETIO (DO-UNTIL)
PROCEDURE
F CONDIO
REPETIO (DO-WHILE)
PROCEDURE
CONDIO F
REPETIO (DO-n-TIMES)
IN U PT
OTU UP T
F N UO
iagrama de Ao - Seqncia
Construes de Controle
Diagrama de Ao - Seleo
Construes de Controle SELEO (IF-THEN-ELSE)
IF condio
IF condio
ELSE
Diagrama de Ao - Case
WHEN condio-2
WHEN condio-3
WHEN condio-n
iagrama de Ao - Repetio
Construes de Controle REPETIO (DO-WHILE) EM VS COBOL II: PERFORM WITH TEST BEFORE UNTIL FORMATO OUT-OF-LINE nome-do-mdulo UNTIL condio
UNTIL condio
Diagrama de Ao - Fuga
Construes de Controle FUGA
IF condio
iagrama de Ao - Estruturao
Diagrama de Ao - DO
Diagrama de Ao - DO (Cont.)
Entendendo o diagrama DO (mdulo pr-definido) TRATAR-ERRO
Define-se o modulo apenas 1 vez no diagrama. TRATAR-ERRO As outras chamadas apenas coloca-se o nome dentro de um retngulo.
Diagrama de Ao - DO (Cont.)
Entendendo o diagrama DO (ROTINA DE USO COMUM ou PROCEDURE)
CALCDATA
Diagrama de Ao - DO (Cont.)
Entendendo o diagrama DATA ACTION
READ
CLIENTE
INICIO
LER CLIENTE
F EOF?
CH-FIM = 1
SOMAR 1 EM CT-LIDOS
LEITURA
TERMINO
SADA
SADA
SADA
SADA
LEITURA TERMINO
Diagrama de Ao - Exerccio
A) FLUXOGRAMA
MOVTO
CADANT
CADATU
ARQUERRO
Diagrama de Ao - Exerccio
1)Atualizar o cadastro de clientes(CADANT CADATU) partir do arquivo MOVTO. 2) Somente o campo VALOR-MOV ser atualizado e dever obedecer as seguintes condies: a) TIPATU-MOV = 1 (Desbloqueio). Somar VALOR-MOV no campo SLDDISP-ATU. b) TIPATU-MOV = 2 (Depsito de cheques). Somar VALOR-MOV no campo SLDATUATU. c) TIPATU-MOV = 3 (Depsito em dinheiro). Somar VALOR-MOV nos campos SLDATU-ATU e SLADDISP-ATU. d) TIPATU-MOV = 4 (Dbito) Na funo de dbito dever ser considerado o tipo de cliente. Para clientes especiais h uma linha de emprstimo automtico que informado no campo LIMCRED-ANT, que estar zerado quando o cliente no tiver conta especial. Se VALOR-MOV for maior que o Saldo (SLDDISP-ANT + LIMCRED-ANT), gravar o ARQERRO, conforme layout, com a constante SEM FUNDOS no campo OBS1, e o campo OBS2 dever ser formatado com a constante CONTA ESPECIAL se for cliente especial , ou CONTA NORMAL se o cliente no tiver limite de crdito. Se VALOR-MOV for menor ou igual que Saldo (SLDDISP-ANT + LINCRED-ANT), subtra-lo dos campos SADDISP-ANT e SLDATU-ANT.
B) PROCEDIMENTOS
C) PROCEDIMENTOS
ADATU
PIC 9(4). PIC 9(6). PIC X(40). PIC S9(8)V99. PIC S9(8)V99. PIC S9(8)V99.
PIC 9(4). PIC 9(6). PIC S9(8)V99. PIC X(20). PIC X(20). PIC X(20).
Seo
Os programas podem ser compostos de uma ou vrias sees (SECTION), sendo que cada seo por sua vez pode ser composta por um vrios pargrafos. Nomes para Sees: Os nomes podem ser formados pelos caracteres: 0 a 9, A a Z e hfen; No podem iniciar e finalizar com hfen; Um nome de seo deve ser nico; O nome de seo deve ser escrito partir da margem A, seguido por um espao em branco e a palavra SECTION seguida por um ponto; Um nome de seo dispensvel se a PROCEDURE DIVISION consistir de somente uma seo; Uma seo termina quando comea outra seo; Uma seo deve ser imediatamente seguida por um nome de pargrafo.
Pargrafo
Um pargrafo constitudo de uma ou mais sentenas. Nomes para os pargrafos: Os nomes podem ser formados pelos caracteres: 0 a 9, A a Z e hfen. No podem iniciar nem finalizar com hfen; O tamanho mximo de 30 caracteres; Um nome de pargrafo seguido por um ponto. Deve comear na margem A.
Sentena
Comando
a menor unidade da PROCEDURE DIVISION. Especifica a ao que se deve executar. uma combinao sinttica vlida de palavras que comeam com um verbo COBOL, tais como MOVE, ADD, READ, WRITE, etc. So quatro as categorias de comandos COBOL: Dirigidos ao Compilado r Os comandos dirigidos ao Compilador so comandos que especificam aes a serem tomadas durante normalmen te a compilao do programa. Imperativo Um comando imperativo especifica que uma ao incondicional para ser tomada pelo programa. Uma srie de comandos imperativos podem ser especificados sempre que um comando imperativo for permitido. Na lista abaixo esto a maioria dos comandos imperativos COBOL: ARITMTICOS CLASSIFICAO MOVIMENTAO ADD MERGE ACCEPT DATE DAY COMPUTE RELEASE INITIALIZE Condicional Um comando condicional especifica que uma ao deve ser tomada caso uma dada condio estipulada no programa seja verdadeira. Na lista abaixo esto alguns comandos condicionais do COBOL: IF THEN ELSE END-IF Abrangncia Em geral, um comando ou clusula do COBOL II pode ter delimitadores de abrangncia na forma explcita ou implcita. Usa-se o delimitador de abrangncia na forma explcita para transformar um comando condicional em um comando imperativo. Explcitos Um delimitador explcito marca o fim de um comando END-ADD END-IF END-SEARCH Implcitos Um delimitador implcito um ponto que termina a abrangncia de todos os comandos anteriores ainda no terminados. No comando IF, a frase ELSE termina a abrangncia de todas as
EVALUATE
INITIALIZE
Um grande beneficio VS COBOL II o novo comando INITIALIZE, que nos permite a inicializao de diversas variveis do programa, de acordo com sua classe de dados, num nico comando. Este comando ser muito til, principalmente em ambientes ON-LINE, onde temos a caracterstica de um mesmo programa executar diversas vezes, uma vez para cada transao, sem a recarga do programa. Isto nos obrigava a inicializar as variveis no inicio da PROCEDURE, com diversos comandos MOVEs, ao invs de inicializ-las na WORKINGSTORAGE.
INITIALIZE identifier-1 [identifier-2]...
REPLACING
{ {
} }
{
DATA BY
indentifier-3 literal-1
}] }]
{
DATA BY
indentifier-3 literal-1
INITIALIZE
Um exemplo no seu formato mais simples: INITIALIZE INVENTORY-DATA. Se INVENTORY-DATA for um item-de-grupo, todos os seus subordinados: Numricos e numricos de edio sero inicializados com zeros alfabticos, alfanumricos e alfanumricos de edio sero inicializados com espaos. Existem trs excees, que no sero inicializados: Indexadores FILLER Itens contendo a clusula REDEFINIDAS (sero inicializados de acordo com o tipo do campo redefinido). Se INVENTORY-DATA A for um item-elementar, ser inicializado com espaos ou zeros, dependendo de sua definio.
INITIALIZE
INTIALIZE WS - DATA AC - TOTAL - 1 AC - TOTAL 2 CT - PAG CT - LIN CT - REG.
ada um, ser inicializado de acordo com o seu tipo, com zero ou espaos.
XEMPLOS INTIALIZE WS-CAMPO-1. WS-CAMPO-1 WS-CAMPO-1 PICTURE ANTES 9(05) 12345 X(05) AB123 99XX9 12AB3 XXBX/BB ABbC/DE **99,9CR 1234,5CR A(05) ABCDE WS-CAMPO-1 DEPOIS 00000 bbbbb bbbbb bbbb/bb **00,0 bbbbb
INITIALIZE
Clusula REPLACING Atravs da clusula REPLACING, voc pode determinar qual a forma de inicializaode cada tipo de campo, por um valor literal ou por um outro campo: INITIALIZE REG-CLIENTE REPLACING ALPHANUMERIC DATA BY LOW-VALUES NUMERIC DATA BY WS-VALOR NUMERIC-EDITED DATA BY +999,99.
INITIALIZE
os
ANJUST PIC X (8) JUSTIFIED RIGHT VALUE SPACES. ALPHANUM-4 PIC X (4) VALUE 1234.
OCEDURE DIVISION.
NITIALIZE ANJUST REPLACING ALPHANUMERIC DATA BY ALPHANUM-4. ALPHANUM-4 1234 ANJUST (ANTES) bbbbbbbb ANJUNST (DEPOIS) bbbb1234
NUMERIC-1 PIC 9 (8) VALUE 98765432. NUM-INT PIC 9 (7) VALUE 1234567.
OCEDURE DIVISION.
NITIALIZE NUMERIC-1 REPLACING NUMERIC DATA BY NUM-INT. NUM-INT 1234567 NUMERIC-1 (ANTES) 98765432 NUMERIC-1 (DEPOIS) 01234567
INITIALIZE
O mais importante de se destacar na clusula REPLACING que, ao ser utilizado em um item-de-grupo, o comando INITIALIZE s inicializar os campos especificados. Os demais permanecero sem alterao.
INITIALIZE
outro exemplo: WS-GROUP. WSG-NAME WSG-AGE WS-INCOME FILLER WSG-DATE WSG-CODE PIC PIC PIC PIC PIC PIC X (15) S9 (3) COMP-3. 9 (7) V99. X (3) XX/XX/XX. A (1) (alphanumeric) (numeric) (numeric) (alphanumeric) (alphanumeric-edited) (alphabetic) contm espaos contm zeros contm zeros inalterado contm bb/bb/bb contm branco inalterado contm 2 contm 2 inalterado inalterado
01 05 05 05 05 05 05
NITIALIZE WS-GROUP.
WSG-NAME WSG-AGE WSG-INCOME FILLER WSG-DATE WSG-CODE NITIALIZE WS-GROUP REPLACING NUMERIC BY 2.
inalterado
NITIALIZE WS-GROUP REPLACING ALPHANUMERIC BY * NUMERIC BY 19. contm *************** contm 19 contm 19 inalterado inalterado
inalterado
INITIALIZE
Quando utilizamos o comando INITIALIZE, ocorrer um processo idntico ao comando MOVE, isto , para cada campo a ser inicializado, ser gerado uma instruo MOVE. Por esta razo, inicializar tabelas com INITIALIZE pode no ser o mtodo mais eficiente. Ser mais eficiente a construo de uma rotina para esta finalidade, e utilizar o comando PERFORM VARYING para executar a inicializao. Voc no pode utilizar INITIALIZE para campos que contenham a clusula OCCURS DEPENDING ON, ou seus subordinados.
A EN T O
ACCEPT
Formato Geral : ACCEPT campo FROM mnemnico DATE DAY DAY-OF-WEEK TIME
Exemplo : WORKING-STORAGE SECTION. 77 HOJE PIC 9(06). ... PROCEDURE DIVISION. INICIO. ACCEPT HOJE FROM DATE.
ACCEPT
Consideraes: Neste exemplo o comando ACCEPT ler a hora do sistema e armazenar essas informaes no item HOJE. O comando ACCEPT pode receber informaes contidas no sistema especificados em registradores especiais (DATE, DAY, ou TIME). A recepo precisa seguir as regras do comando MOVE sem a opo CORRESPONDING. DATE: Seqncia da data no formato: "AAMMDD", a PICTURE implcita 9(06). DAY: Data no formato JULIANO "AADDD", a PICTURE implcita 9(05). TIME: Hora no formato "HHMMSSDD", a PICTURE implcita 9(08). DAY-OF-WEEK: Dia da semana em formato numrico PIC 9. Onde 1 = Segunda-feira, 2 = Tera-feira , ...
DISPLAY
usado para imprimir at 120 caracteres atravs da impressora. No imprime arquivos. Os literais podem estar na forma numrica ou alfanumrica. Exemplo:
DISPLAY TOTAL DISPLAY 'FIM DO PROGRAMA' DISPLAY 'QTD.DE DADOS=' QUANT. DADOS = 0. imprimir o contedo de TOTAL impresso da mensagem FIM DE PROGRAMA exemplo ser impresso : "QUANT. DE
MOVE
A informao representada pelo literal ou data-name1 movido para o data-name2 e assim por diante. Por exemplo suponha que tivssemos 2 campos, um chamado CAMPO1 e o outro CAMPO2. antes do MOVE: CAMPO1 = "BRADESCO" CAMPO2 = "XXXXXXXX" MOVE CAMPO1 TO CAMPO2 depois do MOVE: CAMPO1 = "BRADESCO" MOVE VALOR TO PRECO1 PRECO2 CAMPO2 = "BRADESCO"
PRECO3.
MOVE
Regras: 1. Quando estamos movimentando para "campos alfanumricos" ou alfabticos devemos levar em considerao o seguinte: a. Os caracteres a serem transferidos so armazenados no campo receptor da esquerda para a direita b. Se o campo receptor maior que o campo emissor, as posies restantes ( direita) so preenchidas com espaos c. Se o campo emissor maior que o receptor, a transferncia terminada no momento em que o campo receptor estiver preenchido. 2. Quando estivermos movimentando para campos numricos: a. O alinhamento feito pela vrgula decimal e as posies no usadas so
MOVE CORRESPONDING
A opo CORRESPONDING permite operaes a serem feitas em itens elementares de mesmo nome, se o item de grupo a qual eles pertencem estiverem especificados. Ambos os identificadores devem ser itens de grupo. Para um par de itens de dados (itens subordinados), as seguintes regras so vlidas: Ambos os itens subordinados so elementares Os 2 itens subordinados tem o mesmo nome e as mesmas qualificaes. Os itens subordinados no podem ser identificados pela palavra chave FILLER. Os itens subordinados no podem incluir REDEFINES, OCCURS ou USAGE IS INDEX em suas descries. Se um item subordinado for um grupo, os itens subordinados a ele so
MOVE CORRESPONDING
Exemplo: 05 ITEM-1 OCCURS 6 INDEXED BY X. 10 ITEM-A .... 10 ITEM-B .... 10 ITEM-C REDEFINES ITEM-B. 05 ITEM-2. 10 ITEM-A .... 10 ITEM-B .... 10 ITEM-C .... Se um MOVE CORR ITEM2 TO ITEM-1 (X) for codificado ITEM-A e ITEM-A (X) e ITEM-B e ITEM-B (X) so considerados como correspondente; ITEM-C e ITEM-C (X) no so includos, pois o ITEMC (X) inclui a clusula REDEFINES. No pode ser usado o CORR no nvel 77 ou 88.
Modificao de Referncia
O caracter dois pontos (:) ou clon como conhecida na lngua inglesa era um caracter invlido na sintaxe do VS COBOL at o Release 3. No VS COBOL II Release 3 este caracter indica uma Modificao de Referncia a uma parte de um campo, conhecido tambm como substring. Vamos ver como isto funciona: Reference Modification pode ser utilizado somente em campos no formato DISPLAY. Seu formato o seguinte: DATA FIELD (x : y) Nmero de bytes direita, a partir da posio inicial. Sendo omitido, ser a partir da posio inicial at o fim do campo. Posio inicial.
Modificao de Referncia
Exemplos: 1) MOVE FIELD1(3:7) TO FIELD2 Movimenta FIELD1 do terceiro ao nono byte para FIELD2, ou em outra palavras, a partir de terceiro, sete caracteres direita. 2) MOVE FIELD1(5:) TO FIELD2 Movimenta FIELD1 do quinto caracter at o fim para FIELD2, Exemplo da utilidade de Reference Modificacion: DATA DIVISION. WORKING-STORAGE SECTION. 01 HORA-CORRENTE PIC X (8). PROCEDURE DIVISION. ACCEPT HORA-CORRENTE FROM TIME. DISPLAY HORA CORRENTE = HORA-CORRENTE (1:2) : HORA-CORRENTE (3:2) : HORA-CORRENTE (5:2) :
Modificao de Referncia
Com este novo recurso do VS COBOL II, evita-se complexas codificaes para separar partes de uma string, como por exemplo, separar de um Nome, o Sobrenome: Em VS COBOL: DATA DIVISION. WORKING-STORAGE SECTION. 01 FULL-NAME. 05 FULL-CHAR PIC X OCCURS 40 TIMES. 01 LAST-NAME. 05 LAST-CHAR PIC X OCCURS 20 TIMES. 01 LAST-NAME-BEGIN PIC S9 (3) COMP-3. 01 SUB-FULL PIC S9 (4) COMP. 01 SUB-LAST PIC S9 (4) COMP. PROCEDURE DIVISION. ... MOVE +1 TO SUB-LAST. PERFORM MOVE-LAST THRU MOVE-END VARYNG SUB-FULL FROM LAST-NAME-BEGIN BY +1 UNTIL SUB-FULL > 40 OR SUB-LAST > 20. ... MOVE LAST. MOVE FULL-CHAR (SUB-FULL) TO LAST-CHAR (SUB-LAST). ADD +1 TO SUB-LAST. MOVE-END. EXIT.
Modificao de Referncia
Em VS COBOL II DATA DIVISION. WORKING-STORAGE SECTION. 01 FULL-NAME PIC X (40). 01 LAST-NAME PIC X (20). 01 LAST-NAME-BEGIN PIC S9 (3) PACKED-DECIMAL PROCEDURE DIVISION. ... MOVE FULL-NAME (LAST-NAME-BEGIN: ) TO LAST-NAME.
Modificao de Referncia
Como voc deve ter observado nas pginas anteriores, o Reference Modification pode ser declarado por uma constante inteira, por um campo e ainda por expresses: Atravs de constante: MOVE FIELD1 (3:5) TO FIELD2. Atravs de campo (binrio ou compactado recomendado): MOVE FIELD (POS-INICIAL:TAMANHO) TO FIELD2. Atravs das duas formas combinadas: MOVE FIELD1 (POS-INICIAL:5) TO FIELD2. Atravs de expresses MOVE FIELD1 (POS-INICIAL +1 :TAMANHO - 2) TO FIELD2
A EN T O
O segundo parmetro opcional. No entanto o caracter dois pontos (:) obrigatrio, para que o compilador no entendo como sendo uma subscrio ou indexao: MOVE FIELD1 (3:) TO FIELD2. Modification MOVE FIELD1 (3) TO FIELD2. Reference Subscrio
TO FIELD1.
Exerccio 1
bjetivos :
eviso dos conceitos de formao de registros, uso da clusula redefines, uso dos comandos :
nunciado :
efina no programa COBOL uma rea na WORKING-STORAGE SECTION com o seguinte formato : REGISTRO-PACIENTE. 05 DATA-EDITADA 05 HORA 05 RESPONSAVEL 05 NOME-PACIENTE 05 IDADE-PACIENTE 05 PLANO-SAUDE 05 ESTADO-GRAVE 05 POLICIA-AVISADA 05 DESCRICAO-ESTADO. 10 DESCRICAO-01 10 DESCRICAO-02 10 DESCRICAO-03 05 MEDICO PIC 9(006). PIC 9(004). PIC X(015). PIC X(030). PIC 99. PIC X(015). PIC X(003). PIC X(003). PIC X(060). PIC X(060). PIC X(060). PIC X(020).
Exerccio 1
1) Inicialize o campos com os comandos adequados. 2) Preencha o registro acima com os seguintes dados : 3) Luis Augusto dos Santos, 29 anos. Plano de Sade Sul Amrica. Paciente chegou em estado grave, com vrias leses internas devido a atropelamento. Policiais encaminharam o paciente ao Hospital o mdico que atendeu Dr. Ailton. A data e hora do registro devero ser lidas do sistema operacional. (ACCEPT). NOTA : A data dever conter o formato DDMMAA e a hora HHMM. 4) O responsvel no registro o seu prprio nome. 5) Redefina o registro do paciente a fim de separar o campo nome em dois subcampos : NOME e SOBRENOME. Exiba separadamente o SOBRENOME. 6) Movimentar todo o registro para um campo alfanumrico de 300 caracteres, e exiba este campo na sysout.
Operaes Aritmticas
de se esperar que a maioria dos programas, comerciais ou cientficos, executem clculos, nem que seja uma simples soma. Todos os operandos utilizados em operaes aritmticas devem ser itens elementares numricos. O tamanho mximo de cada operando de 18 dgitos decimais.
[ REMAINDER CAMPO-04 ]
Se a seqncia de operaes do mesmo nvel hierrquico, no for esclarecida pelos parnteses as operaes sero efetuadas da esquerda para a direita. Exemplo: A / B * C ser interpretada como se tivesse sido escrita da seguinte forma: (A / B) * C. A + B / C + D ** E * F + G interpretada como: A + (B / C) + ( ( D ** E) * F) + G
Exerccio 2
Objetivos : Uso das instrues aritmticas. Enunciado : 1) Faa um programa COBOL que calcule a seguinte frmula matemtica R = ( ( X6 - X4 ) + ( X3 * ( X1 - X2 ) ) ) / X5 - X1 2) A preciso de R deve ser de 4 casas decimais, sendo que o formato dos campos deve ser : X2, X3 e X5 binrio X1, X4, X6 e R compactado 3) A frmula dever ser resolvida com os comando bsicos (ADD, MULTIPLY, ....) e COMPUTE. 4) Teste o programa com os valores X1 = 1.507,12 X2 = 456 X3 = 0,9523 X4 = 1.453,15 X5 = -5 X6 = 1.901,01 O resultado R dever ser = -1.796,88 5) Divida o resultado R por 25,13 calcule utilizando as duas formas do DIVIDE com e sem o REMAINDER 6) Utilize o DISPLAY para imprimir todos os resultados
IF / END-IF
Com criao dos delimitadores estruturados, o comando IF ganha em legibilidade e facilita muito a construo de programas estruturados, pois o uso de IFs aninhados (IFs codificados dentro de IFs), muito intenso. Veja a comparao de codificao de programa sem END-IF e com END-IF:
IF / END-IF
Codificando sem end-if
1 5 7 8 10 12 15 20 25 30 35 40 45 50 55 60 65 70 72
100-PRODUCE-ENPLOYEE-LINE. PERFORM 110-READ-EMPLOYEE-RECORD. IF NOT EMPLOYEE-EOF IF SR-ACTIVE-EMPLOYEE PERFORM 120-PRINT-ACTIVE-LINE ELSE PERFORM 150-PRINT-INACTIVE-LINE. IF NOT EMPLOYEE-EOF PERFORM-160-ACCUMULATE-GAND-TOTAL.
IF / END-IF
5 7 8 10 12 15 20 25 30 35 40 45 50 55 60 65 70 72
100-PRODUCE-ENPLOYEE-LINE. PERFORM 110-READ-EMPLOYEE-RECORD. IF NOT EMPLOYEE-EOF IF SR-ACTIVE-EMPLOYEE PERFORM 120-PRINT-ACTIVE-LINE ELSE PERFORM 150-PRINT-INACTIVE-LINE END-IF PERFORM-160-ACCUMULATE-GAND-TOTAL.
IF Aninhados
Analise o seguinte fluxograma:
C PERFORM BAD RISK? D MOVE LOWRATE TO DISCONT F COMPUTE GROSS =(etc) G COMPUTE NET =(etc) H PERFORM INVOICE A GOOD RISK?
B QUANT >100?
Em VS COBOL, este fluxograma seria impossvel de ser implementado, da forma que est desenhado. Para implementar esta lgica teremos que repetir as funes F e G, conforme mostrado na pagina seguinte.
IF Aninhados
m VS COBOL: 5 7 8 10 12 15 20 25 30 35 40 45 50 55 60 65 70 72 IF GOOD-RISK IF QUANT > 100 MOVE HIGH-RATE TO COMPUTE GROSS = . . COMPUTE NET = . . . ELSE MOVE LOW-RATE TO COMPUTE GROSS = . . COMPUTE NET = . . . ELSE PERFORM BAD-RISK. PERFORM INVOICE.
DISCOUNT . DISCOUNT .
IF Aninhados
m VS COBOL II:
5 7 8 10 12 15 20 25 30 35 40 45 50 55 60 65 70 72 GOOD-RISK IF QUANT > 100 MOVE HIGH-RATE TO DISCOUNT ELSE MOVE LOW-RATE TO DISCOUNT END-IF COMPUTE GROSS = . . . COMPUTE NET = . . . SE PERFORM BAD-RISK ND-IF.
RFORM INVOICE.
IF Aninhados
Com esse tipo de instruo o programador indica a existncia de uma deciso em seu programa, dizendo o que fazer conforme o resultado de um teste. Isto , de acordo com o resultado do teste, o programa ser desviado para algum lugar. Exemplo: IF A > B ADD 5 TO C END-IF Neste caso se o teste for verdadeiro, isto , se o contedo do campo A for maior que o contedo de B, a operao soma (ADD 5 TO C) ser executada IF A < B PERFORM CALCULA. END-IF
Se A for menor que B (teste verdadeiro), o pargrafo CALCULA ser executado; se A no for menor que B (teste falso), ser executada a instruo seguinte ao comando
IF Aninhados
Testes de Classe Esse tipo de teste serve para determinar se o contedo de um campo definido com PIC X numrico ou alfabtico. IF DADO IS NUMERIC PERFORM CALCULO END-IF Se o contedo do campo DADO for numrico, haver um desvio para o pargrafo CALCULO IF NOME IS NOT ALPHABETIC GOBACK END-IF Se o contedo de NOME no for alfabtico, o programa termina via execuo do comando GOBACK. Teste de Sinal Este teste permite verificar se o contedo de um campo numrico positivo (POSITIVE), negativo (NEGATIVE) ou nulo (ZERO).
Comando de Desvio - IF
Teste de Relao Este tipo de teste serve para fazer comparaes entre dois operandos, podendo ser, contedo de campos, literais ou expresses aritmticas. So operadores relacionais: IS [NOT] GREATER THAN IS [NOT] > MAIOR QUE [ou] NO MAIOR QUE LESS - EQUAL IF SALARIO GREATER 10000 PERFORM CALC1 END-IF CALC1. COMPUTE SALARIO = SALARIO * 50000. So permitidos os conectores de condio AND e OR Se o contedo de SALARIO for maior que 100000, ento o programa ser desviado para o pargrafo CALC1. Caso contrrio o programa seguir a seqncia normal que o comando: COMPUTE SALARIO = SALARIO + 50000.
Comando de desvio IF
Sem opo ELSE Com opo ELSE Ser executada a sentena que precede a palavra ELSE caso o teste seja verdadeiro, e ELSE, se o teste for falso.
IF A = B ADD 1 TO C SUBTRACT 5 FROM Z MOVE SPACES TO REGISTRO WRITE REGISTRO ELSE ADD 5 TO NUMERO DISPLAY 'FIM' GOBACK END-IF IF A = B ADD 1 TO C ELSE PERFORM P1 END-IF
F CONDIES RELACIONAIS
Antes de mostrarmos as alteraes nos testes de condies relacionais no VS COBOL II, vamos rever as condies possveis no VS COBOL: A < B IF A IS LESS THAN B IF A LESS B A = B IF A IS EQUAL TO B IF A EQUAL B A > B IF A IS GREATER THAN B IF A GREATER B
A NOT < B IF A IS NOT LESS THAN B IF A NOT LESS B A NOT = B IF A IS NOT EQUAL THAN B IF A NOT EQUAL B A NOT > B IF A IS NOT GREATER THAN B IF A NOT GREATER B Mas o VS COBOL no suporta as condies: less than or equal to or equal to or greater than Se voc precisar precisa fazer o seguinte teste: se A menor ou igual a 3 ?
F CONDIES RELACIONAIS
Y
6 > 3
< 3
Agora em VS COBOL II, temos disponvel novas condies relacionais <= e >= para simplificao da lgica e melhoria no entendimento do programa, pois a condio NOT sempre foi causa de muito enganos. O mesmo teste acima feito simplesmente: IF A <= 3
F CONDIES RELACIONAIS
-NUMBER possui um valor entre 2 e 4? Para codificar estes teste em VS COBO IF ((WS-NUMBER NOT < 2 ) AND (WS_NUMBER NOT > 4)) PERFORM...
VS COBOL II, podemos simplificar o teste da seguinte forma: IF WS-NUMBER >= 2 AND WS-NUMBER <= 4 PERFORM... END-IF.
NEXT SENTENCE
Nem sempre numa descrio de lgica se tem necessidade, de dado um teste no comando IF, executar a parte verdadeira e a falsa. Opcionalmente, nesse caso usamos as palavras NEXT SENTENCE para fazer papel de um comando nulo (isto , no faz nenhuma ao). IF A < B IF A > C NEXT SENTENCE ELSE ADD 1 TO C END-IF ELSE PERFORM IMPRESSAO END-IF.
CONTINUE
O comando CONTINUE um comando no-operacional. indicado quando nenhuma instruo executvel ser utilizada. Este comando foi criado para o uso de complementao de sintaxe de qualquer comando condicional ou imperativo do VS COBOL II, principalmente o EVALUATE. Tambm pode ser utilizado para o comando IF/ELSE, substituindo neste caso a palavra-chave NEXT SENTENCE. Veja os exemplos abaixo: IF STATUS-CODE = SPACES CONTINUE ELSE PERFORM 999-ERROR END-IF.
CONTINUE
Nem sempre CONTINUE tem o mesmo efeito de NEXT SENTENCE em um comando IF/ELSE. Quando NEXT SENTENCE processado, a execuo continua aps o prximo ponto; Quando CONTINUE processado, a execuo continua aps o prximo END-IF. No exemplo abaixo, se NEXT SENTENCE fosse utilizado no lugar de CONTINUE, PERFORM BIG-STATE no seria executado. Com o uso de CONTINUE, PERFORM BIG-STATE ser executado. IF STATE-CODE = 07 IF CITY-CODE = 02 PERFORM BIG-CITY ELSE CONTINUE END-IF
AE O T N
OPEN
Sua funo preparar um arquivo para ser lido ou gravado. obrigatrio abrir o arquivo antes de qualquer leitura ou gravao de arquivo. OPEN INPUT CADCONTA CADCLIENTE INPUT ......... para arquivos de entrada OUTPUT ..... para arquivos de sada I-O ................para arquivos indexados de entrada e sada (atualizao)
CLOSE
usado para fechar um arquivo. Para que um arquivo possa ser fechado necessrio que ele tenha sido anteriormente aberto, por um comando OPEN. CLOSE CADCONTA CADCLIENTE
READ
Realiza leitura de um registro dos arquivos especificados como INPUT na instruo OPEN. S pode ser usado aps o arquivo ser aberto por OPEN. Quando esse comando executado um registro lido do arquivo de entrada, esse registro ter condies de ser processado. Quando for detectado o fim do arquivo, desviar o programa para a sentena aps a palavra AT END.
READ file-name [NEXT] [ INTO data-name ] AT END statement [ NOT AT END statement ]
READ
Exemplo: READ CADASTRO AT END MOVE 'Y' TO FIM-DE-ARQUIVO. READ MOVIM INTO REGTRAB AT END GOBACK. READ CARTAO AT END MOVE 'Y' TO IND-FIM-ARQ NOT AT END ADD 1 TO CT-REG-LIDO.
READ
Ao se executar a instruo READ, o registro ser lido do arquivo levado rea de registro do arquivo reservado na FD da FILE SECTION. Com o comando anterior, um registro do arquivo chamado CARTAO, lido e colocado na rea de registro da FD. Aps o comando READ podemos dar o comando MOVE e transferir as informaes que foram lidas e armazenadas na rea de registro para uma rea de trabalho da WORKING-STORAGE SECTION. Entretanto podemos utilizar o comando READ com a opo INTO, que seria o equivalente a um comando READ seguido por um comando MOVE. O registro lido fica acessvel tanto na rea de registro como na rea de trabalho.
WRITE
O comando WRITE providencia a sada de um registro lgico. O verbo WRITE grava o registro em arquivos que foram especificados com OUTPUT na instruo OPEN. Permite tambm a movimentao do papel na impressora. WRITE record-name [ FROM data-name] Exemplo: Notas: Um comando OPEN deve ter sido executado para o arquivo antes do primeiro comando WRITE. O nome do registro deve ser aquele definido em nvel 01 na FD da FILE SECTION. Observe que um comando READ segue um nome de arquivo, mas a um comando WRITE segue um nome de registro. WRITE REG-SAIDA.
WRITE
Se a informao no estiver na rea de sada de registro, o programador deve executar um MOVE desta informao para essa rea. Entretanto, ao invs de usar o MOVE, voc pode usar: WRITE record-name FROM data-name A opo FROM eqivale a um comando WRITE precedido de um comando MOVE para transferir os dados para a rea de sada de registro. Opo ADVANCING Quando um arquivo for impresso em um formulrio contnuo da impressora, deve-se observar o posicionamento do carro da impressora, indicando quantas linhas em branco deseja-se saltar em cada um dos registros impressos.
WRITE - Consideraes:
A) A impressora assume que o primeiro caractere de qualquer registro transferido ela, um caractere de controle de espacejamento, conforme j consideramos. B) Assim sendo, o primeiro caractere de cada registro de um arquivo na impressora deve ser reservado para o caractere de controle de impresso. Exemplo 01 REG-LISTAREL. 05 FILLER 05 LINHA Notas: A opo ADVANCING do comando WRITE colocar automaticamente, o caractere de controle de impresso adequado na primeira posio do registro a ser escrito pela impressora, antes do WRITE a ser executado. AFTER especifica que a impresso do registro deve ser efetuada depois do espacejamento. Isto , permite a impresso do registro aps o formulrio avanar o nmero inteiro de linhas. PIC X. -> posio para controle de carro PIC X(132).
WRITE - Consideraes:
O nmero inteiro pode ser 0, 1, 2, 3, etc... WRITE REGISTRO BEFORE ADVANCING 2 LINES. WRITE LINHA BEFORE 3 LINES. WRITE LINHA FROM DETALHE AFTER 1 LINES. WRITE CABEC AFTER PAGE.
GO TO
Em geral, em um programa COBOL, os comandos so executados na seqncia em que eles aparecem na escrita do programa. H, entretanto, alguns comandos que fazem com que essa execuo seqencial seja alterada passando a executar um outro comando, por meio de desvios. GO TO nome-de-procedimento (deve ser um nome de pargrafo). Exemplo: LER. ... GO TO CALCULAR. ... CALCULAR. ... Nesse exemplo o programa vem executando o pargrafo LER, e quando atingir o GO TO sofrer um desvio para o pargrafo CALCULAR, mesmo que no tenha terminado o pargrafo anterior. Em outras palavras, assim, num programa ao ser encontrado um comando GO TO, a seqncia de execuo desviada para o pargrafo especificado no GOTO.
Exerccio 3
Objetivos : Uso de estruturas condicionais com o comando IF, desvios incondicionais GO TO e comandos de acesso a arquivos externos seqenciais (OPEN/CLOSE, READ/WRITE). Enunciado : 1) Faa um programa COBOL que leia um arquivo com DDNAME igual a ENTRADA, com DSNAME conforme padronizao interna da empresa, cujos os registros tem o seguinte LAYOUT: 01 REGISTRO. 10 REG-NOME 10 REG-IDADE PIC PIC X(030). 99.
Exerccio 3
2) Gerando um arquivo SAIDA com o LAYOUT: 01 REG-SAIDA. 10 REG-SAIDA-NOME 10 FILLER 10 REG-SAIDA-IDADE 10 FILLER 10 REG-SAIDA-DESCR PIC X(030). X(015). PIC 99. X(013). X(015).
3) O campo REG-NOME deve ser movido para REG-SAIDA-NOME e REGIDADE para REG-SAIDA-IDADE. 4) O campo REG-SAIDA-DESCR deve ser criado conforme o contedo do campo REG-IDADE : Se REG-IDADE maior que 60 mover IDOSO para REG-SAIDA-DESCR, Se REG-IDADE maior que 40 mover ADULTO para REG-SAIDA-DESCR Se REG-IDADE maior que 20 mover ADULTO JOVEM para REG-SAIDADESCR
Exerccio 3
5) Todas as condies acima descritas devem estar em uma nica estrutura de IF. 6) Ao final da execuo do programa, dever ser emitido um TOTAL DE CONTROLE (DISPLAY) com o seguinte aspecto : TOTAIS DE REGISTROS LIDOS DO ARQUIVO DE ENTRADA IDOSOS .................. : XX ADULTOS .............. : XX ADULTOS-JOVENS: XX ADOLESCENTES ...: XX CRIANCAS .............: XX GERAL ....................: XX
Comando INSPECT
O comando INSPECT provavelmente o comando COBOL que apresenta a maior variedade de formatos possveis. No VS COBOL eram 3 formatos, e agora no VS COBOL II possvel um novo formato que iremos mostrar mais adiante, com substituto do chamado TRANSFORM. INSPECT como substituto do EXAMINE
INSPECT uma verso mais poderosa do comando EXAMINE. Tudo o que podamos fazer com EXEMINE tambm pode ser feito com INSPECT com diferenas pouco importante no formato. Alm do mais, INSPECT prov um nmero de capacidades no presentes em EXAMINE FIELD1 REPLACING ALL ZEROS BY SPACES. EXAMINE. NSPECT FIELD1 REPLACING ALL ZERO BY SPACES.
MOVE ZERO TO TALLY. NPECT FIELD1 TALLYING TALLY FOR CHARACTERS BEFORE 0.
Comando INSPECT
Exemplos 77 COUNTR 01 DATA-1 PIC 9 VALUE ZERO. PIC X (6).
INSPECT DATA-1 TALLYING COUNTR FOR CHARACTER AFTER INITIAL S REPLACING ALL A BY O DATA-1 Antes COUNTR ANSELM SACKET PASSED Aps DATA-1 Aps 3 ONSELM 5 SOCKET 2 POSSED
Comando INSPECT
77 COUNTR 01 DATA-2 PIC 9 VALUE ZERO. PIC X (11).
INSPECT DATA-2 TALLYING COUNTR FOR LEALDING 0 REPLACING FIRST A BY 2 AFTER INITIAL C.
Aps 2 4 0
Comando INSPECT
77 COUNTR 01 DATA-3 PIC 9 VALUE ZERO. PIC X (8).
Comando INSPECT
Outros exemplos INSPECT FIELD1 REPLACING ALL A BY B BEFORE INITIAL X INSPECT FIELD1 REPLACING CHARACTERS BY SPACES AFTER INITIAL . INSPECT FIELD1 REPLACING ALL X BY Y B BY Z W BY Q AFTER INITIAL SPACE INSPECT FIELD1 REPLACING FIRST X AFTER INITIAL Y BY Z INSPECT FIELD1 REPLACING ABC BY XYZ INSPECT FIELD1 TALLYING COUNT-1 FOR CHARACTERS BEFORE INITIAL DEPT INSPECT SAMPLE TALLYING INDEX-4 FOR LEADING SPACES REPLACING ALL . BY . FIRST Q BY P
Comando INSPECT
Novo Formato
indentifier-2 literal-1
}{
TO
indentifier-3 literal-2
{ [
BEFORE AFTER
} {
INITIAL
indentifier-4 literal-3
} ]
Comando INSPECT
Exemplos
01 DATA-4 PIC X (11). INSPECT DATA-4 CONVERTING a b c d e f g h i j l m n o p q r s t u v w x y z TO A B C D E F G H I J L M N O P Q R S T U V W X Y Z DATA-4 Antes inspect DATA-4 Aps INSPECT
01 DATA-4 PIC X (11). INSPECT DATA-4 CONVERTING a b c d e f g h i j l m n o p q r s t u v w x y z TO A B C D E F G H I J L M N O P Q R S T U V W X Y Z AFTER INITIAL / BEFORE INITIAL ? . DATA-4 Antes DATA-4 Aps A/five/?six a/FIVE/?six R/Rexx/RRRr r/REXX/RRRR Zfour?inspe zfour?inspe
Comando INSPECT
01 DATA-5 PIC X (11).
INSPECT DATA-5 CONVERTING XBC TO YZQ AFTER INITIAL R. DATA-5 Antes XBCRXBC XBC9XBC RXBCXBC DATA-5 Aps XBCRYZQ XBC9XBC RYZQYZQ
EVALUATE
Na Programao Estruturada as estruturas possveis so: SEQUNCIA Seqncia de comandos quaisquer. SELEO Se/Seno. Nas linguagens mais populares essa estrutura obtida pelo comando IF/ELSE. REPETIO Estrutura repetitiva (looping), nos formatos DO-UNTIL ou DOWHILE. Cada linguagens apresenta comandos diferentes: FOR, GOSUB, DO-WHILE, DO-UNTIL, etc. No COBOL ambos os formatos so obtidos pelo comando PERFORM. CASE Caso 1, Caso 2, Caso 3,...,Caso n. Em algumas linguagens essa estrutura obtida pelo comando DO CASE/CASE/ENDCASE.
EVALUATE
Estrutura CASE O VS COBOL no possui nenhum comando para resolver essa estrutura. Quando projetada em um comando COBOL, tnhamos que resolver o problema atravs do uso de IF/ELSE. Uma estrutura CASE obtida atravs de IF/ELSE, caracteriza-se por s executar comandos na condio SE (positivo ou negativo). Na condio SENO ( negativo ou falso), existe uma nova condio. Podemos representar isso atravs do seguinte F V diagrama de blocos:
F V
EVALUATE
O Diagrama da pgina anterior, poderia ser codificado em COBOL da seguinte forma: IF ESTADO - CIVIL = SOLTEIRO PERFORM 100 - SOLTEIRO ELSE IF ESTADO - CIVIL = CASADO PERFORM 110 - CASADO ELSE IF ESTADO - CIVIL = DESQUITADO PERFORM 120 - DESQUITADO ELSE IF ESTADO - CIVIL = DIVORCIADO PERFORM 130 - DIVORCIADO ELSE IF ESTADO - CIVIL = VIUVO PERFORM 140- VIUVO ELSE PERFORM 999 - ERRO. Observao: Neste tipo de estrutura, o correto era no utilizar indentao, para que visualmente fosse fcil de identificar a estrutura CASE (somente em IFs aninhados que utilizamos indentao).
EVALUATE - SINTAXE
Com o novo comando EVALUATE do VS COBL II, agora podemos projetar a estrutura CASE utilizando o seguinte diagrama de blocos:
Integer value = ?
= m
Case-1 function
Case-2 function
Case-3 function
Case-4 function
Case-m function
EVALUATE - SINTAXE
EVALUATE
{ {
{{ WHEN
{ } { }
identifier-1 literal-1 espression-1 TRUE FALSE
[ ALSE
]...
}[{
THOROUGH THRU
}{ }{
{{ ALSON
ANY condition -1 TRUE FALSE [ NOT ]
}[{
THOROUGH THRU
} }]}
}]
]...}...
EVALUATE
A primeira vista, parece ser um comando complexo. O motivo que existe diversas variaes do comando. Atravs de exemplos vamos explorar todas as suas variantes. Em um exemplo simples, podemos traduzir a estrutura IFs que foi mostrada na pgina anterior para o comando EVALUATE: 1 5 7 8 10 12 15 20 25 30 35 40 45 50 55 60 65 70 72 IF ESTADO-CIVIL = SOLTEIRO PERFORM 100-SOLTEIRO ELSE IF ESTADO-CIVIL = CASADO PERFORM 110-CASADO ELSE IF ESTADO-CIVIL = DESQUITADO PERFORM 120- DESQUITADO ELSE IF ESTADO-CIVIL = DIVORCIADO PERFORM 130- DIVORCIADO ELSE IF ESTADO-CIVIL = VIUVO PERFORM 140-VIUVO ELSE PERFORM 999-ERRO. EVALUATE ESTADO-CIVIL WHEN SOLTEIRO PERFORM 100-SOLTEIRO WHEN CASADO PERFORM 110-CASADO WHEN DESQUITADO PERFORM 120- DESQUITADO WHEN DIVORCIADO PERFORM 130- DIVORCIADO WHEN VIUVO PERFORM 140-VIUVO WHEN OTHER PERFORM 999-ERRO END-EVALUATE.
EVALUATE
A forma mostrada na pgina anterior uma das mais simples. Vamos agora apresentar outro exemplo, codificado em IFs e depois codificado em EVALUATE, j com a utilizao na clusula WHEN do operador THRU: 1 5 7 8 10 12 15 20 25 30 35 40 45 50 55 60 65 70 72 IF ITR-TRAN-CODE = 1 PERFORM 240-EDIT-CODE-1-FIELDS ELSE IF ITR-TRAN-CODE = 2 PERFORM 250-EDIT-CODE-2-FIELDS ELSE IF ITR-TRAN-CODE = 3 PERFORM 260-EDIT-CODE-3-FIELDS ELSE IF ITR-TRAN-CODE : 4 PERFORM 270-EDIT-CODE-4-FIELDS ELSE IF ITR-TRAN-CODE : 5 PERFORM 280-EDIT-CODE-5-FIELDS ELSE IF ITR-TRAN-CODE NOT < 6 AND NOT > 10 PERFORM 290-EDIT-COMMON-FIELDS ELSE MOVE N TO VALID-TRAN-CODE ADD 1 TO INVALID-TRAN-CODE-COUNT. EVALUATE ITR - TRAN - CODE WHEN 1 PERFORM 240-EDIT-CODE - 1 - FIELDS WHEN 2 PERFORM 250-EDIT-CODE - 2 - FIELDS WHEN 3 PERFORM 260-EDIT-CODE - 3 - FIELDS WHEN 4 PERFORM 270-EDIT-CODE - 4 - FIELDS WHEN 5 PERFORM 280-EDIT-CODE - 5 - FIELDS WHEN 6 TRHU 10 PERFORM 290-EDIT-COMMON-FIELDS WHEN OTHER MOVE N TO VALID - TRAN - CODE ADD 1 TO INVALID-TRAN-CODE-COUNT END-EVALUATE.
EVALUATE - QUADRO
Este quadro simplificado, mostra diversas formas de se codificar o comando EVALUATE:
EVALUATE Sintax Vriatons
EVALUATE WHEN WHEN WHEN
Examples
EVALUATE TRUE WHEN WS-VALUE < 0.75 WHEN 88-level name
[
[
TRUE FALSE
]
]
WHEN
[ ]
indentifier-2
EVALUATE WS-VALUE WHEN F WHEN PRTHRU ZQ WHEN 13 THRU 175.8 WHEN HRS-REG-WEEK
[ ] [
EVALUATE
[ ]] [
imdentifier-3
1. 2. 3. N. B. M. P. 1. 2. 3.
1 ALSO B ALSO 1 1 ALSO M ALSO 2 1 ALSO P ALSO 3 2 ALSO NOT P ALSO NOT 1 2 ALSO P ALSO ANY 3 ALSO NOT P ALSO ANY OTHER
END-EVALUATE.
3) Uso de expresses
PIC S9 (3) COMP-3. PIC S9 (3) COMP-3. PIC S9 (7) V99 COMP-3.
EVALUATE - EXERCCIO
Voc agora ir codificar um comando EVALUATE para revolver o seguinte problema : Tendo a informao de se h histrico de ataques cardacos na famlia, sexo, e se fumante ou no, determine o fator de risco um ataque cardaco, de acordo com o seguinte quadro: HOMEM Famlias que no possuem histrico de ataque cardaco Famlias que possuem histrico de ataque cardaco MULHER
FUMANTE = 0,18 FUMANTE = 0,14 NO FUMANTE = 0,01 NO FUMANTE = 0,005 FUMANTE = 0,32 FUMANTE = 0,24 NO FUMANTE = 0,03 NO FUMANTE = 0,02
EVALUATE - EXERCCIO
Construa abaixo, uma tabela de deciso de acordo com o quadro abaixo: Famlias que possuem histrico de ataque cardaco
Sexo
Fumante?
Fator de Risco
EVALUATE - EXERCCIO
2) Complete o programa abaixo, codificando o comando EVALUATE de acordo com a tabela de deciso construda na pgina anterior:
5 7 8 10 12 15 20 25 30 35 40 45 50 55 60 65 70 72 ENVIRONMENT DIVISION. CONFIGURATION SECTION. DECIMAL-POINT IS COMMA. DATA DIVISION. WORKING-STORAGE SECTION. 01 WS-RISK PIC Z,999. 01 WS-DATA-TABLE-SETUP. 05 FILLER PIC X (3) VALUE 05 FILLER PIC X (3) VALUE 05 FILLER PIC X (3) VALUE 05 FILLER PIC X (3) VALUE 05 FILLER PIC X (3) VALUE 05 FILLER PIC X (3) VALUE 05 FILLER PIC X (3) VALUE 05 FILLER PIC X (3) VALUE 05 FILLER PIC X (3) VALUE 05 FILLER PIC X (3) VALUE 05 FILLER PIC X (3) VALUE 05 FILLER PIC X (3) VALUE
NHS. NHN. ***. NMS. NMN. NH*. SHS. SHN. N*S. SMS. SMN. *HS.
SET... TO TRUE
O comando SET... TO TRUE para ser usado com Nomes Condicionais (Nveis 88). Com o uso deste comando voc pode setar uma condio como verdadeira sem conhecer qual o valor que teria que ser movido para o campo. Veja o exemplo abaixo: 05 CARGO- STATUS 88 TRAINEE 88 JUNIOR 88 PLENO 88 SENIOR PIC X. VALUE 1. VALUE 2. VALUE 3. VALUE 4.
Para que PLENO seja verdadeiro, com o comando MOVE: MOVE 3 TO CARGO-STATUS. Para que PLENO seja verdadeiro, com o comando SET TO TRUE: SET PLENO TO TRUE.
SET... TO TRUE
O comando SET em VS COBOL II continua com sua antiga funo de manipular os Indexadores de tabelas: SET DT-IX TO 1. SET DT-IX UP BY 1. SET DT-IDX DOWN BY 1. Com a clusula TRUE ele se torna exclusivo para o uso com nomes condicionais (Nveis 88), tornando os programas mais legveis e fceis de manter: 01 WS-EOF-FLAG PIC X VALUE N. 88 MORE-RECORDS-TO-READ VALUE N. 88 END-OF-FILE VALUE E. PROCEDURE DIVISION. ... READ INPUT-FILE AT END SET END-OF-FILE TO TRUE END-READ.
Indexao
Construo de Tabelas
Freqentemente, existe a necessidade do programador construir uma tabela contendo informaes. Esta tabela poder estar definida no programa ou seu contedo poder vir de uma fonte externa, tal como cartes perfurados, discos ou fitas magnticas. O programador poder construir a rea da tabela na DATA DIVISION do seu programa, na FILE SECTION ou na WORKING-STORAGE SECTION, utilizando a clusula OCCURS. Suponha, por exemplo, que necessitemos de uma rea na memria, suficiente para conter vinte ndices econmicos diversos. Ento, teremos: WORKING-STORAGE SECTION. 01 REGISTRO-TRABALHO. 03 IMPOSTO 03 INDICE 03 VARIANCA PIC 9(05)V99. PIC 9(02)V99 PIC 9(03)V99.
OCCURS 20 TIMES.
Indexao (Cont.)
Na memria uma rea chamada de registro-trabalho criada, contendo 92 bytes. Vemos que a clusula OCCURS ocasionou a reserva de vinte vezes 4 bytes, que so necessrios para o armazenamento de uma informao chamada no programa de ndice. Durante a execuo do programa, os valores sero lidos e colocados dentro da tabela de ndices. Vejamos como isto possvel.
Indexao (Cont.)
Na PROCEDURE DIVISION, o programa poder ter acesso a qualquer ndice apenas dando o nome da tabela, que no caso ndice, seguido de um subscrito. Exemplo: ADD MOVE MOVE MOVE INDICE (3) INDICE (I) INDICE (INDIC) REGIAO (ESTADO) TO TOTAL-INDICE. TO AREA1. TO AREA-SAIDA. TO XPD.
Dentro dos parnteses visto o algarismo 3, que representa o valor de uma varivel chamado ndice. O algarismo em questo nos aponta para o terceiro valor colocado na tabela. Na tabela dada como por exemplo, qualquer nmero entre 1 e 20 pode ser um ndice. Qualquer nmero acima de vinte, para o exemplo particular dado ilegal. Os ndices, entretanto, no necessitam ser itens literais numricos, podendo ser nomes simblicos, conforme demonstrado nos outros exemplos.
Indexao (Cont.)
Na aplicao de sucessivos OCCURS aos nomes de dados, devemos ter em mente que o nmero mximo de Indexadores permitidos em COBOL, para um mesmo nome 7. 77 PRODUTO PIC 99. 77 ANO PIC 99. 77 MES PIC 99. 01 PRODUTOS. 05 VENDAS-PRODUTOS OCCURS 20 TIMES. 10 VENDAS-QUINZENAL OCCURS 5 TIMES. 15 VENDAS-MENSAIS OCCURS 12 TIMES PIC S9(08) COMP3.
Tabela de 7 nveis
Agora voc poder construir de at sete nveis! Este recurso provavelmente voc dificilmente ir utilizar pois 3 nveis j eram o suficientes: WORKING - STORAGE SECTION. 01 GRADE-7 05 TAB-1 OCCURS 10 TIMES INDEXED BY IDX-1. 10 TAB-2 OCCURS 10 TIMES INDEXED BY IDX-2. 15 TAB-3 OCCURS 10 TIMES INDEXED BY IDX-3. 20 TAB-4 OCCURS 10 TIMES INDEXED BY IDX-4. 25 TAB-5 OCCURS 10 TIMES INDEXED BY IDX-5. 30 TABOCCURS 10 TIMES INDEXED BY IDX-6. 35 TAB-7 OCCURS 10 TIMES INDEXED BY IDX-7. 40 TAB-ITEM PIC S9 (3) V99 PACKED-DECIMAL. 01 TAB-DISPLAY PIC ZZ9,99
PROCEDURE DIVISION. ... PERFORM 210-DISPLAY-VALUES VARYING AFTER AFTER AFTER AFTER AFTER AFTER IDX-1 IDX-2 IDX-3 IDX-4 IDX-5 IDX-6 IDX-7 FROM FROM FROM FROM FROM FROM FROM 1 2 3 4 5 6 7 BY BY BY BY BY BY BY 1 2 3 4 5 6 7 UNTIL UNTIL UNTIL UNTIL UNTIL UNTIL UNTIL IDX-1 > IDX-2 > IDX-3 > IDX-4 > IDX-5 > IDX-6 > IDX-7 > 10 10 10 10 10 10 10
210-DISPLAY-VALUES. MOVE TAB-ITEM (IDX-1 IDX-2 IDX-3 IDX-4 IDX-5 IDX-6 IDX-7) TO TAB-DISPLAY. DISPLAY TAB-DISPLAY.
Esta a razo de o comando PERFORM VARYING aceitar at 6 clusulas AFTER.
ATENO
A Indexao Relativa no modifica o valor do indexador. Os nicos comandos que modificam o valor de um indexador so PERFORM VARYING, SEARCH E SET.
ATENO
Voc no pode utilizar INITIALIZE para Tabelas de tamanho varivel (OCCURS DEPENDING ON).
Segunda forma:
PERFORM
A seguir, mostramos, algumas das sintaxes possveis do comando PERFORM no VS COBOL : PERFORM (Formato OUT-OF-LINE bsico)
R UH PERFORM procedure-name-1 [{TH O G name-2] TR HU
} procedure-
Outras sintaxes do comando PERFORM: PERFORM (Formato OUT-OF-LINE com opo UNTIL)
R UH PERFORM procedure-name-1 [{TH O G name-2] TR HU
} procedure-
PERFORM (Cont.)
5 7 8 10 12 15 20 25 30 35 40 45 50 55 60 65 70 72 0000-MAINLINE. ... PERFORM 2100-DISPLAY UNTIL WS-COUNT > 4. ... 2100-DISPLAY. ADD 1 TO WS-COUNT DISPLAY THE COUNT NOW = WS-COUNT.
PERFORM (Cont.)
Quando utilizar Inline PERFOM? Mais eficiente que o Outline PERFORM, ele otimiza o cdigo e reduz a paginao de memria virtual. Fcil leitura porque todo o cdigo est em um nico lugar. Melhor, se o cdigo a executar ser executado somente em um lugar do programa, e no em vrios lugares. Quando utilizar Outline PERFOM? Se o cdigo a executar ser executado em vrios lugares do programa. Para certeza, voc pode querer cada lgica a ser executada em um pargrafo separado, proporcionando manuteno mais fceis e maior atendimento do programa.
PERFORM (Cont.)
Voc poder continuar codificando Out-ofline com VS COBOL II, mas lembre-se, ao utilizar Inline PERFORMs, o delimitador ENDPERFORM obrigatrio.
ATENO
PERFORM (Cont.)
Testa a condio antes de executar a funo. Sua estrutura no fluxograma, conhecida como ESTRUTURA DO-WHILE, demostrada abaixo: DO-WHILE (FAA ENQUANTO)
PROCEDURE
CONDIO
Em VS COBOL, a estrutura DO-WHILE era obtida pelo comando PERFORM UNTIL, pois a condio era testada sempre antes de
PERFORM VARYING
ntaxe Out-of-Line:
VARYING
{ [ { {
BY AFTER BY
[ {
WITH TEST
[ { }
}{
BEFORE AFTER
{ }]
THROUGH THRU
procedure-name-2
}{ } ]...
Exerccio 4 (Cont.)
A) FLUXOGRAMA
ARQENT
ARQREL
Exerccio 4 (Cont.)
B) LAY-OUTs
NOME-DISTRIB X(20)
ARQREL
DEMONSTRATIVO GRFICO DA DISTRIBUO DE COMBSTVEL EMPRESA NDICE 1 5 10 15 20 25 30 35 40 45 50 SHELL XXXXXXXXXXXXXXXXXXXXXXXXXX ESSO XXXXXXXXXXXXXXXX TEXACO XXXXXXX IPIRANGA XXXXXXXXXXXX ATLANTIC XXXXXXX SAO PAULO X HUDSON XXX
Exerccio 4 (Cont.)
C) PROCEDIMENTOS 1) No arquivo ARQENT existem registros, um para cada distribuidora de combustvel, com seu nome e porcentagem do mercado. No h registro invlidos. 2) Nenhuma porcentagem de mercado maior que 50%. 3) Leia todos os registros de ARQENT, e imprima no relatrio ARQREL, o nome da empresa e sua porcentagem em forma de grfico, representando cada 1% em um caracter X. Arredonde a porcentagem. 4) O relatrio ARQREL, possui apenas 21 linhas: Cabealho Principal - 4 linhas (2 em branco) Cabealho do detalhe - 4 linhas (1 em branco) Detalhe - 13 linhas (1 em branco entre cada empresa) 5) No h necessidade de lgica para controlar quebra de pgina. 6) O formulrio possui 80 colunas