Você está na página 1de 94

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

1. Introduo 2. Formato do Fonte Cobol 2.1. rea de numerao seqencial 2.2. rea de indicao 2.3. rea A 2.4. rea B 3. Estrutura de um Programa Cobol 3.1. IDENTIFICATION DIVISION 3.2. ENVIRONMENT DIVISION 3.2.1. CONFIGURATION SECTION 3.2.2. INPUT-OUTPUT SECTION 3.3. DATA DIVISION 3.3.1. Especificao dos dados 3.3.1.1. Nvel 3.3.1.2. Nome do dado Indice 3.3.1.3. Formato do dado 3.3.1.4. Valor inicial 3.3.2. Estrutura da DATA DIVISION 3.3.2.1. FILE SECTION 3.3.2.1.1. FILE DESCRIPTION (FD) 3.3.2.2. WORKING-STORAGE SECTION 3.3.2.3. LINKAGE SECTION 3.3.2.3.1. Utilizao do parmetro PARM 3.4. PROCEDURE DIVISION 3.4.1. Movimentao de dados 3.4.2. Clculos aritmticos 3.4.2.1. Adio 3.4.2.2. Subtrao 3.4.2.3. Multiplicao 3.4.2.4. Diviso 3.4.2.5. Resoluo de frmulas 3.4.3. Comandos condicionais 3.4.3.1. Formato dos comandos condicionais

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

3.4.3.2. NEXT SENTENCE 3.4.4.3. CONTINUE 3.4.4.4. EXIT 3.4.3.5 3.4.3.6 Condies concatenadas Condies compostas

3.4.4. Alteraes/Desvios do fluxo do programa 3.4.4.1. Uso do comando GO TO 3.4.4.2. Uso do comando PERFORM 4. Arquivos 4.1. Registros 4.2. Abertura de arquivos 4.3. Leitura/gravao de arquivos 4.4. Fechamento de arquivos 4.5. Entrada e Sada de baixo volume 5. Encerramento do programa 6. Formatos especiais de dados 6.1. Sinal de campos numricos. 6.2. Formatos binrios 6.3. Clusula USAGE 6.3.1. 6.3.2. 6.3.3. 6.4.1. 7. Impresso 7.1. Opo AFTER POSITIONING 7.2. Mscaras de Edio de Campos 7.3. Supresso de zeros 7.4. Tipos de Mscaras de Edio - OUTRAS 7.5. BLANK WHEN ZERO 8. Ordenao de Arquivos 8.1. Sort intrnseco 8.2. Sort extrnseco USAGE DISPLAY USAGE COMP USAGE COMP-3. Nveis das tabelas

6.4. Tabelas

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

9. Arquivos de acesso aleatrio (VSAM) 9.1. Manipulao de Arquivos VSAM 9.1.1. 9.1.2. 9.1.3. 9.1.4. 9.1.5. 9.1.6. 9.1.7. 9.1.8. 9.1.9. 9.1.10. 9.1.11. 9.1.12. INPUT-OUTPUT SECTION para VSAM FILE STATUS PROCEDURE DIVISION para VSAM Abertura do arquivo. READ READ NEXT READ PREVIOUS START WRITE. REWRITE DELETE Fechamento de arquivos

10. Comunicao entre programas 11. Comandos Diversos 11.1. EVALUATE 11.2. REDEFINES 11.3. INSPECT 11.4. STRING 11.5. UNSTRING 11.6. TABELAS INDEXADAS 11.6.1. SET 11.6.2. SEARCH 11.6.2.1. 11.6.2.2. 11.7. ALTER 11.8. GO TO DEPENDING ON 11.9. Nomes condicionais 11.10. Copy 12. Diagrama de Bloco 12.1. 12.2. O que um Diagrama de Bloco Simbologias Pesquisa seqencial Pesquisa binria

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

1. INTRODUO O Cobol uma linguagem de alto nvel criada no ano de 1959. A palavra Cobol uma abreviao de: Common Business Oriented Language. Como seu nome indica, o objetivo desta linguagem permitir o desenvolvimento de aplicaes comerciais para pessoas sem conhecimento profundo de computadores. Por isso a linguagem Cobol usa frases normais da lngua inglesa, e a estrutura de um programa Cobol se assemelha a um texto com divises, pargrafos e frases em ingls. Depois de escrito o programa Cobol (ou programa fonte), necessrio traduz-lo para a linguagem interna do computador (linguagem de mquina), convertendo-se ento em um programa objeto. Esta converso feita pelo prprio computador, usando o programa compilador de Cobol. Damos em seguida a definio de alguns termos importantes para o desenvolvimento do curso: Byte: conjunto de 8 bits (pontos magnticos) que formam uma posio de memria. ASCII: tabela usada em micros para converso do valor binrio dos bits de um byte em um caracter. EBCDIC: tabela da IBM para converso do valor binrio dos bits de um byte em um caracter. Programa fonte: Texto de um programa escrito em uma linguagem de alto nvel (ex.: Cobol). Programa objeto: Programa convertido para a linguagem interna do computador (linguagem mquina). Compilador: Conversor de programa fonte em programa objeto.

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

2. FORMATO FONTE COBOL Todo programa escrito na linguagem Cobol possui algumas regras a serem seguidas. Uma destas regras se refere ao formato das linhas de comando (instrues) dentro do seu editor de fonte. Uma linha de comando Cobol pode ter at 80 caracteres, conforme o formato abaixo: Seqncia 1 I rea A 8 11 12 72 rea de numerao seqencial rea de indicao rea A rea B Comentrios rea B Comentrio 73 80

6 7

Colunas de 1 a 6: Coluna 7: Colunas de 8 a 11: Colunas de 12 a 72: Colunas de 73 a 80:

2.1. REA DE NUMERAO SEQUENCIAL Normalmente consiste em seis dgitos em ordem crescente que normalmente so utilizados para numerar as linhas do fonte. Segundo as regras no ANS85 pode-se tambm colocar comentrios nesta rea. Alm disso, podemos colocar um asterisco na coluna 1 (um) ou qualquer outro caractere com valor ASCII menor do que 20 (ESPAO), fazendo com que a linha inteira seja considerada como um comentrio. Pode-se tambm deixar esta rea em branco. 2.2. REA DE INDICAO Um hfen (-) nesta posio indica que existe uma continuao de um texto que foi iniciado na linha anterior. Um asterisco (*) nesta posio indica que toda a linha deve ser tratada como um comentrio.

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Uma barra (/) nesta posio, alm de marcar a linha como comentrio far com que ao se imprimir este fonte, haver um salto de pgina aps esta linha. 2.3. rea A Posio a partir do qual se escreve nome de pargrafos. 2.4. rea B Posio a partir da qual se escrevem as instrues Cobol. Veja o exemplo de cdigo fonte a seguir: NUM I A AREA B ESTE E UM PARAGRAFO PARA GRAFO-1. ADD VALOR TO LUCRO. COMEN. *PROG1* *PROG1* *PROG1*

000110 * 000120 000130

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

3. ESTRUTURA PROGRAMA COBOL De maneira semelhante a um livro com seus captulos, pargrafos e itens, um programa Cobol formado por uma hierarquia de Divisions, Sections, pargrafos e instrues. Como regra de sintaxe, toda declarao de Division, Section, pargrafo ou instruo deve ser terminado por ponto final (.). O cdigo Cobol possui quatro divises que devem ser utilizadas nesta ordem: IDENTIFICATION DIVISION. ENVIRONMENT DIVISION. DATA DIVISION. PROCEDURE DIVISION. Como foi explicado no item anterior (Formato do fonte) a declarao das DIVISIONS devem se iniciar na rea A do texto (coluna 8). 3.1. IDENTIFICATION DIVISION Esta a diviso de identificao do programa. No contm sections, mas somente alguns pargrafos preestabelecidos e opcionais. O nico pargrafo obrigatrio o PROGRAM-ID (Nome do programa). O nome do programa deve ser uma palavra com at 8 caracteres (letras ou nmeros), comeando por uma letra. Esta diviso possui a seguinte estrutura: IDENTIFICATION PROGRAM-ID. AUTHOR. DATE-WRITTEN. DATE-COMPILED. SECURITY. REMARKS. DIVISION. nome-programa. comentrio. comentrio. comentrio. comentrio. comentrio.

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

PROGRAM-ID (Program Identification) - dever ser informado o nome do programa atravs do qual ele ser identificado. AUTHOR - clusula opcional onde pode ou no constar o nome do autor do programa. DATE-WRITTEN - clusula opcional onde o desenvolvedor coloca a data em que o programa foi codificado. DATE-COMPILED - clusula opcional onde o compilador insere a data da compilao do programa. SECURITY - clusula opcional onde podem ou no constar informaes sobre o acesso ao programa. REMARKS - clusula opcional onde normalmente se colocam observaes sobre o programa. Como por exemplo, o histrico de suas atualizaes e seus respectivos autores, ou a data de criao e objetivo do programa, etc. IMPORTANTE: Se houver a necessidade da incluso de mais de uma linha com textos explicativos, deve-se utilizar um * (asterisco) na coluna 7 (sete). Desta forma a nova linha ser tratada como comentrio pelo compilador.

3.2. ENVIRONMENT DIVISION Esta diviso descreve o equipamento envolvido no programa. Possui duas sections e sua estrutura a seguinte: ENVIRONMENT CONFIGURATION SOURCE-COMPUTER. OBJECT-COMPUTER. SPECIAL-NAMES. INPUT-OUTPUT FILE-CONTROL. I-O CONTROL. SECTION. DIVISION. SECTION. comentrio. comentrio.

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

3.2.1. CONFIGURATION SECTION Esta seo destina-se a uma descrio geral do ambiente do computador. Ela composta por trs pargrafos: SOURCE-COMPUTER, OBJECT-COMPUTER e SPECIALNAMES conforme mostrado acima. SOURCE-COMPUTER - identifica o computador onde foi confeccionado o programa (opcional). OBJECT-COMPUTER - identifica o computador do ambiente de produo (opcional). SPECIAL-NAMES - tem comandos pr-definidos em Cobol, para especificar alfabeto, moeda ou separador de decimal (vrgula ou ponto). Porm todos os comandos so opcionais. O separador de decimais o mais freqentemente, indicando que vai se usar a vrgula para separar as casas decimais. A sintaxe correta : SPECIAL-NAMES. DECIMAL-POINT 3.2.2 INPUT-OUTPUT SECTION. Esta seo destina-se a configurao dos arquivos que o programa utilizar. Ela possui dois pargrafos: FILE-CONTROL e I-O-CONTROL. FILE-CONTROL - neste pargrafo devemos especificar cada um dos arquivos que o programa ir utilizar, de forma individualizada. I-O-CONTROL - contm vrios pargrafos opcionais para especificar opes de uso de fitas magnticas. Como este dispositivo caiu em desuso, este pargrafo no mais usado atualmente. No pargrafo FILE-CONTROL, usamos uma instruo SELECT para cada arquivo descrito. A sintaxe correta : SELECT nome-do-arquivo ASSIGN TO dispositivo-do-computador. No exemplo abaixo, mostraremos a ENVIRONMENT DIVISION de um programa que ir acessar um arquivo chamado CLIENTES. IS COMMA.

10

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

. ENVIRONMENT CONFIGURATION SPECIAL-NAMES. DECIMAL-POINT INPUT-OUTPUT FILE-CONTROL. SELECT CLIENTES ASSIGN TO DA-S-CLIENTES. .... O programador pode usar qualquer palavra com at 30 caracteres como nome-de arquivo, mas uma vez definido, este dever ser usado igualmente em todos os pontos do programa quando se referir a este arquivo nome interno. O formato da clusula dispositivo-do-computador varia conforme o computador (micro, mainframe, etc), mas no caso do mainframe usa-se o formato mostrado no exemplo, composto de 3 segmentos, separados por hfen: Tipo de dispositivo: UR - para dispositivos de registro fixo (impressoras, carto). UT - para dispositivos de registro varivel (fitas). DA - para dispositivos de acesso aleatrio (discos). Modo de acesso: S Sequencial. D Direto (Randmico). I Indexado. Nome externo do arquivo nome pelo qual o operador do computador reconhece o arquivo. O nome externo geralmente est associado aos comandos JCL na execuo do programa. Para arquivos abertos para leitura (veja OPEN INPUT e OPEN I-O), pode-se especificar a clusula OPTIONAL no SELECT. Com esta clausula, se ao tentarmos abrir o arquivo e este no existir, ele automaticamente criado vazio. Sintaxe do SELECT com OPTIONAL: SELECT OPTIONAL nome-do-arquivo ASSIGN TO dispositivo. IS COMMA. SECTION. DIVISION. SECTION.

11

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

3.3. DATA DIVISION A DATA DIVISION a diviso do programa onde so definidos os dados, incluindo todas as variveis e constantes necessrias, assim como o layout dos registros dos arquivos. A definio de um dado deve estar no seguinte formato: Nvel nome-do-dado formato valor-inicial.

3.3.1. ESPECIFICAO DOS DADOS 3.3.1.1. NVEL O nvel um nmero que varia de 01 a 99 e que define a hierarquia do dado em relao aos outros dados. Podem-se agrupar os dados e concaten-los formando hierarquias como por exemplo: 01 WRK-DATA-NASCIMENTO. 03 03 03 WRK-DIA-NASCIMENTO. WRK-MES-NASCIMENTO. WRK-ANO-NASCIMENTO.

Neste exemplo, DIA MS e ANO-NASCIMENTO so partes integrantes do item de grupo DATA-NASCIMENTO. Os nveis 01 e 03, neste exemplo, so usados para determinar esta hierarquia. Os nveis de 50 a 99 tm uso especfico, reservado para futuras expanses do Cobol. Em mainframe usam-se dois nveis nesta faixa: Nvel 77 - usado quando o dado no tem hierarquia (item independente). Nvel 88 - usado para nomes condicionais.

12

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

IMPORTANTE: REGRA: De todos estes nveis, somente o nvel 01 e o nvel 77 podem der codificados na margem A do programa (coluna 8). que toda nveis devem ser codificados a partir da Na codificao de programa, exigidoOs demais a hierarquia de um item de grupo inicie com margem B (coluna 12). um item de nvel 01. A partir dele, cada nvel subordinado deve ter o mesmo nmero, por exemplo, se para o segundo nvel for escolhido o nmero 3 todos os itens do segundo nvel devem ter nvel 03, e se o terceiro nvel tiver o numero 10, todos os itens do terceiro nvel devem ter nvel 10, e assim sucessivamente. 3.3.1.2. NOMEAO DO DADO Pode-se utilizar qualquer palavra de no mximo 30 caracteres -- incluindo letras, nmeros e hfen, sendo que pelo menos uma deve ser letra. Este nome dever ser usado em todos os pontos do programa a que se referir a este dado. Se no for necessrio realizar uma referncia no programa deste dado, o nome poder ser omitido. Porm, para o COBOL ele obrigatrio. Neste caso, usa-se ento a palavra FILLER que identifica dados annimos. Por exemplo: 01 WRK-INICIO-PGM este dado no ser utilizado no restante do programa.

