Baixe o app para aproveitar ainda mais
Prévia do material em texto
COBOL Lógica estruturada e linguagem de programação Cobol para processamento de dados de grandes empresas Edinelson Pacci Maria Edjane COBOL 2 PÚBLICO-ALVO Este material se destina à estudantes com conhecimento iniciante em raciocínio lógico para resolver problemas. OBJETIVOS 1. Capacitar os alunos na construção de programas cobol fáceis de ler, depurar, modificar e manter. 2. Treinar o pensamento lógico para construção de programas estruturados para processamento batch de dados de grandes empresas. 3. Apresentar aos alunos metodo de programação estruturada. 4. Simular o ambiente de trabalho de fábrica de programas, preparando os participantes para o mercado de trabalho na área de programação e desenvolvimento de sistemas. COBOL 3 ÍNDICE 1. INTRODUÇÃO ............................................................................................................................... 5 IDENTAÇÃO .............................................................................................................................................. 5 2. FORMATO DO FONTE COBOL ............................................................................................... 7 ÁREA DE NUMERAÇÃO SEQÜENCIAL (COLUNAS DE 1 A 6) ....................................................... 7 ÁREA DE INDICAÇÃO (COLUNA 7) ..................................................................................................... 7 ÁREA A ÁREA B (COLUNAS DE 8 A 72) ............................................................................................ 8 3. DIVISÕES DO COBOL .............................................................................................................. 9 IDENTIFICATION DIVISION................................................................................................................. 9 ENVIRONMENT DIVISION .................................................................................................................. 10 CONFIGURATION SECTION .............................................................................................................. 10 INPUT-OUTPUT SECTION .................................................................................................................. 10 DATA DIVISION ..................................................................................................................................... 11 FILE SECTION. ...................................................................................................................................... 11 WORKING-STORAGE SECTION. ...................................................................................................... 11 ESPECIFICAÇÃO PARA DADOS DE ARQUIVOS OU VÁRIAVEIS ............................................ 11 MÁSCARAS DE EDIÇÃO ...................................................................................................................... 14 BLANK WHEN ZERO ............................................................................................................................. 14 PROCEDURE DIVISION ....................................................................................................................... 16 4. COMANDOS DE REPETIÇÃO PROGRAMAÇÃO ESTRUTURADA .................... 17 PERFORM ................................................................................................................................................ 17 PERFORM PARÁGRAFO [THRU] PARÁGRAFO-FIM ................................................................................ 17 PERFORM PARÁGRAFO N TIMES .......................................................................................................... 17 PERFORM PARÁGRAFO [WITH TEST {BEFORE | AFTER}] UNTIL ............................................. 17 CONDIÇÃO .................................................................................................................................................. 17 PERFORM PARÁGRAFO [WITH TEST {BEFORE|AFTER}] VARYING ......................................... 18 CAMPO FROM N BY M .............................................................................................................................. 18 COMANDOS BASICOS .................................................................................................................... 19 ACCEPT ................................................................................................................................................... 19 DISPLAY .................................................................................................................................................. 20 MOVE ....................................................................................................................................................... 20 INITIALIZE ............................................................................................................................................. 21 EXIT .......................................................................................................................................................... 22 STOP RUN ................................................................................................................................................ 22 5. COMANDOS ARITMÉTICOS ................................................................................................ 23 ADD ........................................................................................................................................................... 23 COBOL 4 SUBTRACT .............................................................................................................................................. 24 DIVIDE ..................................................................................................................................................... 25 MULTIPLY .............................................................................................................................................. 26 COMPUTE................................................................................................................................................ 26 6. COMANDOS DE DECISÃO .................................................................................................... 28 IF ................................................................................................................................................................ 28 EVALUATE .............................................................................................................................................. 30 CONTINUE .............................................................................................................................................. 31 NEXT SENTENCE ................................................................................................................................... 31 7. COMANDOS PARA PROCESSAMENTO DE ARQUIVOS SEQUENCIAIS ......... 32 ENVIRONMENT DIVISION - INPUT-OUTPUT SECTION ........................................................... 32 DATA DIVISION - FILE SECTION. ................................................................................................... 34 PROCEDURE DIVISION ....................................................................................................................... 35 OPEN ......................................................................................................................................................... 35 READ .........................................................................................................................................................35 WRITE ...................................................................................................................................................... 36 CLOSE ...................................................................................................................................................... 36 INSTRUÇÕES FREQUENTEMENTE UTILIZADAS, TABELAS INTERNAS E FORMATOS DE DADOS .................................................................................................................. 37 COPY ......................................................................................................................................................... 37 CALL E LINKAGE SECTION ............................................................................................................... 37 CANCEL ................................................................................................................................................... 38 EXIT PROGRAM .................................................................................................................................... 38 GOBACK .................................................................................................................................................. 38 STRING ..................................................................................................................................................... 39 TABELAS INTERNAS ............................................................................................................................ 39 CLAUSULA OCCURS ................................................................................................................................ 39 NÍVEIS DE TABELAS ............................................................................................................................ 40 FORMATO ESPECIAIS DE DADOS .................................................................................................... 41 FORMATOS BINÁRIOS ........................................................................................................................ 41 CLÁUSULA USAGE................................................................................................................................ 42 USAGE COMP. ........................................................................................................................................ 43 USAGE COMP-3. ..................................................................................................................................... 43 ./ COBOL 5 1. INTRODUÇÃO O Cobol é uma linguagem de alto nível criada no ano de 1959. A palavra Cobol é uma abreviação de: COmmon Business Oriented Language Como seu nome indica, o objetivo desta linguagem é permitir o desenvolvimento de aplicações comerciais para pessoas sem conhecimento profundo de computadores. Por isso a linguagem Cobol usa frases normais da língua inglesa, e a estrutura de um programa Cobol se assemelha a um texto com divisões, parágrafos e frases em inglês. IDENTAÇÃO O processo de identação consiste em alinhar comandos, de forma que fique mais fácil ao programador que estiver analisando o código, visualizar e, por decorrência, entender o conjunto de instruções. Algumas instruções trabalham com Subconjuntos (blocos) de (outras) instruções; por meio da identação coloca-se instruções que façam parte de um mesmo bloco num mesmo alinhamento. O caso mais comum é o das instruções de teste (IF), onde normalmente existe pelo menos um bloco de instruções que deve ser executado quando a condição testada for satisfeita; e, opcionalmente, outro bloco de instruções que devem ser executadas quando a condição testada não for satisfeita, exemplo: IF condição Instruções para condição satisfeita ELSE Instruções para condição não satisfeita END-IF Visualmente facilita-se bastante se deslocar os blocos algumas posições à direita (duas ou três posições são suficientes), para que fique destacado o ELSE e o END-IF, facilitando a análise do fonte. Se a especificação fosse feita sem identação, a leitura não seria fácil. IF condição COMPUTE A = (B * C ) ** 4 ELSE COMPUTE A = (B * C ) ** 5 COMPUTE C = A / 0.015 END-IF COBOL 6 Ficaria mais difícil analisar do que se houvesse sido especificado com identação: IF condição COMPUTE A = (B * C ) ** 4 COMPUTE C = A / 0.005 ELSE COMPUTE A = (B * C ) ** 5 COMPUTE C = A / 0.015 END-IF A vantagem fica muito mais evidente quando houver IFs encadeados : Sem identação : IF condição IF condição COMPUTE A = (B * C ) ** 4 COMPUTE C = A / 0.005 ELSE COMPUTE A = (B * C ) ** 8 COMPUTE C = A / 0.055 END-IF ELSE IF conical COMPUTE A = (B * C ) ** 5 COMPUTE C = A / 0.007 ELSE COMPUTE A = (B * C ) ** 9 COMPUTE C = A / 0.007 END-IF END-IF Com identação: IF condição IF condição COMPUTE A = (B * C ) ** 4 COMPUTE C = A / 0.005 ELSE COMPUTE A = (B * C ) ** 8 COMPUTE C = A / 0.055 END-IF ELSE IF condição COMPUTE A = (B * C ) ** 5 COMPUTE C = A / 0.007 ELSE COMPUTE A = (B * C ) ** 9 COMPUTE C = A / 0.007 END-IF END-IF. COBOL 7 2. FORMATO DO 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 (instruções) dentro do seu editor de fonte. Uma linha de comando Cobol pode ter até 80 caracteres, conforme o formato abaixo: Seqüência I Área A Área B Não utilizado 1 6 7 8 11 12 72 73 80 Colunas de 1 a 6: Área de numeração seqüencial (ou comentário) Coluna 7: Área de indicação Colunas de 8 a 11: Área A Colunas de 12 a 72: Área B ÁREA DE NUMERAÇÃO SEQÜENCIAL (COLUNAS DE 1 A 6) Normalmente coloca-se comentários nesta área. ÁREA DE INDICAÇÃO (COLUNA 7) HÍFEN(-) Se o hífen estiver nesta posição indica que existe uma continuação de uma cadeia de caracteres, (uma palavra ou frase), que foi iniciada na linha anterior. Uma literal que não caiba numa linha, para que seja continuada na próxima linha, precisa ter na próxima linha a indicação da continuação (hífen na coluna 7) e, em qualquer coluna a partir da 12, um apóstrofe indicando o início da continuação. 1 A 6 7 A AREA B - ASTERISCO(*) Nesta posição indica, para o compilador COBOL, que toda a linha deve ser tratada como uma linha de comentário. 1 A 6 7 A AREA B * ESTA ROTINA CONFERE A DATA DGITADA VERIFICAR-DATA. COBOL 8 ÁREA A ÁREA B (COLUNAS DE 8 A 72) Área A: Posição a partir da qual se escreve nome de Division, Sections, parágrafos e nível 01 de grupo de dados. Área B: Posição a partir da qual se escrevem as instruções Cobol. Veja o exemplo de código fonte a seguir: Num. I A AREA B 000110 * ESTE E UM COMENTARIO PARAGRAFO-1. ADD VALOR TO LUCRO. COBOL 9 3. DIVISÕES DO COBOL De maneira semelhante a um livro com seus capítulos, parágrafos e itens, um programa Cobol é formado por uma hierarquia de Divisions, Sections, parágrafos e instruções. Uma regra importante em Cobol é que toda declaração (Instrução, Nome de parágrafo, Division ou Section), deve ser terminada por ponto final (.). O código Cobol possui quatro divisões que devem ser utilizadas nesta ordem: IDENTIFICATION DIVISION. ENVIRONMENT DIVISION.DATA DIVISION. PROCEDURE DIVISION. Como foi explicado no item anterior (Formato do fonte Cobol) a declaração das DIVISÕES devem se iniciar na área A do texto (coluna 8). IDENTIFICATION DIVISION Esta é a divisão de identificação do programa. Não contêm sections, mas somente alguns parágrafos pré-estabelecidos e opcionais. O único parágrafo obrigatório é o PROGRAM-ID (Nome do programa). O nome do programa deve ser uma palavra com até 8 caracteres (letras ou números), começando por uma letra. Esta divisão possui a seguinte estrutura: IDENTIFICATION DIVISION. PROGRAM-ID. PROGRAMA. AUTHOR. EDINELSON PACCI. Observe a utilização do ponto final (.) no fonte Cobol. Nenhum destes pontos pode ser omitido para não causar erro de compilação. COBOL 10 ENVIRONMENT DIVISION Esta divisão descreve o equipamento envolvido no programa. Possui duas SECTION e sua estrutura é a seguinte: ENVIRONMENT DIVISION. * CONFIGURATION SECTION. SOURCE-COMPUTER. Comentário. OBJECT-COMPUTER. Comentário. SPECIAL-NAMES. * INPUT-OUTPUT SECTION. FILE-CONTROL. I-O CONTROL. CONFIGURATION SECTION Esta seção destina-se a uma descrição geral do ambiente do computador. Ela é usualmente composta pelo parágrafo SPECIAL-NAMES. SPECIAL-NAMES Comandos pré-definido do Cobol separador de decimal (vírgula ou ponto) Formato: SPECIAL-NAMES. DECIMAL-POINT IS COMMA. Esta instrução informa que a vírgula (COMMA) será usada como separador de decimais. INPUT-OUTPUT SECTION Esta seção destina-se a configuração dos arquivos e será tratada no item 8. COBOL 11 DATA DIVISION A DATA DIVISION é a divisão do programa onde são definidos os dados, incluindo todas as variáveis e constantes necessárias, assim como o conteúdo dos registros dos arquivos. A DATA DIVISION é composta habitualmente por duas Sections: FILE SECTION e WORKING-STORAGE SECTION. Também existe a LINKAGE SECTION que será tratada no COBOL AVANÇADO. FILE SECTION. A FILE SECTION é a Section usada para detalhar o conteúdo dos registros dos arquivos e será tratada no item 8. WORKING-STORAGE SECTION. NA WORKING-STORAGE SECTION devemos definir todas as variáveis que o programa precisa para seu completo funcionamento. Não há parágrafos nesta Section, e os dados podem ser definidos como grupos hierárquicos (níveis 01 a 49), ou dados independentes (nível 77) em qualquer ordem, desde que não se crie um nível 77 no meio de uma hierarquia causando seu rompimento. Exemplo: WORKING-STORAGE SECTION. 77 CONTADOR PIC 999. 77 SOMA PIC 9(6)V99. 01 DATA-VENCIMENTO. 03 DIA PIC 99. 03 MES PIC 99. 03 ANO PIC 99. ESPECIFICAÇÃO PARA DADOS DE ARQUIVOS OU VÁRIAVEIS A definição de um dado em Cobol é feito com o seguinte formato: NÍVEL O nível é um número variando de 01 a 99 que define a hierarquia do dado em relação aos outros dados. Em Cobol pode-se agrupar os dados e concatená-los formando hierarquias como no exemplo abaixo: DATA-NASCIMENTO DIA-NASCIMENTO MES-NASCIMENTO ANO-NASCIMENTO Neste exemplo, DIA MÊS E ANO de NASCIMENTO são partes integrantes da DATA-NASCIMENTO. Em Cobol, os níveis de 01 a 49 podem ser usados para especificar estas hierarquias, onde um valor maior significa dependência. O exemplo acima acrescido dos níveis seria: Nível identificador-1 Formato Valor-inicial COBOL 12 03 DATA-NASCIMENTO 05 DIA-NASCIMENTO 05 MES-NASCIMENTO 05 ANO-NASCIMENTO Os níveis de 50 a 99 têm uso específico, reservado para futuras expansões do Cobol. Atualmente usam-se dois níveis nesta faixa: Nível 77- usado quando o dado não tem hierarquia (item independente). Nível 88 usado para nomes condicionais. Será explicado no Cobol Avançado De todos estes níveis, somente o nível 01 e o nível 77 podem ser codificados na margem A do fonte Cobol (coluna 8). Os outros níveis devem ser codificados na margem B (coluna 12). O Cobol exige também que toda a hierarquia de um grupo de itens comece com um item de nível 01. A partir dele, cada nível subordinado deve ter o mesmo número, por exemplo, se para o segundo nível for escolhido o número 3 todos os itens do segundo nível devem ter nível 03, e se para o terceiro nível for escolhido o número 10, todos os itens do terceiro nível devem ser especificado com o nível 10. NOME-DO-DADO Qualquer palavra, pode ter no máximo 30 caracteres, incluindo letras, números e hífen, sendo que pelo menos um dos caracteres deve ser letra. Quando um campo criado na DATA DIVISION não for referenciado em nenhum comando do programa, não será necessário criar um nome-do-dado para este campo, e neste caso usa-se a palavra FILLER como nome-do-dado deste campo. A palavra FILLER é o nome padrão para identificar campos anônimos. FORMATO DO DADO O formato dos dados em Cobol é especificado pela palavra reservada PICTURE, ou pela sua abreviação PIC. Os formatos são descritos usando uma das 3 letras seguintes: 9 O dado é numérico. X O dado é alfa-numérico, e pode conter letras, números e outros caracteres. A O dado é alfabético, e contem somente letras e espaços. A quantidade de caracteres contidos no dado é especificado no Formato repetindo-se as letras acima. Por exemplo, se o item QUANT-PROD tem 5 algarismos, seu formato será: 77 QUANT-PROD PIC 99999. Pode-se abreviar esta repetição colocando o número de repetições entre parênteses: 77 QUANT-PROD PIC 9(5). COBOL 13 Representando a letra do formato (A, X, ou 9) pela letra F, e o número de caracteres da variável no campo por n, a sintaxe do formato será a seguinte: Quando um item numérico tiver casas decimais, não se carrega na memória do computador o separador decimal (vírgula), porque os circuitos de cálculo do computador não foram projetados para operar com a vírgula. Se o item VALOR-PROD tiver por exemplo o valor de 2,35, seu valor fica na memória como 235. Mas o programa Cobol precisa saber em que posição estava a vírgula que desapareceu (vírgula implícita). A vírgula implícita é definida no formato pela letra V, como abaixo: 77 VALOR-PROD PIC 99999V99. Ou 77 VALOR-PROD PIC 9(5)V99. Em um grupo de itens contidos em uma hierarquia (com níveis de 01 a 49) só podem ter a cláusula PIC os itens no nível mais baixo da hierarquia (itens elementares). Ex.: 01 FUNC. 03 NASCIMENTO. 05 MÊS PIC 99. 05 ANO PIC 99. 03 ENDERECO. 05 RUA PIC X(20). 05 NÚMERO PIC 9999. A linguagem Cobol suporta itens numéricos com até 18 algarismos, e itens alfanuméricos até 32.768 caracteres (dependendo do sistema operacional). Existem ainda formatos especiais da PIC para itens a serem impressos, que serão vistos mais adiante. VALOR-INICIAL Esta cláusula é opcional em Cobol. Seu objetivo é definir um valor para o item quando o programa se inicia. Se ela for omitida, o item correspondente terá valores imprevisíveis. No caso de um item que irá conter uma totalização, por exemplo, é conveniente que ele comece com o valor zero. O valor-inicial é definido em Cobol pelo formato: Em Cobol existem 2 tipos de literal: numérico e alfa-numérico. Os literais numéricos são escritos colocando-se diretamente o valor na instrução. Ex.: 77 IDADE-MINIMA PIC 99 VALUE 18. VALUE literal.PIC F(n). COBOL 14 Os literais alfas-numéricos devem ser colocados entre aspas simples 77 NOME- Não se pode misturar em um programa Cobol o uso de aspas simples com aspas duplas, ou seja, se um programa começou a ser escrito com aspas simples, deve-se usar aspas simples em todo o programa. Os literais alfas-numéricos em Cobol podem ter no máximo 120 caracteres. Pode-se usar ainda como valor-inicial as CONSTANTES FIGURATIVAS, como por exemplo ZEROS, SPACES, LOW-VALUES ou HIGH-VALUES. ZEROS O item (deve ser numérico) será preenchido com algarismos 0 (zero). SPACES O item (deve ser alfabético ou alfa-numérico) será preenchido com espaços. LOW-VALUES (menor valor) Indica que este item na memória deve ter todos os seus bytes com todos os bits desligados. HIGH-VALUES - (maior valor) Indica que este item na memória deve ter todos os seus bytes com todos os bits ligados. MÁSCARAS DE EDIÇÃO A cláusula PICTURE (ou PIC) tem alguns formatos próprios para fazer edição de variáveis numéricas no momento de uma impressão que são mostrados na tabela abaixo: PICTURE VALUE IMPRESSÃO $ZZZZ9,99 2 $ 2,00 $$$$$9,99 2 $2,00 R$****9,99 2 $*****2,00 +ZZZZ9,99 -2 - 2,00 --------9,99 -2 -2,00 ++++9,99 -2 -2,00 ++++9,99 +2 +2,00 ZZ.ZZ9,99+ -2002 2.002,00- 99/99/99 020304 02/03/04 99B99B99 020304 02 03 04 BLANK WHEN ZERO Esta cláusula, usada após a máscara de edição da PICTURE, envia espaços em branco para a impressora quando a variável numérica a ser impressa tem valor zero, independente do formato da máscara. Exemplo: 03 VALOR PIC ZZ.ZZ9,99 BLANK WHEN ZERO. COBOL 15 IMPORTANTE : 1. Para campos numéricos (PIC 9) pode-se opcionalmente colocar a indicação de sinal: PIC 9(03) ou PIC S9(03). 2. Se não for especificado sinal, o campo será SEMPRE tratado como se tivesse número positivo. Exemplo: se a variável WCALC for definida com PIC 9(03) e contiver zero, se subtrairmos 1, ela passará a ter o número 1 positivo (é sempre forçado sinal positivo após uma operação aritmética) 3. Se for especificado sinal, o campo será SEMPRE tratado conforme os números relativos. Exemplo: se a variável WCALC for definida com PIC S9(03) e contiver zero, se subtrairmos 1, ela passará a ter o número 1 negativo 4. Máximo de 18 algarismos num campo numérico, incluindo parte inteira e decimal COBOL 16 PROCEDURE DIVISION Esta divisão controla a execução do programa, e é onde colocamos os comandos oriundos do algoritmo planejado pelo programador (lógica). Os comandos (instruções) do Cobol são formados por um único verbo da língua inglesa, seguido dos parâmetros necessários, e que serão discutidos um a um nos parágrafos seguintes. As instruções de um programa Cobol podem ser reunidas em parágrafos, e estes em seções, definidas pelo programador com o fim de tornar o programa mais fácil de ser entendido. Exemplo: ******* INICIO PROCEDIMENTOS DO PROGRAMA ********** PROCEDURE DIVISION. ROTINA-PRINCIPAL SECTION. INICIO. PERFORM INICIALIZAR. PERFORM PROCESSAR. PERFORM FINALIZAR. FIM-ROTINA-INICIAL. EXIT PROGRAM. STOP RUN. ***************** SEÇÃO INICIALIZAR *************** INICIALIZAR SECTION. ... ... INICIALIZAR-FIM. EXIT. ***************** SEÇÃO PROCESSAR *************** PROCESSAR SECTION. ... ... PROCESSAR-FIM. EXIT. ***************** SEÇÃO FINALIZAR *************** FINALIZAR SECTION. ... ... FINALIZAR-FIM. EXIT. COBOL 17 4. COMANDOS DE REPETIÇÃO PROGRAMAÇÃO ESTRUTURADA Como vimos em Lógica de programação, os programas devem ser Estruturados. Programas bem projetados e estruturados são aqueles que possuem uma série de construções lógicas, em que a ordem na qual as instruções são executadas é padronizada. Em programas estruturados, cada conjunto de instruções que realiza uma função específica é definido em uma rotina ou, em COBOL, um parágrafo. Ele consiste em uma série de instruções relacionadas entre si, em programação estruturada, os parágrafos são executados por meio da instrução PERFORM. PERFORM A instrução PERFORM permite que o controle passe temporariamente para um parágrafo diferente e depois retorne para o parágrafo original do qual a instrução PERFORM foi executada. Há dois tipos de instrução PERFORM. 1. PERFORM OUT LINE: PROCEDURE-NAME é especificado, ou seja, é dado um PERFORM em um PARÁGRAFO ou SECTION. 2. PERFORM IN LINE: As instruções estão logo abaixo do comando PERFORM. Deve ser delimitado pela frase END- PERFORM. Há 4 Formatos de PERFORM. 1. PERFORM básico 2. PERFORM com opção TIMES 3. PERFORM com opção UNTIL 4. PERFORM com opção VARYING UNTIL Formato 1: PERFORM parágrafo [THRU] parágrafo-fim A opção THRU é opcional e pode também ser utilizado nos demais formatos. Exemplo 1.1: PERFORM INICIALIZAR. PERFORM PROCESSAR THRU PROCESSAR-FIM. Formato 2: PERFORM parágrafo N TIMES O parágrafo referido é executado N TIMES, onde N pode ser uma constante ou variável numérica. Exemplo 2.1: PERFORM com opção TIMES (OUT-LINE) 20-00-CALCULA-TOTAL. MOVE ZEROS TO WS-TOTAL PERFORM 25-00-CÁLCULO 3 TIMES. 20-99-EXIT. EXIT. Formato 3: PERFORM parágrafo [WITH TEST {BEFORE | AFTER}] UNTIL condição O parágrafo referido é executado até que a condição especificada pela opção UNTIL seja verdadeira. COBOL 18 Tipo de teste que é efetuado no comando PERFORM UNTIL: o WITH TESTE BEFORE (omitido assume como padrão). Caracteriza um DO WHILE. É realizado inicialmente o teste da condição UNTIL declarada, antes mesmo da seqüência de instruções ser executada. o WITH TEST AFTER (somente assume se declarado). Caracterizando um REPEAT UNTIL. Isso assegura que a seqüência de instruções declaradas é executada pelo menos uma vez. Exemplo 3.1. PERFORM com opção UNTIL (OUT-LINE) 00-00-MAIN-LINE. PERFORM INICIALIZAR PERFORM 10-00-PROCESSAR UNTIL WS- PERFORM FINALIZAR. 00-00-EXIT. EXIT. Exemplo 3.2. PERFORM com opção UNTIL (IN-LINE) 00-00-MAIN-LINE. PERFORM INICIALIZAR PERFORM LER-ARQUIVO PERFORM UNTIL WS- IF WS-LIN > 50 PERFORM ROT-CABECALHO. PERFORM ROT-DETALHE PERFORM LER-ARQUIVO END-PERFORM. PERFORM FINALIZAR. 00-00-EXIT. EXIT. Formato 4: PERFORM parágrafo [WITH TEST {BEFORE|AFTER}] VARYING campo FROM n BY m UNTIL condição Executa o parágrafo especificado, até que a condição especificada seja satisfeita. Antes de executar o bloco de instruções pela primeira vez, atribui o valor N a variável CAMPO. Após cada execução do bloco, antes de voltar a executá-lo, incrementa M à variável CAMPO. Opção WITH TESTE {BEFORE | AFTER} segue a mesma regra do formato 3. Exemplo 4.1. PERFORM com opção VARYING (OUT-LINE) 10-00-PROCESSAR. PERFORM ROT-CABECALHO. PERFORM ROT-DETALHE VARYING WS-LIN FROM 1 BY 1 UNTIL WS-LIN = 60 ... ROT-DETALHE. PERFORM IMPRIMIR-DETALHE. PERFORM LER-ARQUIVO. COBOL 19 Exemplo 4.2. PERFORM com opção VARYING (IN-LINE) 00-00-MAIN-LINE. PERFORM INICIALIZAR PERFORM LER-ARQUIVO PERFORM UNTIL WS- PERFORM ROT-CABECALHO PERFORM VARYING WS-LIN FROM 1 BY 1 UNTIL WS-LIN = 60 PERFORM IMPRIMIR-DETALHE PERFORM LER-ARQUIVO END-PERFORM END-PERFORM. PERFORM FINALIZAR. COMANDOS BASICOS ACCEPT O Cobol foi desenvolvido originalmente para processar arquivos de dados e ainda é usado, com esta finalidade. Entretanto,em muitas vezes existe a necessidade de interação com o operador. Usamos o comando (verbo) ACCEPT para fornecer os dados de entrada por meio de um cartão DD do JCL (tratado no programa Cobol como SYSIN). O comando ACCEPT recebe do dispositivo de entrada padrão SYSIN (cartão //DDSYSIN DD *) ou informações do sistema contidas em um registrador especial (DATE, DAY, DAY-OF-WEEK ou TIME). Formato: [SYSIN ] [DATE ] ACCEPT identificador-1 [FROM [DAY ]] [DAY-OF-WEEK ] [TIME ] Obs: Quando a opção FROM é omitida o padrão FROM SYSIN é assumido. Regras: SYSIN Cada vez que o programa Cobol passa pela instrução ACCEPT, uma linha da SYSIN do JCL é carregada na variável CAMPO. É necessário prever com cuidado quantas linhas terá a SYSIN do JCL, porque se o comando ACCEPT não encontrar uma linha para carregar na sua variável, o sistema operacional emitirá uma mensagem de erro para o operador e o programa ficará suspenso até a intervenção do operador. DATE Tem implícito PIC 9(06) Formato YYMMDD- data gregoriana 20/12/2005 será expresso como 051220 DAY Tem implícito PIC 9(05) Formato YYDDD- data Juliana 04/07/1981 será expresso como 81185 COBOL 20 DAY-OF-WEEK Tem implícito PIC 9(1), onde: 1 = Segunda-feira, 2 = terça-feira, 3 = quarta feira,4 = quinta-feira, 5 = sexta-feira, 6 = sábado, 7 = domingo. TIME Tem implícito PIC 9(08) Formato HHMMSSCC Hora, minuto, segundo, centésimos. 2:41 da tarde será expresso como 14410000 Exemplos: ACCEPT RESPOSTA FROM SYSIN Lê um registro lógico em SYSIN e coloca-o na variável denominada RESPOSTA WORKING-STORAGE SECTION. 05 WS-DATE PIC 9(06). 05 WS-TIME PIC 9(08). ... ACCEPT WS-DATE FROM DATE. ACCEPT WS-TIME FROM TIME. DISPLAY Exibe conteúdo de campo(s) num dispositivo de saída. Normalmente é o dispositivo cujo DDNAME é SYSOUT. Formato: DISPLAY [identificador-1 | literal-1] ... Exemplos: DISPLAY "PROGRAMA INICIANDO............. " DISPLAY "TOTAL REGISTROS LIDOS.........: " WS-REGLIDOS DISPLAY "TOTAL REGISTROS GRAVADOS..: " WS-REGGRAV DISPLAY WS-SQLCODE DISPLAY WS- - -ANO MOVE A instrução MOVE transfere dados de uma área de memória para uma ou mais áreas. Alinhamento alfabético/alfa-numérico Os dados são acomodados no campo receptor alinhando-se da esquerda para a direita. Se o campo emissor for maior que o receptor, os BYTES mais a direita, em excesso, serão truncados no campo receptor. Se o emissor for menor que o receptor os BYTES faltantes para preencher o campo receptor serão preenchidos com SPACES. Alinhamento Numérico Os dados são acomodados no campo receptor alinhando-se da direita para a esquerda. Se o campo emissor for maior que o receptor os BYTES mais a direita do campo emissor serão truncados. Os campos: EMISSOR e RECEPTOR podem ser itens de grupo ou elementares. Formato: MOVE ALL {identificador-1 | literal-1} TO {identificador-2 ...} COBOL 21 Exemplos: MOVE WS-NUM-PAG TO NUM-PAG-REL. MOVE WS-CODCLI-ARQ TO WS-CODCLI-AUX, COD-CLI-REL. MOVE ZEROS TO WS-ACUM-VALOR, WS-TOT-PAG, WS-ACUM-COMISSAO. MOVE TO WS-FIM-ARQ. M TO WS-FIM-ARQ. Exemplos de MO Comando Campo emissor (constante figurativa) Campo receptor formato Conteúdo do campo receptor após o MOVE MOVE ZERO TO TOTSAL ZERO PIC 9(5) 00000 MOVE ZEROS TO TOTSAL ZEROS PIC 9(5) 00000 MOVE ZEROES TO TOTSAL ZEROES PIC 9(5) 00000 MOVE SPACE TO SIGLA SPACE PIC X(02) 4040 (em Hexa decimal) MOVE SPACES TO SIGLA SPACES PIC X(02) 4040 (em Hexa decimal) MOVE HIGH-VALUE TO CHAVE-ARQUIVO HIGH-VALUE PIC X(03) FFFFFF (em Hexa decimal) MOVE LOW-VALUE TO CHAVE-ARQUIVO LOW-VALUE PIC X(03) 000000 (em Hexa decimal) -MSG PIC X(05) ***** WS_MSG PIC X(05) *A*A* ZEROS O item (deve ser numérico) será preenchido com algarismos 0 (zero). SPACES O item (deve ser alfabético ou alfa-numérico) será preenchido com espaços. LOW-VALUES - indica que este item na memória deve ter todos os seus bytes com todos os bits desligados. Um item nestas condições terá o menor valor possível em todas as comparações. HIGH-VALUES - indica que este item na memória deve ter todos os seus bytes com todos os bits ligados. Um item nestas condições terá o maior valor possível em todas as comparações. INITIALIZE Efetua a inicialização (atribuição de valores) de uma variável (ou um conjunto de variáveis). Como default variáveis numéricas são inicializadas com zeros e variáveis alfas-numéricas são inicializadas com espaços. Se a variável especificada for um item de grupo, todos os seus sub-itens serão inicializados de acordo com seu formato: os que forem numéricos, serão inicializados com zero (respeitando-se seu formato : zonado, compactado ou binário) ; se a variável for alfa-numérica ou alfabética, ela será inicializada com espaços. Da mesma forma, se a variável tiver a cláusula OCCURS, todas as suas ocorrências serão inicializadas. Pode-se especificar um conteúdo alternativo para a inicialização, através da cláusula REPLACING. Formato: COBOL 22 INITIALIZE variável [ REPLACING [NUMERIC | ALPHABETIC] DATA BY literal/variável] Exemplos: INITIALIZE AREA-DE-VALORES, WS-ACUM-VALOR EXIT A instrução EXIT provê um ponto de encerramento comum para uma serie de parágrafos. A instrução EXIT não tem efeito na compilação nem na execução do programa, é portanto, usado com a finalidade de documentar o programa. Formato: EXIT Exemplo: PROCEDURE DIVISION 00-00-MAIN-LINE. PERFORM INICIALIZAR. PERFORM PROCESSAR. PERFORM FINALIZAR. 00-99-FIM. EXIT. STOP RUN A instrução STOP RUN encerra a execução do programa. Formato: STOP RUN Exemplo: PROCEDURE DIVISION 00-00-MAIN-LINE. PERFORM INICIALIZAR. PERFORM PROCESSAR. PERFORM FINALIZAR. 00-99-FIM. EXIT. STOP RUN. COBOL 23 5. COMANDOS ARITMÉTICOS As instruções para efetuar cálculos aritméticos em Cobol são: ADD(somar), SUBTRACT(subtrair), MULTIPLY(multiplicar), DIVIDE(dividir) e COMPUTE(calcular). Formato básico para instruções aritméticas: Instrução aritmética [ ROUNDED ] [END-...] Opção ROUNDED Para obter resultados arredondados, a opção ROUNDED pode ser especificada em qualquer instrução aritmética. Em todos os casos, ela vem imediatamente após o nome de dados resultante. O Cobol faz um arredondamento clássico para o resultado da instrução aritmética (valores menores que 5 são truncados, e os maiores são arredondados para cima). Exemplo: ADD WS-VALOR1 TO WS-VALOR2 ROUNDED Opção ON SIZE ERROR Quando a variável que recebe o resultado da operação aritmética não tem tamanho suficiente para conter o resultado, o Cobol trunca o valor resultante (o valor perde algarismos à esquerda), e o Cobol não emite avisos ou código de erro. Para que se possa detectar esta situação é necessário codificar na instrução aritmética a clausula ON SIZE ERROR, onde podemos colocar uma mensagem de erro, parar o programa ou desviar para um parágrafo especial de tratamento de erro. Exemplo: ADD VALOR-1 TO VALOR-2 ON SIZE ERROR -FLAG-ESTOURO. Opção END- Visando permitir uma programação estrutura, todas as instruções aritméticas do Cobol permitem terminador de escopo. ADD Acumula dois ou mais operandos numéricos e armazena resultados. Formato: ADD { identificador-1 ... literal-1 ...} TO | GIVING { identificador-de-resultado... } Regras: 1. Todos os literais e campos que são parte da adição devem ser numéricos. Após a palavra GIVING, contudo, o campo pode ser um item de relatório. 2. O campo identificador-de-resultado, após TO ou GIVING, deve ser um nome de dados, e não um literal. 3. Pelo menos dois operandos deverão anteceder a palavra GIVING. 4. Ao usar TO, o conteúdo inicial do identificador-de-resultado, que deve ser numérico, é somado junto ao dos outros campos (identificador-1 ... literal-1...). COBOL 24 5. Ao usar o formato GIVING, o campo identificador-de-resultado receberá a soma, mas seu conteúdo inicial não será parte da instrução ADD. Ele pode ser tanto um campo numérico como um item de relatório. Exemplos: ADD WS-VALOR TO WS-AC-TOTAL. Efetua: WS-AC-TOTAL = WS-AC-TOTAL + WS-VALOR. ADD WS-VALOR TO WS-AC-TOTAL1 WS-AC-TOTAL2. Efetua: WS-AC-TOTAL1 = WS-AC-TOTAL1 + WS-VALOR. Efetua: WS-AC-TOTAL2 = WS-AC-TOTAL2 + WS-VALOR. ADD WS-AC-TOTAL1, WS-AC-TOTAL2, WS-AC-TOTAL3 TO WS-AC-TOTGERAL. Efetua: WS-AC-TOTGERAL = WS-AC-TOTGERAL + WS-AC-TOTAL1 + WS-AC-TOTAL2 + WS-AC-TOTAL3. ADD WS-VALOR1 WS-VALOR2 GIVING WS-AC-VALOR. Efetua: WS-AC-VALOR = WS-VALOR1 + WS-VALOR2. SUBTRACT Subtrai um ou mais operandos numéricos e armazena resultados. Formato 1: SUBTRACT { identificador-1 ... literal-1 ...} FROM identificador-de- Formato 2: SUBTRACT { identificador-1 ... literal-1 ...} FROM identificador-2 literal-2 GIVING identificador-de-resultado ... Regras: 1. Observe a colocação das reticências (...) no Formato 1. O primeiro conjunto depois do identificador-1 significa que dois ou mais operandos podem ser subtraídos do identificador-2. Além disso, os operandos podem ser subtraídos do identificador-de-resultado-1, do identificador-resultado-2, e assim por diante. 2. Com o Formato 2, pode vir qualquer número ou identificadores imediatamente após a palavra SUBTRACT ou a palavra GIVING, mas depois da palavra FROM é permitido um único identificador ou literal. 3. Todos os literais e campos que são parte da instrução SUBTRACT devem ser numéricos. Depois da palavra GIVING, contudo, o campo pode ser um item de relatório. 4. O campo identificador-de-resultado, após FROM ou GIVING, deve ser um nome de dados, e não um literal. 5. Ao usar o formato GIVING, o campo identificador-de-resultado receberá o resultado da subtração, mas seu conteúdo inicial não será parte da instrução SUBTRACT. Ele pode ser tanto um campo numérico como um item de relatório. COBOL 25 Exemplos: SUBTRACT VL-CHEQUE FROM SALDO. Efetua: SALDO = SALDO VL-CHEQUE. SUBTRACT VL-CHEQUE FROM SALDO GIVING SALDO-ATUAL Efetua: SALDO-ATUAL = SALDO VL-CHEQUE. DIVIDE Efetua uma divisão, disponibilizando o quociente e, se indicado, o resto. Formato 1: DIVIDE {(divisor)identificador-1 literal-1} INTO {(dividendo)identificador-2 literal-2} GIVING identificador-de- [ REMAINDER identificador-de-resto ] Formato 2: DIVIDE {(dividendo)identificador-1 literal-1} BY {(divisor)identificador-2 literal-2} GIVING identificador-de-resultado ... [ REMAINDER identificador-de-resto ] Regras: 1. Observar que GIVING é opcional com INTO, mas obrigatório com BY. 2. No formato 1, quando a opção GIVING não é utilizada o resultado da divisão é colocado dentro do indentificador logo após a palavra INTO. 3. A opção REMAINDER é utilizada quando se faz necessário guardar o resto da divisão em outro identificador. Exemplos: DIVIDE 2 INTO WS-NÚMERO Efetua WS-NÚMERO = WS-NÚMERO / 2 DIVIDE WS-VL-DOLAR INTO WS-VL-REAIS GIVING WS-RESULT Efetua WS-RESULT = WS-VL-REAIS / WS-VL-DOLAR DIVIDE WS-NUM BY 2 GIVING WS-RESULT REMAINDER WS-RESTO Efetua WS-RESULT = WS-NUM / 2 (resto em WS-RESTO) COBOL 26 MULTIPLY Efetua a multiplicação entre variáveis Formato: MULTIPLY {identificador-1 literal-1} BY {identificador-2 literal-2} GIVING identificador-de-resultado ... [END-MULTIPLY] ] Regras: 1. Observe a colocação das reticências (...). O resultado será armazenado em todos os identificadores-de-resultado após GIVING. Exemplos: MULTIPLY 2 BY VALOR ROUNDED Efetua VALOR = 2 * VALOR (com arredondamento) MULTIPLY VALOR BY 2 GIVING DOBRO Efetua DOBRO = VALOR * 2 MULTIPLY 2 BY VALOR GIVING DOBRO Efetua DOBRO = 2 * VALOR COMPUTE Com a instrução COMPUTE, as operações aritméticas podem ser combinadas sem as restrições impostas para o campo receptor quando é usado ADD, SUBTRACT, MULTIPLY e DIVIDE. Quando as operações aritméticas são combinadas, a instrução compute é mais eficiente que as instruções aritméticas escritas em serie. Formato: COMPUTE identificador-de-resultado [ROUNDED] = Intrução-aritmética [ [NOT] ON SIZE ERROR instrução-imperativa] Regras: 1. A opção ROUNDED e ON SIZE ERROR segue a mesma regra utilizada para expressões aritméticas. 2. Os símbolos que podem ser utilizados em uma instrução COMPUTE, conforme sua ordem de prioridade de execução, são: ( ) Parênteses ** Exponenciação * Multiplicação / Divisão + Adição - Subtração 3. O sinal de igual, assim como os símbolos aritméticos, devem ser precedidos e seguidos de um espaço. Assim, para calcular B+C+D**2 e colocar o resultado em A, use a seguinte instrução: COMPUTE A = B + C + D ** 2. O parêntese não é obrigatório ser seguido de espaço. COBOL 27 4. A ordem em que são executadas as operações em uma expressão aritmética que contenha mais de um operador segue a seguinte prioridade de hierarquia. 1 º ( ) Expressões dentro de parênteses 2 º Exponenciação 3 º Multiplicação, divisão 4 º Adições e Subtrações Quando houver operadores de mesma hierarquia, eles serão executados da esquerda para a direita. Exemplos: COMPUTE WS-RESULT ROUDEND = (AA + BB) / CC COMPUTE WS-RESULT = (((AA + BB) / CC) / DD) * (EE ** 2) A fórmula A = B² + C² ficará em Cobol da seguinte forma: COMPUTE A = (B ** 2 + C ** 2) ** (0,5). COBOL 28 6. COMANDOS DE DECISÃO IF Efetua teste de condições especificadas, e efetua os desvios necessários de acordo com o resultado. A base para identificar os pontos de desvio é o PONTO, o ELSE ou o END- IF. PONTO e END-IF indicam o fim da especificação da instrução; as instruções que estão após o PONTO e o END-IF, portanto, são executadas tanto para os casos de condição satisfeita quanto para os casos de condição não satisfeita. Formato: IF CONDIÇÃO instruções (para condição verdadeira) [ELSE instruções (para condição não verdadeira) END IF] CONDIÇÃO Pode ser uma condição simples ou complexa. A Tabela de operadores lógicos e relacionais abaixo, pode ser utilizada para combinar a condição a ser testada. Descrição Símbolo Em COBOL Igual = EQUAL Diferente NOT = NOT EQUAL Maior que > GREATER Menor que < LESS Maior ou igual a NOT < NOT LESS Menor ou igual a NOT > NOT GREATER OPERADOR DESCRIÇÃO Not "NÃO": Inverte o valor de um operando. Se o operando é verdadeiro o resultado será falso. Se o operando é falso o resultado será verdadeiro. And "E": Se os dois operandos são verdadeiros, o resultado será verdadeiro. Se um dos dois operandos é falso, o resultado será falso. Or "OU": Se os dois operandos são falsos, o resultado será falso. Se um dos dois operandos é verdadeiro, o resultado será verdadeiro. COBOL 29 CategoriasSímbolo Notação alternativa Teste de sinal IS POSITIVE IS NEGATIVE IS ZERO Teste de classe IS NUMERIC IS ALPHABETIC INSTRUÇÕES Podem ser uma das seguintes condições: - Uma instrução imperativa - Uma instrução condicional - Uma instrução imperativa seguida pôr uma instrução condicional. ELSE Se a avaliação da condição for verdadeira, será executado a instrução antes do ELSE. Se a avaliação testada for falsa, será executada a instrução entre o ELSE e o END-IF. IF sem ELSE Se a avaliação da condição for verdadeira, será executada a instrução entre o IF e o END-IF. Exemplo 1: (IF SEM ELSE) IF WS-CAMPO1 EQUAL WS-CAMPO-2 PERFORM 10-00-PESQUISA END-IF Exemplo 2: (IF COM ELSE) IF WS-CAMPO1 < WS-CAMPO-2 ADD 1 TO WAC-CAMPO3 ELSE COMPUTE WS-TOTAL = WS-VALOR1+ WS-VALOR2 END-IF Exemplo 3: (IF COM NEXT SENTENCE) IF WS-CAMPO1 > WS-CAMPO-2 NEXT SENTENCE ELSE ADD WS-CAMPO4 TO WS-TOTAL END-IF Exemplo 4: (NINHOS DE IF) IF WS-CAMPO1 = WS-CAMPO-2 -CAMPO3 IF WS-CAMPO < WRK-CAMPO4 ADD 1 TO WS-CAMPO PERFORM 15-00-SITUAÇÃO1 END-IF IF WS-CAMPO5 > WS-CAMPO6 COBOL 30 PERFORM 15-00-SITUAÇÃO2 ELSE IF WS-CAMPO7 EQUAL NEXT SENTENCE ELSE PERFORM 20-00-SITUAÇÃO3 END-IF END-IF END-IF EVALUATE Faz a comparação de uma variável contra os valores indicados, efetuando as instruções correspondentes. A instrução EVALUATE é uma notação abreviada para ninho programação estruturada. Formato: EVALUATE variável WHEN identificador-1 THRU identificador- Instrução-imperativa- [WHEN OTHER instrução-imperativa-2] END-EVALUATE Exemplo: EVALUATE SIGLA-UF WHEN 'SP' DISPLAY 'SÃO PAULO' WHEN 'PR' DISPLAY 'PARANA' WHEN 'SC' DISPLAY 'SANTA CATARINA' WHEN 'RS' DISPLAY 'RIO GRANDE DO SUL' WHEN OTHER DISPLAY 'OUTRO ESTADO' END-EVALUATE. EVALUATE WS-SALDO WHEN ZEROS THRU 10000 WHEN 10001 THRU 20000 D WHEN > 20000 - END-EVALUATE. COBOL 31 CONTINUE A instrução CONTINUE permite que seja especificado um desvio de um bloco nulo. Esta instrução indica que nenhuma instrução executável condicional ou imperativa pode ser usada. Formato: CONTINUE Exemplo: IF A > B CONTINUE ELSE END-IF. NEXT SENTENCE Efetua um desvio para a próxima sentença (o início dela é identificado pelo próximo ponto ou END-comando ) Formato: NEXT SENTENCE Exemplos: IF A > B NEXT SENTENCE ELSE DI END-IF. COBOL 32 7. COMANDOS PARA PROCESSAMENTO DE ARQUIVOS SEQUENCIAIS Quando o programa precisa gravar ou ler dados em ARQUIVOS precisamos incluir em nossos programas a estrutura para tratamento desses arquivos. Os arquivos devem ser declarados na INPUT-OUTPUT SECTION (ENVIRONMENT DIVISION), com a instrução SELECT. Os conteúdos do arquivo devem ser descritos na FILE SECTION (DATA DIVISION) com a instrução FD. Na PROCEDURE DIVISION é necessário programar as instruções para gravar ou ler estes arquivos. ENVIRONMENT DIVISION - INPUT-OUTPUT SECTION Esta seção destina-se a configuração dos arquivos que o programa usa. FILE-CONTROL Cláusula SELECT Neste parágrafo devemos especificar cada um dos arquivos que o programa irá acessar. No parágrafo FILE-CONTROL, usado para definir arquivos, usamos uma instrução SELECT para cadastrar no programa cada um dos arquivos usados pelo programa. O formato da instrução SELECT é o seguinte: Formato: SELECT nome-arquivo-lógico ASSIGN TO nome-arquivo-fisico [FILE STATUS IS identificador-1] Regras: Nome-arquivo-lógico: Nome que será tratado internamente pelo programa. Nome-arquivo-fisico: Deve especificar o nome do arquivo que será grafado fisicamente no sistema operacional. No caso de programação Mainframe, deve-se usar a mesma palavra que será empregada no JCL (comandos de execução do programa), para especificar o arquivo quando o programa for executado. Idenficiador-1, representa o nome da variável, no programa cobol, que vai receber o resultado de acesso ao arquivo. A variável do FILE STATUS do arquivo deve estar definido no programa Cobol, conforme exemplo abaixo: 01 FS-FILE-STATUS. 05 FS-CADAGE PIC X(002) VALUE SPACES. 05 FS-CADMEDIA PIC X(002) VALUE SPACES. COBOL 33 FILE STATUS PARA ARQUIVO SEQUENCIAL A boa prática de programação sugere que todos os comandos para processamento de arquivos na PROCEDURE DIVISION devem ser seguidos de um teste na variável FILE STATUS para verificar possíveis erros. A variável FILE STATUS pode retornar um dos valores abaixo: STATUS SIGNIFICADO '00' 'SUCCESSFUL COMPLETION' '10' 'END OF FILE' '35' '35' 'OPEN, FILE NOT PRESENT' '39' 'OPEN, FILE ATTRIB CONFLICTING' '41' 'OPEN, FILE IS OPEN' '42' 'CLOSE, FILE IS CLOSED' '46' 'SEQUENTIAL READ WITHOUT POSITIONING' '47' 'READING FILE NOT OPEN AS INPUT/IO/EXTEND' '48' 'WRITE WITHOUT OPEN IO' '9x' 'PERMISSION NOT OK' Exemplo: No exemplo abaixo mostramos uma ENVIRONMENT DIVISION de um programa que irá acessar um arquivo CLIENTES. * ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. DECIMAL-POINT IS COMMA. * INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT CLIENTES ASSIGN TO CLIENTES FILE STATUS IS FS-CLIENTES. * Neste exemplo escolhemos como nome-arquivo-lógico dentro da instrução SELECT a palavra CLIENTES. O programador pode usar qualquer palavra com até 30 caracteres para definir este nome, mas uma vez definido um nome-arquivo-lógico na instrução SELECT, deverá usar sempre este nome no programa quando se referir a este arquivo. COBOL 34 DATA DIVISION - FILE SECTION. A FILE SECTION é a Section usada para detalhar o conteúdo dos registros dos arquivos que o programa irá ler/gravar. Vimos anteriormente, na INPUT-OUTPUT SECTION (ENVIRONMENT DIVISION), que para cada arquivo a ser tratado no programa havia uma instrução SELECT especificando e definindo um nome para o arquivo. Na FILE SECTION precisamos agora detalhar cada um destes arquivos. Isto é feito usando o parágrafo padrão FD FILE DESCRIPTION. FD (FILE DESCRIPTION) FD nome-do-arquivo RECORDING MODE IS F LABEL RECORD [STANDARD | OMITTED] BLOCK CONTAIS O RECORDS 01 nome-do-registro. ... [03 nome-de-campo ...] Regras: 1. A clausula RECORDING MODE é opcional e serve só como documentação. 2. A clausla LABEL RECORD com a opção STANDARD é utilizada para a definição de arquivo SEQUENCIAL. A opção OMITTED deve ser utilizada em arquivo para RELATÓRIOS. Obs: É necessário observar com atenção o uso correto do ponto final na FILE SECTION, como está demonstrado no exemplo abaixo. Exemplo: O arquivo CLIENTES definido na INPUT-OUTPUT SECTION seria detalhado aqui como: DATA DIVISION. FILE SECTION. FD CLIENTES RECORDING MODE IS F RECORD CONTAINS 80 CHARACTERS. 01 REG-CLIENTES. 03 COD-CLIENTE PIC 9(8). 03 NOME-CLIENTE PIC X(20). 03 ENDER-CLIENTE PIC X(40). 03 VALOR-CLIENTE PIC 9(10)V99. COBOL 35 PROCEDURE DIVISION OPEN Todo arquivo antes de ser manipulado deve ter seu acesso aberto pelo comando OPEN. Este comando abre o contato com o dispositivo físico do arquivo e reserva, na memória (WORKING-STORAGE SECTION), áreas necessárias para a troca de dados entre o computador e o dispositivoexterno. Indica quais arquivos serão de entrada e quais serão de saída. Formato: OPEN [INPUT | OUTPUT | EXTEND] Nome-arquivo1 ... Regras: 1. INPUT: Permite abrir o arquivo apenas para operações de leitura. 2. OUTPUT: Permite abrir o arquivo para operações de gravação / impressão. Esta operação pode ser especificada quando o arquivo estiver sendo criado. Esta opção não permite comandos de leitura no arquivo. 3. NOME-Arquivo1 ... : Nome lógico do(s) arquivo(s) definido(s) na clausula SELECT e na FD-File Description. Exemplos: OPEN INPUT CADAGENCIA. OPEN I-O CADBANCOS, CADFILIAIS. READ Para acesso sequencial, a instrução READ obtém o próximo registro lógico de um arquivo disponível ao programa objeto. Para acesso RANDOMICO, a instrução READ obtém um registro especificado de um arquivo de acesso direto disponível ao programa objeto. Quando a instrução READ for executada, o arquivo associado deve estar aberto no modo INPUT ou I-O Formato: Leitura Sequencial READ nome-arquivo [INTO nome-area-working] [AT END instrução-imperativa] [END-READ] Regras: 1. INTO: O registro corrente é movido de uma área de INPUT para nome-area-working, de acordo com as regras da instrução MOVE. 2. AT END: Se a condição AT END for especificada, a instrução- imperativa do após o AT END será executada. COBOL 36 Exemplo: Leitura em arquivo ORGANIZATION SEQUENTIAL ENVIRONMENT DIVISON. INPUT-OUTPUT SECTION. FILE CONTROL. SELECT SEQENT01 ASSIGN TO SYS-SEQENT01 FILE STATUS IS WS-STATUS. ... PROCEDURE DIVISION. ... LER-ARQ-SEQENT. READ SEQENT01 INTO WS-REGISTRO-SEQENT01 -FIM END-READ. WRITE A instrução WRITE regrava logicamente um dado registro num arquivo de acesso direto. Formato: WRITE nome-de-registro-1 [FROM identificador-1]. Regras: 1. O arquivo de acesso direto associado à instrução WRITE deve ser aberto no modo OUTPUT ou EXTEND. 2. NOME-DE-REGISTRO-1: Deve ser o nome de um registro lógico na entrada da FD na DATA DIVISION. 3. FROM identificador-1: O conteúdo do identificador-1 é copiado para o nome-de-registro-1 antes de ocorrer a gravação. Depois da execução com sucesso da instrução WRITE, o registro continua disponível no identificador-1. Exemplo: WRITE REGISTRO-ARQUIVO FROM REGISTRO-AUXILIAR. CLOSE Efetua o fechamento de arquivos. A boa prática de programação é fechar todos os arquivos abertos através do comando OPEN Formato: CLOSE nome-de-arquivo ... Exemplos: CLOSE ARQBANCO. CLOSE ARQAGENCIA. CLOSE ARQBANCO, ARQAGENCIA. CLOSE ARQBANCO ARQAGENCIA. COBOL 37 INSTRUÇÕES FREQUENTEMENTE UTILIZADAS, TABELAS INTERNAS E FORMATOS DE DADOS COPY O comando COPY é usado para copiar trechos de programa fonte que estão armazenados em bibliotecas (BOOKS) para dentro dos programas Cobol. Esses trechos de programa podem conter descrições 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: Formato: COPY nome-do-book. Importante: O comando COPY pode ser utilizado em qualquer divisão do COBOL. CALL E LINKAGE SECTION A instrução CALL transfere o controle de um programa objeto a outro, retornando a próxima instrução do programa chamador. Com a instrução CALL, podemos passar parâmetros de um programa para outro. O programa chamado deve definir as variáveis na LINKAGE SECTION e especificar na PROCEDURE DIVISION as variáveis através da cláusula USING. Formato: CALL nome-programa [USING parametro-1 [parametro-2 ... parametro-n] ] Exemplos: *PROGRAMA CHAMADOR ****************************** ID DIVISION. PROGRAM-ID. DATA DIVISION. WORKING-STORAGE SECTION. 01 WRK-PROGNAME PIC X(07). 01 WRK-AREA1. 05 WRK-PGTO PIC S9(05)V99 05 WRK-VLR-HORA PIC S9(01)V99 05 WRK-HORAS PIC S9(02)V99 01 WRK-AREA-2 PIC X(01). PROCEDURE DIVISION. MOVE TO WRK-PROGNAME CALL 'WRK-PROGNAME USING WRK-AREA-1 WRK-AREA-2. CANCEL WRK-PROGNAME. ... COBOL 38 *PROGRAMA CHAMADO ****************************** ID DIVISION. PROGRAM-ID. DATA DIVISION. LINKAGE SECTION. 01 WRK-AREA1. 05 WRK-PGTO PIC S9(05)V99 05 WRK-VLR-HORA PIC S9(01)V99 05 WRK-HORAS PIC S9(02)V99 01 WRK-AREA-2 PIC X(01). PROCEDURE DIVISION USING WRK-AREA1 WRK-AREA2. ROTINA-PRINCIPAL. IF WRK-PGTO > 1000,00 PERFORM PROCESSAR. ... GOBACK. CANCEL A instrução CANCEL libera a área de memória ocupada por um sub- programa chamado. Formato: CANCEL nome-programa Exemplo: CALL USING WRK-AREA-1 WRK-AREA-2. CANCEL EXIT PROGRAM A instrução EXIT PROGRAM especifica o final de um programa chamado e retorna o controle ao programa chamador. Se o fluxo de execução do programa chamado atingir a instrução EXIT PROGRAM enquanto estiver operando sob o controle de uma instrução CALL o controle retornara ao programa chamador na próxima instrução após o comando CALL. Se o fluxo de execução atingir a instrução EXIT PROGRAM e não estiver sob o controle de uma instrução CALL, a instrução EXIT PROGRAM será ignorada, sendo executada a próxima instrução após a instrução EXIT PROGRAM. Formato: EXIT PROGRAM. Exemplo: ... 99-99-EXIT. EXIT PROGRAM. GOBACK Finaliza o programa e volta para o programa chamador. Tem a mesma funcionalidade do EXIT PROGRAM. COBOL 39 Formato: GOBACK Exemplo: ... PERFORM PROCESSAR THRU PROCESSAR-FIM. GOBACK ... STRING A instrução STRING concatena o conteúdo de vários campos em um campo receptor. Seu formato é: Formato: STRING identificador-1 ... literal-1 ... DELIMITED BY SIZE INTO identificador-2 Exemplo: -LIDOS DELIMITED BY SIZE INTO WS-MENSAGEM. TABELAS INTERNAS Alguns algoritmos mais avançados exigem a definição de uma mesma variável várias vezes, aumentando o trabalho de codificação do programa correspondente tanto na DATA DIVISION, como também as instruções resultantes na PROCEDURE DIVISION. Por exemplo, em um algoritmo para acumular as vendas do ano separadas por mês, precisamos definir 12 campos de total na DATA DIVISION, e a PROCEDURE DIVISION deverá ter 12 testes do mês da venda para decidir em que total deve ser feito a soma. Ex.: DATA DIVISION. ... 03 TOTAL-01 PIC 9(8)V99. 03 TOTAL-02 PIC 9(8)V99. ... 03 TOTAL-12 PIC 9(8)V99. PROCEDURE DIVISION. IF MÊS = 01 ADD VENDAS TO TOTAL-01 ELSE IF MÊS = 02 ADD VENDAS TO TOTAL-02 ELSE ... IF MÊS = 12 ADD VENDAS TO TOTAL-12. Clausula OCCURS A linguagem Cobol possui um recurso para resolver este problema. Na DATA DIVISION a variável será definida somente uma vez, acompanhada da cláusula OCCURS que definirá quantas vezes a variável deve ser repetida. A sintaxe da definição do item com OCCURS é: COBOL 40 Formato: NÍVEL identificador-1 PIC ____ OCCURS n TIMES. Regras: 1. A cláusula OCCURS só pode ser usada em variáveis de nível 02 a 49. 2. Quando uma variável de uma tabela (definida com OCCURS) for usada na PROCEDURE DIVISION, ela precisa ser acompanhada de um indexador (subscrito) que definirá qual ocorrência da tabela está sendo referido. Este subscrito deve estar dentro de parênteses e pode ser um literal numérico ou uma variável numérica com valores inteiros. Por ex: ADDVENDAS TO TOTAL-MENSAL(5).Neste caso a soma esta sendo feita no quinto mês (Maio). Exemplo: A codificação do algoritmo do exemplo acima ficará reduzido agora a: DATA DIVISION. 01 TOTAIS-GERAIS. 03 TOTAL-MENSAL PIC 9(8)V99 OCCURS 12 TIMES. ... PROCEDURE DIVISION. ... ADD VENDAS TO TOTAL-MENSAL (MES-VENDA). NÍVEIS DE TABELAS Em Cobol podemos definir um item de uma tabela como uma nova tabela, e assim sucessivamente até um nível 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 mês de venda, montaremos a DATA DIVISION como abaixo: DATA DIVISION. 01 TOTAIS-VENDA. 03 VENDAS-ESTADO OCCURS 27 TIMES. 05 VENDAS-PRODUTO OCCURS 5 TIMES. 07 VENDAS-MÊS PIC 9(8)V99 OCCURS 12 TIMES. Este código montará na memória uma tabela com 3 níveis de 1620 totais (27 estados X 5 produtos X 12 meses). Para acessar um total desta tabela será necessário um conjunto de 3 indexadores: PROCEDURE DIVISION. .... ADD VENDAS TO VENDAS-MÊS (CD-ESTADO, CD-PRODUTO, MÊS-VENDA). Importante: Os indexadores dentro do parênteses devem estar na mesma seqüência da definição das tabelas (mesma hierarquia). COBOL 41 FORMATO ESPECIAIS DE DADOS REDEFINES A cláusula REDEFINES é usada quando alguma informação da DATA DIVISION precisa ser definida em dois ou mais formatos diferentes. Por exemplo, em um campo de data podemos ter o formato dia/mês/ano ou ano/mês/dia: 01 WS-DATA PIC 9(06). 01 WS-DATA-R REDEFINES WS-DATA. 03 ANO-D PIC 99. 03 MÊS-D PIC 99. 03 DIA-D PIC 99. 01 WS-DATA-INV PIC 9(08). 01 WS-DATA-INV-R REDEFINES WS-DATA-INV. 03 DIA-INV PIC 9(02). 03 Mês-INV PIC 9(02). 03 SEC-INV PIC 9(02). 03 ANO-INV PIC 9(02). 01 WS-DATA-MASC PIC 99/99/9999. PROCEDURE DIVISION. ACEITAR-DATA-SISTEMA. ACCEPT WS-DATA FROM DATE. MOVE ANO-D TO ANO-INV. MOVE Mês-D TO MÊS-INV. MOVE DIA-D TO DIA-INV. IF ANO-D > 50 MOVE 19 TO SEC-INV ELSE MOVE 20 TO SEC-INV. MOVE WS-DATA-INV TO WS-DATA-MASC. Os campos redefinidos ocupam o mesmo lugar na memória. No exemplo acima, o valor colocado no campo ANO-I aparece também em DIA-D. Os campos da área redefinida não guardam nenhuma relação com o formato e posição dos campos da primeira definição da área, e a única condição é que o total de bytes das duas áreas seja igual. Outro ex.: 01 VALORES-PEQUENOS. 03 VALOR-1 PIC 9(6). 03 FILLER PIC X(4). 01 VALORES-GRANDES REDEFINES VALORES-PEQUENOS. 03 VALOR-2 PIC 9(8). 03 FILLER PIC XX. FORMATOS BINÁRIOS Quando usamos os formatos descritos nos parágrafos anteriores para descrever variáveis na DATA DIVISION, o Cobol armazena cada caracter das variáveis definidas em 1 byte da memória. Um byte é um conjunto de 8 bits. O computador associa cada combinação de bits ligado/desligado destes 8 bits com uma letra (ou caracter) do nosso alfabeto. Assim, no caso do COBOL 42 mainframe IBM, que usa o padrão EBCDIC, podemos representar estes 2 exemplos: Caracter bits na memória valor decimal valor hexadecimal A 1 1 0 0 0 0 0 1 191 C1 5 1 1 1 1 0 1 0 1 245 F5 Acontece porem que o computador não foi projetado para fazer cálculos com este formato. Ele usa o valor binário puro dos bits para cálculos, onde cada bit da direita para a esquerda tem o valor da potencia de 2 correspondente, como no esquema: Bits 8 7 6 5 4 3 2 1 Valor 128 64 32 16 8 4 2 1 Assim o caracter 5 do formato EBCDIC acima seria interpretado pelo computador nas operações de cálculo como 245 (veja valor decimal da representação do caracter 5 no exemplo anterior). Os programadores Cobol não precisariam se preocupar com este detalhe, porque o compilador Cobol coloca no programa objeto gerado instruções adicionais para, na hora do cálculo, converter todas as variáveis do formato EBCDIC para binário, fazer o cálculo, e converter o resultado do formato binário para EBCDIC, e devolver o resultado convertido para a memória. Os inconvenientes de se trabalhar com variáveis numéricas em EBCDIC são: - A ineficiência causada pelas conversões de formato. - O formato EBCDIC ocupa espaço maior na memória. CLÁUSULA USAGE A linguagem Cobol usa a cláusula USAGE na especificação das variáveis para definir seu formato na memória. Existem os seguintes formatos: [USAGE] DISPLAY = dados numéricos em zonado. Cada algarismo ocupa um byte. Máximo de 18 caracteres/algarismos. [USAGE] COMP = dados numéricos no formato binário ponto fixo (valor expresso em decimal) ; os valores limite (menor e maior) são os que podem ser representados com a quantidade de algarismos (decimais) indicada. [USAGE] COMP-1 = dados numéricos no formato binário ponto flutuante curto. Não colocar PIC (ele é estabelecido automaticamente pelo compilador). Valor expresso em notação científica (mantissa e expoente). [USAGE] COMP-2 = dados numéricos no formato binário ponto flutuante longo. Não colocar PIC (ele é estabelecido automaticamente pelo compilador). Valor expresso em notação científica (mantissa e expoente). [USAGE] COMP-3 = dados numéricos no formato decimal COBOL 43 PIC indica a quantidade de algarismos do maior número que poderá estar contido nesta variável; cada algarismo ocupa meio byte. Para determinar o tamanho total do campo, acrescentar mais meio byte para o sinal (último meio byte à direita; independentemente de o campo ter sido definido com SINAL (PIC S) ou não). [USAGE] COMP-4 = dados numéricos no formato binário ponto fixo. Valor expresso em decimal. [USAGE] COMP-5 = dados numéricos no formato binário ponto fixo (valor expresso em decimal) ; os valores limite (menor e maior) são os que podem ser representados no campo no formato binário ponto fixo. USAGE COMP. Usado para especificar que a variável deve ter formato binário. Só é usado para variáveis numéricas. A sintaxe para definir VAR como variável binária é: Ou O Cobol formata números com USAGE COMP somente em 3 formatos binários que são os formatos disponíveis na CPU do mainframe para cálculos: Um formato com 2 bytes, ou 16 bits (1 bit de sinal e 15 bits de valores binários), um formato de 4 bytes, ou 32 bits (1 bit de sinal e 33 bits de valores binários), e 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: DE ATE BYTES VALORES S9(1)COMP S9(4) COMP 2 -32768 a + 32768 S9(5)COMP S9(9) COMP 4 -2.147.483.648 a + 2.147.483.648 S9(10)COMP S9(18)COMP 8 valores com ate 18 algarismos USAGE COMP-3. Neste formato usa-se grupos de 4 bits para representar 1 número, e por isso 1 byte consegue armazenar 2 números. Para calcular o tamanho fisico do campo deve-se utilizar a seguinte formula: Dividir o tamanho do Campo por 2 Desprezar a casa decimal Soma 1 no resultado Exemplo: 01 WS-SALDO-CONTA PIC S9(15)V99 17 / 2 = 8,5 8 + 1 = 9 O tamanho fisíco desse campo é 8 digitos 77 VAR PIC 9(6) USAGE COMP. 77 VAR PIC 9(6) COMP.
Compartilhar