Outubro de 2006 Linguagem COBOL Manual de Formação Linguagem COBOL Manual de Formação Índice 1. Linguagem de Programação COBOL ................................................................................................................3 1.1. Formato das Instruções ..............................................................................................................................3 2. Estrutura de um Programa em COBOL .............................................................................................................4 3. DIVISIONS. Estrutura Básica .............................................................................................................................5 3.1. Identification Division ..................................................................................................................................5 3.1.1. Program-ID. Programa .....................................................................................................................5 3.2. Environment Division ..................................................................................................................................5 3.2.1. Configuration Section .......................................................................................................................5 3.3. Data Division ...............................................................................................................................................6 3.3.1. Working-Storage Section ..................................................................................................................6 3.4. Procedure Division ....................................................................................................................................15 3.4.1. Instruções .......................................................................................................................................16 3.4.2. Manuseamento de Ficheiros ..........................................................................................................22 3.4.3. Data Division...................................................................................................................................23 3.4.4. File Section .....................................................................................................................................23 3.4.5. Label Records.................................................................................................................................24 3.4.6. Record Contains .............................................................................................................................24 3.4.7. Block Contains ................................................................................................................................24 3.4.8. Data Record[S] ...............................................................................................................................24 © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. -2- Linguagem COBOL Manual de Formação 1. Linguagem de Programação COBOL 1.1. Formato das Instruções As instruções que constituem um programa COBOL, escrevem-se respeitando o formato do antigo cartão perfurada de 80 colunas. Nesse dito cartão, estipularam-se duas áreas para o começo de escrita: Margem A - da coluna 8 à 11; Margem B - da coluna 12 à 72. As restantes colunas têm significados especiais: Coluna 1- 6 - Servem para uma numeração de registos. Quando se usavam cartões perfuradas, indicava a ordem dos cartões. A numeração é feita hoje tal como se fazia na altura: de 10 em 10 para permitir intercalar novos cartões. Coluna 7 - Para indicar o começo de uma linha de comentários utiliza-se o “*”. Em COBOL não se pode poscomentar uma linha de programa. Colunas 73 - 80 - Utilizavam-se no caso dos cartões perfurados para definir um código de 8 caracteres que representava o nome do programa. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. -3- Linguagem COBOL Manual de Formação 2. Estrutura de um Programa em COBOL Um programa COBOL, está estruturado em quatro partes principais chamados DIVISÕES. IDENTIFICATION DIVISION Identificação do programa ENVIRONMENT DIVISION Descrição de ambiente DATA DIVISION Definição de dados e variáveis PROCEDURE DIVISION Instruções do programa A identificação das DIVISION, escrevem-se sempre na margem A e devem existir todas, como depois se verá, uma DIVISION pode ficar vazia. Termina-se com um ponto. Cada DIVISION pode estar dividida em secções chamadas SECTION’s definidas por um nome, os quais também se escrevem na margem A seguidos de um espaço, e a palavra SECTION. Termina-se com um ponto. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. -4- Linguagem COBOL Manual de Formação 3. DIVISIONS. Estrutura Básica 3.1. Identification Division 3.1.1. Program-ID. Programa De codificação obrigatória. Identifica o programa atribuindo-lhe um nome. Este nome será utilizado pelo processador para tratar a execução do programa. Em concreto aparecerá como referência em caso de anomalia de execução. [AUTHOR. nome.] [DATE-WRITTEN. data.] [DATE-COMPILED. data.] … Elementos informativos, que o compilador considera como comentários. 3.2. Environment Division 3.2.1. Configuration Section [SOURCE-COMPUTER. modelo.] [OBJECT-COMPUTER. modelo.] Estes também são elementos informativos, alguns compiladores emitem mensagens de aviso. [SPECIAL-NAMES.] Serve para assignar nomes a entidades standard do COBOL, ou fazer trocas internas de nomes de entidades: DECIMAL-POINT IS COMMA.] Especifica que se substitua o ponto decimal por vírgula. SPECIAL-NAMES escreve-se na margem A, DECIMAL-POINT... na margem B. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. -5- Linguagem COBOL Manual de Formação 3.3. Data Division 3.3.1. Working-Storage Section Nesta secção definem-se dados complementares (itens) para o processo que vai executar o programa, tais como contadores, indicadores etc. Não se pode utilizar na codificação nenhum elemento que não tenha sido definido nesta secção e outras que estão relacionadas com os dados. A definição de um item nesta secção é constituída pelos seguintes elementos: Número de nível; Nome do item; Cláusula PICTURE: - Carácter de definição. Um ponto como terminador. 3.3.1.1. Nome do Item Será uma cadeia de caracteres de comprimento máximo 32. Pode conter letras e números, mas não espaços nem caracteres especiais excepto ‘-‘. Pode-se fazer uma reserva de espaço de memória sem assignar nome, utilizando a palavra reservada FILLER. 3.3.1.2. Cláusula PICTURE Define o formato do item com ajuda do carácter de definição. Carácter de definição. Repete-se tantas vezes como a capacidade que se queira assignar ao item. Termina-se com um ponto. A para conteúdo exclusivamente alfabético; 9 para conteúdo exclusivamente numérico; V em itens numéricos, separa parte inteira e decimal; S em itens numéricos, indica número com sinal; X para conteúdo alfanumérico. NN NUMERO PICTURE 999. NN NOME PIC XXXXXXXXXXXXXXXXXXXX. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. -6- Linguagem COBOL Manual de Formação A repetição também se pode indicar desta forma: NN NUMERO PICTURE 999. NN NUMERO PIC 9(3). NN NOME PIC XXXXXXXXXX. NN NOME PIC X(10). Os caracteres X e 9 não são combináveis na mesma PICTURE. A instrução: NN NUMERO PIC 999 - Define um item numérico inteiro de três dígitos. NN NUMERO PIC 9(5)V9(3). - Define um item numérico decimal de oito dígitos, dos quais cinco constituem a parte inteira e três a decimal. A definição: NN NUMERO PIC 9(3). - Define um número inteiro de três dígitos, mas não tem especificado o sinal, o conteúdo passará de 999 a 0 e depois a 1, 2, etc., se se utiliza como contador; não admitirá valores negativos. Para que um item numérico admita tais valores, tem que ser definido com: NN NUMERO PIC S9(3). Os itens numéricos em COBOL não podem ter mais de 15 dígitos. Z - troca zero não significativo por espaço; + - troca zero não significativo por +; - - troca zero não significativo por -; * - troca zero não significativo por *; $ - troca Zero não significativo por $. Estes caracteres são combináveis com 9, mas os itens definidos com estes caracteres não se podem utilizar em operações matemáticas ou de comparação. 3.3.1.3. Número de Nível Permite a subdivisão de um item em ‘partes’, a cada uma das quais se pode atribuir um nome. O item assim subdividido pode-se processar como um todo ou processar cada uma das ‘partes’. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. -7- Linguagem COBOL Manual de Formação Supondo um item MORADA composto por Rua, número da porta, a localidade e o país, pode aparecer a necessidade de processar os elementos separadamente. O COBOL permite a subdivisão de MORADA mediante o uso de números de nível. Os números de nível vão desde 01 a 49, sendo 01 o nível mais alto e 49 o mais baixo, de modo que às subdivisões de MORADA se vão dar os nomes RUA, NUM, LOC e PAIS, poder-se-á escrever: NN MORADA NN+1 RUA NN+1 NUM NN+1 LOC NN+1 PAIS Afectando-as do mesmo número de nível NN+1, para indicar uma subdivisão do item MORADA de nível NN. Em: NN MORADA NN+1 RUA NN+1 NUM NN+1 LOC NN+1 PAIS NN NOME NOME já não seria uma subdivisão de MORADA, mas o seu nível escrever-seia na mesma coluna que as restantes subdivisões, então seria assim: NN MORADA NN+1 RUA NN+1 NUM NN+1 LOC NN+1 PAIS NN+1 NOME Ao escrever itens subdivididos, temos de ter em conta que o item que se subdivide não pode levar PICTURE. Esta é atribuída ao nível das subdivisões, desde que não sejam também subdivididas. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. -8- Linguagem COBOL Manual de Formação Um item dado, pode-se subdividir em elementos alfabéticos e/ou numéricos e/ou alfanuméricos. Os itens subdivididos chamam-se itens de grupo, e os que levam PICTURE, elementares. 01 MORADA. 02 RUA PIC X(15). 02 NUM PIC 999. 02 LOC PIC X(30). 02 PAIS PIC X(30). 01 NOME PIC X(25). Se a um item se atribui o nível 01, escreve-se na margem A e o NOME e resto da definição na margem B. Os níveis 02 a 49 escrevem-se sempre na margem B. Um item de grupo pode conter, por sua vez, itens de grupo: 01 CLIENTE. 02 DNI PIC X(15). 02 DADOS-PESSOAIS. 03 NOME PIC X(25). 03 APELIDOS PIC X(50). 03 MORADA. 04 RUA PIC X(15). 04 NUM PIC 999. 04 LOC PIC X(30). 02 TIPOCART PIC XX. 02 NUMCART PIC X(20). Ode DNI, DADOS-PESSOAIS, TIPOCART e NUMCART são subdivisões de CLIENTE; NOME, APELIDOS e MORADA de DADOS-PESSOAIS e RUA, NUM, LOC de MORADA. Nota importante: Dado que no COBOL não se concebem itens sem natureza, a um item de grupo assigna-se PICTURE alfanumérica, o que terá que ser tido em conta ao tratálos. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. -9- Linguagem COBOL Manual de Formação 3.3.1.4. Qualificadores de Nome de Item Em princípio não se pode repetir o nome de um item, excepto se é parte de um item de grupo. O nome do item de grupo usa-se como qualificador com a conjunção OF. 01 CLIENTE. 02 DNI PIC X(15). 02 DADOS-PESSOAIS. 03 NOME PIC X(25). 03 APELIDOS PIC X(50). 03 MORADA. 04 RUA PIC X(15). 04 NUM PIC 999. 04 LOC PIC X(30). 04 PAIS PIC X(30). 02 TIPOCART PIC XX. 02 NUMCART PIC X(20). 01 PROVEDOR. 02 DNI PIC X(15). 02 DADOS-PESSOAIS. 03 NOME PIC X(25). 03 APELIDOS PIC X(50). 03 MORADA. 04 RUA PIC X(15). 04 NUM PIC X(30). 04 LOC PIC X(30). 04 PAIS PIC X(30). Para distinguir, em COBOL de que DNI se trata, numa instrução da PROCEDURE DIVISION, escreve-se DNI OF PROVEDOR. Para mencionar a RUA, sem dificuldades: RUA OF MORADA © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 10 - Linguagem COBOL Manual de Formação Não basta: RUA OF MORADA OF DADOS-PESSOAIS E tem de se por: RUA OF MORADA OF DADOS-PESSOAIS OF CLIENTE 3.3.1.5. Assignação de Valores na Definição A definição de um item não pressupõe nada sobre o seu conteúdo; se se deseja estabelecer um valor inicial, pode-se empregar a cláusula VALUE. 01 NUMERO1 PIC S9(5) VALUE -12. 01 NUMERO2 PIC 9(3)V99 VALUE 1.25. 01 NOME1 PICX(15) VALUE ’PEPE’. 01 CADENA1 PIC X(5) VALUE ‘00000’. Onde os valores a atribuir escrevem-se entre aspas (simples ou duplas) se se trata de valores não numéricos. Regra geral, só se pode usar a cláusula VALUE nos itens elementares, sempre que não estão referenciados numa cláusula OCCURS (veja-se a definição de tabelas mais abaixo). Certos valores podem-se atribuir mediante as chamadas constantes figurativas SPACES, ZEROS: 01 CADENA1 PIC X(5) VALUE ZEROS. Ou se especificam por repetição de um carácter determinado: 01 CADENA2 PIC X(20) VALUE ALL ‘*’. 3.3.1.6. A Cláusula REDEFINES Em ocasiões pode ser necessário tratar um dado como composto de vários outros. Isto pode ser resolvido, como já se viu, mediante a definição de um item subdividido ou redefinindo-o. Supondo que se tratara de processar o ano como composto de século e ano dentro de século, no primeiro caso fazia-se: © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 11 - Linguagem COBOL Manual de Formação 01 DATA. 02 SECULO PIC 99. 02 ANO PIC 99. Com o que se poderia tratar os DADOS DATA, SECULO e ANO, pelo que teria que ter-se em conta que DATA é um item alfanumérico. A alternativa seria definir DATA como item numérico e redefini-lo para subdividilo na forma: 01 DATA PIC 9(4). 01 DATA1 REDEFINES DATA. 02 SECULO PIC 99. 02 ANO PIC 99. Assim consegue-se que DATA seja também um item numérico. A redefinição não consome espaço adicional de memória; unicamente assigna um novo nome a um item ou a zonas de um item, já definido. As redefinições devem ir todas juntas e a continuação do item que redefinem e devem levar o mesmo número de nível. Qualquer item pode ser redefinido, incluindo os de uma subdivisão redefinida. Se o item redefinidor não vai ser tratado, pode-se eliminar uma entrada na tabela de símbolos, utilizando o nome FILLER: 01 DATA PIC 9(4). 01 FILLER REDEFINES DATA. 02 SECULO PIC 99. 02 ANO PIC 99. 3.3.1.7. Representação Interna de Itens Numéricos Os itens não numéricos ocupam em memória tantos bytes como posições que se definiram. Para os itens numéricos, existem três formas de armazenamento: DISPLAY Por defeito: Um byte por cada dígito. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 12 - Linguagem COBOL Manual de Formação 01 NUMERO PIC 9(3) VALUE 23. F0F0F2F3 em EBCDIC DECIMAL COMPACTADO Dois dígitos por byte e sinal por defeito (F para positivo, C para negativo, por defeito: sinal positivo). 01 NUMERO PIC 9(3) COMP-3 VALUE 123. 0123F Ao calcular a dimensão em memória, há que ter em conta que o COBOL só trabalha com bytes completos: 9(n) -> próximo par a n dividido por 2 -> l l -> (I*2 )-1 -> 9(n) Os itens numéricos de número par de dígitos ocupam o mesmo que os de impar imediatamente superior. BINARIO. Alocação de memoria por múltiplos de 2 bytes, segundo o número de dígitos especificado. 01 NUMERO PIC 9(4) COMP. 3.3.1.8. Variáveis Múltiplas ou Tabelas As tabelas (array noutras linguagens), definem-se especificando a ocorrência múltipla num item dado, usando a cláusula OCCURS. Quando se definem tabelas tem de se ter em conta duas coisas: O número de nível do item ao qual se vai aplicar a cláusula OCCURS não pode ser 01. 01 FILLER. 02 TABELA OCCURS número Onde número indica as vezes que se pode repetir TABELA, ou seja o número de elementos do array. Número tem de ser um valor explícito. Não se podem assignar valores a um item definido com OCCURS. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 13 - Linguagem COBOL Manual de Formação Para assignar valores aos elementos de uma tabela, redefine-se um item elementar ou de grupo cujo valor se fará coincidir com a tabela. Suposto o caso de querer definir uma tabela que contenha os dias de cada um dos meses do ano, pode-se fazer: 01 DADOS-MESES. 03 FILLER P1C 99 VALUE 31. 03 FILLER PIC 99 VALUE 0. …………. 03 FILLER PIC 99 VALUE 31. 01 FILLER REDEFINES DADOS-MESES. 03 DIAS-MES OCCURS 12 P1C 99. Ou também: 01 DAD0S-MESES PIC X(24) VALUE ‘310031303130313130313031’. 01 FILLER REDEFINES DAD0S-MESES. 03 DIAS-MES OCCURS 12 PIC 99. A referência a um elemento faz-se na forma TABELA (n), sendo n um valor que pode ir entre 1 e número, e que pode ser um valor explícito ou o conteúdo de uma variável numérica. O COBOL não faz comprovação dos limites de um array, de modo que será o programador que tem que controlar que o valor n ou índice se mantém no intervalo correcto. O item afectado pela cláusula OCCURS pode ser elementar: 01 FILLER. DIAS-MES OCCURS 12 PIC 99. Ou de grupo: 01 FILLER. 02 TABELA OCCURS número. 03 DADO1 PIC... 03 ............................. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 14 - Linguagem COBOL Manual de Formação E, neste caso, as subdivisões podem, por sua vez, ser array’s. A forma genérica da cláusula OCCURS é: OCCURS n1 [TO n2] [DEPENDING ON item] [INDEXED BY item] Onde nº 1 é o número mínimo de elementos se a cláusula TO está presente ou o total, em caso contrario, nº 2 é o máximo e o item numérico especificado na cláusula DEPENDING ON controla a longitude actual do array e deverá ter um valor que está entre os limites deste. INDEXED BY permite a manipulação de tabelas através de índices internos, variáveis internas de COBOL, que não se definem como itens. 3.4. Procedure Division Nesta division contém as instruções de que consta o programa: Escrevem-se na margem B. As instruções podem-se agrupar em parágrafos identificados com um nome. O nome do parágrafo escreve-se na margem A, pode ter até 32 caracteres de comprimento, e deve terminar com um ponto. Esta separação em parágrafos utiliza-se para executar sub-processos e invocá-los ou saltá-los desde outros pontos do programa. Em princípio, o COBOL não necessita de terminadores especiais de instrução, salvo quando se terminam certas instruções ou se escreve a última instrução de um parágrafo; neste caso termina-se com um ponto. É conveniente que haja ao menos um nome de parágrafo no início da division; certos compiladores acusam a sua falta como um erro severo. Uma vez carregado o programa em memória, a execução começa na primeira instrução e termina ao encontrar: STOP RUN Instrução que pode existir tantas vezes como as necessárias. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 15 - Linguagem COBOL Manual de Formação 3.4.1. Instruções 3.4.1.1. Instruções de Transferência de DADOS 3.4.1.1.1. MOVE MOVE A TO B [C D....] Onde B, C, D são itens de WORKING. A pode ser o conteúdo de um item de WORKING, uma constante figurativa ou um valor imediato (número ou literal). MOVE 25 TO CONTA MOVE CONTA TO CONTA2 CONTA3 MOVE SPACES TO CADEIA3 Na transferência, há que ter em conta o tipo de item receptor; pode-se transferir um número a um campo alfanumérico, mas não a um alfabético e pode-se transferir o conteúdo de um campo alfanumérico a um numérico, sempre e quando o primeiro só contenha caracteres numéricos. As conversões de formato só se fazem no caso de itens/valores numéricos. No caso de valor ‘mais pequeno’, os campos não numéricos são preenchidos com brancos peIa direita e os numéricos com zeros peIa esquerda. No caso de valor ‘maior’, os campos não numéricos são truncados pela direita e os numéricos perdem dígitos significativos. 3.4.1.1.1.1. MOVE CORR MOVE CORR[ESPONDING] A TO B A e B são itens de grupo. O movimento faz-se de forma que as subdivisões de B se carregam com as de A do mesmo nome. Esta instrução terá de usar-se com precaução, já que diferentes naturezas de itens nas áreas receptora e emissora podem provocar o fim anormal do programa. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 16 - Linguagem COBOL Manual de Formação 3.4.1.1.1.2. SET SET A to valor | item Se A é uma variável interna, carrega A com o valor ou item especificados. 3.4.1.2. Instruções Aritméticas. 3.4.1.2.1. ADD ADD ATO B[CD …....] Onde B, C, D são itens e A pode ser o conteúdo de um item ou um valor imediato, soma A aos conteúdos dos itens referenciados por TO. O conteúdo de A não muda. ADD A B[C...] GIVING R Onde R é um item e A, B.... podem ser conteúdos de itens de memória ou valores imediatos, faz a soma A+B[C+D+....] e deposita em R. Os conteúdos de A, B, C não variam. 3.4.1.2.2. SUBTRACT SUBTRACT A FROM B[CD………..] Onde B, C, D são itens e A pode ser o conteúdo de um item ou um valor imediato, subtrai A aos conteúdos dos itens referenciados por FROM. O conteúdo de A não muda. SUBTRACT A FROM B GIVING R Onde B e R são itens e A pode ser o conteúdo de um item ou um valor imediato, efectua B-A e coloca o resultado em R. Os conteúdos de A e B não variam. SET UP \ DOWN BY UP SET A BY item | valor DOWN Sendo A uma variável interna, incrementa | decrementa A no valor | item especificado. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 17 - Linguagem COBOL Manual de Formação 3.4.1.2.3. MULTIPLE MULTIPLE A BY B Onde B é um item e A pode ser o conteúdo de um item ou um valor imediato, multiplica o conteúdo de B por A. O conteúdo de A não muda. MULTIPLE A BY B GIVING C Onde B e C são itens e A pode ser o conteúdo de um item ou um valor imediato, faz a multiplicação B*A e o resultado fica em C. O conteúdo de A não muda. 3.4.1.2.4. DIVIDE DIVIDE A BY B [GIVING C] [REMAINDER R] Onde A [C][D] são itens e B pode ser o conteúdo de um item ou um valor imediato, faz a divisão A/B e deixa o resultado em: A se não se especifica GIVING C se se especifica GIVING REMAINDER devolve o resto da divisão. O quociente será inteiro ou não, dependendo da definição do item que o recebe. 3.4.1.2.4.1. COMPUTE COMPUTE expr Valoriza expr como expressão algébrica na forma: Resultado = operações Onde resultado e todos os items que intervenham em operações tem que estar definidos na WORKING-STORAGE. Em algumas versões de COBOL, um mesmo item não pode aparecer em ambos os membros da equação, como é o caso de: COMPUTE I =I + 1 © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 18 - Linguagem COBOL Manual de Formação Expressão que, em qualquer caso, não se executaria nunca com COMPUTE, dado o tempo que consome (ADD 1 TO I seria muito mais rápida). 3.4.1.3. Instruções de Bifurcação Permitem alterar o fluxo de execução do programa, especificando alternativas. 3.4.1.3.1. IF Instrução de bifurcação condicionada ou alternativa. lF condicão [THEN] <accão 1> [ELSE < acção 2> | NEXT SENTENCE]. Se a condição se cumpre, executa-se a acção 1. A alternativa (opcional) expressa-se na cláusula ELSE. A instrução tem de terminar com um ponto. As acções podem conter qualquer conjunto de instruções sempre que estas não exijam um ponto como terminador (instruções com cláusula AT END). A cláusula THEN não é obrigatória. IF A IF B IF C < acção 1> ELSE < acção 2> ELSE NEXT SENTENCE ELSE < acção 4>. Note-se que o ponto termina toda a instrução. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 19 - Linguagem COBOL Manual de Formação 3.4.1.3.2. GO GO [TO] nome-de-parágrafo Bifurcação incondicional à primeira instrução do parágrafo nome-deparágrafo. Não deve utilizar-se pois complica a análise e manutenção futura dos programas. 3.4.1.3.3. PERFORM PERFORM nome-de-parágrafo1 [THRU nome-de-parágrafo2] [VARYING item 1 FROM item2lvalor2 [BY item3lvalor3]] [UMTIL condição] Execução das instruções marcadas com a etiqueta nome-de-parágrafo1 e retorno à instrução seguinte. O final de parágrafo detecta-se por aparecer outro parágrafo ou o final do ficheiro. Se se especifica nome-de-parágrafo2, executam-se todas as instruções desde a primeira do primeiro parágrafo até à última do segundo. Os parágrafos destinados a ser invocados mediante PERFORM situam-se fora da linha principal do programa para impedir que se executem desnecessariamente. VARYING item 1 Execução cíclica de PERFORM, controlada por item, que será um item numérico. FROM item2 l valor2 Inicialização de item. Esta cláusula executa-se só a primeira vez. BY item3 l valor3 Incremento da variável de controlo. O valor pode ser positivo ou negativo. UNTIL condição Condição que deve usar-se para terminar a execução de PERFORM. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 20 - Linguagem COBOL Manual de Formação 3.4.1.3.4. SEARCH SEARCH tabela [ALL] item [VAREING item 1] ATTEND <instrucao-mandatoria> WHEN condição <accão> Pesquisa em tabela. A tabela tem que estar indexada internamente (cláusula INDEXED BY). A busca é sequencial a partir da posição do índice interno, se não se especifica ALL. Se se especifica ALL, a busca será dicotómica, mas a tabela tem que estar ordenada ascendentemente ou descendentemente. 3.4.1.3.4.1. Tabela Variável afectada pela cláusula OCCURS. Si se utiliza a modalidade dicotómica haverá que especificar uma cláusula ASCENDING | DESCENDING que indique por que elemento está ordenada a tabela. 3.4.1.3.4.2. VARYING Se a busca é sequencial, pode-se pedir que uma variável de WORKING item 1, se actualize com o valor do índice interno. 3.4.1.3.4.3. ATTEND Acção a tomar se não se cumpre nenhuma das cláusulas WHEN. 3.4.1.3.4.4. WHEN Condição que se deve cumprir para executar <acção>. Podem utilizar-se até 12 cláusulas. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 21 - Linguagem COBOL Manual de Formação 3.4.2. Manuseamento de Ficheiros Para a utilização de ficheiros há que incluir novas instruções em diferentes DIVISÕES do programa. Estas instruções dividem-se em: Instruções descritivas; Instruções de acesso. 3.4.2.1. Instruções Descritivas Descrevem o ficheiro desde o ponto de vista físico e lógico e escrevem-se em: 3.4.2.1.1. Environment Division Ambas na margem A: INPUT OUTPUT SECTION. FlLE CONTROL Dentro deste parágrafo especificam-se: Definição de um nome lógico para um ficheiro físico; Organização do ficheiro; Modo de acesso para ficheiros indexados; Descrição do índice principal [e secundário] para ficheiros indexados; Área de recepção para códigos de retorno para ficheiros VSAM. Mediante a instrução SELECT na qual se especificam as cláusulas que vêm em continuação, margem B e se termina com um ponto. SELECT nome ASSIGN [TO] ORGANIZATION [IS] SEQUENCIAL INDEXED ACCESS MODE [IS] SEQUENCIAL RANDOM DYNAMIC [RECORD KEY [IS] Item 1] [FILE STATUS [IS] item 2]. SYS002-DA-3340-S-ETIQUETA © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 22 - Linguagem COBOL Manual de Formação Ligação com uma ficha de JCL com o nome ETIQUETA, na qual se referencia o nome real do ficheiro. Os parâmetros anteriores fazem referência ao dispositivo lógico e modelo da unidade de suporte; em MVS são meramente informativos. 3.4.2.1.1.1. Organization Organização do ficheiro (por defeito SEQUENTIAL). 3.4.2.1.1.2. Access Modo de acesso: SEQUENTIAL Acesso sequencial (por defeito). RANDOM Acesso por índice. DYNAMIC Acesso misto. Pode-se aceder aos registos por índice e ainda existe uma recuperação sequencial por ordem de chave e a possibilidade de explorar a existência de um registo sem efectuar a leitura. Os modos RANDOM e DYNAMIC só se podem especificar em ORGANIZATION INDEXED. 3.4.2.1.1.3. Item2 Identifica um item definido com PICTURE XX na WORKINGSTORAGE SECTION, destinado a recolher códigos de retorno, no caso em que o ficheiro esteja no formato VSAM. 3.4.3. Data Division Escrito na margem A e antes da WORKING-STORAGE. 3.4.4. File Section E, dentro desta secção: FD nome LABEL RECORDS STANDARD 1 OMITTED [RECORD COMTAINS n CHARACTERS 1 [BLOCK COMTAINS r RECORDS] [DATA RECORD[S] [IS 1 ARE] item1 item2....]. 01 item1. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 23 - Linguagem COBOL Manual de Formação 01 item2. FD File Description. Deve ser definida na margem A. O nome que vai na continuação, na margem B, tem que ser algum dos nomes codificados nas instruções SELECT. 3.4.5. Label Records Gestão de etiquetas de ficheiro/registos: STANDARD Gestão de etiquetas standard IBM OMMITTED Ficheiro sem etiquetas (aplica-se a determinados ficheiros em banda e a impressoras). 3.4.6. Record Contains Tamanho do registo em bytes. 3.4.7. Block Contains Factor de bloqueio em número de registos. 3.4.8. Data Record[S] Referência às áreas de intercâmbio de dados (áreas de registo). Nestas áreas descreve-se, em formato WORKING, a distribuição da informação dos registos de um ficheiro (campos). Estas áreas serão a fonte em operações de escrita e o destino em operações de leitura. No caso de ficheiros com diferentes tipos de registo, as áreas podem ser várias, com diferentes distribuições, e entende-se que todas redefinem a primeira, sem necessidade de utilizar a cláusula REDEFINES. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. SELECT ENTRADA ASSIGN TO SYSOO2-DA-3340-S-ENTRADA. ORGANIZATION INDEXED ACCESS DYNAMIC © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 24 - Linguagem COBOL Manual de Formação RECORD KEY CHAVE FILE STATUS COD-RET. DATA DIVISION. FILE SECTION. FD ENTRADA LABEL RECORDS STANDARD. 01 CABECALHO 03 CHAVE PIC 9(5) COMP-3. 03 TIPO PIC 9. 03 DADOS-CLIENTE. 01 05 NOME PIC X(30). 05 DIRECCAO PIC X(50). DETALHE. 03 FILLER PIC XXX. 03 TIPO PIC9. 03 DESCRICAO PIC X(50). 03 IMPORTANCIA PIC 9(9) COMP-3. 03 FILLER PIC X(25). WORKING-STORAGE SECTION. ……… 03 COD-RET PIC XX. Nesta sequência de instruções descreveu-se um ficheiro indexado, ao qual se vai aceder directamente e/ou sequencialmente por chave ascendente, indexado pelos três primeiros bytes do registo, e que guarda informação dos tipos diferentes descritos nos DATA RECORDS CABECALHO e DETALHE. O ficheiro está suportado em VSAM, os códigos de retorno irão ser recebidos no item COD-RET e o comprimento do registo é de 84 bytes. Para distinguir os dois tipos de registos, convém actualizar com diferentes valores o campo TIPO, por exemplo, com 1 para o cabeçalho e 2 para o detalhe no caso de © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 25 - Linguagem COBOL Manual de Formação escrita de registos estes mesmos valores servirão para saber qual das áreas descreve o registo em operações de leitura. 3.4.8.1. Instruções de Processamento. O processamento de um ficheiro compõe-se das operações seguintes: Abrir o ficheiro Aceder ao ficheiro - Exploração - Leitura - Escrita - Re-escrita - Eliminar Fechar o ficheiro Abrir o ficheiro OPEN modalidade nome Modalidade INPUT Só entrada (leitura) OUTPUT Só saída ( escrita) I-O Entrada / Saída. Nome simbólico do ficheiro ( SELECT). Nome Na mesma instrução podem abrir-se: Vários ficheiros na mesma modalidade Vários ficheiros em modalidades distintas. 3.4.8.2. Aceder ao Ficheiro 3.4.8.2.1. Exploração Se se especificou ACCESS DYNAMIC: START ficheiro KEY EQUAL NOT LESS item_chave [INVALID KEY instrucao_mandatoria 1 Exploração do índice procurando um registo cuja chave seja igual e não menor que o conteúdo actual do campo RECORD KEY. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 26 - Linguagem COBOL Manual de Formação 3.4.8.2.1.1.1. Invalid Key Acção a tomar se não se encontra correspondência. A acção não pode conter IF. Para ficheiros VSAM, consultar a variável descrita no FILE STATUS. O código ‘23’ indica registo não encontrado. 3.4.8.2.2. Leitura READ ficheiro [NEXT] [INTO W-AREA ] | [AT END instrucao_mandatoria] | [INVALID KEY instrucao _mandatoria] 3.4.8.2.2.1. Next Em acesso DYNAMIC, ler registo. Codifica-se imediatamente atrás de START, lê-se o registo localizado se a localização teve êxito. Depois lê-se o registo cuja chave seja a seguinte ao valor actual do item mencionado em RECORD KEY. 3.4.8.2.2.2. Into W-Area Transferência automática dos dados lidos para uma área de WORKING. 3.4.8.2.2.3. Access Sequential Leitura do registo seguinte. 3.4.8.2.2.4. AT END Acção a efectuar quando encontra o final do ficheiro. A acção não pode conter IF. Para ficheiros VSAM, consultar a variável descrita em FILE STATUS. O código ‘10’ indica final de ficheiro. 3.4.8.2.2.5. ACCESS RANDOM Leitura do registo cuja chave coincida com o conteúdo actual do campo RECORD KEY. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 27 - Linguagem COBOL Manual de Formação 3.4.8.2.2.5.1. INVALID KEY Acção a tomar se não se encontra correspondência. A acção não pode conter IF. Para ficheiros VSAM, consultar a variável descrita em FILE STATUS. O código ‘23’ indica registo não encontrado. 3.4.8.2.3. Escrita WRITE data record [FROM W-AREA] [INVALID KEY instrucao_mandatoria] 3.4.8.2.3.1. FROM W-AREA Gravação dos dados de uma área de WORKING. A área copia-se para a data_record antes da gravação. 3.4.8.2.3.2. ACCESS SEQUENTIAL Gravação na sequência do último registo. 3.4.8.2.3.3. ACCESS RANDOM Gravação de um registo cuja chave é o conteúdo actual do campo RECORD KEY. 3.4.8.2.3.3.1. INVALID KEY Acção a tomar se a chave está repetida. A acção não pode conter IF. Para ficheiros VSAM, consultar a variável descrita em FILE STATUS. O código ‘22’ indica chave repetida a nível de índice Primário e o registo não é gravado. O código ‘02’ indica repetição a nível de índice Alternativo, mas o registo será gravado. 3.4.8.2.4. Re-escrita REWRITE data_record [FROM W-AREA] [INVALID KEY sentencia_mandatoria] © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 28 - Linguagem COBOL Manual de Formação 3.4.8.2.4.1. FROM W-AREA Actualização dos dados de uma área de WORKING. A área copia-se da data_record antes da gravação. 3.4.8.2.4.2. ACCESS RANDOM Actualização de um registo cuja chave é o conteúdo actual do campo RECORD KEY. 3.4.8.2.4.2.1. INVALID KEY Acção a tomar se não se encontra o registo. A acção não pode conter IF. Para ficheiros VSAM, consultar Ia variável descrita em FILE STATUS. O código ‘23’ indica registo não encontrado. O código ‘22’ indica chave repetida a nível do índice Alternativo único e o registo não é actualizado. O código ‘02’ indica repetição a nível de índice Alternativo, mas o registo será actualizado. 3.4.8.2.5. Eliminar DELETE ficheiro [INVALID KEY instrucao_mandatoria] 3.4.8.2.5.1. Access Random Eliminar um registo cuja chave é o conteúdo actual do campo RECORD KEY. 3.4.8.2.5.1.1. Invalid Key Acção a tomar se não se encontra o registo. A acção não pode conter IF. Para ficheiros VSAM, consultar a variável descrita em FILE STATUS. O código 23 indica registo não encontrado. 3.4.8.2.6. Fechar o FICHEIRO CLOSE ficheiro1 [ficheiro2…] © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 29 - Linguagem COBOL Manual de Formação 3.4.8.3. SORT Esta instrução permite a ordenação de ficheiros a partir de um programa COBOL, mas com uma série de variantes que a fazem mais potente que as acções que se podem levar a cabo no Programa de Utilitários SORT. Os elementos que se manipulam numa ordenação são: O ficheiro de entrada a ordenar; O ficheiro de saída destinado a receber o resultado da ordenação; A área se trabalho (normalmente em disco), para a qual se copia o ficheiro de entrada para proceder à sua ordenação. Na instrução SORT, referencia-se a área de ordenação e não o ficheiro de entrada. O critério de ordenação aponta para campos da área de ordenação. Os ficheiros de entrada e saída, definem-se como já se viu atrás, mas para a área de ordenação especifica-se na INPUT-OUTPUT SECTION: SELECT SORTWK ASSIGN TO SORTWK. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 30 - Linguagem COBOL Manual de Formação Sem descrever nem organização nem acesso. Na FILE SECTION: SD SORTWK. 01 RSORTWK. 03 CHAVE. Sem especificação de LABEL, identifica a área de ordenação lógica. A instrução permite as variantes de manipulação dos ficheiros de entrada e saída seguintes: Entrada e saída automáticas SORT SORTWK ASCENDING 1 DESCENDING KEY CHAVE USING ENTRADA GIVING SAIDA Entrada manual e saída automática SORT SORTWK ASCENDING 1 DESCENDING KEY CHAVE INPUT PROCEDURE ENTRADA-SORT GIVING SAIDA Entrada e saída manuais SORT SDRTWK ASCENDING DESCENDING KEY CHAVE INPUT PROCEDURE ENTRADA-SORT OUTPUT PROCEDURE SAIDA-SORT Entrada automática e saída manual SORT SOR1VIK ASCENDING 1 DESCENDING KEY CHAVE USING ENTRADA OUTPUT PROCEDURE SAIDA-SORT. Convém recordar que os ficheiros que intervêm na ordenação devem estar fechados antes da execução da instrução SORT. Quando se usam as opções INPUT ou OUTPUT PROCEDURE, que se codificaram na PROCEDURE DIVISION e nas SECTION com o nome das PROCEDUREs que se referenciaram na instrução. Estas SECTION devem estar juntas e no final do programa, para evitar execuções adicionais não desejadas. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 31 - Linguagem COBOL Manual de Formação A opção INPUT e/ou OUTPUT PROCEDURE faz com que a etapa correspondente da instrução SORT não se execute e tenha que ser o programador a abrir e a ler o ficheiro de entrada e a gravar na área de ordenação (INPUT PROCEDURE) e o leia da área de ordenação e abra ou grave no ficheiro de saída (OUTPUT PROCEDURE). A escrita na área de ordenação faz-se com: RELEASE RSORTWK [FROM W-REGiSTO] A leitura de um registo da área de ordenação faz-se com: RETURN SORTWK [INTO W-REGISTO] AT END accao-mandatoria. Em que a cláusula AT END se emprega para sinalizar o fim dos dados na área de ordenação. No JCL que se construa para executar um programa que leve uma instrução SORT, têm que se incluir umas bibliotecas especiais para os módulos de serviço da instrução. Estas bibliotecas incluir-se-ão no cartão JOBLIB ou STEPLIB e os nomes são, regra geral, SORT.SORTLIB e SORT.LINKLIB. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 32 - Linguagem COBOL Manual de Formação 3.4.8.3.1. Exemplos de Programas COBOL com SORT. 1 3.4.8.3.1.1. SORT com Entrada e Saída Automáticas * ---------------------------------------COBOLREALIA-----------------------------* PSORT SORT USING GIVING * -----------------------------------------------------------------------------------------IDENTIFICATION DIVISION. PROGRAM-ID. PSORT. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. AAT-PC. OBJECT-COMPUTER. AAT-PC. SPECIAL-NAMES. DECIMAL-POI NT IS COMMA. INPUT-OUTPUT SECTION. FILE-CONTROL. *------------------------------------* FICHEIRO DE ARTIGOS - ENTRADA *------------------------------------SELECT ENTRADA ASSIGN TO ‘ARTIGO.DAT’ FILE STATUS STAT-ENTRADA. *------------------------------------------------------------* FICHEIRO SAIDA DE ORDENAÇÃO *-------------------------------------------------------------SELECT SAIDA ASSIGN TO ARTIGO.ORD’. *--------------------------------------------------------------* AREA DE ORDENAÇÃO *--------------------------------------------------------------SELECT SORTWK1 ASSIGN TO ‘SORTWK1.DAT’. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 33 - Linguagem COBOL Manual de Formação DATA DIVISION. FILE SECTION. FD ENTRADA LABEL RECORDS STANDARD. 01 RENTRADA PIC X(80). FD SAIDA LABEL RECORDS STANDARD. * --------------------------------------------------------------------* FICHEIRO SAIDA DE ORDENAÇÃO * --------------------------------------------------------------------SELECT SAIDA ASSIGN TO ‘ARTIGO.ORD’. *---------------------------------------------------------------------* AREA DE ORDENAÇÃO * --------------------------------------------------------------------SELECT SORTWK1 ASSIGN TO ‘SDRTWK1.DAT’. DATA DIVISION. FILE SECTION. FD ENTRADA LABEL RECORDS STANDARD. 01 RENTRADA PIC X(80). FD SALIDA LABEL RECORDS STANDARD. * ---------------------------------------------------------------------------* FICHEIRO SAIDA DE ORDENACAO *----------------------------------------------------------------------------SELECT SAIDA ASSIGN TO ‘ARTIGO.ORD’. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 34 - Linguagem COBOL Manual de Formação *------------------------------------------------------------------------* AREA DE ORDENACAO *-----------------------------------------------------------------------SELECT SORTWK1 ASSIGN TO SORTWK1.DAT. DATA DIVISION. FILE SECTION. FD ENTRADA LABEL RECORDS STANDARD. 01 RENTRADA PIC X(80). FD SALIDA LABEL RECORDS STANDARD. * -------------------------------------------------------------* FICHEIRO SAIDA DE ORDENACAO * -------------------------------------------------------------SELECT SALIDA ASSIGN TO ‘ARTIGO.ORD’. *---------------------------------------------------------------* AREA DE ORDENACAO * --------------------------------------------------------------SELECT SORTWK1 ASSIGN TO ‘SORWVK1.DAT’. DATA DIVISION. FILE SECTION. FD ENTRADA LABEL RECORDS STANDARD. 01 RENTRADA PIC X(80). FD SAIDA © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 35 - Linguagem COBOL Manual de Formação LABEL RECORDS STANDARD. *-------------------------------------------------------------------------* FICHEIRO SAIDA DE ORDENACAO *--------------------------------------------------------------------------SELECT SAIDA ASSIGN TO ’ARTIGO.ORD’. *---------------------------------------------------------------------------* AREA DE ORDENACAO *---------------------------------------------------------------------------SELECT SORTWK1 ASSIGN TO ‘SORTWK1.DAT’ DATA DIVISION. FILE SECTION. FD ENTRADA LABEL RECORDS STANDARD. 01 RENTRADA PIC X(80). FD SAIDA LABEL RECORDS STANDARD. 01 RSAIDA PIC X(80). SD SORTWK1. 01 RSORTWK1 03 SORTKEY PIC X(3). 03 FILLER PIC X(77). WORKING-STORAGE SECTION SELECT SAIDA ASSIGN TO ‘ARTIGO.ORD’. 01 STAT-ENTRADA PIC XX PROCEDURE DIVISION. PSORT. SORT SORTWK1 ASCENDING KEY SORTKEY USING ENTRADA GIVING SAIDA © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 36 - Linguagem COBOL Manual de Formação STOP RUN. 3.4.8.3.1.2. SORT com Entrada e Saída Manuais. *-----------------------------------COBOL REALIA —-------------------------* PSORTI SORT INPUT PROCEDURE OUTPUT PROCEDURE *---------------------------------------------------------------------------------------IDENTIFICATION DIVISION. PROGRAM-ID. PSORTI. ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. AAT-PC. OBJECT-COMPUTER. AAT-PC. SPECIAL-NAMES. DECIMAL-POINT IS COMMA. INPUT-QUTPUT SECTION. FILE-CONTROL. *-----------------------------------------------------------------* FICHEIRO DE ARTIGOS - ENTRADA *------------------------------------------------------------------SELECT ENTRADA ASGN TO ‘ARTIGO.DAT FILE STATUS STAT-ENTRADA. *------------------------------------------------------------------* FICHEIRO SAIDA DE ORDENAÇÃO *------------------------------------------------------------------SELECT SAIDA ASSIGN TO ‘ARTIGO.ORD’ FILE STATUS STAT-SAIDA. *-------------------------------------------------------------------* AREA DE ORDENACAO * --------------------------------------------------------------------SELECT SORTWK1 ASSIGN TO ‘SORTWKI.DAT’. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 37 - Linguagem COBOL Manual de Formação DATA DIVISION. FILE SECTION. FD ENTRADA LABEL RECORDS STANDARD. 01 RENTRADA PIC X(80). FD SALIDA LABEL RECORDS STANDARD. 01 RSAIDA PIC X(80). SD SORTWKI. 01 RSORTWKI. 03 SORTKEY PIC X(3). 03 FILLER PIC X(77). WORKING-STORAGE SECTION. 01 STAT-ENTRADA PIC XX. 01 STAT-SAIDA PIC XX. 01 RN-SORTWKI PIC X VALUE SPACES. PROCEDURE DIVISION. PSORT. SORT SORTWK1 ASCENDING KEY SDRTKEY INPUT PROCEDURE 1-SORT-ENTRADA OUTPUT PROCEDURE 2-SORT-SAIDA STOP RUN. 11-CARREGAR-SORTWK1. RELEASE RSORTWKI FROM RENTRADA READ ENTRADA IF STAT-ENTRADA NOT = ‘00 IF STAT-ENTRADA NOT = ‘10’ DISPLAY ‘ERRO DE LEITURA’ STAT-ENTRADA GOTO 11-CARREGAR-SORTWKI-F. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 38 - Linguagem COBOL Manual de Formação 11 -CARREGAR-SOR1WKI -F. EXIT. 21 -LER-SORTWK1. WRITE RSAIDA FROM RSORTWKI RETURN SORTWKI AT END MOVE ‘1’ TO FIN-SORTWKI. 21-LER-SORTWKI -F. EXIT. 1 -SORT-ENTRADA SECTION. OPEN INPUT ENTRADA IF STAT-ENTRADA NOT = ‘00 DISPLAY ‘NAO SE ABRE O FICHEIRO’ STAT-ENTRADA GO TO 1-SORT-ENTRADA-F. READ ENTRADA IF STAT-ENTRADA NOT = ‘00’ IF STAT-ENTRADA NOT =‘l0’ DISPLAY ‘ERRO DE LEITURA’ STAT-ENTRADA GO TO 1-SORT-ENTRADA-F. DISPLAY INICIO CARGA SORT PERFORM 11-CARREGAR-SORTWK1 THRU 11-CARREGAR-SORTWK1-F UMTIL STAT-ENTRADA = ‘10 CLOSE ENTRADA DISPLAY ‘FIM CARREGA SORT. PASSO ORDENAR’. 1 -SORT-ENTRADA-F. EXIT. 2-SORT-SAIDA SECTION. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 39 - Linguagem COBOL Manual de Formação OPEN OUTPUT SAIDA IF STAT-SAIDA NOT = ‘00’ DISPLAY ‘ERRO AO ABRIR O FICHEIRO DE SAIDA’ STATENTRADA GO TO 2-SORT-SAIDA-F. RETURN SORTWKI AT END MOVE ‘1’ TO FIN-SORTWKI. DISPLAY ‘INICIO LEITURA SORT PERFORM 21-LER-SORTWK1 THRU 21-LER-SORTWK1-F UMTIL FIM-SORTWKI = ‘1’ CLOSE SAIDA DISPLAY ‘FIM LEITURA SORT. FIM PROCESSO’. 2-SORT-SAIDA-F. EXIT. 3.4.8.3.2. Ligação entre Programas Entre as utilizações mais comuns em COBOL está a transmissão de dados entre programas. Com muita frequência existem programas já feitos, que se encarregam de tarefas tais como ler registos de ficheiros, eliminar brancos em cadeias de texto, etc., e que não temos que codificar nem incluir no programa que necessite de realizar uma destas tarefas. Simplesmente se invoca a sua execução com uma instrução CALL no ponto do programa em que seja necessário. Os programas destinados a serem ligados podem apresentar-se em dois formatos: © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 40 - Linguagem COBOL Manual de Formação 3.4.8.3.2.1. Executável Independente Este formato, cuja chamada gera um enlace dinâmico, é o menos usado uma vez que obriga o sistema a aceder ao disco e carregar o programa quando é chamado. 3.4.8.3.2.2. Objecto Independente É o mais utilizado. Na fase de montagem inclui-se junto com o objecto do programa principal, constituindo um só executável. O acesso aos módulos assim montados, denomina-se ligação estática. Será este método que se descreve a seguir. A estrutura do módulo chamado é ligeiramente diferente da de um programa comum. A do módulo chamador não muda, excepto na inclusão da instrução CALL. A filosofia da ligação é a seguinte. Mediante a instrução CALL, especificam-se as direcções dos dados do módulo invocante a que vai ter acesso o módulo invocado. No módulo invocado há que descrever uma área destinada a guardar as direcções passadas e indicar o uso das referidas direcções. 3.4.8.3.2.3. Módulo Invocante Liga ao módulo invocado com a instrução: CALL ‘módulo_invocado’ USING identificador1 [identificador2 ] Em que o nome do módulo invocado se escreve entre pelicas. Os identificadores referenciam itens da WORKING nos quais estão os dados a passar. Há que ter muito cuidado ao escrever o nome do módulo invocado, porque um erro de escrita detecta-se só na fase de montagem e provocará um erro de código 806 em execução. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 41 - Linguagem COBOL Manual de Formação 3.4.8.3.2.4. Módulo Invocado Há que introduzir uma SECTION nova na DATA DIVISION, chamada LINKAGE SECTION na qual haverá um nível 01 para cada uma das direcções que se passam. Os nomes que se atribuem a estas níveis 01 são de livre definição e não é obrigatório que coincidam com as variáveis que se referenciam no módulo invocante. Para estes níveis especificam-se PICTURE’s iguais às dos dados que se passam. Para completar a ligação a especificação da PROCEDURE DIVISION altera-se para a forma: PROCEDURE DIVISION USING nome_nivel01[nome_nivel02 ....] Em que nome_nivel01 é o de cada um dos níveis 01 especificados na LINKAGE SECTION. A instrução que termina a execução é EXIT PROGRAM. Nunca se executará a instrução STOP RUN. Quando se conclui a ligação, os nomes dos níveis 01 da LINKAGE SECTION são apontadores para as áreas de dados que o módulo invocante mencionou na instrução CALL. As modificações que o módulo invocado tenha utilizado como referência aos nomes dos níveis 01 da sua LINKAGE SECTION, transmitir-se-ão imediatamente aos correspondentes itens da WORKING do módulo invocante. © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 42 - Linguagem COBOL Manual de Formação © 2006 Capgemini Este documento é confidencial e não pode ser reproduzido sem autorização prévia da Capgemini Portugal - Serviços de Consultoria e Informática, S.A. - 43 -