Poderia substituir por: 01 FILLER

3.3.1.3. FORMATO DO DADO O formato dos dados especificado pela palavra reservada PICTURE, ou pela sua abreviao PIC.

A clusula PICTURE usada para descrio de informaes sobre itens, tais como: tamanho, sinal, tipo (numrico, alfanumrico ou alfabtico). Tipos possveis: ALFABTICO - representado por letras mais o espao, e o caractere usado a letra A.

13

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Por exemplo: 77 WRK-DADO1 77 WRK-DADO2 77 WRK-DADO3 PICTURE IS AAA PIC IS AAA VALUE ABC. VALUE ABC. VALUE BCD.

PIC A(3)

ALFANUMRICO - representado por letras, nmeros e caracteres. O caractere usado a letra X. A representao de dados no pode exceder a 120 caracteres. Por exemplo: 01 01 WRK-DADO1 WRK-DADO2 PIC XXX PIC X(04) VALUE ANO. VALUE KKKK.

NUMRICO - usa-se para representao exclusiva de itens numricos. Os caracteres usados so: 9, V, P, S. 9 = utilizado para indicar a posio do campo que contm um dgito de 0 a 9. V = usado para mostrar a posio da vrgula decimal. O ponto decimal, se colocado, no faz parte do item. P = representa um dgito numrico zero (0). S = indica a presena de sinal, deve ser colocado antes do 9 A quantidade de caracteres contido no dado especificado no formato repetindo-se as letras acima. Por exemplo, se o item WRK-QUANT-PROD tem 5 algarismos, seu formato deve ser: 77 77 WRK-QUANT-PROD OU WRK-QUANT-PROD PIC 9(05). PIC 99999.

14

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Quando um item numrico tiver casas decimais, no se carrega na memria o separador decimal (vrgula). O item WRK-VALOR-PROD por exemplo, tem um valor de 2,35. O armazenamento na memria fica como 235, mas no programa preciso saber em que posio estaria a vrgula que desapareceu (vrgula implcita -- definida no formato pela letra V). Portanto, teramos que definir o dado conforme abaixo: 77 77 WRK-VALOR-PROD OU WRK-VALOR-PROD PIC 9(05)V99. PIC 99999V99.

IMPORTANTE: Em um item de grupo, o nvel principal no deve ser definido com a clusula PICTURE. Somente os nveis pertencentes a ele devem ser definidos (itens elementares).

Por exemplo: 01 WRK-FUNCIONARIO. Sem definio de formato 03 WRK- NASCIMENTO. Sem definio de formato 05 05 WRK-MES WRK-ANO PIC 99. PIC 99.

O Cobol suporta itens numricos com at 18 algarismos e itens alfanumricos com at 32768 caracteres (dependendo do sistema operacional). Existem ainda formatos especiais da PIC para itens a serem impressos ou exibidos na tela, que sero vistos mais adiante.

3.3.1.4. VALOR INICIAL DO DADO Esta clusula opcional. Seu objetivo definir um valor para o item quando o programa se inicia. Se ela for omitida, o item correspondente ter valores imprevisveis. No caso de um item que ir conter uma totalizao, por exemplo, conveniente que ele seja INICIALIZADO com o valor zero.

15

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

A sintaxe para o valor inicial : 77 WRK-QUANT-PROD PIC 99999 VALUE literal.

Para os dados numricos a inicializao deve ser: 77 WRK-IDADE-MINIMA PIC 99 VALUE 18.

Isto significa que quando o programa for iniciado, a varivel WRK-IDADE-MINIMA conter o valor 18. Para os dados alfanumricos a inicializao deve ser inserida entre aspas: 77 WRK-NOME-RUA PIC X(20) VALUE RUA FIDALGA.

Isto significa que quando o programa for iniciado, a varivel WRK-NOME-RUA conter o valor RUA FIDALGA. Os literais alfanumricos podem ter no mximo 120 caracteres. Podem-se ainda usar como valor inicial as CONSTANTES FIGURATIVAS: ZEROS, SPACES, HIGH-VALUES ou LOW-VALUES. O HIGH-VALUES maior valor possvel assumido pela varivel - e LOW-VALUES menor valor possvel assumido pela varivel - s podero ser utilizados em variveis do tipo alfanumricas ou item de grupo (tambm consideradas alfanumricas). Este tipo de inicializao largamente utilizada para programas que executam balance-line (batimento entre arquivos).

IMPORTANTE: LOW-VALUES diferente de espaos -- indica que o contedo da varivel na memria deve ter os seus bytes com todos os bits desligados.

16

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Exemplos de inicializao em hexadecimal:


INICIALIZAO COM TAMANHO VARIAVEL FORMATO HEXADECIMAL

ZEROS

PIC 9(03)

FFF 000 444 000 000 000 FFF FFF

SPACES

PIC X(03)

LOW-VALUES

PIC X(03)

HIGH-VALUES

PIC X(03)

3.3.2. ESTRUTURA - DATA DIVISION Na DATA DIVISION especificado o layout do registro de cada arquivo entrada/sada utilizados no programa. Tambm serve para declarao das reas de trabalho e constantes necessrias para o processamento dos dados. A DATA DIVISION composta por quatro sees: FILE WORKING-STORAGE REPORT LINKAGE SECTION. SECTION. SECTION. SECTION.

3.3.2.1. FILE SECTION A FILE SECTION usada para definir o layout / contedo do registro do arquivo que o programa ir ler / gravar. Vimos anteriormente, que na INPUT-OUTPUT SECTION (ENVIRONMENT DIVISION), que para cada arquivo a ser tratado no programa dever haver uma instruo SELECT especificando e definindo um nome para o arquivo. Na FILE SECTION precisamos definir a estrutura de cada um destes arquivos. Isto feito atravs do pargrafo FILE DESCRIPTION (FD).

17

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

3.3.2.1.1. FILE DESCRIPTION (FD) a descrio do arquivo. FD NOME-DO-ARQUIVO BLOCK CONTAINS (quantidade de blocos) RECORD CONTAINS (tamanho do registro lgico) RECORDING MODE (formato do arquivo) LABEL RECORD (formato do label) DATA RECORD (nome do registro). Parmetros: BLOCK CONTAINS - Especifica o tamanho do registro fsico. Ex.: BLOCK CONTAINS 9999 RECORDS Se for colocado zeros (0), assume informaes do carto DD - JCL. Se no for colocado RECORDS, assume CHARACTERS. RECORD CONTAINS - Especifica o tamanho do registro lgico. Ex.: RECORD CONTAINS 9999 CHARACTERS

Se esta clusula for colocada, feita uma conferncia pelo compilador, somando a quantidade de bytes da definio do registro. RECORDING MODE Especifica o formato do arquivo Ex.: RECORDING MODE IS X Onde X poder ser definido com: (F) -> comprimento fixo (V) -> comprimento varivel (U) -> indefinido (S) -> estendido (spanned)

18

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Se no for colocada a clusula RECORDING MODE, o compilador determinar pelo carto DD JCL ou catlogo. LABEL RECORD - Especifica o formato do label. Ex.: LABEL RECORD IS XXXXXXXX Onde XXXXXXXX poder ser definido com: STANDARD -> padro OMITTED -> omitido Quando omitido assume LABEL STANDARD. Para impressora, leitora de cartes, perfuradoras, usar OMITTED, pois no possuem LABELS. Os demais casos usar STANDARD. DATA RECORD - Serve apenas como documentao, identificando os registros do arquivo pelo nome. Ex.: DATA RECORD IS NOME-DO-DADO-1 ou DATA RECORD ARE NOME-DADO-1, NOME-DADO-2, ...

CLUSULA FILLER usada para um item elementar ou um item de grupo, e nunca ser refenciado. Pode ser usada na DATA DIVISION e suas SECTIONS. Exemplo: 01 REGISTRO. 02 FILLER PIC X(100).

CLUSULA VALUE usada para definir um valor inicial para um item da WORKING-STORAGE SECTION. No pode ser usada na FILE SECTION. Exemplo: 1 CABEC01. 02 02 FILLER FILLER PIC X(10) PIC X(06) VALUE SPACES. VALUE FOLHAS.

19

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

02

CB01-DATA

PIC X(10)

VALUE SPACES.

O arquivo CLIENTES definido na INPUT-OUTPUT SECTION, seria detalhado aqui como: DATA FILE FD CLIENTE IS F IS STANDARD 0 RECORDS 80 CHARACTERS IS REG-CLIENTES. DIVISION. SECTION.

RECORDING MODE LABER RECORDING BLOCK CONTAINS RECORD CONTAINS DATA-RECORD 01 REG-CLIENTES. 03 03 03 03

COD-CLIENTE NOME-CLIENTE ENDER-CLIENTE VALOR-CLIENTE

PIC 9(8). PIC X(20). PIC X(40). PIC 9(10)V99.

20

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

3.3.2.2. WORKING-STORAGE SECTION A WORKING-STORAGE SECTION usada para definir todas as variveis necessrias ao funcionamento do programa. No h pargrafos nesta seo, e os dados podem ser definidos como itens de grupo (nveis 01 a 49), ou itens elementares (nvel 77). IMPORTANTE: No poder haver quebra na seqncia da declarao de nveis. Primeiramente, devem ser definidas todas as variveis elementares (nvel 77) e aps os itens de grupo (nvel 01 a 49). Portanto, aps o uso do nvel 01 no recomendvel voltar a declarar variveis com nvel 77.

3.3.2.3. LINKAGE SECTION Usada para recebimento de parmetros -- estabelecer comunicao -- entre dois programas ou recebimento de parmetros via JCL (PARM). 3.3.2.3.1. UTILIZAO DO PARM

Para acessar dados informados atravs do PARM, declarar na LINKAGE SECTION uma estrutura com:

Uma varivel PIC S9(04) COMP que recebe o tamanho dos dados. Em continuao, outra varivel que ir conter, em tempo de execuo, os

dados informados atravs do PARM; ela deve ter tamanho suficiente para receber todos os dados. LINKAGE SECTION. 01 LKG-DATA-VIA-PARM. 03 03 LKG-DATA-PARM-TAM LKG-DATA-1 PIC S9(04) COMP. PIC X(10).

21

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

03

LKG-DATA-2

PIC X(08).

*====================================================* PROCEDURE DIVISION USING LKG-DATA-VIA-PARM. *====================================================* DISPLAY LKG-DATA-PARM-TAM. DISPLAY LKG-DATA-1 ' ' LKG-DATA-2.

Se o programa for executado com PARM='01/01/200331/12/03' ele exibir 00018 01/01/2003 31/12/03 Note que o tamanho da varivel colocado em LKG-DATA-PARM-TAM inclui somente o tamanho dos dados em si, sem incluir os 2 bytes de LKG-DATA-PARM-TAM. 3.4. PROCEDURE DIVISION A ltima diviso controla a execuo do programa, e onde colocaremos os comandos oriundos do algoritmo planejado pelo programador. Os comandos (instrues) do Cobol so formados por um nico verbo da lngua inglesa, seguido dos parmetros necessrios. As instrues podem ser reunidas em pargrafos, e estes em sees, definidas pelo programador com o fim de tornar o programa mais fcil de ser entendido. Por exemplo, dentro de uma seo principal, posso definir as macro-sees, responsveis por executar todos os procedimentos necessrios para se atingir o objetivo final do programa:

22

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

*----------------------------------------------------------------------------------------------* 0000-ROTINA-PRINCIPAL SECTION. *----------------------------------------------------------------------------------------------* PERFORM 1000-ENTRADA. SEGUNDA SEO DO PROGRAMA PERFORM 2000- PROCESSAMENTO. TERCEIRA SEO DO PROGRAMA PERFORM 3000-SAIDA. QUARTA SEO DO PROGRAMA *----------------------------------------------------------------------------------------------* 0000-99-FIM. EXIT. *----------------------------------------------------------------------------------------------* 3.4.1. MOVIMENTAO DO DADO Para copiar dados de uma varivel para outra se usa a instruo MOVE. Sintaxe: MOVE varivel-1 REGRAS: A varivel receptora (varivel-2) no pode ser uma literal. Exemplo utilizao incorreta: MOVE WRK-VALOR TO RUA DIREITA. TO varivel-2.

Tanto a varivel receptora quanto a de origem devero ter o mesmo formato, ou seja, deve-se mover contedo numrico para numrico, alfanumrico para alfanumrico. Exemplo utilizao incorreta: MOVE WRK-VALOR TO NOME-CLIENTE.

Quando a varivel receptora tiver um tamanho menor que a varivel emissora (de origem) do dado, ocorre um TRUNCAMENTO do dado para que este possa se adaptar ao novo item. No gerado nenhum aviso quando isto ocorre.

23

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Quando a varivel receptora tiver um tamanho maior que a emissora (de origem), a varivel receptora ir automaticamente ser preenchida com espaos se ela for alfanumrica, ou com zeros esquerda se ela for numrica. Se a varivel de origem movida for alfanumrica, o truncamento acontece na parte direita do campo (os dados so movidos da esquerda para a direita). Se a varivel de origem movida for numrica, o truncamento esquerda (os nmeros so movidos da direita para a esquerda). 3.4.2. CLCULOS ARITMTICOS As instrues para efetuar clculos aritmticos so: ADD, SUBTRACT, MULTIPLY, DIVIDE e COMPUTE. Quando o clculo envolver variveis/nmeros com casas decimais, preciso observar que o Cobol adapta o resultado ao formato que foi definido para a varivel de resultado, ocasionando truncamento ou surgimento de zeros adicionais na parte decimal do resultado. Por exemplo, se tivermos na WORKING-STORAGE a definio das variveis abaixo: 77 77 77 WRK-QUANT WRK-ENTRADA WRK-SALDO PIC 99V99 PIC 99V9 PIC 9999. VALUE 35,12. VALUE 12,5.

Se somarmos WRK-QUANT e WRK-ENTRADA e colocarmos o resultado em WRKSALDO, esta ficar com 47, pois esta varivel no est prevendo o uso de casas decimais. 3.4.2.1. ADIO Para efetuarmos a soma de valores utilizamos o comando ADD. Formato 1: ADD valor-1 valor-2 TO acum-1 acum2 ....

Neste formato, a soma dos valores das variveis, valor-1 e valor-2, so acrescidos aos valores j existentes nas variveis acum-1 e acum-2.

24

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

As variveis, valor-1 e valor-2, podem ser literais numricas. J as variveis, acum-1 e acum-2, s podero ser variveis numricas recebero o valor acumulado. Por exemplo: 77 77 77 WRK-VAL-1 WRK-VAL-2 WRK-VAL-3 PIC 9(02) PIC 9(02) PIC 9(02) VALUE 5. VALUE 10. VALUE 12.

ADD WRK-VAL-1 WRK-VAL-2

TO WRK-VAL-3.

Resultado aps a execuo da instruo acima: WRK-VAL-3 = 27 (VALOR FINAL) Formato 2: ADD valor-1 valor-2 GIVING total.

Neste formato a soma dos valores, valor-1 e valor-2, no so acumulados na varivel total. A varivel total zerada antes de receber a soma, perdendo assim o valor acumulado no passado. Por exemplo: ADD WRK-VAL-1 WRK-VAL-2 GIVING WRK-VAL-3.

Resultado aps a execuo da instruo acima: WRK-VAL-3 = 15 (VALOR FINAL) Parmetros opcionais -- podem ser adicionados a qualquer dos formatos acima: ROUNDED - usado somente quando os operandos no forem nmeros inteiros. Se as variveis que recebem o resultado do ADD no tiverem casas decimais suficientes, normalmente ocorre truncamento e o resultado perde as decimais. Com a clausula ROUNDED feito um ARREDONDAMENTO do resultado (valores menores que .5 so truncados, e os maiores so arredondados para cima).

25

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

ON SIZE ERROR usado para os casos em que houver estouro do campo receptor do resultado. Pode-se colocar nesta instruo uma mensagem de erro, parar o programa ou desviar para um pargrafo especial de tratamento de erro. Por exemplo: ADD WRK-VAL-1 ON SIZE ERROR DISPLAY ESTOUROU O CAMPO DE RESULTADO STOP RUN. 3.4.2.2. SUBTRAO As subtraes so efetuadas com o comando SUBTRACT. De maneira anloga ao ADD, h dois formatos bsicos: Formato 1: SUBTRACT valor-1 valor-2 FROM acum-1 acum2 .... TO WRK-VAL-2

Neste formato, a soma dos valores das variveis, valor-1 e valor-2, so subtrados aos valores j existentes nas variveis acum-1 e acum-2. As variveis, valor-1 e valor-2, podem ser literais numricas. J as variveis, acum-1 e acum-2, s podero ser variveis numricas recebero o valor subtrado. Formato 2: SUBTRACT valor-1 valor-2 FROM acum GIVING total.

Neste formato a soma dos valores das variveis, valor-1 e valor-2, so subtrados de acum, e o resultado colocado em total. Os valores das variveis, valor-1, valor-2 e acum, no so alterados. A varivel total zerada antes de receber o resultado. Parmetros opcionais -- podem ser adicionados a qualquer dos formatos acima:

26

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

ROUNDED ON SIZE ERROR Estes parmetros tm funcionamento idntico aos do comando ADD. 3.4.2.3. MULTIPLICAO O comando utilizado para operaes de multiplicao o MULTIPLY. H tambm 2 (dois) formatos: Formato 1: MULTIPLY valor-1 BY valor-2.

Este formato multiplica a varivel valor-1 pela varivel valor-2, e o resultado fica em valor-2. IMPORTANTE: Na multiplicao e diviso, o resultado fica sempre no ltimo operando.

Assim, se quisermos multiplicar a varivel WRK-QUANT por 3 (trs) devemos executar a instruo: MULTIPLY 3 BY WRK-QUANT.

Como conseqncia da regra do resultado, o ltimo operando da multiplicao deve ser sempre uma varivel. Portanto, seria incorreto executar a instruo abaixo: MULTIPLY WRK-QUANT Formato 2: MULTIPLY valor-1 BY valor-2 GIVING valor-3. BY 3.

Neste formato o resultado da multiplicao colocado em valor-3 e os valores das variveis, valor-1 e valor-2, no so alterados. Parmetros opcionais -- podem ser adicionados a qualquer dos formatos acima:

27

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

ROUNDED ON SIZE ERROR Estes parmetros tm funcionamento idntico aos do comando ADD. 3.4.2.4. DIVISO O comando utilizado para operaes de diviso o DIVIDE. H tambm 3 (trs) formatos: Formato 1: DIVIDE valor-1 INTO valor-2.

Este formato divide a varivel valor-2 pela varivel valor-1 e o resultado movido para valor-2. Assim como na multiplicao, o resultado da diviso fica sempre no ltimo operando. Assim, se quisermos dividir a varivel WRK-QUANT por 3 (trs) devemos executar a instruo: DIVIDE 3 INTO WRK-QUANT.

Como conseqncia da regra do resultado, o ltimo operando da diviso deve ser sempre uma varivel. Portanto, seria incorreto executar a instruo abaixo: DIVIDE WRK-QUANT Formato 2: DIVIDE valor-1 INTO valor-2 GIVING valor-3. BY 3.

Neste formato o resultado da diviso colocado em valor-3 e os valores das variveis, valor-1 e valor-2, no so alterados. Formato 3: DIVIDE valor-1 BY valor-2 GIVING valor-3.

28

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Neste formato o resultado da diviso de valor-1 por valor-2 colocado em valor-3 e os valores das variveis, valor-1 e valor-2, no so alterados. Parmetros opcionais -- podem ser adicionados a qualquer dos formatos acima: ROUNDED ON SIZE ERROR Estes parmetros tm funcionamento idntico aos do comando ADD. REMAINDER valor-4 Este parmetro s pode ser usado com os formatos 2 e 3, e quando os operandos envolvidos forem nmeros inteiros. Sua funo carregar o resto da diviso em valor-4. Sintaxe deste parmetro junto ao formato 3: DIVIDE valor-1 GIVING valor-3 3.4.2.5. RESOLUO DE FORMULAS O comando COMPUTE utilizadol para resolver frmulas complexas. Sintaxe: COMPUTE valor = frmula. BY valor-2 REMAINDER valor-4.

Frmula pode ser qualquer expresso aritmtica contendo os seguintes operandos: + * / ** () Adicionar Subtrair Dividir Exponenciao Parnteses B + C , dever ser codificada: Multiplicar

Por exemplo, a frmula A = COMPUTE A

= (B ** 2 + C ** 2) ** (.5).

29

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

IMPORTANTE: A exponenciao com expoentes decimais (no exemplo **(.5)) no funciona em todos os sistemas operacionais. 3.4.3. COMANDOS CONDICIONAIS Comandos condicionais so comandos executados dependendo de uma condio. A instruo que coordena a condio nos comandos condicionais o IF. As condies testadas pela instruo IF so divididas em 3 categorias, e esto relacionadas na tabela abaixo: Categorias Relacionais Smbolo = > < No No No No No IS IS IS IS IS IS IS IS Notao alternativa EQUAL GREATER THAN LESS THAN POSITIVE NEGATIVE ZERO NUMERIC ALPHABETIC

Teste de sinal

Teste de classe

tem tem tem tem tem

Testes de condio exemplos: IF IF IF IF WRK-CODIGO WRK-VALOR WRK-SALDO WRK-CODIGO IS EQUAL 5 IS GREATER THAN ZEROS IS NEGATIVE IS NUMERIC

Pode-se associar a palavra NOT com qualquer tipos de teste, criando-se assim testes de condio negativa. Por exemplo: IF IF IF IF WRK-CODIGO WRK-VALOR WRK-SALDO WRK-CODIGO IS NOT EQUAL 5 IS NOT GREATER THAN ZEROS IS NOT NEGATIVE IS NOT NUMERIC

3.4.3.1. FORMATO DOS COMANDOS Existem 2 (dois) formatos de comandos condicionais:

30

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Formato 1: IF condio-1 Instrues-1 Instrues-2 END-IF. Neste formato, se a condio condio-1 for satisfeita, todas as instrues definidas internamente (instrues-1 e instrues-2) sero executadas. Se condio-1 no for verdadeira, o programa no executa as instrues definidas internamente e retoma a execuo a partir do ponto final (aps o END-IF). Com respeito distribuio do texto do fonte, necessrio salientar os seguintes aspectos: O recuo maior usado para escrever instrues-1 (endentao) importante tanto esteticamente quanto para um melhor entendimento do fonte. Procurar sempre escrever uma instruo por linha. O ponto final fundamental em comandos condicionais, pois indica o fim das instrues sob influncia do teste. Exemplos de uso de comandos condicionais: ..... 77 IF WRK-VALOR WRK-VALOR MOVE ZEROS END-IF. MOVE WRK-VALOR TO WRK-SAIDA. PIC 9(4) VALUE 50. ..... GREATER 100 TO WRK-VALOR DISPLAY O VALOR MUITO ALTO

No exemplo acima a varivel WRK-SAIDA ser formatada com valor 50 porque a condio do IF no foi atendida. Se o ponto final estivesse aps o comando DISPLAY, a instruo MOVE ZEROS TO WRK-VALOR seria executada sempre, independente do IF. Neste caso a varivel WRKSAIDA ser formatada com zeros.

31

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Formato 2: IF condio-1 Instrues-1 ELSE Instrues-2 END-IF. Instrues-3. Neste formato, quando a condio-1 for satisfeita, as instrues-1 sero executadas, caso contrrio, as instrues-2 sero executadas. O ponto final marca o fim do comando condicional (IF/ELSE/END-IF). As instrues-3, que independente da condio-1. Exemplo incorreto de comando condicional: IF WRK-VALOR GREATER 1000 TO WRK-MENSAGEM. Finaliza o comando IF esto aps o ponto final, sero sempre executadas

MOVE VALOR ACIMA DO LIMITE ELSE

MOVE VALOR ABAIXO DO LIMITE TO WRK-MENSAGEM END-IF. MOVE WRK-MENSAGEM TO WRK-SAIDA.

A instruo ELSE ficar fora da influncia do IF, devido ao ponto final colocado aps o primeiro comando MOVE. O compilador emitir uma mensagem de erro de sintaxe.

32

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

3.4.3.2. NEXT SENTENCE O comando NEXT SENTENCE pode ser usado associado aos comandos condicionais quando no h nenhuma instruo a ser executada. Por exemplo: IF WRK-VALOR NEXT SENTENCE ELSE ADD 10 END-IF. O NEXT SENTENCE direciona a execuo para a primeira instruo aps o ponto final. 3.4.3.3. CONTINUE TO WRK-VALOR GREATER 10

No efetua processamento, servindo somente para contexto. Usado em geral quando o teste sendo efetuado no tem processamento especfico para a condio satisfeita. Exemplos: MOVE SPACES TO TEXTO. IF TEXTO EQUAL SPACES CONTINUE ELSE DISPLAY "NAO PASSA POR AQUI". IF CAMPOA GREATER THAN CAMPOB CONTINUE ELSE COMPUTE CAMPOC = CAMPOA - CAMPOB. TESTA-SIGLA-REGIAO-SUL. IF SIGLA = "SP" CONTINUE

33

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

ELSE IF SIGLA = "PR" CONTINUE ELSE IF SIGLA = "SC" CONTINUE ELSE IF SIGLA = "RS" CONTINUE ELSE PERFORM ERRO1 THRU SAI-ERRO1. SIGLA-OK. 3.4.4.4. EXIT um ponto comum de finalizao para uma srie de procedimento(s). NOME-PARAGRAFO. clusula do pargrafo. Em um programa poder ter vrios EXITs associados com PERFORMs. 3.4.4. INITIALIZE Com este comando efetuamos a inicializao de um rea de trabalho, ele tem a finalizade de limpar/inicializar uma determinada rea de trabalho ou de um determinado arquivo, com um nico dado, prviamente determinado, sem ter que usarmos o comando MOVE, usando apenas o comando INITIALIZE. Por exemplo: INITIALIZE AREA-TRABALHO REPLACING NUMERIC DATA BY 7 DISPLAY 'TROCANDO OS CAMPO NUMERICOS POR 7 = ' AREA-TRABALHO. INITIALIZE AREA-TRABALHO REPLACING ALPHANUMERIC DATA BY '%' DISPLAY 'TROCANDO OS CAMPO ALFA POR % INITIALIZE AREA-TRABALHO DISPLAY 'LIMPANDO OS CAMPOS PELO DEFAULT = ' AREA-TRABALHO. = ' AREA-TRABALHO. EXIT. A clusula EXIT deve ser precedida por um nome de pargrafo e deve ser nica EXIT.

34

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

3.4.5. CONDIES CONCATENADAS As condies concatenadas acontecem quando no lugar das instrues subordinadas a um teste de condio coloca-se um segundo teste de condio, originando assim uma cadeia de testes subordinados um ao outro. Estas cadeias de testes so teoricamente indefinidas, porm o aumento de testes concatenados aumenta a complexidade da lgica. Nas condies concatenadas importante observar o uso da endentao, como forma de aumentar sua clareza. No exemplo abaixo, mostramos condies concatenadas: IF WRK-DEBITO IF WRK-ANO MOVE DEBITO OK ELSE MOVE CONTA EM ATRASO END-IF ELSE MOVE CONTA SEM DEBITO END-IF. O fluxograma que representa a condio acima : TO WRK-MENSAGEM TO WRK-MENSAGEM GREATER WRK-CREDITO NOT LESS 2004 TO WRK-MENSAGEM

35

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

DEBITO > CREDIT

NS
ANO >=2004

S S
DEBITO OK

ITO ITO
O

N N N

CONTA SEM DEBITO

CONTA EM ATRASO

3.4.6. CONDIES COMPOSTAS Condies compostas so testes de condies ligados com as clusulas AND ou OR. Regras: AND - a condio resultante de duas ou mais condies ligadas pela clusula AND verdadeira somente se todas as condies componentes forem verdadeiras. OR - a condio resultante de duas ou mais condies ligadas pela clusula OR verdadeira se pelo menos uma das condies componentes for verdadeira. Por exemplo: IF WRK-NOTA WRK-FREQUENCIA END-IF. IF WRK-IDADE WRK-ACOMPANHANTE END-IF. GREATER 18 OR GREATER ZEROS GREATER 5 AND GREATER 80

MOVE ALUNO APROVADO TO WRK-MENSAGEM

MOVE ENTRADA PERMITIDA TO WRK-MENSAGEM

36

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Quando houver necessidade de se usar vrios testes de condio unida por clusulas AND e OR misturados, aconselhvel o uso de parnteses para agrupar as condies. Sem o uso de parnteses, as condies so resolvidas da esquerda para a direita, primeiro todas as condies AND e depois as condies OR. Estas regras podem conduzir a erros se no forem avaliadas com muito cuidado. o uso de parnteses direciona a seqncia de avaliao das condies, simplificando a lgica. Obs.: O Cobol resolve primeiro as expresses dentro dos parnteses. Confira os dois exemplos abaixo e descubra a diferena entre eles: IF (A = B OR C = D) AND E = F ... IF A = B OR (C = D AND E = F) ... 3.4.7. ALTERAES/DESVIOS DO FLUXO DO PROGRAMA A execuo da lgica do programa, ou algoritmo, feita pelas instrues que so codificadas na PROCEDURE DIVISION. O Cobol executa as instrues sequencialmente, de cima para baixo, somente saltando as instrues subordinadas aos testes condicionais com resposta falsa. Os comandos de alterao/desvio de fluxo permitem interromper esta seqncia de execuo. Existem dois comandos utilizados para controle de fluxo de programa: GO TO PERFORM Para permitir o uso de desvios na seqncia das instrues de um programa, necessria a incluso de PARGRAFOS em pontos convenientes do programa. As duas instrues acima desviam a execuo do programa para estes PARGRAFOS. 3.4.7.1. USO DO COMANDO GO TO O comando GO TO usada para desvios simples e imperativos. No exemplo abaixo, o comando GO TO est associado a um comando condicional.

37

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

IF

WRK-TEMPO-DE-CASA MOVE 50 GO

GREATER 10 TO WRK-BONUS TO DESVIO-1

END-IF. MOVE ZEROS DESVIO-1. ADD WRK-BONUS TO WRK-SALARIO. TO WRK-BONUS.

IMPORTANTE: O uso do comando GO TO deve ser feito com critrio. Nos ltimos anos, a utilizao do GO TO se restringe a desvios para o incio ou final de uma seo. Diz-se que, um programa bem estruturado no necessita de uso de GO TO.

3.4.7.2. USO DO COMANDO PERFORM O comando PERFORM desvia a execuo do programa para um pargrafo ou seo especficos, executa as instrues deste pargrafo / seo e retoma a execuo do programa na instruo seguinte ao comando PERFORM, isto , reinicia o fluxo interrompido pelo PERFORM. Por exemplo: MOVE WRK-CODIGO PERFORM 2100-CALCULAR-DIGITO. IF WRK-DIG-CALCULADO MOVE OK ELSE MOVE DIGITO NO CONFERE END-IF. TO WRK-MENSAGEM EQUAL WRK-DIGITO-TESTE TO WRK-MENSAGEM TO WRK-CAMPO-TESTE.

38

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

No programa dever existir um pargrafo / seo chamada 2100-CALCULARDIGITO, ou o compilador acusar erro de codificao. *----------------------------------------------------------------------------------------------* 2100-CALCULAR-PRINCIPAL SECTION. *----------------------------------------------------------------------------------------------* MOVE ZEROS COMPUTE MOVE WRK-DIG-RETORNO TO WRK-DIG-CALCULADO. TO WRK-DIG-CALCULADO.

*----------------------------------------------------------------------------------------------* 2100-99-FIM. EXIT. *----------------------------------------------------------------------------------------------* A instruo PERFORM pode ser usada para executar mais de um pargrafo se tiver a clusula THRU: Sintaxe: PERFORM pargrafo-1 THRU pargrafo-2. Neste caso, o programa desvia para pargrafo-1, executa todas as instrues / pargrafos que encontrar at atingir o pargrafo-2, executa o pargrafo-2 e retorna. H ainda a opo de usar o PERFORM para executar pargrafo/sees repetidas vezes podem-se usar repeties definidas ou indefinidas. A sintaxe - PERFORM com repeties definidas: PERFORM pargrafo n TIMES.

Onde n um literal numrico (nmero), ou seja, a quantidade de vezes que o pargrafo / seo ser executado. Para repeties indefinidas necessrio fornecer uma condio para ser testada. A instruo PERFORM executar o pargrafo / seo at que a condio testada seja satisfeita.

39

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

A sintaxe PERFORM com repeties indefinidas: PERFORM pargrafo UNTIL condio.

Existe ainda uma forma mais sofisticada de PERFORM com repetio indefinida que controla uma varivel que pode ser usada no pargrafo executado. Sintaxe: PERFORM pargrafo VARYING varivel FROM valor-1 BY valor-2 UNTIL condio. Exemplo: PERFORM 2200-CALCULAR-DESCONTO VARYING TAXA UNTIL FROM 1 BY 1 DESCONTO NOT GREATER 500.

Neste exemplo, o PERFORM inicializa a varivel TAXA com o valor inicial 1. Em seguida, testa a condio DESCONTO NOT GREATER 500, e se no satisfeita executa a seo 2200-CALCULAR-DESCONTO. Realiza este procedimento at que a condio (UNTIL) seja atendida. A varivel taxa ser incrementada de 1 em 1 a cada teste. Use o diagrama de blocos abaixo para entender esta instruo:

40

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

A S > 500 S N N S Soma 1 na taxa Calcula . Descont o


Prim. Vez

Taxa = 1

Segue

41

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

4. ARQUIVO Todas as instrues que vimos at aqui manipulavam as variveis na memria do computador. Mas a memria voltil (quando se desliga o computador, perde-se todo seu contedo). Alem disso, um recurso limitado, e quando nosso programa finaliza, ele precisa ser apagado para que outros programas possam ser executados. Todos os dados que esto na memria e que no queremos perder quando o programa encerrado devem ser gravados em ARQUIVOS, como discos magnticos, fitas magnticas, etc. Um programa Cobol trata todos os tipos de arquivos basicamente da mesma maneira: Os arquivos devem ser declarados na INPUT-OUTPUT SECTION (ENVIRONMENT DIVISION), com a instruo SELECT. O layout/contedo do arquivo deve ser descrito na FILE SECTION (DATA DIVISION) - instruo FD. Na PROCEDURE DIVISION necessrio programar as instrues para manipulao dos arquivos. 4.1. REGISTRO Para armazenar informaes em arquivos, inicialmente necessrio definir um arquivo para cada tipo de informao. Desta maneira teremos um arquivo para funcionrios, um arquivo para produtos, um arquivo para notas fiscais, etc. Uma vez definido a informao para um arquivo, devemos definir os dados que queremos salvar neste arquivo. Por exemplo, para um arquivo de cadastro de funcionrios poderamos gravar as seguintes informaes: CODIGO DO FUNCIONARIO NOME DATA DE ADMISSO CARGO SALARIO O arquivo de funcionrios ser ento uma repetio seqencial dos dados acima para cada um dos funcionrios da empresa. Cada uma das informes acima recebe

42

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

genericamente o nome de CAMPO. Por exemplo, o CODIGO DO FUNCIONRIO um CAMPO pertencente ao arquivo de funcionrios. Um ou um conjunto de campos que define um funcionrio recebe o nome de REGISTRO. O conjunto de todos os registros dos funcionrios, constitui o Arquivo de Funcionrios, que ser identificado por um DDNAME. 4.2. ABERTURA DE ARQUIVO Todo arquivo DEVE OBRIGATORIAMENTE estar aberto para a manipulao de seus registros. O comando OPEN realiza a abertura do arquivo quando da execuo do programa. Este comando abre o contacto com o dispositivo fsico do arquivo, e reserva na memria reas necessrias para a troca de dados entre o computador e o dispositivo externo. A sintaxe para o comando : OPEN tipo arquivo nome-do-arquivo. Onde: Tipo de arquivo: inserir INPUT para arquivos de entrada, ou seja, somente operao de leitura ser executada; OUTPUT para arquivos de sada, ou seja, so arquivos que recebero informaes (gravao) ou de I-O para arquivos de entrada/sada. Nome do arquivo: DDNAME do arquivo. Deve ser o mesmo utilizado na clusula SELECT. Exemplos: OPEN INPUT OUTPUT I-O CADFUNC EMPRESA. CADSAIDA. ARQLOG.

4.3. LEITURA E GRAVAO DE ARQUIVO LEITURA Existem 3 (trs) comandos para leitura/gravao de registros dos arquivos.

43

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

READ nome-do-arquivo AT END instrues-1. OU READ nome-do-arquivo

Formato mais usual

Esta instruo l um registro do arquivo e carrega seus dados nas variveis definidas na FD (FILE SECTION). A cada novo comando READ carrega o prximo registro do arquivo e assim sucessivamente arquivo seqencial. A clausula AT END opcional, e faz com que o programa execute as instrues-1 quando foram lidos todos os registros do arquivo ou se o arquivo estiver vazio. GRAVAO WRITE nvel 01 do registro definido na FD. OU WRITE nvel 01 do registro definido na FD FROM nvel 01 do registro auxiliar. Esta instruo grava no arquivo todos os dados carregados no layout do registro na FD. De maneira diferente do comando READ, que usa como operando o nome do arquivo, o comando WRITE usa o nome do registro. REGRAVAO REWRITE nvel 01 do registro definido na FD. Este comando usado para atualizar (alterar) o contedo de um registro j existente em um arquivo. Por razes fsicas, este comando s pode ser usado com discos magnticos. 4.4. FECHAMENTO DE ARQUIVO Antes do trmino do programa, os arquivos abertos precisam ser fechados e desta forma, liberar os dispositivos fsicos e no caso de gravaes garantir a integridade dos dados.

44

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Sintaxe: CLOSE nome-do-arquivo. 4.5. ENTRADA E SADA DE BAIXO VOLUME Quando um programa precisa receber uma informao com quantidade pequena de bytes -- poucos caracteres como por exemplo, a data do processamento, ou emitir uma sada pequena como por exemplo, uma mensagem de erro, pode-se usar as instrues ACCEPT e DISPLAY. Estas instrues no precisam da definio de arquivos de entrada e sada. Como em muitas linguagens, o Cobol usa os conceitos de Entrada Padro e Sada Padro para especificar dispositivos que o programa no define. Para o Mainframe, a Entrada Padro geralmente o arquivo de comandos JCL usado para disparar o JOB, e a Sada Padro a impressora que emite o resumo da execuo do JOB. As instrues ACCEPT e DISPLAY operam sobre as entrada/sada padro, ou sobre a Console do computador se for especificado. Sintaxe do comando ACCEPT: ACCEPT varivel receptora Onde: Varivel receptora - deve ser definida na WORKING-STORAGE e ter formato compatvel com a informao que ser recebida. FROM CONSOLE - clausula opcional. Se omitida, os dados sero obtidos atravs de comandos via JCL. Se especificado, o programa interrompido nesta instruo, uma mensagem de dados requeridos aparece na console do computador, e somente quando o operador digita os dados na console e tecla <ENTER> o programa continua. O comando DISPLAY tem o formato: DISPLAY varivel-1 varivel-2 OU DISPLAY varivel-1 Este comando exibir na sada padro os valores das variveis, varivel-1 e varivel2, ou sobre a Console quando a clausula UPON CONSOLE for especificada. Varivel-1 e varivel-2 podem ser campos da WORKING-STORAGE ou literais. UPON CONSOLE. FROM CONSOLE.

45

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

5. ENCERRAMENTO DO PROGRAMA Para finalizar um programa utiliza-se os comandos STOP RUN ou GOBACK. O comando GOBACK deve ser usado para parar o programa chamado (mdulo) e retornar ao programa chamador para dar continuidade a sua execuo. IMPORTANTE: O comando STOP RUN no pode ser utilizado para programas de processamento ONLINE. Diferentemente do GOBACK que pode ser utilizado em programas BATCH e ONLINE.

Abaixo um exemplo de um programa completo que l uma fita de movimentao de produtos e imprime um relatrio com o resumo das quantidades acumuladas por produto. *----------------------------------------------------------------------------------------------* IDENTIFICATION PROGRAM-ID. TREI0001. AUTHOR. FULANO DE TAL. *----------------------------------------------------------------------------------------------* * * *----------------------------------------------------------------------------------------------* * * *----------------------------------------------------------------------------------------------* ENVIRONMENT DIVISION. *----------------------------------------------------------------------------------------------* *----------------------------------------------------------------------------------------------* CONFIGURATION SECTION. *----------------------------------------------------------------------------------------------* *----------------------------------------------------------------------------------------------* PROGRAMA TESTE TCS T R A I N I N G F O R M A C A O DIVISION. *----------------------------------------------------------------------------------------------*

46

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

INPUT-OUTPUT FILE-CONTROL. SELECT ENTRADA FILE-STATUS SELECT SAIDA FILE-STATUS DATA FILE * INPUT *

SECTION.

*----------------------------------------------------------------------------------------------* ASSIGN TO TAPE IS WRK-FS-ENTRADA. ASSIGN TO PRINTER IS WRK-FS-SAIDA. DIVISION. SECTION. - ARQUIVO CONTENDO OS REGISTROS ENTRADA - LRECL = 0046 *

*----------------------------------------------------------------------------------------------* *----------------------------------------------------------------------------------------------* *----------------------------------------------------------------------------------------------* * ORG. SEQUENCIAL *----------------------------------------------------------------------------------------------* FD ENTRADA RECORDING MODE LABER RECORD BLOCK CONTAINS 01 REG-ENTRADA. 03 COD-PROD 03 NOME-PROD 03 QUANT-PROD PIC X(06). PIC X(30). PIC 9(06)V99. - LRECL = 0052 * IS F IS STANDARD 0 RECORDS.

*----------------------------------------------------------------------------------------------* * OUTPUT - ARQUIVO CONTENDO OS REGISTROS ENTRADA * ORG. SEQUENCIAL * *----------------------------------------------------------------------------------------------* FD SAIDA RECORDING MODE LABER RECORD BLOCK CONTAINS 01 REG-SAIDA. PIC X(06). 03 COD-PROD IS F IS STANDARD 0 RECORDS.

47

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

03 FILLER 03 NOME-PROD 03 FILLER 03 QUANT-PROD WORKING-STORAGE 77 77 77 77 77 77 77 FILLER WRK-FS-ENTRADA WRK-FS-SAIDA WRK-COD-ANT WRK-QUANT-PROD WRK-NOME-ANT FILLER

PIC X(04). PIC X(30). PIC X(04). PIC 9(06)V99. SECTION. PIC X(32) PIC X(02) PIC X(02) PIC X(06) PIC 9(06)V99 PIC X(30) PIC X(32) VALUE VALUE SPACES. VALUE SPACES. VALUE SPACES. VALUE ZEROS. VALUE SPACES. VALUE

*----------------------------------------------------------------------------------------------* *----------------------------------------------------------------------------------------------* ** INICIO DA WORKING-STORAGE TREI0001 **.

** FINAL DA WORKING-STORAGE TREI0001 **.

48

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

*----------------------------------------------------------------------------------------------* PROCEDURE DIVISION. *----------------------------------------------------------------------------------------------* *----------------------------------------------------------------------------------------------* 0000-ROTINA-PRINCIPAL PERFORM 1000-INICIALIZAR. PERFORM 2000-TRATAR-ARQ-VAZIO. PERFORM 3000-PROCESSAR-REG UNTIL WRK-FS-ENTRADA EQUAL 10. PERFORM 3100-GRAVAR-REG-SAIDA. PERFORM 5000-FINALIZAR. *----------------------------------------------------------------------------------------------* 0000-99-FIM. 1000-INICIALIZAR OPEN INPUT ENTRADA EXIT. SECTION. *----------------------------------------------------------------------------------------------* *----------------------------------------------------------------------------------------------* OUTPUT SAIDA. PERFORM 1100-TRATAR-FS-ENTRADA. PERFORM 1200-TRATAR-FS-SAIDA. *----------------------------------------------------------------------------------------------* 1000-99-FIM. EXIT. *----------------------------------------------------------------------------------------------* *----------------------------------------------------------------------------------------------* 2000-TRATAR-ARQ-VAZIO SECTION. *----------------------------------------------------------------------------------------------* PERFORM 2100-LER-ARQ-ENTRADA. IF WRK-FS-ENTRADA DISPLAY * DISPLAY * DISPLAY * PERFORM 5000-FINALIZAR END-IF. EQUAL 10 ARQUIVO ENTRADA VAZIO PROCESSAMENTO ENCERRADO * * * DISPLAY ************ TREI0001 ************ SECTION. *----------------------------------------------------------------------------------------------*

DISPLAY ************ TREI0001 ************

49

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

*----------------------------------------------------------------------------------------------* 2000-99-FIM. EXIT. *----------------------------------------------------------------------------------------------* *----------------------------------------------------------------------------------------------* 2100-LER-ARQ-ENTRADA READ ENTRADA. IF WRK-FS-ENTRADA GO END-IF. MOVE COD-PROD OF REG-ENTRADA TO WRK-COD-ANT. MOVE NOME OF REG-ENTRADA TO WRK-NOME-ANT. EQUAL 10 TO 2100-99-FIM SECTION. *----------------------------------------------------------------------------------------------*

PERFORM 1100-TRATAR-FS-ENTRADA. *----------------------------------------------------------------------------------------------* 2100-99-FIM. EXIT. *----------------------------------------------------------------------------------------------* *----------------------------------------------------------------------------------------------* 3000-PROCESSAR-REG IF SECTION. *----------------------------------------------------------------------------------------------* COD-PROD OF REG-ENTRADA NOT EQUAL WRK-COD-ANT PERFORM 3100-GRAVAR-REG-SAIDA MOVE ZEROS END-IF. ADD QUANT-PROD OF REG-ENTRADA TO WRK-QUANT-PROD. PERFORM 2100-LER-ARQ-ENTRADA. TO WRK-QUANT-PROD

50

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

*----------------------------------------------------------------------------------------------* 3000-99-FIM. EXIT. *----------------------------------------------------------------------------------------------* *----------------------------------------------------------------------------------------------* 3100-GRAVAR-REG-SAIDA MOVE SPACES MOVE WRK-COD-ANT MOVE WRK-NOME-ANT MOVE WRK-QUANT-PROD WRITE REG-SAIDA. PERFORM 1200-TRATAR-FS-SAIDA. *----------------------------------------------------------------------------------------------* 3100-99-FIM. EXIT. *----------------------------------------------------------------------------------------------* *----------------------------------------------------------------------------------------------* 4000-FINALIZAR SECTION. *----------------------------------------------------------------------------------------------* CLOSE ENTRADA SAIDA. PERFORM 1100-TRATAR-FS-ENTRADA. PERFORM 1200-TRATAR-FS-SAIDA. STOP RUN. *----------------------------------------------------------------------------------------------* 4000-99-FIM. EXIT. *----------------------------------------------------------------------------------------------* SECTION. TO REG-SAIDA. TO COD-PROD OF REG-SAIDA. TO NOME-PROD OF REG-SAIDA. TO QUANT-PROD OF REG-SAIDA. *----------------------------------------------------------------------------------------------*

51

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

6. FORMATOS ESPECIAIS DE DADOS 6.1. SINAL CAMPOS NUMRICOS J vimos que para declarar uma varivel numrica na DATA DIVISION, usamos o caractere 9 juntamente com a clausula PIC. Para prever o sinal (positivo ou negativo), deve-se acrescentar a letra S aps a PIC, conforme abaixo: 77 WRK-VAR-1 PIC S9999.

6.2. FORMATO BINRIO Quando usamos os formatos descritos nos pargrafos anteriores para descrever variveis na DATA DIVISION, o Cobol armazena cada caracter das variveis definidas em 1 byte da memria. Foi visto na introduo do curso que um byte um conjunto de 8 bits. O computador associa cada combinao de bits ligado/desligado destes 8 bits com uma letra (ou caracter) do nosso alfabeto. Assim, no caso do mainframe, que utiliza o padro EBCDIC, podemos representar estes 2 exemplos: Caracter A 5 Bits na memria 1100 0001 1111 0101 Valor decimal 191 245 Valor hexadecimal C1 F5

Acontece porm que o computador no foi projetado para fazer clculos com este formato. Ele usa o valor binrio puro dos bits para clculos, onde cada bit da direita para a esquerda tem o valor da potncia de 2 correspondentes, como no esquema: Bits Valor 8 128 7 64 5 32 4 8 3 4 2 2 1 1

Assim o caractere 5 do formato EBCDIC acima seria interpretado pelo computador nas operaes de clculo como 245. Os programadores Cobol no precisariam se preocupar com este detalhe, porque o compilador Cobol coloca no programa objeto gerado, instrues adicionais para, na hora do

52

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

clculo, converter todas as variveis do formato EBCDIC para binrio, fazer o clculo, e converter o resultado do formato binrio para EBCDIC, e devolver o resultado convertido para a memria. Os inconvenientes de trabalhar com variveis numricas em EBCDIC so: A ineficincia causada pelas converses de formato. O formato EBCDIC ocupa espao maior na memria.

6.3. CLUSULA USAGE A clusula USAGE utilizada definir o formato da varivel na memria. Existem 3 (trs) opes de formato: USAGE DISPLAY. USAGE COMP. USAGE COMP-3. 6.3.1. USAGE DISPLAY Especifica que a varivel ser formatada em EBCDIC. Este formato assumido quando se omite a clusula USAGE. 6.3.2. USAGE COMP Usado para especificar que a varivel deve ter formato binrio. S usado para variveis numricas. O Cobol formata nmeros com USAGE COMP somente em 3 formatos binrios que so os formatos disponveis na CPU do mainframe para clculos: Um formato com 2 bytes, ou 16 bits (1 bit de sinal e 15 bits de valores binrios); Um formato de 4 bytes, 0u 32 bits (1 bit de sinal e 33 bits de valores binrios); Um formato com 8 bytes, ou 64 bits (1 bit de sinal e 63 bits de valores). A escolha destes formatos feita de acordo com o tamanho do campo especificado pelo programador, segundo a tabela abaixo:

53

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

DE S9(1)COMP S9(5)COMP S9(10)COMP

ATE S9(4) COMP S9(9) COMP S9(18)COMP

BYTES 2 4 8

VALORES -32768 a + 32768 -2.147.483.648 a + 2.147.483.648 valores com ate 18 algarismos

6.3.3. USAGE COMP-3 Este um formato binrio usado exclusivamente em mainframes IBM para variveis numricas. Neste formato, usam-se grupos de 4 bits para representar 1 nmero, e por isso 1 byte consegue armazenar 2 nmeros. Os valores dos bits no byte aparecem como: Bits Valor 8 8 7 4 6 2 5 1 4 8 3 4 2 2 1 1

Neste formato o sinal obrigatrio, usando tambm 4 bits, com configuraes conforme tabela abaixo: Bits 8 1 1 1 1 1 1 4 0 0 1 1 1 1 2 1 0 0 0 1 1 1 0 1 0 1 0 1 Valor decimal 10 11 12 13 14 15 Valor hexa A B C D E F Sinal + + + +

Todas as outras combinaes de bits so invlidas para sinal. Mostraremos abaixo o nmero 245 usando os 3 (trs) formatos em Cobol: Cobol 77 VAR-1 PIC 999 VALUE 245 77 VAR-1 PIC 999 COMP VALUE 245 77 VAR-1 PIC S999 COMP-3 VALUE 245 Configurao dos bits 1111 0010 1111 0100 0101 0000 0000 1111 0101 0010 0100 0101 1100 Hexa F2 F4 F5 00 F5 24 5C

1111

Como regra geral, o Cobol no suporta nmeros com mais de 18 algarismos.

54

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

6.4 TABELAS Alguns algoritmos exigem a definio de uma mesma varivel vrias vezes, aumentando o trabalho de codificao do programa correspondente tanto na DATA DIVISION, como tambm as instrues resultantes na PROCEDURE DIVISION. Por exemplo, em um algoritmo para acumular as vendas do ano separadas por ms, precisamos definir 12 campos de total na DATA DIVISION, e a PROCEDURE DIVISION dever ter 12 testes do ms da venda para decidir em que total deve ser feito a soma. Ex.: DATA DIVISION. 03 TOTAL-01 03 TOTAL-02 03 TOTAL-12 PIC 9(8)V99. PIC 9(8)V99. PIC 9(8)V99.

PROCEDURE DIVISION. IF MS = 01 ADD VENDAS TO TOTAL-01 ELSE IF MS = 02 ADD VENDAS TO TOTAL-02 ELSE ...... ELSE IF MS = 12 ADD VENDAS TO TOTAL-12. A linguagem Cobol possui um recurso para resolver este problema. Na DATA DIVISION a varivel ser definida somente uma vez, acompanhada da clusula OCCURS que definir quantas vezes a varivel deve ser repetida. A sintaxe da definio do item com OCCURS : Nvel varivel PIC picture OCCURS n TIMES.

O total mensal do exemplo acima ficar. 1 TOTAIS-GERAIS. 03 TOTAL-MENSAL PIC 9(8)V99 OCCURS 12 TIMES.

55

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

A clusula OCCURS s pode ser usada em variveis de nvel 02 a 49. Quando uma varivel de uma tabela (definida com OCCURS) for usada na PROCEDURE DIVISION, ela precisa ser acompanhada de um indexador (subscrito) que definir qual ocorrncia da tabela est sendo referido. Este subscrito deve estar dentro de parnteses e pode ser um literal numrico ou uma varivel numrica com valores inteiros. Por ex.: ADD VENDAS TO TOTAL-MENSAL(5).

Neste caso a soma esta sendo feita no quinto ms (Maio). A codificao do algoritmo do exemplo acima ficar reduzido agora a: DATA DIVISION. 1 TOTAIS-GERAIS. 03 TOTAL-MENSAL PROCEDURE DIVISION. ............ ADD VENDAS TO TOTAL-MENSAL (MS-VENDA). 6.4.1 NVEIS DAS TABELAS Em Cobol podemos definir uma entrada de uma tabela como uma nova tabela, e assim sucessivamente at um nvel de 3 tabelas. Por exemplo, para obter o total de vendas separado por estado, e em cada estado por tipo de produto, e para cada produto por ms de venda, montaremos a DATA DIVISION como abaixo: DATA DIVISION. 1 TOTAIS-VENDA. 03 VENDAS-ESTADO 05 07 OCCURS 27 TIMES. OCCURS 5 TIMES. PIC 9(8)V99 OCCURS 12 TIMES. VENDAS-PRODUTO VENDAS-MS PIC 9(8)V99 OCCURS 12 TIMES.

56

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Este cdigo montar na memria uma tabela com 3 nveis de 1620 totais (27 estados X 5 produtos X 12 meses). Para acessar um total desta tabela ser necessrio um conjunto de 3 subscritores: PROCEDURE DIVISION. ............ ADD VENDAS TO VENDAS-MS (COD-ESTADO, COD-PRODUTO, MS-VENDA). Os subscritos dentro do parnteses devem estar na mesma seqncia da definio das tabelas (mesma hierarquia).

57

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

7. IMPRESSO O Cobol trata a impresso de relatrios de maneira similar gravao de arquivos, ou seja, enviar uma linha de relatrio para a impressora idntico a gravar um registro em um arquivo. Por isso precisamos definir o relatrio na INPUT-OUTPUT SECTION (ENVIRONMENT DIVISION) com a instruo SELECT, precisamos definir o contedo das linhas de impresso na FILE SECTION (DATA DIVISION) com a instruo FD, e na PROCEDURE DIVISION devemos usar as instrues OPEN, WRITE e CLOSE para controlar a impresso. No entanto, obviamente existem diferenas entre um arquivo e um relatrio, e os seguintes detalhes devem ser observados em um programa: Diferentemente dos arquivos, onde todos os registros tem o mesmo lay-out, em um relatrio as linhas de detalhe podem ser diferentes (incluindo sub-totais, ttulos de grupos etc.). Alm disso, sempre existe um cabealho em cada folha ou ainda linhas de rodap. O programa precisa controlar a mudana de pgina. Para isto normalmente usa-se a varivel LINAGE-COUNTER, que incrementada automaticamente a cada comando WRITE do relatrio. Quando esta varivel atinge o numero de linhas disponveis na folha, o programa deve comandar o salto para a nova folha imprimir as linhas de cabealho. comum haver totalizaes em vrios nveis (sub-totais, totais gerais etc.). Estes totais so emitidos quando muda a identificao de grupo dentro dos registros lidos. Por exemplo, em um relatrio de vendas com totais por ms o programa deve comparar o ms do registro lido com o ms do registro anterior para verificar se so diferentes. Nestas mudanas de identificador de grupo (geralmente conhecido como QUEBRA), o programa deve emitir uma linha de total, e acertar convenientemente as variveis de totalizao. O comando WRITE tem um formato prprio para impresses mostrado abaixo: WRITE registro BEFORE ADVANCING varivel LINES OU WRITE registro AFTER ADVANCING varivel LINES OU WRITE registro BEFORE ADVANCING PAGE OU

58

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

WRITE registro AFTER ADVANCING PAGE As clusulas BEFORE ADVANCING ou AFTER ADVANCING so opcionais e servem para comandar a mudana de linha na impressora. A palavra ADVANCING pode ser omitida. Uma instruo como a seguinte: WRITE LINHA-DETALHE BEFORE 2 LINES. Imprime a linha detalhe ANTES de saltar 2 linhas em branco na impressora, ou seja, a linha impressa e DEPOIS h um salto de 2 linhas em branco. O ADVANCING PAGE provoca um salto para o inicio de nova pgina.

7.1 OPO AFTER POSITIONING Esta opo deve ser declarada como caracter alfanumrico (PICTURE X). Por exemplo, na impresso do cabealho de um relatrio: FD IMPRESSAO LABEL RECORD BLOCK CONTAINS IS OMITTED 0 RECORDS. RECORDING MODE IS F

01 REG-RELATORIO. 03 02 PROCEDURE WRITE RELATORIO CARRO FILLER PIC X(01). PIC X(132) VALUE SPACES. DIVISION FROM CABEC1 AFTER POSITIONING CARRO.

59

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Abaixo encontra-se o valores possveis que podem ser atribudos ao salto do CARRO: Branco Zero 0 Menos - Mais + 1 a 9 A, B, C Espacejamento simples Espacejamento duplo Espacejamento triplo Supresso do espacejamento Salto do canal 1 a 9 Salto do canal 10, 11 e 12

No POSITIONING, o mximo de linhas que se pode pular so 3 (trs);

No deve-se utilizar AFTER e BEFORE no mesmo programa.

7.2. MSCARAS DE EDIO DE CAMPOS Utiliza-se para itens que devem ser impressos ou enviados para tela de programas online. So definidos na WORKING-STORAGE SECTION. O formato representado por qualquer combinao dos seguintes caracteres: (9), (V), (P), (.), (Z), (*), (CR), (DB), (,), (0), (B), ($), (+), (-) (9), (V), (P) - so usados de maneira semelhante ao uso dos itens numricos; (.) - o ponto decimal, quando usado, inserido na posio indicada; (Z) - indica a supresso de zeros no significativos; (*) - usado como proteo de um nmero impresso; (CR), (DB) - significam CR (crdito) e DB (dbito). Usa-se somente quando o nmero for negativo. Caso o nmero seja positivo, no aparecer nada; (,), (0), (B) - so smbolos de edio que so inseridos na impresso; ($), (+), (-) - so impressos na posio indicada. OBS: O smbolo (-) no dever ser o prximo sinal aps o ponto. Caso isso ocorrer, definir mais um (-).

60

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Exemplo: 01 CAMPO PIC --.---.---,99.

Definio 9(04) 9V9(2) 9(03) S9(02) 9(05) 9(04)V99 9(03) 9(03) 9(03) S9(03)V99 9(04) 9(06) 9(03) S9(02) S9(02) S9(02) S9(02) S9(02) S9(04)

Picture 9999 9V99 999PP S99 99.999 Z.ZZZ,99 ZZZ **9 *** 999,99CR 990099 99B99B99 $999 -99 -99 +99 +99 99-.--9

Valor Real 502 1,25 43700 -21 10.987 25,50 422 *** 800,00CR 110025 12 13 15 $371 -15 16 15 +16 15-12

Na memria 502 125 437 2110987 002550 000 422 000 80000(-) 1125 121315 371 15(-) 16 15(-) 16(+) 15(-) 0012(-)

OBS: caso tenha que utilizar o caracter , para se fazer entendido ao Cobol, define-se dentro das aspas duplas. Exemplo: 77 ASPA PIC X(01) VALUE .

61

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

A clusula PICTURE (ou PIC) tem alguns formatos prprios para fazer edio de variveis numricas no momento de uma impresso.

Observao: Mscaras de edio tambm podem serem usadas para mensagens exibidas na SYSOUT / CONSOLE e na formatao de campos alfanumricos. 7.3. SUPRESSO DE ZEROS Tomemos como exemplo a seguinte varivel definida na WORKING-STORAGE: 03 VALOR PIC 9(5)V99 VALUE 2.

A instruo: WRITE VALOR Ter como resultado: 0000200 Que a imagem desta varivel na memria do computador (VALOR est definido com 5 posies inteiras e 2 variaveis, com uma vrgula implcita). Para suprimir os zeros a esquerda das variveis numricas, e forarmos a impresso da virgula, usamos a letra Z nas posies onde o zero deve ser suprimido, e a definio do VALOR no registro de impresso (FD) ser: 03 VALOR PIC ZZZZ9,99.

E agora a instruo WRITE produzir: 2,00 7.4. TIPOS DE MASCARA DE EDIO - OUTRAS Os seguintes exemplos ilustram outras mscaras de edio: PICTURE R$ZZZZ9,99 $$$$$9,99 R$****9,99 +ZZZZ9,99 ++++9,99 ZZZZ9,99+ ZZZZ9,99CR 2 2 2 -2 -2 -2 -2 VALUE IMPRESSO R$ 2,00 $2,00 r$****2,00 2,00 -2,00 2,002,00CR

62

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

99/99/99 99B99B99

020304 020304

02/03/04 02 03 04

7.5. BLANK WHEN ZERO Esta clusula, usada aps a mscara de edio da PICTURE, envia espaos em branco para a impressora quando a varivel numrica a ser impressa tem valor zero, independente do formato da mscara. Pode ser abreviado para BZ. Ex.: 03 VALOR PIC ZZZZ9,99 BLANK WHEN ZERO.

63

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

8. ORDENAO DE ARQUIVOS Os registros esto dispostos nos arquivos na ordem em que foram gravados. Por exemplo, um arquivo de clientes pode ter sido gravado em ordem crescente de cdigo de cliente. Para se fazer um relatrio dos clientes em ordem alfabtica de nomes, necessrio reordenar o arquivo nesta ordem. Isto feito em Cobol usando o recurso do SORT. Para usar o SORT necessrio definir no programa um arquivo temporrio. O SORT grava neste arquivo os registros a serem ordenados, efetua a classificao, e devolve nele os registros ordenados. Alem deste temporrio, define-se tambm no programa um arquivo de entrada (arquivo original), e um arquivo de sada que receber os registros ordenados. A definio do arquivo temporrio feito com uma instruo SELECT padro. Na FILE SECTION porem, o pargrafo FD deve ser substitudo pos SD (Sort Description), e na descrio do registro suficiente definir os campos envolvidos na ordenao. Existem duas maneiras de codificar a instruo SORT na PROCEDURE DIVISION: Na primeira (SORT Intrnseco), o processo de classificao no altera o contedo do registro do arquivo. Na segunda, o pode se alterar o lay-out dos registros do arquivo de sada, eliminar campos na sada e at eliminar registros na classificao (mantendo somente os que interessarem ao relatrio de sada). Esta segunda opo pode ser usada para se melhorar a performance, ao se utilizar registros menores. 8.1. SORT INTRNSECO No SORT INTRINSECO, a instruo SORT tem o formato: SORT arquivo-sd ASCENDING campo USING arquivo-entrada GIVING arquivo-saida. Este comando executa todas as etapas necessrias classificao, e o programa Cobol no precisa abrir, ler, gravar ou fechar qualquer dos arquivos encolvidos no processo. Tambm pode se usar DESCENDING quando se quizer ordem decrescente na ordenao, assim como colocar vrios campos como chave de classificao.

64

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

8.2. SORT EXTRNSECO Quando no usamos o SORT Intrnseco, o precesso mais complexo e envolve os seguintes passos: necessrio definir 2 paragrafos na PROCEDURE DIVISION, a INPUT

PROCEDURE e a OUTPUT PROCEDURE, para respectivamente ler o arquivo de entrada e gravar o arquivo de sada. Na INPUT PROCEDURE abre-se o arquivo de entrada (OPEN), faz-se a leitura dos registros (READ), e move-se para a SD do arquivo SORT os campos escolhidos. Em seguida grava-se o registro SD. Repete-se o ciclo de leituras da entrada e gravao do SD at se atingir o fim do arquivo de entradas, e finalmente fecha-se o arquivo de entrada. A gravao do registro SD deve ser feito com a instruo RELEASE. Na OUTPUT PROCEDURE, o arquivo de sada deve ser aberto com OPEN OUTPUT. Em seguida deve-se ler cada registro classificado no arquivo SD com a instruo RETURN, mover os campos da SD para o registro de sada (FD), e gravar o arquivo de sada (WRITE). Repetir as leituras da SD e gravao da sada at o fim do arquivo de SORT, e finalmente fechar o arquivo de sada. O formato da instruo SORT nesta opo : SORT arquivo-sd ASCENDING campo INPUT PROCEDURE pargrafo-1 OUTPUT PROCEDURE pargrafo-2. No exemplo abaixo, classificamos o arquivo Cliente usano o mtodo explicito. IDENTIFICATION DIVISION. PROGRAM-ID. AUTHOR. * ENVIRONMENT DIVISION. LISTACLI. TCS.

65

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

CONFIGURATION SECTION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT CLIENTES ASSIGN TO SELECT RELAT ASSIGN TO * DATA DIVISION. FILE SECTION. FD CLIENTES. 01 REG-CLIENTES. 10 CLIENTES-CODIGO 10 CLIENTES-NOME 10 CLIENTES-DATA-NASC. 20 CLIENTES-DATA-NASC-ANO 20 CLIENTES-DATA-NASC-MS 20 CLIENTES-DATA-NASC-DIA 10 CLIENTES-TELEFONE 10 CLIENTES-ENDERECO 10 CLIENTES-BAIRRO 10 CLIENTES-CIDADE 10 CLIENTES-ESTADO 10 CLIENTES-CEP 10 CLIENTES-E-MAIL SD ORD-CLIENTES. 01 SORT-REG-CLIENTES. 10 SORT-CLIENTES-CODIGO 10 SORT-CLIENTES-NOME 10 SORT-CLIENTES-E-MAIL FD RELAT. 01 REG-RELAT PIC X(106). PIC 9(006). PIC X(050). PIC X(050). PIC 9(004). PIC 9(002). PIC 9(002). PIC X(030). PIC X(050). PIC X(030). PIC X(030). PIC X(002). PIC 9(008). PIC X(050). PIC 9(006). PIC X(050). DA-S-CLIENTES. DA-S-RELAT. SELECT ORD-CLIENTES ASSIGN TO DA-S-ORDCLIENTES.

66

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

WORKING-STORAGE SECTION. * PROCEDURE DIVISION. INICIO. SORT ORD-CLIENTES ASCENDING SORT-CLIENTES-NOME INPUT PROCEDURE SORTIN-CLIENTES THRU EXIT-SORTIN-CLIENTES OUTPUT PROCEDURE SORTOUT-CLIENTES THRU EXIT-SORTOUT-CLIENTES STOP RUN * SORTIN-CLIENTES. OPEN INPUT CLIENTES. LOOP-CLIENTES. READ CLIENTES AT END GO TO FIM-CLIENTES. MOVE CLIENTES-CODIGO TO SORT-CLIENTES-CODIGO MOVE CLIENTES-NOME TO SORT-CLIENTES-NOME MOVE CLIENTES-E-MAIL TO SORT-CLIENTES-E-MAIL RELEASE SORT-REG-CLIENTES GO TO LOOP-CLIENTES. FIM-CLIENTES. CLOSE CLIENTES. EXIT-SORTIN-CLIENTES. EXIT. SORTOUT-CLIENTES. OPEN OUTPUT RELAT. LOOP-SORTOUT. RETURN ORD-CLIENTES AT END GO TO FIM-SORTOUT. WRITE REG-RELAT FROM SORT-REG-CLIENTES. GO TO LOOP-SORTOUT. FIM-SORTOUT. CLOSE RELAT. EXIT-SORTOUT-CLIENTES. EXIT.

67

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

9. ARQUIVOS DE ACESSO ALEATRIO(VSAM) Toda a programao de arquivos visto at aqui tratava de um tipo de arquivo denominado SEQUENCIAL. Nestes arquivos os registros esto dispostos na ordem em que foram gravados. Para se ter acesso a um registro especfico necessrio ler todos os registros do arquivo a partir do inicio at atingirmos o registro pretendido. O mainframe tem, porm um outro tipo de arquivo de acesso aleatrio, que s pode ser acessado em discos magnticos: os arquivos VSAM. Nos arquivos VSAM escolhe-se um ou mais campos do registro como CHAVE de acesso. No programa Cobol, fornecendo-se o valor da chave de um registro, as instrues de leitura/gravao acessam o registro diretamente, independente da sua posio no arquivo. H dois tipos de organizao interna dos arquivos VSAM: SEQUENCIAL INDEXADA RELATIVA. Na organizao SEQUENCIAL INDEXADA, a chave formada por campos do registro, como foi exposto acima. Na organizao RELATIVA, a chave a posio do registro dentro do arquivo. Por exemplo, para ler o centsimo registro do arquivo, fornecemos o valor 100 como chave. Nos arquivos VSAM RELATIVOS necessrio um algoritmo para associar um registro especifico com sua posio no arquivo. Apesar dos arquivos VSAM RELATIVOS serem mais eficientes no processamento, a exigncia de se criar este algoritmo restringe muito seu uso. Os arquivos VSAM exigem sintaxe especializada em algumas partes do Cobol que descrevemos em seguida. 9.1. MANIPULAO ARQUIVOS VSAM 9.1.1. INPUT-OUTPUT SECTION A clusula SELECT ter a seguinte estrutura para arquivos indexados:

68

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

ENVIRONMENT DIVISION. CONFIGURATION SECTION. .. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT [OPTIONAL] nome-arquivo ASSIGN TO nome-externo ORGANIZATION IS tipo-de-organizao ACCESS MODE IS tipo-de acesso RECORD KEY IS key-principal ALTERNATE KEY IS key-alternada [WITH DUPLICATES] FILE STATUS IS campo-status. A clausula OPTIONAL ja foi descrita no SELECT para arquivos sequenciais. Os detalhes do comando, mostrados em letras minsculas so explicados abaixo: Nome-do-arquivo sintaxe idntica aos arquivos seqenciais. Nome-externo - sintaxe idntica aos arquivos seqenciais. Tipo-de-organizao: o INDEXED para arquivos seqncias indexados o RELATIVE para arquivos relativos Tipo-de-acesso: o SEQUENTIAL O arquivo ser lido sequencialmente o RANDOM O arquivo ser lido aleatoriamente.

69

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

o DYNAMIC O arquivo ser lido e atualizado. key-principal Campo do registro escolhido para identificar de maneira inequivoca o registro. O arquivo s pode ter uma RECORD KEY. key-alternada Qualquer outro campo do registro usado para pesquisa de registros. Pode-se acrescentar a esta clausula a declarao WITH DUPLICATES, que indica que a pesquisa por esta chave pode conduzir a mais de um registro. Oarquivo pode ter vrias ALTERNATE KEY. ALTERNATE KEY deve ser usado com cuidado porque aumenta o processamento nas atualizaes para manter mais chaves no arquivo. Os campos de chave de um arquivo VSAM so partes integrantes da estrutura fsica do arquivo, e so definidas na criao do mesmo pelo DBA. As seguintes clusulas so opcionais no SELECT: ACCESS MODE /

ALTERNATE KEY.

9.1.2. FILE-STATUS

O FILE STATUS permite ao usurio monitorar a execuo de operaes de entrada e sada (I/O) requisitadas para os arquivos de um programa. Aps cada operao de I/O, o sistema move um valor para a STATUS KEY (campo alfanumrico, com 2 caracteres definidos na WORKING-STORAGE SECTION e especificado na ENVIRONMENT DIVISION, atravs do SELECT) que acusa o sucesso ou o insucesso da operao. Qualquer valor movido para a STATUS KEY diferente de zeros, revela que a execuo no foi bem sucedida. Alguns exemplos de operaes de I/O que podem ser testadas o FILE STATUS: OPEN - START - WRITE - READ - REWRITE - CLOSE

70

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Os testes de FILE-STATUS devem ser realizado para todas as operaes de arquivos, seja ele SEQUENCIAL ou INDEXADO. Todos os comandos para arquivos VSAM na PROCEDURE DIVISION devem ser seguidos de um teste na varivel FILE STATUS para verificar possveis erros. A varivel FILE STATUS pode retornar um dos valores abaixo: 00 Comando com sucesso. 02 Sucesso, mas existe Alternate Key. 04- Sucesso, Mas o compr do registro no confere com FD. 05- Open Optional com sucesso, mas no existia arquivo anterior. 10- Fim do arquivo. 14- Para arquivos relativos, a key maior que numero de registros 21- Registro fora de ordem. 22- No write, registro j existe. 23- No read, registro no existe. 24- Write fora dos limites lgicos do arquivo. 30- Parity error. 34- Write fora dos limites fsicos do arquivo. 35- No open, arquivo no existe. 37- Arquivo no suporta este tipo de open. 38- Open error. Arquivo esta fechado com lock. 39- Open error. Atributos do arquivo no batem com FD. 41- Arquivo j esta aberto. 42- Arquivo j esta fechado. 43- Tentativa de atualizar sem ler. 44- Violao de limites. 46- Read next sem start. 47- Read em arquivo open output. 48- Write em arquivo open input. 49- Delete ou rewrite sem open I-o 9X- Erro de run-time (X o valor binrio do erro). 9.1.4. ABERTURA DO ARQUIVO - VSAM O comando OPEN o mesmo que o dos arquivos seqenciais.

71

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

9.1.5. LEITURA DO ARQUIVO - VSAM Comando READ: READ arquivo Este comado l o registro cuja chave foi carregada na RECORD KEY. Exemplo de um programa com READ: FILE-CONTROL. SELECT ARQ-CLIENTE ASSIGN TO DA-S-CLIENTE ORGANIZATION IS INDEXED RECORD KEY IS COD-CLIENTE FILE STATUS IS STATUS-CLIENTE. .......... WORKING-STORAGE SECTION. 77 77 WORK-COD STATUS-CLIENTE ..................... PROCEDURE DIVISION. ........................... ACCEPT WORK-COD MOVE WORK-COD TO COD-CLIENTE. READ ARQ-CLIENTE IF STATUS-CLIENTE = 10 MOVE CLIENTE NO EXISTE TO MENSAGEM GO TO FIM-PROGRA. 9.1.6. READ NEXT - VSAM Comando READ/NEXT: READ arquivo NEXT. PIC . PIC XX.

72

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Este comando l o prximo registro do arquivo na seqncia de chaves. Uma seqncia de comandos READ NEXT retorna uma coleo de registros ordenada por uma chave. Esta seqncia de READ NEXT deve ser precedida de um comando START que especifica a chave usada nas leituras e o valor do inicio desta chave. 9.1.7. READ PREVIOUS VSAM Comando READ/PREVIOUS: READ arquivo PREVIOUS. Este comando l o registro anterior do arquivo na seqncia de chaves. Funciona de maneira idntica ao READ NEXT, usando a ordem decrescente da chave. 9.1.8. START - VSAM Comando START: START arquivo KEY condio chave . O comando START usado na preparao de uma seqncia de READ NEXT ou READ PREVIOUS. Ele no carrega registros na memria, mas prepara o VSAM para as prximas leituras. A condio especificada para a KEY pode ser qualquer uma das condies relacionais vistas na instruo IF (=, GREATER, NOT LESS etc.). A chave usada no comando deve ser uma das chaves definidas na clausula SELECT para este arquivo (pode ser a RECORD KEY ou uma ALTERNATE KEY). Esta chave ser usada nos comandos READ posteriores. Exemplo: ......... FILE-CONTROL. SELECT ARQ-CLIENTE ASSIGN TO DA-S-CLIENTE ORGANIZATION IS INDEXED RECORD KEY IS COD-CLIENTE

73

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

ALTERNATE KEY IS NOME-CLIENTE FILE STATUS IS STATUS-CLIENTE. .......... WORKING-STORAGE SECTION. 77 STATUS-CLIENTE ..................... PROCEDURE DIVISION. ........................... MOVE JOSE TO NOME-CLIENTE. START ARQ-CLIENTE KEY NOT LESS NOME-CLIENTE IF STATUS-CLIENTE = 23 MOVE NO EXISTEM CLIENTES PARA ESTA CONDICAO. GO TO FIM-PROGRA. LOOP-LEITURA. READ ARQ-CLIENTE NEXT IF STATUS-CLIENTE = 10 GO TO FIM-PROGRA. MOVE REG-CLIENTE TO REG-SAIDA GO TO LOOP-LEITURA. 9.1.9. WRITE - VSAM Comando WRITE: WRITE record-name. Este comando cria um registro novo no arquivo, com o contedo de record-name. Record-name a varivel de nvel 01 definida na FD do arquivo a atualizar. O VSAM examina o campo RECORD KEY dentro do record-name, e coloca o registro criado dentro do arquivo na posio correta para manter a ordem crescente da RECORD KEY. Se o valor da RECORD KEY do registro a gravar j existir no arquivo, o registro no ser includo e o status 22 ser retornado. 9.1.10. REWRITE - VSAM PIC XX.

74

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Comando REWRITE: REWRITE record-name. Este comando regrava o registro de chave igual a RECORD KEY no arquivo, com o contedo de record-name. O VSAM examina o campo RECORD KEY dentro do record-name, pesquisa o registro contendo esta RECORD KEY e o regrava com o contedo de record-name. O comando REWRITE s pode ser usado depois de um comando READ que leia o registro a atualizar para a mamoria (portanto usando a RECORD KEY deste registro).

75

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

9.1.11. DELETE - VSAM DELETE arquivo RECORD. Este comando apaga o registro cuja chave coincide com o valor da RECORD KEY existente na FD. 9.1.12. FECHAMENTO DE ARQUIVOS - VSAM O comando para fechar o VSAM idntico ao dos arquivos seqnciais. CLOSE nome-do-arquivo.

76

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

10. COMUNICAO ENTRE PROGRAMAS. A instruo CALL usada em Cobol para executar um outro programa que j esteja compilado dentro das bibliotecas do Mainframe, e quando este outro programa terminar a execuo o nosso programa retoma o controle na instruo seguinte ao CALL. Por exemplo, se o nosso programa processa sadas de material, ele pode em cada sada executar um programa CALCSENH que confere a exatido da senha do requisitante. O processo de invocar outro programa envolve tambm a passagem de dados entre os dois programas, que est explicado no exemplo abaixo. Programa SAIDAS-MAT. IDENTIFICATION DIVISION. PROGRAM-ID. SAIDAMAT. * ENVIRONMENT DIVISION. CONFIGURATION SECTION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT SAIDA ASSIGN TO DA-S-SAIDA. SELECT MATERIAIS ASSIGN TO DA-I-MATERIAIS ORGANIZATION IS INDEXED RECORD KEY IS COD-MATER FILE STATUS IS STATUS-MATER. * DATA DIVISION. FILE SECTION. FD SAIDA. 1 REG-SAIDA. 03 COD-CLIENTE 03 COD-PROD 03 QUANT-PROD PIC 9(6). PIC X(6). PIC 9(6). 03 DIGITO-CLIENTE PIC 9.

77

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

FD MATERIAIS. 1 REG-MATERIAIS. 03 COD-MATER 03 NOME-PROD 03 ESTOQUE * WORKING-STORAGE SECTION. 77 STATUS-MATER 77 SUBROTINA 01 AREA-SENHA. 05 WCOD-CLIENTE 05 WRETORNO * PROCEDURE DIVISION. INICIO. OPEN INPUT SAIDA. OPEN I-O MATERIAIS. IF STATUS-MATER NOT = 00 DISPLAY ERRO STATUS-MATER NO OPEN DO MATERIAL. STOP RUN. LEITURAS. READ SAIDA AT END GO TO FINAL. MOVE COD-CLIENTE TO WCOD-CLIENTE MOVE DIGITO-CLIENTE TO WDIGITO-CLIENTE. CALL CALCSENHA USING AREA-SENHA. IF WRETORNO NOT = ZERO DISPLAY WCOD-CLIENTE WDIGITO-CLIENTE SENHA INVALIDA. GO TO LEITURAS. PIC 9(6). PIC 9. 05 WDIGITO-CLIENTE PIC 9. PIC XX. PIC X(09) VALUE CALCSENHA. PIC X(6). PIC X(30). PIC 9(8).

78

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

MOVE COD-PROD TO COD-MATER READ MATERIAIS IF STATUS-MATER = 23 DISPLAY WCOD-CLIENTE COD-MATER MATERIAL NO EXISTE. GO TO LEITURAS. IF QUANT-PROD > ESTOQUE DISPLAY WCOD-CLIENTE COD-MATER QUANT-PROD SEM ESTOQUE. GO TO LEITURAS. SUBTRACT QUANT-PROD FROM ESTOQUE. REWRITE REG-MATERIAIS. IF STATUS-MATER NOT = 00 DISPLAY ERRO STATUS-MATER NO REWRITE.. GO TO LEITURAS. FINAL. CLOSE SAIDA MATERAIS. STOP RUN. Programa CALCSENH. IDENTIFICATION DIVISION. PROGRAM-ID. CALCSENH. * ENVIRONMENT DIVISION. CONFIGURATION SECTION. INPUT-OUTPUT SECTION. FILE-CONTROL. * DATA DIVISION. FILE SECTION. * WORKING-STORAGE SECTION. 77 WTRAB * PIC 9(6).

79

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

LINKAGE SECTION. 01 LINK-SENHA. 05 LCOD-CLIENTE 05 LRETORNO * PROCEDURE DIVISION USING LINK-SENHA. INICIO. MOVE 0 TO LRETORNO. DIVIDE 9 INTO LCOD-CLIENTE GIVING WTRAB REMAINDER LRETORNO. GOBACK. Explicaes sobre os programas acima: - O programa SAIDAMAT invoca o programa CALCSENH com a instruo: CALL CALCSENH USING AREA-SENHA. - A clusula USING AREA-SENHA da instruo acima indica que toda a informao da rea AREA-SENHA deve ser passada para o programa CALCSENH. - O programa CALCSENH deve ter na DATA DIVISION a LINKAGE SECTION. Nesta SECTION devem ser descritos os dados recebidos pelo programa, ou seja, os campos da LINKAGE SECTION do CALCSENH representam os campos AREA-SENHA passados pelo CALL do SAIDAMAT. - A LINKAGE SECTION funciona como uma janela atravez da qual o programa CALCSENH v a rea AREA-SENHA. As alteraes feitas nos campos da LINKAGE SECTION so na realidade executados sobre a AREA-SENHA. - Na PROCEDURE DIVISION do programa CALC-SENHA precisa ter a clusula USING para especificar que os dados recebidos do programa chamador esto em LINK-SENHA. - O programa chamado (CALCSENH) no pode terminar com a instruo STOP RUN, que somente deve ser usada no termino geral do JOB. A instruo GOBACK deve ser usada para parar o programa chamado e continuar a execuo do programa chamador. PIC 9(6). PIC 9. 05 LDIGITO-CLIENTE PIC 9.

80

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Observaes: 1 - Pode-se enviar mais de um nvel 01 de grupos ou varivel sequncia; 2 O comando CALL CALCSENHA USING AREA-SENHA considerado uma Chamada Esttica, uma vez que, o nome do programa j est mencionado no prprio comando, porm, o comando CALL SUBROTINA USING AREA-SENHA considerada uma Chamada Dinmaica, uma vez que, invocado uma rea do nvel 77 da WorkStorage, onde o valor do campo SUBROTINA poder ser mudado para outros tipos de chamadas no processamento do programa chamador no caso o Programa SAIDAS-MAT. pela parmetro

USING, porm, necessrio que a Linkage do programa chamado deve estar na mesma

81

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

11. COMANDOS DIVERSOS 11.1. EVALUATE A instruo EVALUATE serve para substituir cadeias de instrues IF ELSE e tornar o programa mais legvel. Ela usa a opo EVALUATE da sintaxe para avaliar uma expresso ou o valor de uma varivel, e um conjunto de opes WHEN para definir condies e comandos a executar baseando-se na avaliao acima. A sintaxe desta instruo : EVALUATE varivel-ou-expressao ALSO varivel-ou-expresso ... WHEN condio Comandos WHEN condio Comandos ................ WHEN ANY Comandos WHEN OTHER comandos. Nesta instruo, variavel-ou-expresso pode ter os seguintes valores:

Uma varivel. Neste caso as opes WHEN devem testar valores ou faixas de valores (usando o conector THRU) para esta varivel. Exemplo: EVALUATE NOTA WHEN 1 THRU 5 DISPLAY REPROVADO WHEN 6 TO 9 DISPLAY APROVADO WHEN 10 DISPLAY APROVADO COM LOUVOR.

82

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Uma expresso. Neste caso as opes WHEN devem testar somente as constantes lgicas TRUE e FALSE. Exemplo: EVALUATE NOTA > 5 WHEN TRUE DISPLAY APROVADO WHEN FALSE DISPLAY REPROVADO.

As constantes lgicas TRUE ou FALSE. Neste caso as opes WHEN podem testar qualquer condio, mesmo que no tenham relao entre si. Se as condies testadas forem verdadeiras, os comandos associados no WHEN sero executados. Exemplo: EVALUATE TRUE WHEN NOTA > 5 DISPLAY APROVADO WHEN MES = 1 DISPLAY JANEIRO. 11.2. REDEFINES A clusula REDEFINES usada quando alguma informao da DATA DIVISION

precisa ser definida em dois ou mais formatos diferentes. Por exemplo, em um campo de data podemos o formato dia/ms/ano ou ano/ms/dia: 1 DATA-DIRETA. 03 DIA-D 03 MS-D 03 ANO-D 01 03 ANO-I 03 MS-I 03 DIA-I PIC 99. PIC 99. PIC 99. PIC 99. PIC 99. PIC 99.

DATA-INVERSA REDEFINES DATA-DIRETA.

83

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Os campos redefinidos ocupam o mesmo lugar na memria. No exemplo acima, o valor colocado no campo ANO-I aparece tambm em DIA-D. Os campos da rea redefinida no guardam nenhuma relao com o formato e posio dos campos da primeira definio da rea, e a nica condio que o total de bytes das duas reas seja igual. Outro ex.: 1 VALORES-PEQUENOS. 03 VALOR-1 03 FILLER 03 VALOR-2 03 FILLER PIC 9(6). PIC X(4). PIC 9(8). PIC XX.

01 VALORES-GRANDES REDEFINES VALORES-PEQUENOS.

11.3. INSPECT A instruo INSPECT varre um campo alfa-numrico contando caracteres ou fazendo substituies de certos caracteres por outros. A sintaxe para fazer substituio : INSPECT campo REPLACING condicao-1 var-1 BY var-2. ou INSPECT campo REPLACING CARACTERS BY var-2. Condio-1 pode ser uma das seguintes palavras: ALL - Todos os caracteres iguais a var-1 serao substituidos por var-2. LEADING Todos os caracteres iguais a var-1 que estiverem no inicio do campo serao substituidos por var-2. O primeiro caracter diferente de var-1 interrompe a substituicao. FIRST O primeiro caracter igual a var-1 sera substituido por var-2. Esta condicao provoca somente uma substituicao. O uso da opo CARACTERS faz com que todos os caracteres do campo sejam substitudos por var-2. Os formatos acima podem ser ampliados pela clausula AFTER/BEFORE como segue: INSPECT campo REPLACING condicao-1 var-1 BY var-2 condio-2 var-3. ou INSPECT campo REPLACING CARACTERS BY var-2 condio-2 var-3.

84

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Aqui, condio-2 pode ser: AFTER A substituio comea depois do caracter var-3. BEFORE A substituio efetuada nos carateres antes de var-3. A sintaxe para a instruo INSPECT contar caracteres : INSPECT campo TALLYING var-1 condicao var-2. ou INSPECT campo TALLYING CARACTERS var-2. Esta instruo conta caracteres dependendo da condio especficada. Condio pode ser qualquer uma das citadas na opo de substituio vista acima, exclundo a opo FIRST. O resultado da contagem aparece na varivel chamada var-1. 11.4. STRING. A instruo STRING concatena o contedo de vrios campos em um campo receptor. Seu formato : STRING campo-1 DELIMITED BY delimitador Campo-2 DELIMITED BY delimitador INTO campo-n WITH POINTER campo-p Neste exemplo, os contedos de campo-1, campo-2 etc. so reunidos e movidos para campo-n. Por exemplo: Antes do STRING: Campo-1 JOSE Aps o STRING: Campo-1 JOSE campo-2 SILVA campo-n JOSESILVA campo-2 SILVA campo-n

O parmetro DELIMITER opcional. Sua funo interromper a movimentao de dados para o campo receptor. Exemplo:

85

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

STRING VAR-1 DELIMITED BY S VAR-2 DELIMITED BY V INTO RESP. Antes do STRING: VAR-1 JOSE Aps o STRING: VAR-1 JOSE VAR-2 SILVA RESP JOSIL VAR-2 SILVA RESP

A funo de WITH POINTER, tambm opcional, indicar a posio do campo receptor que comea a receber os dados. Assim no exemplo: STRING VAR-1 DELIMITED BY S VAR-2 DELIMITED BY V INTO RESP WITH POINTER DESLOC. Antes do STRING: VAR-1 JOSE Aps o STRING: VAR-1 JOSE VAR-2 SILVA DESLOC 3 RESP XXJOSIL VAR-2 SILVA DESLOC 3 RESP XXXXXXX

11.5. UNSTRING A funo do comando UNSTRING inversa do comando STRING, isto , ele quebra o contedo de um campo emissor em varia partes movendo os resultados para vrios campos. O formato deste comando : UNSTRING campo [DELIMITED BY [ALL] delim [OR [ALL] delim.

86

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

INTO var-1 [DELIMITER IN var-d] [COUNT IN count] Var-2 ........ [WITH POINTER pointer] [TALLYING IN var-t] Usando esta sintaxe, os dados so extrados da varivel campo e colocados em var-1, var2, var-3 ... e assim sucessivamente. Veja o exemplo: 77 VAR-1 77 VAR-2 77 CAMPO PIC XX. PIC X(4). PIC X(6) VALUE 123456.

PROCEDURE DIVISION. UNSTRING CAMPO INTO VAR-1 VAR-2. Apos o comando: CAMPO 123456 VAR-1 12 VAR-2 3456

A clausula DELIMITED no comando permite quebrar o campo emissor pelos delimitadores. Sem a clausula o comando usar os comprimentos dos campos receptores no processo. Veja o exemplo: 77 VAR-1 77 VAR-2 77 CAMPO PIC XX. PIC X(4). PIC X(6) VALUE JOAO SILVA.

PROCEDURE DIVISION. UNSTRING CAMPO DELIMITED BY SPACES INTO VAR-1 VAR-2. Aps o comando: CAMPO JOAO SILVA VAR-1 JOAO VAR-2 SILVA

87

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Se no campo sendo quebrado haver a ocorrncia de um delimitador repetido, como por exemplo duas palavras separadas por dois ou mais espaos, a clausula ALL faz com que o conjunto de delimitadores seja considerado um s delimitador. Sem a clausula ALL, para cada delimitador ser usado um campo receptor em branco. DELIMITER IN define uma varivel para receber o delimitador encontrado no campo emissor. COUNT IN define uma varivel numrica para receber a quantidade de caracteres colocada no campo receptor. WITH POINTER define uma varivel numrica que conter a posio de inicio de movimentao dos dados no campo emissor. TALLYING IN define um campo numrico para conter a quantidade de campos receptores realmente usados na movimentao. Esta varivel deve ser inicializada antes da instruo UNSTRING. 11.6. TABELAS INDEXADAS Em Cobol pode-se associar ndices especiais aos elementos de uma tabela. Estes ndices so mais eficientes que o processo tradicional de subscrio, onde se usam variveis da WORKING-STORAGE como ndice, alem de permitir recursos avanados como pesquisa binria para localizao de elementos da tabela. O Cobol aloca diretamente os registradores da CPU para os ndices especiais. Em conseqncia o programa no deve aloca-los como uma varivel da WORKING-STORAGE. A definio destes ndices feita somente na especificao da tabela que agora ter a seguinte sintaxe: Nvel varivel OCCURS inteiro TIMES INDEXED BY nome-do-indice ASCENDING KEY campo-chave.

88

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

Exemplo: 2 VENDAS OCCURS 12 TIMES INDEXED BY IND-VENDAS ASCENDING KEY MES-VENDA. 03 MES-VENDA 03 VALOR-VENDA PIC 99. PIC 9(6)V99.

Neste exemplo, IND-VENDAS o ndice alocado para a tabela. Este ndice no pode ser definido na WORKING-STORAGE. A clausula ASCENDING KEY opcional e serve para declarar que a tabela ordenada pela varivel MS-VENDA. Tambm podemos declarar tabelas ordenadas em ordem decrescente usando DESCENDING KEY nesta clausula. 11.6.1. SET Como o ndice definido pela opo INDEXED BY nas tabelas indexadas no uma varivel padro do Cobol, no de pode usar as instrues (MOVE, ADD, SUBTRACT) do Cobol para alterar seu valor. Usa-se a instruo SET com as seguintes sintaxes: Para mover um valor para o index: SET index TO varivel-ou-literal Para copiar o valor do index para uma variavel: SET variavel TO index Para somar um valor ao index: SET index UP BY valor Para subtrair um valor do index: SET index DOWN BY valor. 11.6.2. SEARCH A intruo SEARCH usada para pesquisas em tabelas indexadas. Existem 2 opes de pesquisa com SEARCH: pesquisa seqencial e pesquisa binria. 11.6.2.1. PESQUISA SEQUENCIAL

89

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

A sintaxe para pesquisa seqencial : SEARCH tabela VARYING ndice AT END comandos WHEN condio Comandos. Nesta instruo, tabela o item que contem a clausula INDEXED BY. A clausula VARYING opcional e define uma variavel para mostrar o ndice da tabela. O Cobol sempre usa o indexador definido pelo INDEXED BY para as pesquisas, mas se usarmos a clausula VARYING o Cobol varia tambm a varivel ndice da clausula, que portanto ter o mesmo valor do indexador da tabela. A clausula AT END especifica os comandos que devem ser executados quando a pesquisa na tabela no teve sucesso. A clausula WHEN define realmente as condies da pesquisa, e os comandos a serem executados quando a pesquisa tiver sucesso. No caso de sucesso o indexador e o ndice da clausula VARYING estaro posicionados no elemento da tabela que satisfez as condies da clausula WHEN. Uma medida importante nas pesquisas seqenciais inicializar o indexador da tabela, geralmente com o valor 1 que representa o primeiro item da tabela, porque a instruo SEARCH inicia a pesquisa usando o valor encontrado no momento no indexador. Exemplo de comando SEARCH usando a tabela de vendas do exemplo de tabelas indexadas: SEARCH VENDAS VARYING VARIAVEL-DE-TRABALHO AT END DISPLAY ESTE MS NO TEVE VENDAS WHEN MS-VENDA (IND-VENDAS) = MS-DA-PESQUISA MOVE VALOR-VENDA (IND-VENDAS) TO ......

90

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

11.6.2.2. PESQUISA BINRIA As diferenas entre pesquisa seqencial e binria so: Na pesquisa binria a tabela deve ser definida com a clausula KEY, que definir a chave que ser usada na pesquisa. A clausula WHEN do SEARCH dever testar necessariamente o campo definido na clausula KEY da tabela. A opo ALL da sintaxe do SEARCH a opo que indica pesquisa binria. O comando SEARCH no tem a opo VARYING. A sintaxe do SEARCH em pesquisa binria : SEARCH ALL tabela AT END comandos WHEN condio Comandos. O exemplo do SEARCH para pesquisa binria : SEARCH ALL VENDAS AT END DISPLAY ESTE MS NO TEVE VENDAS WHEN MS-VENDA (IND-VENDAS) = MS-DA-PESQUISA MOVE VALOR-VENDA (IND-VENDAS) TO ...... 11.7. ALTER A instruo ALTER serve para mudar o direcionamento de uma instruo GO TO. A instruo a ser alterada deve ser a nica dentro de um paragrfo, e a alterao ocorre dinamicamente na memria quando o programa estiver sendo executado. Muitas empresas no recomendam o uso desta instruo porque ela fora o programa a executar um desvio que no esta escrito no fonte original. Por exemplo no exemplo abaixo:

91

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

PARAGR-1. GO TO PARAGR-2. ............... ALTER PARAGR-1 TO PROCEED TO PARAGR-3 ............... PARAGR-2. ............... PARAGR-3. Neste exemplo, se o programa passar alguma vez pela instruo ALTER, a instruo GO TO que aparece no PARAGR-1 funcionar como se estivesse sido escrito: GO TO PARAGR-3. 11.8. GO TO DEPENDING ON O comando GO TO pode apontar para varios paragrafos quando usado com a clausula DEPENDING ON. Para isto necessario ter um campo para servir como indexador, e o desvio ser feito para o paragrafo cuja sequencia for igual ao valor do indexador. Por exemplo: GO TO PARAGR-1 PARAGR-2 PARAGR-3 DEPENDING ON CONTADOR. O desvio ser feito para PARAGR-1, PARAGR-2 PARAGR-3 se o valor de CONTADOR for respectivamente 1, 2 ou 3. Qualquer outro valor de CONTADOR no provoca desvio do GO TO. 11.9. NOMES CONDICIONAIS Nomes condicionais (CONDITION NAMES) so recursos para atribuir nomes alternativos para variveis quando elas recebem determinados valores. Para esta atribuio, usado o nivel 88 da DATA DIVISION, como no exemplo:

92

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

77 ESTADO-CIVIL 88 88 88 SOLTEIRO CASADO DESQUITADO

PIC 9. VALUE 1. VALUE 2. VALUE 3.

Na PROCEDURE DIVISION, os testes condicionais da varivel ESTADO-CIVIL podem ser feitos agora de duas maneiras, usando o nome original da varivel ou o nome alternativo que implicitamente representa um valor da varivel. Ex.: IF ESTADO-CIVIL = 1 DISPLAY CASADOS. ou IF SOLTEIRO DISPLAY ENTRADA PROIBIDA. ESTE CLUBE E SOMENTE PRA CASADOS. Os nomes condicionais s podem ser usados em variveis de nvel elementar (que tenham a clusula PIC). 11.10. COPY O comando copy usado para copiar trechos de programa fonte que esto armazenados em bibliotecas (BOOKS) para dentro dos programas Cobol. Estes trechos de programa podem conter descries de registros de arquivos, rotinas padronizadas que devem ser repetidas em muitos programas etc. No local conveniente do programa onde dever ser copiado o BOOK basta codificar: COPY nome-do-book. ENTRADA PROIBIDA. ESTE CLUBE E SOMENTE PRA

93

Manual de Referncia: COBOL - Programao Curso de Cobol - Apresentao

12. DIAGRAMA DE BLOCO 12.1. O QUE UM DIAGRAMA DE BLOCO? O diagrama de blocos uma forma padronizada e eficaz para representar os passos lgicos de um determinado processamento. Com o diagrama podemos definir uma seqncia de smbolos, com significado bem definido, portanto, sua principal funo a de facilitar a visualizao dos passos de um processamento. 12.2. SIMBOLOGIA Existem varios tipos de simbolos utilizados na confecao de um diagrama de blocos, porem, abaixo iremos demosntras os mais utilizados: Ao Carto Perfurado Deciso

Arquivo VSAM

Arquivo Sequencial

Fita Magntica

Conector

Banco de Dados

Manuseio de arquivos

Relatrios

Incio / Fim de processo

94

Você também pode gostar