cobol by suchenfz

VIEWS: 697 PAGES: 253

									Introdução à Linguagem COBOL




   Introdução ao COBOL - Apostilado para Treinamento




   Microsoft, MS, MS-DOS, Windows, Windows 95 Windows NT, Word, Project,
   Access, Excel, PowerPoint e logo do Windows são de propriedade da
   Microsoft Corporation nos Estados Unidos e/ou outros países.

   COBOL é de propriedade da IBM Corporation nos Estados Unidos e/ou
   outros países.
Capítulo 1 - Prefácio
Este Material...
Este material foi desenvolvido para os participantes do curso de Introdução à
Linguagem COBOL.
Neste você irá encontrar os principais e mais abrangentes recursos sobre este
produto, e estará baseado na configuração padrão de instalação do Software
indicado pelo fabricante.
Buscou-se na criação deste manual, o uso de uma linguagem simples e clara,
sendo escrito em função da execução de Tarefas e a descrição das mesmas
através de passos que serão identificados com uma numeração seqüencial.
O objetivo desse treinamento é habilitar os participantes à:


     Conhecimento do ambiente de Programação de Linguagens de Computação
     Conhecimento do ambiente de Lógica de Programação
Pré-Requisito
Esse treinamento requer que os participantes possuam os seguintes pré-
requisitos :

    Conhecimentos básicos de programação
    TSO e JCL
     Capítulo 2
Elementos básicos do
     COBOL II
Caracteres
    Numéricos - 0 a 9           Alfabéticos - A a Z

    Espaço (branco)             Sinal positivo ou Soma +

    Sinal negativo ou Hífen -   Asterisco ou Multiplicação *

    Barra ou Divisão /          Sinal de Igual   =

    Cifrão $                    Vírgula,

    Ponto.                      Apóstrofo '

    Abre parênteses (           Fecha parênteses )

    Maior que >                 Menor que <
Palavras em Cobol
Dividimos em dois grupos:

       Palavras Reservadas

       Palavras definidas pelo programador
Palavras em Cobol
Palavras Reservadas

São aquelas que tem um significado específico para o compilador COBOL, e
não pode ser utilizada fora de sua finalidade dentro de um programa COBOL.


IDENTIFICATION                                LABEL
RECORD                                        READ
WRITE                                         DATA
Palavras em Cobol
Tipos de Palavras Reservadas:

Palavras Chaves

       São essenciais às especificações de um programa. A omissão dessas
       palavras acarretará resultados errôneos na compilação.


Palavras Opcionais

       São palavras não obrigatórias, servindo apenas para um melhor
       entendimento do programa. Dependendo do programador querer usa-las
       ou não.
Palavras Definidas Pelo Programador
Também chamadas de "NOME". São palavras formadas pelo programador e
servem para referenciar elementos do programa.

Nome de arquivo                           registro
Campos                                    etc.
Palavras Definidas Pelo Programador (Cont.)
Regras Para Formação de Nomes:

      O tamanho máximo é de 30 caracteres;
      Não pode conter espaços ou brancos;
      Pode conter letras, números ou hífens. (Sendo que o hífen não pode
      iniciar ou terminar)
      Não pode ser uma palavra reservada COBOL;
      Não pode conter outros caracteres senão A-Z, 0-9 e o hífen (-);
      Deve conter no mínimo 1 caractere alfabético.

      Válidos                        Não Válidos            Motivo

      CADCOR                         SAO PAULO              Espaço
      PLUG-COD                       X*Y                    Asterisco
      NOME-BRADESCO                  VALUE                  Reservada
      BRASIL                         CLASSE
            Reservada
Constantes
Constantes também chamadas de literais, isto é, Constante e Literal são sinônimos, neste
curso usaremos os dois termos para acostumar com ambos. Existem três tipos de Literais ou
Constantes:

Literal Numérico

        É uma constante definida pelo programador, constituída pelos caracteres
        numéricos de 0 a 9, sinais positivos (+), negativo (-) e vírgula decimal (, ).

Regras de formação:

No máximo 18 caracteres numéricos
Uso de apenas um sinal (+ ou -), e quando usado deve ser posicionado na extremidade
esquerda do literal. A omissão do sinal significará que o número é positivo

Uso de uma vírgula decimal, podendo aparecer em qualquer posição do número, exceto na
extremidade direita. Constantes sem vírgula decimal são considerados números inteiros.

Exemplos:
                   3824             +30,273 -14,5                55,7
Literais Não Numéricos ou Alfanuméricos
São seqüências de caracteres escritos entre apóstrofos(„) ou aspas (“). Não
podem ser utilizadas em expressões aritméticas.

Regras de formação:

Não Pode conter mais de 120 caracteres;
Espaços em branco também são considerados partes da constante;
Constantes não numéricas fazem parte da classe dos alfanuméricos;
Aspas ou apóstrofos não fazem parte da constante;
A constante pode conter qualquer caractere exceto apóstrofo.


“NOME DO CLIENTE”                       'ENDEREÇO'

'$ 127,5'                               ' ' (Espaços em branco)
Constantes Figurativas
Possuem significado específico para o compilador. Não deve ser escrita entre
apóstrofos, para não ser considerada uma constante não numérica.

ZERO                   ZEROS            ZEROES

Representa uma ou mais ocorrências do caracter numérico 0, dependendo do
contexto pode também ser numérico ou não numérico.

MOVE ZERO TO DATA-NAME1 ou MOVE ZEROS TO DATA-NAME1


SPACE           SPACES

Representa uma ou mais posições em branco (ou espaços), tratadas como um item
alfanumérico.

MOVE SPACE TO DATA-NAME1 ou MOVE SPACES TO DATA-NAME1
Constantes Figurativas (Cont.)
QUOTE          QUOTES

Representa uma ou mais ocorrências do caractere apóstrofo (') movidas para um
item não numérico.

MOVE QUOTE TO DATA-NAME1 ou MOVE QUOTES TO DATA-NAME1


HIGH-VALUE     HIGH-VALUES

Representa uma ou mais ocorrências do caractere X'FF' (representação em
hexadecimal do maior valor na seqüência de caracteres na representação
EBCDIC). A constante figurativa HIGH-VALUE é tratado como um literal não
numérico.

MOVE HIGH-VALUE TO DATA-NAME1
Constantes Figurativas (Cont.)
LOW-VALUE              LOW-VALUES

Representa uma ou mais ocorrências do caractere X'00' (representação em
hexadecimal do menor valor na seqüência de caracteres na representação
EBCDIC). A constante figurativa LOW-VALUE é tratado como um literal não
numérico.

MOVE LOW-VALUE TO DATA-NAME1

MOVE LOW-VALUES TO DATA-NAME1

ALL (literal)

Representa uma ou mais ocorrências da cadeia de caracteres que compõe o
literal que não deve ser numérico. Quando uma constante figurativa é usada, a
palavra ALL é redundante.

MOVE ALL ' ' TO DATA-NAME1 ou MOVE SPACES TO DATA-NAME1
MOVE ALL '*' TO DATA-NAME1
Constantes Figurativas (Cont.)
NULL, NULLS (extensão IBM)

Representa um valor usado para indicar que itens de dados definidos com USAGE
IS POINTER ou com ADDRESS OF (registradores especiais) não contém um
endereço válido.

SET DATA-NAME1 TO NULL ou SET ADDRESS OF DATA-NAME1 TO NULLS
      Capítulo 3
Divisões do COBOL II
As quatro divisões do COBOL
Um programa fonte escrito em COBOL é constituído sempre por 4 divisões e que
deverão vir nessa mesma ordem:

IDENTIFICATION DIVISION

ENVIRONMENT DIVISION

DATA DIVISION

PROCEDURE DIVISION


Cada "DIVISION" do COBOL pode estar dividida em uma ou mais "SECTION",
que por sua vez, cada "SECTION" pode estar dividida em um ou mais
"PARÁGRAFOS" e cada "PARÁGRAFO" pode ter um ou uma série de
"STATEMENT" (comandos).
IDENTIFICATION DIVISION
Documenta o programa, identifica o nome do programa fonte, datas de
codificação e compilação, e outras informações.

Esta divisão não é formada por nenhuma seção, apenas, por parágrafos que
veremos mais adiante.
ENVIRONMENT DIVISION
Esta é a segunda divisão de um programa COBOL com o objetivo de
especificar o ambiente de compilação e execução, associar cada arquivo no
programa com um arquivo externo, especificar sua organização, modo de
acesso e outras informações.

A ENVIRONMENT DIVISION está subdividida em duas seções opcionais,
isto é, que deverão ser escritas ou não, dependendo da necessidade do
programa, a saber:


       CONFIGURATION SECTION.

       INPUT-OUTPUT SECTION.
DATA DIVISION
Descrever os dados que o programa manipulará quer para entrada ou saída,
assim como os dados constantes e intermediários do programa.

A DATA DIVISION é constituída na maioria dos casos por três seções:

FILE SECTION.

WORKING-STORAGE SECTION.

LINKAGE SECTION
PROCEDURE DIVISION
É a quarta e última divisão de um programa COBOL, descreve todos os
procedimentos a serem executados pelo programa, tais como operações e
manipulações de dados, controles, etc.

É formada geralmente por diversas seções e parágrafos dependendo da
necessidade do problema.
         Capítulo 4
Folha de Codificação COBOL
Colunas
O compilador COBOL possui características posicionais, isto é, se de um lado
necessitamos ordenação de palavras, divisões e seções, por outro lado é
necessário usar uma estrutura definida da maneira de escrever.

Essa estrutura ou formato permitem ao processador identificar determinadas
informações. A maneira gráfica de representar o formato é por intermédio da
folha de programação. Nesta folha encontramos todas as especificações de
formatos já prefixados.


Colunas de 1 a 6

Usadas para numerar as linhas de um programa. A numeração é em ordem
crescente. Opcionalmente podem deixar de serem preenchidas.
Colunas (Cont.)
Coluna 7
É usada para um "hífen", que significa continuação de literais não numéricos, e o
símbolo * (asterisco) usado para comentários.

Coluna 8 a 72

Usadas para as entradas (palavras ou literais) do programa. Estas colunas estão
agrupadas em duas margens: margem A (colunas 8 a 11) e margem B (colunas
12 a 72).

Colunas 73 a 80

São destinadas opcionalmente à identificação do programa, ou das alterações
efetuadas
MARGENS
Estas colunas são agrupadas em duas margens:

A - (colunas 8 a 11)

Nomes de divisões
Nomes de seções
Nomes de parágrafos

Descrição de arquivos (encontrados na DATA DIVISION que começam com palavras
reservadas de duas letras chamadas indicadores de nível", tais como FD; o indicador de nível
é escrito na margem A; o restante da descrição deve ser escrito na margem B).

Títulos especiais, na Procedure Division.

Os números de nível podem ser escritos na margem A, como por exemplo o nível 77.

B - (colunas 12 a 72).

Começar-se-á a escrever qualquer outra entrada que não está relacionada acima.
EXEMPLO
Para uma melhor visualização, deve-se começar as entradas de um programa em
linhas separadas. Entretanto, caso não seja possível, a nova entrada deverá ser
separada da primeira por pelo menos um espaço.

Se uma entrada for grande demais para caber em uma linha, ela deve continuar na
segunda linha na margem B, não importando se a primeira começou na margem A
ou B.
EXEMPLO (Cont.)
Exemplo de um Programa escrito em COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID.     EXEMPLO.
AUTHOR.         BARTO.
REMARKS.         ESTE PROGRAMA E UM EXEMPLO.

ENVIRONMENT DIVISION.

CONFIGURATION SECTION.

SPECIAL-NAMES. DECIMAL-POINT IS COMMA.


INPUT-OUTPUT SECTION.

FILE-CONTROL.

       SELECT CADCONTA ASSIGN TO CADCONTA.

       SELECT LISTAREL    ASSIGN TO LISTAREL.
EXEMPLO (Cont.)
DATA DIVISION.
FILE SECTION.
FD CADCONTA
    LABEL RECORD IS STANDARD.

01 REG-CADCONTA.
      05 CO-CHAVE.
              10 CO-REGIAO      PIC X(03).
              10 CO-SUBCENTRO   PIC X(03).
              10 CO-AGENCIA     PIC 9(04).
              10 CO-NUMERO      PIC 9(07).
      05 CO-SALDO               PIC S9(11)V99   COMP-3.
      05 CO-DATA-ABERT          PIC 9(08).
      05 CO-DATA-ULT-MOV        PIC 9(08).
      05 CO-LIMITE-CRED         PIC S9(05)V99   COMP-3.
      05 CO-RESTRICAO           PIC X(01).
      05 FILLER                 PIC X(25).

FD LISTAREL
    LABEL RECORD IS OMITTED.

01 REG-LISTAREL.
      05 CONTROLE               PIC X(001).
      05 LINHA                  PIC X(132).
EXEMPLO (Cont.)
WORKING-STORAGE SECTION.
01 FLAG-EOF                PIC X(001)   VALUE SPACES.
88 CONDICAO-EOF                         VALUE HIGH-VALUES.
01 CB10-CABECALHOS..
        05 CB11-CABEC01.
                 10 FILLER              PIC   X(30)    VALUE „BRADESCO *****‟.
                 10 FILLER              PIC   X(90).   VALUE „RELACAO DE......‟.
                 10 FILLER              PIC   X(05)    VALUE „PAG.‟.
                 10 CB11-PAG            PIC   ZZ9.
        05 CB12-CABEC02.
                 10 FILLER              PIC X(80)   VALUE
                 „REGIAO SUBCENTRO      AGENCIA C.CORRENTE ....‟.
                 10 FILLER              PIC X(42).  VALUE „S A L D O‟.
01 LD50-LINHAS-DETALHE.
        05 LD51-LINHA01.
                 10 FILLER              PIC X(05)      VALUE SPACES.
                 10 LD51-REGIAO         PIC X(03).
                 10 FILLER              PIC X(04)      VALUE SPACES.
                 ........
                 .........
        05 LD52-LINHA02.
                 10 FILLER              PIC X(10)      VALUE SPACES.
                 ........
                 ........
01 AC100-ACUMULADORES.
        05 AC100-LIN                    PIC 9(02)      VALUE 99.
        05 AC100-PAG                    PIC 9(03)      VALUE ZEROS.
        ........
EXEMPLO (Cont.)
PROCEDURE DIVISION.
A000-00-PRINCIPAL.
        PERFORM B000-00-ABERTURA THRU B999-99-FIM.
        PERFORM C000-00-PROCESSAMENTO UNTIL CONDICAO-EOF.
        PERFORM X000-00-FINAL THRU X999-99-FIM.
A999-99-FIM.
        GOBACK.
B000-00-ABERTURA.
        OPEN INPUT CADCONTA
               OUTPUT        LISTAREL.
        PERFORM D000-00-LE-CONTA.
B999-99-FIM.
        EXIT.
C000-00-PROCESSAMENTO.
        IF CO-REGIAO = “ABC”
        MOVE “S” TO LD51-RESTRICAO
        ELSE
        MOVE “N” TO LD51-RESTRICAO
        END-IF.
        PERFORM I000-00-IMPRIME
        PERFORM D000-00-LE-CONTA.
C999-99-FIM.           EXIT.
EXEMPLO (Cont.)
D000-00-LE-CONTA.
         READ CAD-CONTA AT END
                 MOVE HIGH-VALUES TO FLAG-EOF.
D999-99-FIM. EXIT

I000-00-IMPRIME.
          IF      AC100-LIN IS GREATER 55
                  PERFORM I500-00-CABEC.
          MOVE CO-REGIAO           TO LD51-REGIAO …..
          MOVE LD51-LINHA01 TO LINHA
          WRITE REG-LISTAREL AFTER 1 LINE.
          ADD 1                    TO AC100-LIN.
          GO TO I999-99-FIM.

I500-00-CABEC.

          ADD 1                          TO AC100-PAG
          MOVE AC100-PAG         TO CB11-PAG
          WRITE REG-LISTAREL FROM CB11-CABEC01 AFTER PAGE
          .....
          MOVE 0 TO AC100-LIN.
I999-99-FIM. EXIT

X000-00-FINAL.
         CLOSE   CAD-CONTA
                 LISTAREL.
X999-99-FIM.     EXIT.
     Capítulo 5
Notações de Formatos
 Notações de Formatos
A seguir são descritas as notações utilizadas para descrever os formatos de um programa COBOL, nesta
  apostila.

• As palavras reservadas são escritas em letras maiúsculas, não devendo ser abreviadas e nem ter a
  ortografia errônea.

• As palavras reservadas não sublinhadas são opcionais (uso não obrigatório), porém quando utilizadas
  não devem conter erros de ortografia.

• As palavras reservadas sublinhadas são as palavras chaves.

• As informações a serem escritas pelos programadores estão em letras minúsculas.

• As partes entre [ ] (colchetes) são opcionais, utilizando-as conforme a necessidade.

• As partes entre { } (chaves) indicam que obrigatoriamente devemos escolher a alternativa mais
  adequada.

• Partes do formato que podem ser repetidas qualquer número de vezes, são seguidas por três pontos
  (...) sucessivos. Se esses pontos seguem uma palavra, eles se aplicam somente aquela palavra. Caso
  esses pontos sigam colchetes ou       chaves, eles se referem à parte toda entre colchetes ou chaves do
  formato.

Exemplo:

OPEN { INPUT / OUTPUT } arquivo1 [arquivo2]...
    Capítulo 6
Cláusulas Especiais
Cláusulas Especiais
      Capítulo 7
Identification Division
Informações
A IDENTIFICATION DIVISION deve ser a primeira divisão no programa Cobol.
Nesta divisão identifica-se o programa, Nome, Autor, data em que foi feito,
comentários sobre o que faz o programa, etc.

As informações escritas na IDENTIFICATION DIVISION são tratadas pelo
compilador COBOL como comentários para documentação, não afetando portanto
o significado do programa e não sendo traduzidos em linguagem de máquina.
Informações (Cont.)
IDENTIFICATION DIVISION. O nome da divisão IDENTIFICATION DIVISION deve ser
                         escrito a partir da margem A, seguido por ponto. A
ou                       abreviação ID DIVISION pode substituir a forma por
                         extenso, e os parágrafos opcionais podem estar
ID DIVISION.             codificados a seguir em qualquer ordem.
                         Os comentários em qualquer parágrafo opcional podem ser
                         quaisquer combinação de caracteres EBCDIC, escritos na
                         margem B em uma ou mais linhas sendo inválido o uso do
                         hífen na coluna 7 para indicar continuação.

PROGRAM-ID.                Nome do programa. Único parágrafo obrigatório na
                           IDENTIFICATION DIVISION, cujo objetivo é dar nome ao
                           programa. O sistema usará as oito primeiras posições para
                           identificar o nome do programa.
                           O nome do programa deve começar com letra, caso
                           contrário haverá conversão de caractere da seguinte forma:
                           o dígito 0 será convertido para J e dígitos de 1 à 9 para A à
                           I. Se houver um hífen das posições de 2 a 8, será
                           convertido para o dígito 0.
Informações (Cont.)
AUTHOR .        Nome do autor. [...] – Opcional. Este parágrafo bem como os
                demais restantes serve para documentação. Este parágrafo tem
                como finalidade identificar o autor do programa (o nome do
                programador).
INSTALLATION.   Empresa. [...]- Opcional
                Identificamos aqui o nome da empresa ou localização.
DATE-WRITTEN.   DD/MM/AA. - Opcional Identifica a data da codificação do
                programa.
DATE-           Não preencher. [...]
COMPILED.       Identifica a data de compilação do programa. Podemos aqui
                escrever apenas o nome do parágrafo seguido por um ponto, e
                quando o programa for compilado, o compilador COBOL se
                encarregará de escrever a data de compilação.
SECURITY.       Comentário do programa - Opcional
                Documentar qualquer medida de segurança a ser tomada quanto
                ao programa e/ou dos arquivos utilizados pelo programa. Lembre-
                se que isto não gerará nenhuma ação a ser tomada por parte do
                sistema, servindo apenas como parte da documentação do
                programa.
                Use também para documentar as alterações efetuadas.
Informações (Cont.)
Exemplo:

      ID DIVISION.
      PROGRAM-ID.       XPTO999.
      AUTHOR.           BARTOLOMEU.
      INSTALLATION.     ARO/DSAG/CSDS BRADESCO.
      DATE-WRITTEN.     AGOSTO-95.
      DATE-COMPILED.

* COM ASTERISCO VIRA COMENTARIO.
* OUTROS COMENTÁRIOS PODERAO SER ACRESCENTADOS
/ ESTA LINHA SAIRA NA PROXIMA PAGINA DA COMPILACAO E‟ COMENTARIO.
     Capítulo 8
Environment Division
Seções
ENVIRONMENT DIVISION.   Vem logo após a IDENTIFICATION, esta divisão indica qual o
                        computador e os arquivos a serem utilizados pelo programa,
                        associando cada arquivo com os seus respectivos periféricos de
                        entrada e saída.

CONFIGURATION           É utilizada para fornecer informações sobre o computador, e está divida
SECTION.                em três parágrafos:

SOURCE-COMPUTER.        Nome do computador [WITH DEBUGGING MODE].
                        Este parágrafo serve para identificar o computador que compilará o
                        programa COBOL.:

OBJECT-COMPUTER.        Nome do computador.
                        [MEMORY SIZE integer{WORDS /            CHARACTERS / MODULES}]
                        [PROGRAM COLLATING SEQUENCE IS alphabet-name].
                        [SEGMENT-LIMIT IS priority-number].
                        Este parágrafo serve para identificar o computador no qual será
                        executado o programa COBOL.

SPECIAL-NAMES.          [function-name-1 is mnemonic-name ...]
                        [CURRENCY SIGN IS literal-1]
                        [DECIMAL-POINT IS COMMA]. O parágrafo SPECIAL-NAMES tem por
                        objetivo relacionar funções existentes no compilador COBOL com
                        nomes simbólicos dados pelo programador.
                        Deve ser usado sempre que precisar inverter o ponto decimal para a
                        virgula.
Exemplo
ENVIRONMENT                    DIVISION.

CONFIGURATION                  SECTION.

SOURCE-COMPUTER.               IBM3090.
OBJECT-COMPUTER.               IBM3090.

SPECIAL-NAMES.

     DECIMAL-POINT IS COMMA.
Seções
INPUT-OUTPUT SECTION. Define os arquivos utilizados pelo programa. Assim como efetiva as
                      ligações entre o programa e os periféricos.
FILE-CONTROL              Estabelece o relacionamento entre os nomes e outros dados associados a
                          arquivos com periféricos externos. A expressão FILE CONTROL aparece
                          somente uma única vez no início do parágrafo, e deve ser codificado na
                          margem A. O formato a seguir serve tanto para arquivos de métodos de
                          acesso QSAM como VSAM ESDS.
SELECT                    É usada para dar nomes aos arquivos utilizados no programa e associá-los
[OPTIONAL]file-Name       com seus respectivos periféricos. Os nomes dos arquivos são definidos
ASSIGN TO assignment-     pelo programador, criando o nome que quiser, desde que obedeça às
name-1 ...                regras de formação das palavras definidas pelo programador.
RESERVE Integer AREA      Regras para formação de nomes de arquivos:
ORGANIZATION IS           De 1 até 30 caracteres;
SEQUENTIAL / INDEXED      Nenhum caractere especial, exceto hífen;
ACCESS MODE IS            Nenhum caractere branco no meio;
SEQUENTIAL / RANDOM       Pelo menos um caractere alfabético.
FILE STATUS IS data-      Nome:     De 1 a 8 caracteres especificando o nome do arquivo externo
name-2 ...                requerido. Este precisa ser o nome especificado no comando DD de JCL
                          para este arquivo. Este nome não pode ser uma palavra reservada
                          (exemplo SYSIN, SYSOUT, SYSPUNCH).
I-O-CONTROL.              Especifica quando devem ser efetuados "checkpoints" e compartilhamento
                          de áreas de memória para os diferentes arquivos. Este parágrafo é
                          opcional num programa COBOL
 Capítulo 9
Data Division
Seção FILE SECTION
DATA DIVISION             Sua função é descrever os arquivos e seus registros, assim como
                          qualquer área de trabalho necessária ao programa.
Dividida em 3 Seções:

FILE SECTION              É a seção que aloja a descrição dos arquivos definidos nas cláusulas
                          SELECT da ENVIRONMENT DIVISION.
            FILE SECTION.
            FD CADCONTA
                    RECORDING                MODE IS F
                    LABEL RECORD ARE        STANDARD
                    RECORD CONTAINS          70 CHARACTERS
                    DATA  RECORD            IS REG-CADCONTA.

            01 REG-CADCONTA.
                   05 CO-CHAVE.
                           10 CO-REGIAO           PIC X(03).
                           10 CO-SUBCENTRO        PIC X(03).
                           10 CO-AGENCIA PIC 9(04).
                           10 CO-NUMERO PIC 9(07).
                   05 CO-SALDO                    PIC S9(11)V99    COMP-3.
                   05 CO-DATA-ABERT      PIC 9(08).
                   05 CO-DATA-ULT-MOV    PIC 9(08).
                   05 CO-LIMITE-CRED     PIC S9(05)V99     COMP-3.
                   05 CO-RESTRICAO                PIC X(01).
                   05 FILLER                      PIC X(25).
Seção FILE SECTION (Cont.)
File-Name

       Precisa seguir o indicador de nível (FD ou SD), e precisa ser o mesmo nome
       especificado na entrada SELECT associada. O nome do arquivo precisa aderir às
       regras de formação de nomes definidos pelo programador, ao menos um caractere
       deve ser alfabético. O nome do arquivo deve ser único para este programa.

Cláusula BLOCK

       Determina o tamanho do bloco (registro físico) do arquivo, em número de registros
       ou caracteres. O bloco pode ter tamanho variável. Caso esta cláusula for omitida o
       arquivo será considerado desblocado.
       No entanto, rodando sob MVS a codificação: BLOCK CONTAINS 0, pode
       especificar que para arquivos QSAM; o tamanho do bloco será determinado através
       de parâmetros do comando DD de JCL, ou através do Label do arquivo.

Cláusula RECORD

       Determina o tamanho do registro (registro lógico) do arquivo, em número de
       caracteres
Seção FILE SECTION – Recording Mode
Cláusula RECORDING

        Determina o formato de registro que o arquivo possui. Em COBOL, basicamente, podemos
        declarar os seguintes formatos:

        MODE F: Todos os registros do arquivo são do mesmo tamanho e cada um está inteiramente
        contido em um bloco. Os blocos podem conter mais de um registro, mas usualmente existe
        um número fixo de registros por bloco;

        MODE U: Os registros podem ser fixos ou variáveis. Contudo, existe apenas um registro por
        bloco. Não existem campos de descrições de comprimento de registro ou bloco;

        MODE V: Os registros podem ser fixos ou variáveis, inteiramente contidos em um bloco. Os
        blocos podem conter mais de um registro. Cada registro inclui a descrição dos campos de
        comprimento do registro e cada bloco inclui a descrição do tamanho do bloco. Estes campos
        não são descritos na DATA DIVISION; sua previsão é feita automaticamente e não são
        disponíveis para o programador.

        MODE S: Os registros podem ser fixos ou variáveis; podendo até mesmo ser maiores que o
        bloco. Se um registro (SPANNED) for maior que o espaço disponível em um bloco, um
        segmento do registro será escrito de modo a preencher o bloco. O resto do registro é
        armazenado no próximo bloco (ou blocos, se necessário).Cada segmento de um registro no
        bloco, mesmo que esteja inteiramente contido no bloco, inclui um campo de descrição do
        segmento, e cada bloco inclui um campo de descrição do bloco.
        Estes campos também não estão disponíveis para o programador.
Seção FILE SECTION – LABEL
Cláusula LABEL

      Indica se o arquivo tem ou não registro com informações de label. Essa
      cláusula é obrigatória para cada descrição de arquivo (FD). Utiliza-se do
      seguinte modo:

      OMITTED Significa que o label foi omitido, normalmente seu uso é para
      arquivo em cartões, impressoras e arquivos sem informações de label.

      STANDARD Quando o arquivo contiver um label que foi formatado pelo
      sistema, seu uso normal é para arquivos em fitas, discos e qualquer outro
      meio magnético.
Entrada da descrição de registros
Como vimos na FILE SECTION além da entrada de descrição de arquivos, temos a
entrada da descrição de registros. Na entrada da descrição de registro indica-se as
características dos registros tais como tamanho, valores e natureza. O número de
nível é um recurso empregado em COBOL para que se possa determinar com
simplicidade a estrutura de um registro, a hierarquia das informações (dos dados)
dentro de um registro.
Exemplo:

Pode-se dividir o registro em quantos níveis convier (01 a 49). O primeiro nível (01)
é onde reconhecemos todo o registro; a seguir o segundo nível com as subdivisões
do registro; depois o terceiro nível com as subdivisões do segundo nível e assim
sucessivamente, definindo uma seqüência de campos.

Os itens (ou níveis) que não possuem subdivisões são chamados de elementares.
Os itens que possuem subdivisões são denominados itens de grupo.

No exemplo anterior os campos região, sub-centro, agencia, são itens elementares
já o campo Chave é um item de Grupo.
Níveis Especiais
Os números de níveis especiais identificam itens que não estruturam
registros. Estes níveis especiais são:



       77 Identifica um item independente da WORKING-STORAGE ou
       LINKAGE SECTION que não são subdivisões de outros itens, e
       que também não são subdivididos. Sua definição deve começar
       na margem A.


       88 Identifica qualquer entrada de nome de condição que está
       associada a um valor particular de uma variável condicional.
       Veremos maiores detalhes na consideração da cláusula VALUE.
FILLER
Um registro é sempre iniciado pelo número de nível 01 que indica ser o maior
agrupamento e à medida que se detalhem os dados, os números de níveis
crescem.
Pode-se utilizar para um número de nível o valor máximo que é 49. O número de
nível não necessita crescer de uma forma contínua mas manter a ordem de
grandeza.

FILLER e Data-Name

O Data-Name (nome de dado) é aquele nome atribuído ao campo a ser utilizado
no programa, isto é, define os campos do registro. Um nome de dado pode ter no
máximo 30 caracteres de especificação.

FILLER é um nome genérico atribuído a campos que não tem necessidade de
serem especificados, pois não serão utilizados no processamento. No ambiente
IBM, o FILLER pode ser tanto um item de grupo, como item elementar.
FILLER (Cont.)
Exemplo:

  FD CADCONTA
  LABEL RECORD IS STANDARD.
  01 REG-CADCONTA.
   05 CO-CHAVE.
     10 CO-REGIAO       PIC X(03).
     10 CO-SUBCENTRO PIC X(03).
     10 CO-AGENCIA      PIC 9(04).
     10 CO-NUMERO       PIC 9(07).
   05 CO-SALDO          PIC S9(11)V99 COMP-3.
   05 CO-DATA-ABERT     PIC 9(08).
   05 CO-DATA-ULT-MOV PIC 9(08).
   05 CO-LIMITE-CRED    PIC S9(05)V99 COMP-3.
   05 CO-RESTRICAO      PIC X(01).
   05 FILLER            PIC X(25).
Regras Sintáticas
O nome de dado ou FILLER devem ser escritos logo após o número de nível.

O nome de dado que é criado pelo programador deve obedecer às regras de
formação das palavras definidas pelo programador.

A palavra reservada FILLER é utilizada para denominar aqueles campos de
informação que não tenham necessidade de serem referenciados no programa.

Os nomes de dados definidos na WORKING-STORAGE SECTION e LINKAGE
SECTION, devem ser únicos, porque não podem ser qualificados.
Cláusula PICTURE (PIC)
Essa cláusula define o tamanho, a classe e estrutura de um campo de dados. A função da cláusula
PICTURE é indicar:

O tamanho de um campo, ou seja, quantas posições de memória o campo de informações ocupa.
A classe do campo, isto é, indica se o campo é numérico, alfanumérico ou alfabético.
Máscaras de edição, isto é, detalhes que devem aparecer na impressão do campo.

A cláusula PICTURE nunca poderá aparecer em um item de grupo. Resumindo, a cláusula PICTURE
sempre estará presente e só estará presente nos itens elementares.

Cada caractere, na combinação permitida da PICTURE representará uma posição de memória. Como se
verá mais adiante o caractere X, indica a presença de um caractere alfanumérico. Se desejarmos um
campo capaz de receber 5 caracteres alfanuméricos teríamos de definir:

PIC XXXXX                              PICTURE X(05)
PIC IS XXXXX                           PICTURE IS X(05)

A palavra IS é opcional. Para se evitar repetição prolongada do mesmo caractere (imagine representar
20 posições ou mais dessa forma), porem, pode-se valer do seguinte artifício:

PIC X(5)
onde o número entre parênteses representa o número de ocorrências do sinal X. Não há espaço entre o
sinal de PIC e os parênteses e nem entre esses e o número.
Cláusula PICTURE (PIC) (Cont.)
A sua codificação ficará assim:

        FD CADCONTA
        LABEL RECORD IS STANDARD.
        01 REG-CADCONTA.
           05 CO-CHAVE.
              10 CO-REGIAO           PIC X(03).
              10 CO-SUBCENTRO        PIC X(03).
              10 CO-AGENCIA          PIC 9(04).
              10 CO-NUMERO           PIC 9(07).
           05 CO-SALDO               PIC S9(11)V99 COMP-3.
           05 CO-DATA-ABERT          PIC 9(08).
           05 CO-DATA-ULT-MOV        PIC 9(08).
           05 CO-LIMITE-CRED         PIC S9(05)V99 COMP-3.
           05 CO-RESTRICAO           PIC X(01).
           05 FILLER                 PIC X(25).

A palavra FILLER pode ser omitida:

               05                    PIC X(25).
Sinais de PICTURE
Os sinais de PICTURE, que serão abaixo descritos, podem ser divididos em dois grupos:

PICTURE de leitura
PICTURE de edição ou máscara
PICTURE de leitura
Os sinais que podemos usar são os seguintes: 9, X, V, S, A. Dentro desse tipo de
PICTURE , podemos ainda classificar os tipos de itens (campos) que elas definem:
              São configurados pelos caracteres 9, S e V. O caractere de PICTURE 9, indica
              a presença de um caractere numérico (de 0 à 9) naquela posição do campo.
              O caractere de PICTURE S, indica a presença do sinal aritmético (+ ou ) em
              um campo de informações. Deverá ser colocado no início de uma configuração
Numéricos
              de caracteres de PIC.
              Exemplo: PIC S9(04) Indica campo numérico de quatro posições com sinal.
              O caractere de PICTURE V, indica o posicionamento de uma vírgula decimal
              implícita.
              Exemplo: PIC S9(03)V9(02) S e V não ocupam espaço na memória.
Sinais de PICTURE (Cont.)
                       São configurados apenas pela letra A. Essa letra A na
Campos Alfabéticos     PIC indica a presença de um caractere alfabético ou do
                       caractere branco naquela posição.
                       Exemplo : NOME PIC A(04). 4 posições alfabéticas.


                       São combinações de X. Indica que aquela posição
                       conterá um caractere alfanumérico, o que vale dizer
Campos Alfanuméricos   que o caractere de PICTURE X, permite a definição de
                       um campo, capaz de aceitar qualquer caractere
                       (numérico, alfabético ou especial).
                       Exemplo: 10 ENDERECO                   PIC X(30).
Sinais de PICTURE
Resumindo temos:




Exemplos: O símbolo "V" na coluna armazenamento na memória
significa uma vírgula decimal implícita.
PICTURE de edição
A PICTURE de edição refere-se à preparação de dados para impressão. Somente
campos numéricos são passíveis de edição. O formato é representado por
qualquer combinação dos seguintes caracteres:

9 V , Z * B $ + . CR DB.

Os caracteres 9 e V são usados do mesmo modo já visto. O caractere "," (vírgula
decimal) quando usado, é inserido na posição indicada. O valor do item será
automaticamente alinhado por esta vírgula.
As posições à direita da vírgula devem ser constituídas apenas por caracteres do
tipo:

9 Z * . $ + CR DB

Z: indica a supressão de zeros não significativos (zeros à esquerda). Não é
possível colocar-se Z à direita de um caractere 9.

"*": é usado como proteção do número impresso. Os zeros à esquerda serão
substituídos por asteriscos. _ esquerda dos asteriscos poderemos usar apenas os
símbolos ". , $ + ".
PICTURE de edição (Cont.)
"$": este caractere, usado na extrema esquerda ou direita do número, é impresso
na posição onde estiver.

"+": usado nas posições extremas dos campos, aparecem na posição onde estiver.
Se o valor do campo for positivo aparece o sinal "+" se for negativo aparece o sinal
"".

"-": (usado como o +) se o valor do campo for negativo será impresso o sinal "",
entretanto se for positivo aparecerá um espaço em branco.

B: (letra B maiúscula) é um símbolo de edição que insere branco exatamente no
local onde estiver codificado.

".": (ponto) insere o ponto no local onde está.

CR, DB: são siglas utilizadas com o significado de crédito (CR) e débito (DB). Elas
aparecem na posição extrema direita da PICTURE. Se o valor do item for negativo,
esses caracteres serão impressos à direita do número, caso contrário serão
substituídos por brancos.
Exemplo
Arquivo de Entrada: CADCONTA
Arquivo de Saída:          LISTAREL
Nome do registro:          REG-LISTAREL
DATA DIVISION.
FILE SECTION.
FD CADCONTA
LABEL RECORD IS STANDARD
DATA RECORD IS REG-CADCONTA.
01 REG-CADCONTA.
        05 CO-CHAVE.
            10 CO-REGIAO          PIC X(03).
            10 CO-SUBCENTRO       PIC X(03).
            10 CO-AGENCIA         PIC 9(04).
            10 CO-NUMERO          PIC 9(07).
        05 CO-SALDO               PIC S9(11)V99   COMP-3.
        05 CO-DATA-ABERT          PIC 9(08).
        05 CO-DATA-ULT-MOV        PIC 9(08).
        05 CO-LIMITE-CRED         PIC S9(05)V99   COMP-3.
        05 CO-RESTRICAO           PIC X(01).
        05 FILLER                 PIC X(25).
FD LISTAREL       LABEL RECORD ARE OMITTED
    DATA RECORD IS LINHA.
01 REG-LISTAREL.
   05 FILLER             PIC X(001).
   05 LD-REGIAO          PIC X(003).
   05 FILLER             PIC X(005).
   05 LD-SUBCENTRO       PIC X(003).
   05 FILLER             PIC X(005).
   05 LD-SALDO           PIC ZZZ.ZZ9,99.
Tipos de Campos
Zonado

     Campo zonado é aquele onde um algarismo é representado em um byte no
     formato zona e dígito. O tamanho máximo de dígitos deste tipo de campo
     é18 que será representado em 18 bytes.
     Para informar na definição que o campo é zonado, basta não codificar a
     cláusula USAGE, ou seja após o "TAMANHO" colocar o ponto.
     Exemplo: 05 CPO-ZONADO PIC 9(10).
Tipos de Campos (Cont.)
Compactado

Neste campo cada algarismo é representado em meio byte e o meio byte mais à
direita contém o sinal do campo.
Exemplo: Um Campo de 5 dígitos com o valor +345 tem sua representação
           em hexadecimal X'00345C'. O tamanho máximo de dígitos desse
           campo é 17, que serão representados em 9 bytes.
A fórmula para cálculo do número de bytes de um campo compactado:
         a) Número ímpar de dígitos: Somar 1 ao número de dígitos e dividir o
            resultado por 2.
         b) Número par de dígitos: Somar 2 ao número e dividir o resultado por 2.
Observe que em um campo com número de dígitos par ocorre a perda do último
meio byte à esquerda. Para definir um campo compactado, basta codificar a
cláusula USAGE igual a "COMP3".
Exemplo: 05 CPO-COMPACTADO PIC 9(10) COMP-3.
            ou
            05 CPO-COMPACTADO PIC 9(10) PACKED-DECIMAL.
O VS COBOL II usa as cláusulas: PACKED-DECIMAL e COMP-4, como
cláusulas equivalentes ao COMP-3. A constante USAGE é opcional.
Tipos de Campos (Cont.)
Binário

          O campo binário oferece uma maior capacidade de representação dentro
          de um byte. Em um campo de 4 casas o valor 6859 é armazenado em
          dois bytes e com representação hexadecimal X'1ACB'. A definição do
          campo por exemplo ficaria da seguinte forma:

                 05 CPO-BINARIO PIC 9(04) BINARY.

          O uso deste campo tem aplicação prática para representar valores até
          9.999, embora os dois bytes binários represente um valor máximo de
          32.768.

          A definição PIC 9(09) BINARY, tem sua aplicação para valores até
          999.999.999, embora os quatro bytes binários possa também representar
          um valor máximo de 2.147.483.648.
          A cláusula COMP também define campos binários.
Working Storage Section
                         Aqui se define os dados de trabalho do programa, ou seja todos
                         os campos de informação (constantes ou variáveis), dos quais o
WORKING-STORAGE SECTION. programador lançará mão e que não fazem parte dos arquivos e
                         neste item classificam-se: contadores, acumuladores, cabeçalhos
                         de impressão, áreas de apoio ou áreas de armazenagem
                         temporária, linhas de impressão, constantes do programa, etc.

Esta seção descreve registros, constantes e áreas de trabalho que não fazem parte de arquivos
externos, mas que são necessários para a execução.

A distribuição destes dados, faz-se da mesma forma que na FILE SECTION, acrescentando-se a
existência do nível 77, que é o nível que define dados independentes, isto é, aqueles que não são
estrutura de dados ou parte deles.

Os dados que se relacionam com outros, ou seja, são subdivididos, devem ser agrupados obedecendo
as leis de descrição de estrutura de dados e começando do nível 01.

Exemplo nível 77:

          WORKING-STORAGE SECTION.

          77 CONTADOR         PIC 9(005).
          77 MENS             PIC X(008).
VALUE
VALUE IS literal

        Para se especificar os valores iniciais de constantes e contadores usar a cláusula
        VALUE. Todo item definido com a cláusula VALUE na WORKING-STORAGE
        SECTION receberá o valor especificado pelo literal para seu valor inicial, podendo
        ser mudado na PROCEDURE DIVISION.

        A cláusula VALUE não deve ser especificada para descrições de dados que
        tenham a cláusula OCCURS ou sejam subordinadas a itens que contenham a
        cláusula OCCURS.

        A cláusula VALUE pode ter um segundo formato que é usado para descrever um
        nome de condição. Cada nome de condição normalmente necessita de um
        número de nível 88 para sua definição; entretanto, a cláusula VALUE no seu
        segundo formato associa valor, valores ou faixa de valores a um determinado
        nome de condição.

        Quando a opção THRU é utilizada, os valores que delimitam os intervalos devem
        estar em ordem crescente.

        O tipo de literal usado na cláusula VALUE deve ser coerente com a descrição do
        campo que lhe é associado.
VALUE (Cont.)
Exemplo:

01 TESTA-ESTADOS.
      05 TA-ESTADO                  PIC X(02)      VALUE SPACES.
          88 RIO-DE-JANEIRO                        VALUE 'RJ'.
          88 SAO-PAULO                             VALUE 'SP'.
          88 MINAS-GERAIS                          VALUE 'MG'.

A seguir veremos um exemplo de codificação da DATA DIVISION, apenas
para efeito didático. Note que usamos a cláusula VALUE e os valores
iniciais dos campos que a possuem são as que essa cláusula define.
Exemplo
DATA DIVISION.
FILE SECTION.
FD CADCLIENTE
LABEL RECORD IS STANDARD.
01 REG-CADCLIENTE.
   05 CC-NOME-CLI           PIC X(50).
   05 CC-ENDE-CLI                    PIC X(40).
   05 CC-ESTA-CLI                    PIC X(02).
   05 FILLER                PIC X(22).
FD SAIDA
LABEL RECORD ARE OMITTED.
01 LINHA.
   05 FILLER                PIC X(01).
   05 LD-NOME-CLI           PIC X(50).
   05 FILLER                PIC X(10).
   05 LD-ENDE-CLI                     PIC X(50).
WORKING-STORAGE SECTION.
77 AC100-LINHAS             PIC 9(02)          VALUE 99.
77 CT150-PAGINA             PIC 9(03)                 VALUE ZERO.
01 W200-REG-CADCLIENTE.
05 W200-BRANCO              PIC X(10)          VALUE SPACES.
05 W200-CIDADE              PIC X(15)          VALUE 'SAO PAULO'.
05 W200-ESTADO              PIC X(15).
05 W200-SIGLA-ESTADO        PIC X(02).
BLANK WHEN ZERO
A cláusula BLANK WHEN ZERO substitui o item por espaços, todas as
vezes que seu valor for em todas posições zeros. Seu formato é:
BLANK WHEN ZERO
REDEFINES
A cláusula REDEFINES é utilizada para re-escrever uma área ou de um
arquivo ou da WORKING-STORAGE, de modo que os caracteres pertencentes
a área possam ser referenciados por outros nomes.

01 REG-ARQMOV.
05 MO-CHAVE.
      10 MO-REGIAO                         PIC X(03).
      10 MO-SUBCENTRO               PIC X(03).
      10 ...
05 MO-TIPO-MOV                      PIC 9(02).
05 RMO-TIPO-MOV  REDEFINES
   MO-TIPO-MOV                      PIC X(02).

No exemplo anterior, a área descrita para MO-TIPO-MOV é a mesma que
descrita para RMO-TIPO-MOV. Contudo, um é numérico o outro e
alfanumérico.
REDEFINES (Cont.)
Outra forma é redefinir o item de grupo, a divisão de campos para esses itens
de grupo não é a mesma, porém o tamanho total deve ser igual.

01 REG-ARQMOV.
05 MO-CHAVE.
        10 MO-REGIAO                           PIC X(03).
        10 MO-SUBCENTRO                 PIC X(03).
05 RMO-CHAVE        REDEFINES
           MO-CHAVE.
        10 MO-PRIMEIRA                  PIC X(01).
        10 MO-SEGUNDA                   PIC X(01).
        10 ....
        10 MO-SEXTA                     PIC X(01).
05 ....

De maneira geral, a cláusula REDEFINES permite a referenciação da mesma
área de memória do computador para conter itens de dados diferentes ou
agrupamento alternativo da mesma informação. Isto é, a cláusula REDEFINES
permite a redefinição da área de memória, e não dos itens que ocupam aquela
área.
Linkage Section
                       É utilizada para ligar o programa principal em COBOL
                       a outros programas, muito utilizado em programação
 LINKAGE SECTION       modular, para comunicação entre o programa
                       principal e as subrotinas passando parâmetros.



O seu funcionamento é parecido com o da Working, com a diferença que os
dados aqui declarados serão compartilhados com outro programa, podendo tanto
enviar como receber dados nessa área. (é uma área comum entre programas).
      Capitulo 10
Programação Estruturada
PROGRAMAÇÃO ESTRUTURADA
O COBOL MORREU... VIVA O COBOL!
Apesar de todo ano aparecerem notícias sobre sua morte, o Cobol resiste
bravamente. Estima-se que existam cerca de 65 bilhões de linhas de código
Cobol do mundo inteiro, crescendo a um ritmo de 5 bilhões de linhas
anualmente.

Se considerarmos que cada programa Cobol é patrimônio da empresa, e que o
valor de cada linha eqüivale a U$ 15,00 (estudo feito pelo Gartner Group),
temos o equivalente a U$ 975.000.000.000,00 (novecentos e setenta e cinco
bilhões de dólares) em patrimônio, escritos em linguagem Cobol no mundo
inteiro

Um patrimônio considerável, que não ser abandonado da noite para o dia!
O seu universo de programadores deve provavelmente chegar a mais de
2 milhões de profissionais usando esta linguagem, principalmente mantendo
”Legacy Systems”, alguns com mais de 20 anos de idade.

Isso significa que sair do Cobol não é uma tarefa muito simples e para
muitas empresas manter essa linguagem é uma questão de sobrevivência.
PROGRAMAÇÃO ESTRUTURADA (Cont.)
Uma versão Cobol orientada a objeta (00) não é uma contradição de termos. O
conceito de 00 propõe um foco “data centered”, onde um objeto é constituído de
dados e de código que os manuseiam. A estrutura da aplicação é sugerida pela
estrutura dos dados. Este conceito adapta-se muito bem ao Cobol, pois está
linguagem oferece boas facilidades para organizar e processar estruturas de dados.

As primeiras versões de 00 e visual Cobol já estão começando a ser disponibilizados
no mercado, pelos tradicionais fornecedores de “Cobol Workbench”, como microfocos
e computer associates.

Uma recomendação para aqueles usuários que estão hoje altamente dependentes do
Cobol, é caminhar para uma evolução gradual dos seus “legacy systems”, pela
adoção dos conceitos de 00 nesta linguagem. O uso do 00Cobol pode reduzir a curva
de aprendizado, pois a linguagem já é conhecida dos técnicos, sendo que a novidade
(conceitos de 00), é incluída como extensão da linguagem.

Entretanto, estas primeiras versões não estão padronizados, pois o padrão ANSI-00
ainda está em elaboração. Este é um risco dos pioneiros do 00Cobol: a sintaxe do
produto escolhido não estar aderente a padrões mundiais.
COMPUTERWOLD, abril/95
EVOLUÇÃO DO COBOL
O Cobol vem evoluindo nos últimos anos, e a versão 85, conhecida como “Structured
Cobol” (na versão IBM é o Cobol/II) já quebrou o paradigma de programa monolítico das
antigas versões, e incorporou construções similares às encontradas em linguagem como
Pascal. Podemos citar as construções.

        IF / END-IF

        READ / END-READ

        Evoluções do PERFORM, que passa a se comportar como Do-while e Do-until

        etc.

Infelizmente, os velhos hábitos continuam arraigados e a maioria dos programas Cobol
escritos hoje em dia não aproveitam adequadamente o conceito de estrutura embutido na
linguagem. O mesmo problema poderá acontecer com a versão OO. Sem uma
conceituada sólida nos fundamentos deste paradigma, os desenvolvedores continuarão a
usar o Cobol nos conceitos antigos, hoje sem dúvida anacrônicas.

É por esta razão que incluímos este capitulo de PROGRAMAÇÃO ESTRUTURADA neste
curso, onde abordaremos os principais objetivos desta técnica, e também novos conceitos
para melhorar a qualidade dos programas como ACOPLAMENTO e COESÃO. Além
disso, apresentamos uma nova técnica para projetar programas estruturados:
DIAGRAMAÇÃO DE AÇÃO.
Visão Geral de Programação Estruturada
O termo PROGRAMAÇÃO ESTRUTURADA foi criado pelo Prof. Edsger Dijkitra
em meados da década de 60, e obteve atenção de um número significativo de
pessoas em uma conferência de Engenharia de Software em 1968. Porém, não
foi este o evento que impulsionou a metodologia, e sim pela sua carta (agora
famosa) enviada ao editor do CACM, entitulada “A instrução GO TO é
considerada prejudicial”.

Infelizmente, os anos que seguiram a carta, a controvérsia sobre a sentença GO
TO sombreou os mais significantes aspectos da Programação Estruturada.
Algumas vezes, a programação sem GO TO e a Programação Estruturada eram
considerados como conceitos sinônimos. Porém, os objetivos da programação
estruturada vão além de simplesmente criar programas sem sentenças GO TO.
O que é Programação Estruturada
Base teórica para toda a lógica de procedimento, isto é, para o tipo de lógica
que descrevemos tradicionalmente com um diagrama (fluxograma foi o mais
utilizado). Em meados da década de 60, dois cientistas de computador
italianos, Corrado Bonh e Gioseppe Jacopini, provaram matematicamente que
qualquer lógica de procedimento poderia ser derivado das combinações de três
tipos básicos de estruturas:

       SEQUÊNCIA
       SELEÇÃO (IF-ELSE ou CASE)
       REPETIÇÃO (DO-WHILE ou DO-UNTIL)


Essas três estruturas formam o núcleo da Programação Estruturada. A
descoberta de que essas três são suficientes para qualquer estrutura lógica
arbitrariamente complexa é importantíssima, tão importante quanto a
descoberta da Engenharia de que qualquer forma de lógica de hardware pode
ser construída pelas combinações das portas AND, OR e NOT.
Elementos da Programação Estruturada
A Programação Estruturada se concentra em tópicos como:

        Programação sem GO TO (completo ou parcial banimento da sentença)

        Programação com construção de controle padronizadas: Seqüência,
         Seleção e Repetição.

        Na forma do programa estruturado

        Na aplicação das convenções de codificação estruturada norteia todo o
         processo de programação. Impõe uma disciplina em cada estágio da
         criação de sistema de software e a organização dos programadores.
         Trata-se portanto de uma coleção de metodologias, ao Invés de um único
         método.
Programação estruturada é uma metodologia que leva a disciplina a
forma do programa, processo do projeto, codificação e teste. É uma
metodologia para construção de programas modulares sob uma
disposição hierárquica usando construções de controle
padronizadas.
Objetivos da Programação Estruturada
  Melhorar a leitura do Programa
  Fazer com as que a correspondências entre o programa fonte e seu
   processo de execução seja o mais trivial possível.
  Encorajar a localização das estruturas de controle e o uso dos dados.
  Reduzir a complexidade do programa através da simplificação dos seus
   caminhos de controle.
  Possibilitar a leitura do programa, do campo ao fim, sem nenhum pulo de
   controle.
  Melhorar a eficiência do programa.
  Identificar a confiabilidade do programa
  Construir o programa de forma a eliminar a necessidade de sua depuração.
  Fornecer uma disciplina para a programação
  Forçar os programadores a pensar
  sistematizar o processo de programar.
  Reduzir o custo da programação
Propriedades da Programação Estruturada
  O programa é dividido em um grupo de módulos arranjados de forma
   hierárquica, que representam o seu relacionamento lógico e de execução.

  O fluxo de execução entre os módulos está restrito a simplicidade do
   seguinte esquema: O controle passa para a única entrada do módulo, que
   após o processamento, segue para a única saída do módulo. O controle
   retorna ao módulo de chamada.

  A construção do módulo é padronizada de acordo com as regras tradicionais
   de modularização e com as construções de controle básicos permitidas.

  A documentação do programa é facilitada com a inclusão de observações
   na própria codificação fonte, explicando as funções, estruturada de dados e
   o relacionamento entre os módulos.
Construções de Controle
SEQÜÊNCIA




Quando o controle de execução do tipo SEQUÊNCIA é usado, os comandos são
executados um após o outro, na mesma ordem em que eles aparecem na
codificação fonte. Ex:

MOVE          A TO B.
COMPUTE       C = B* 12
MOVE          C TO Y.
Construções de Controle (Cont.)
SELEÇÃO (IF/ELSE)




Quando se usa a estrutura de SELEÇÃO (IF/ELSE), uma condição é testada.

       Se a condição é verdadeira (IF), executa-se um conjunto de instruções.

       Senão (ELSE), executa-se outro conjunto.

No final, os dois conjuntos se encontram em um ponto comum para continuidade
de execução chamado Terminator (END-IF).

Quando uma das duas portas possíveis, SE (IF) e SENÃO (ELSE), não tiver
instruções para ser executada, deve-se mesmo assim codificá-lo com um
comando nulo (não executável). Em COBOL temos a palavra
NEXT SENTENCE para esta finalidade.
Construções de Controle (Cont.)
SELEÇÃO (IF/ELSE)                                  V       F

Uma estrutura de SELEÇÃO (IF/ELSE) tem o               V           F
seguinte formato básico:
                                                               V       F
       IF condição
       sentença-1
       ELSE
       sentença-2
       END-IF

Quando a sentença-1 desta estrutura de seleção
contém outra estrutura de seleção, ela é chamada
de IF aninhado (ou encadeado):
Construções de Controle (Cont.)
Se a aplicação requer mais de três níveis de decisões aninhadas (ou encadeadas),
o programador deve separá-las em partes distintas, isto é, em módulo separados
que podem ser entendidos separadamente. Estudos feitos por Noam Chomsky no
campo da lingüística e Gerald Weinberg no campo da programação sobre
dificuldade do ser humano em entender a complexidade , sugerem que muito
poucas pessoas podem entender mais do que três níveis de IFs aninhados.


    Finalmente, muitos problemas com IF aninhados são uma indicação de que o
     programador não está acostumado com tabelas de decisão. Assim, o método
     de tabela de decisão é provavelmente o melhor modo para assegurar de que
     todas as combinações foram expressas, e de que as redundâncias,
     ambigüidades e contradições foram eliminadas, e ainda, que a lógica está
     organizada de modo que possa ser codificada de forma trivial.
Construções de Controle (Cont.)
SELEÇÃO (CASE)

                                             Integer
                                            value = ?




                                                                         = m
      Case-1        Case-2       Case-3                 Case-4      Case-m
      function      function     function               function    function




Na estrutura SELEÇÃO (CASE), a estrutura é aplicada de forma que uma, entre um
conjunto de alternativas, seja escolhida com base em um teste de condição.
No VS COBOL II representa-se esta estrutura através do comando EVALUATE.
Construções de Controle (Cont.)
REPETIÇÃO (DO-UNTIL)       DO-UNTIL (FAÇA ATÉ QUE)

                            Um módulo ou Procedure é executado,
                            após o qual ocorre um teste de
                            condição de fim de loop. Se a condição
                            é verdadeira, o loop é terminado e a
                            execução continua com a próxima
       PROCEDURE            instrução seqüencial. Se a condição é
                            falsa, o módulo é executado
                            novamente. Note que o loop com DO-
                            UNTIL é executado pelo menos uma
                       F
                            vez.
        CONDIÇÃO
                           No VS COBOL II representa-se esta
                           estrutura através do comando
              V            PERFORM WITH TEST AFTER UNTIL
                           ...
Construções de Controle (Cont.)
REPETIÇÃO (DO-WHILE)       DO-WHILE (FAÇA)
                           Uma condição de témino é testada. Se a condição é
                           falsa, o loop é terminado e a execução continua com
                           a próxima instrução sequencial. Se a condição é
                           verdadeira, um módulo ou procedure é executado e a
                           condição é testada novamente. Note que, se a
                           condição é inicialmente falsa, o loop não será
               PROCEDURE   executado

                           No VS COBOL II representa-se esta estrutura
           V               através do comando
CONDIÇÃO                   PERFORM WITH TEST BEFORE UNTIL...

      F
Construções de Controle (Cont.)
REPETIÇÃO (DO-n-TIMES)      DO-n-TIMES(FAÇA n VEZES

                            Um número de vezes é estabelecido.
                            Quando o limite é atingido, o loop é
                            terminado e a execução continua com a
                            próxima instrução sequaencial. Senão, um
                            bloco de instruções ou módulo é executado

 CONDIÇÃO       PROCEDURE
                            No VS COBOL II representa-se esta
                            estrutura através do comando
                            PERFORM UNTIL n TIMES
Construções de Controle (Cont.)
FUGA
  A possibilidade de FUGA (conhecida também como EXIT) para um ponto de
  saída do módulo é uma técnica muito útil no caso de ser necessário “pular”
  algumas instruções devido a erros ou situações excepcionais. Em muitas
  linguagens de programação, a fuga é representada por uma sentença GO TO
  (inclusive no VS COBOL II).

                                             V
Construções de Controle (Cont.)
FUGA
   Neste caso, a instrução GO TO não irá contra os fundamentos da
   Programação Estruturada, porque o seu uso ficará ao desvio para um ponto
   de saída do módulo. Ex:

       PROCEDURE DIVISION.
       ...
       100-LETURA-ARQENT SECTION.
               READ ARQEBT
                      AT END GO TO 100-LEITURA-ARQENT-RETURN
               END-READ.
               COMPUTE VALOR = VALOR * 1,10.
               IF VALOR > 100
                      MOVE VALOR TO LIMIT-1               FUGA
               ELSE
                      MOVE VALOR TO LIMIT-2.
       100-LEITURA-ARQENT-RETURN.
               EXIT.

Ponto de saída do módulo
Padronização do formato do módulo
Um programa estruturado é um programa modular. Porém, adicionalmente as regras
básicas de modularização, a forma do próprio módulo também está restrita a algumas
regras. Regras estritas de formato para a construção de um módulo estruturado são um
outro meio de simplificar o programa. Isto permite ao programador se concentrar no
significado do programa, ao invés de sua forma sintética.

As regras para a construção de um módulo são:

    O módulo tem uma única entrada e uma única saída.
   O ponto de saída deve seguir o ponto de entrada na codificação, com nenhum outro
deste tipo entre eles. Isto quer dizer que não deve haver meios de se entrar no meio do
módulos, ou por qualquer ponto intermediário. Deve-se obrigatoriamente iniciar pelo ponto
de entrada, não haver qualquer interrupção e pontos intermediários, a não pelo método de
fuga onde por alguma condição desvia-se para o ponto de saída do módulo.

    O módulo é uma estrutura fechada.
   Deve executar uma única função dentro do sistema. Este é o conceito de “CAIXA
PRETA”, isto é, conhece-se o input (as entradas), o output (as saídas), mas não a
necessidade de se conhecer como é feito o processo em detalhes, apenas qual a função a
ser executada.
Padronização do formato do módulo (Cont.)

    O módulo é uma estrutura fechada.
    Deve executar uma única função dentro do sistema. Este é o conceito de “CAIXA PRETA”,
isto é, conhece-se o input (as entradas), o output (as saídas), mas não a necessidade de se
conhecer como é feito o processo em detalhes, apenas qual a função a ser executada.

   As construções de controle são restritas e padronizadas.
  Seqüência, Seleção (com os recursos adicionais aceitos), Repetição e Fuga.




                INPUT                               OUTPUT

                                 FUNÇÃO
Padrões para programações estruturadas
  Programa é dividido em pedaços independentes, chamado módulos. Um módulo
   em COBOL pode ser considerado como qualquer uma das seguintes unidades de
   programação:

 Parágrafo
 Seção
 Subprograma
 Programa aninhado ( COBOL II)

  Um módulo é uma unidade fechada e completa, cuja codificação é lógica e
   fisicamente separada dos outros módulos. Em COBOL pode não ser separado
   fisicamente, como nos casos de Parágrafo, Seção e Programa aninhado.
  Um módulo apresenta uma única função lógica do programa.
  O tamanho do módulo não deve exceder 50 linhas de instruções, ou o tamanho de
   uma página da listagem.
  O módulo está limitado a um ponto de entrada e um ponto de saída. Durante a
   execução o controle entra pelo primeiro e sai pelo segundo.
  Os módulos estão relacionados dento de uma estrutura de controle hierárquico.
   Cada nível da estrutura de controle representa uma descrição funcional mais
   detalhada esse fato garante a passagem do controle de programa de módulo a
   módulo durante a execução.
  Não deve haver nenhum LOOP na estrutura de controle. Isso significa que
   um módulo não pode chamar a si mesmo ou a seu módulo chamador.
Padrões para programações estruturadas (Cont.)
  Todos os nomes de variáveis e módulos devem ser significativos. Os nomes dos
   módulos devem sugerir sua função e os nomes das variáveis sua finalidade no
   programa.

  Nomes de variáveis que sejam locais (usadas somente em um módulo) devem
   começar com o mesmo prefixo.

  As únicas construções de controle aceitáveis são seqüência, seleção, repetição e
   fuga.

  Deve-se codificar uma instrução por linha. Se uma instrução requer mais de uma
   linha, as linhas sucessivas devem ser diferenciadas.

  As sentenças IFs não devem ser encadeadas em mais de três níveis.

  O uso da sentença GO TO está limitado ao módulo em que ocorrer. Isto significa que
   não deve ser usado para transferir o controle para outro módulo: é somente usado no
   desvio (fuga) para o ponto de saída dentro de um módulo.

  A codificação obscura (truque) deve ser evitada.
Documentação Gráfica do Programa
Técnicas de Diagramação

• Diagrama de Estrutura
  Ótima para Projeto Estruturado de Sistemas, pois trabalham em um nível macro,
  organizando a hierarquia dos módulos e documentando inclusive os dados que trafegam
  entre os módulos. Ruim para projetos detalhados de programa.

• Diagrama HIPO
  Bom para projeto detalhado de programas pequenos. Rapidamente se tornam
  aglomerados e difíceis de entender.

• Diagrama Warnier-Orr
  Combina as técnicas de Projetos do sistema e Programa detalhado. Ruim para mostrar a
  lógica condicional assim como outras técnicas de detalhe.

• Diagrama Jackson
  Bom para o projeto do programa, mas não ajuda quando a lógica do programa for
  complexa.

• Fluxograma
  Ótimo para detalhar a lógica de programa pequenos. Para programas complexo tornam-
  se embaraçosos. Incentivam a uma visão do programa que leva a uma estrutura pobre
  (seqüencial).
Documentação Gráfica do Programa (Cont.)
• Linguagem Estrutura e Pseudo-código
  Linguagens Estruturas são escritas de uma forma que o usuário possa atendê-las, são
  estruturas hierarquicamente, e possuem uma estrutura similar a codificação de
  programas. Pseudo-código utilizam uma notação mais formal, orientado para o
  profissional de PD. A maioria das linguagens da 4ª geração é mais simples e fácil de
  entender do que o Pseudo-código.

• Quadros Nassi-Shneiderman
  Bom para detalhar programas, mas muito pobre para mostrar a hierarquia (seqüencial).

• Diagramas de Ação
  Foram projetadas para resolver problemas das outras técnicas de diagramação . São
  rápidos e fáceis de desenhar. Cobre desde a visão geral até os detalhes a nível de
  codificações. Possibilitam a construção de programas estruturados e são mais gráficos
  que pseudocódigos.
Diagrama de Ação - Seqüência
Construções de Controle



                  SEQUÊNCIA


                  COMANDO-1

                  COMANDO-2

                 COMANDO-3
                     .
                     .
                     .
                 COMANDO-n
Diagrama de Ação - Seleção
Construções de Controle


  SELEÇÃO (IF-THEN-ELSE)



      IF condição            IF condição




      ELSE
Diagrama de Ação - Case
SELEÇÃO (CASE)

                 WHEN condição-1



                 WHEN condição-2



                 WHEN condição-3



                 WHEN condição-n
Diagrama de Ação - Repetição
               Construções de Controle


               REPETIÇÃO (DO-WHILE)

   EM VS COBOL II: PERFORM WITH TEST BEFORE UNTIL

                FORMATO OUT-OF-LINE

                  nome-do-módulo
                  UNTIL condição




                  FORMATO IN-LINE

                  UNTIL condição
Diagrama de Ação – Repetição (Cont.)
              Construções de Controle


              REPETIÇÃO (DO-UNTIL)
  EM VS COBOL II: PERFORM WITH TEST AFTER UNTIL
              FORMATO OUT-OF-LINE


                 nome-do-módulo




                  UNTIL condição

                FORMATO IN-LINE




                  UNTIL condição
Diagrama de Ação - Repetição (Cont.)
            Construções de Controle


            REPETIÇÃO (DO-n-TIMES)
     EM VS COBOL II: PERFORM UNTIL n TIMES
             FORMATO OUT-OF-LINE


               nome-do-módulo
                 n    TIMES




               FORMATO IN-LINE

                  n   TIMES
Diagrama de Ação - Fuga
Construções de Controle

      FUGA




                    IF condição
Diagrama de Ação - Estruturação
Entendendo o diagrama

             ESTRUTURAÇÃO
Diagrama de Ação - DO
Entendendo o diagrama

             DO (sem repetição)


             nome-do-módulo
Diagrama de Ação - DO (Cont.)
  Entendendo o diagrama

        DO (módulo pré-definido)


                            TRATAR-ERRO




                                      Define-se o modulo
                                      apenas 1 vez no
                                      diagrama.

               TRATAR-ERRO            As outras chamadas
                                      apenas coloca-se o nome
                                      dentro de um retângulo.
Diagrama de Ação - DO (Cont.)
Entendendo o diagrama

      DO (ROTINA DE USO COMUM ou PROCEDURE)




                   CALCDATA
Diagrama de Ação - DO (Cont.)
Entendendo o diagrama


      DATA ACTION




                    READ   CLIENTE
Diagrama de Ação – Comparativo com o Fluxograma
                        PROCESSA-
   PGM001               MENTO
                                                           LEITURA



    INICIO
                                                          LER
                                                         CLIENTE


   LEITURA                                           F               V
                                                            EOF?
             PROCESSA
             MENTO

                                              SOMAR                  MOVER
                                              1 EM                   1 PARA
                                              CT-LIDOS               CH-FIM
   CH-FIM
     =
     1                  LEITURA



   TERMINO
                         SAÍDA                              SAÍDA



    SAÍDA
                        INICIO      TERMINO




                        SAÍDA        SAÍDA
Diagrama de Ação – Comparativo com Fluxograma
         PRINCIPAL
           INICIO


         LEITURA

         LER   CLIENTE

               SE EOF

               MOVER 1 PARA CH-FIM

               ELSE

               SOMAR 1 EM CT-LIDOS


          PROCESSAMENTO
          UNTIL CH-FIM = 1



               LEITURA


           TERMINO
Diagrama de Ação - Exercício
A) FLUXOGRAMA



          MOVTO          CADANT




                CADATU    ARQUERRO
Diagrama de Ação - Exercício (Cont.)
B) LAY-OUTs
MOVTO

   CHAVE-MOV
AGN-MOV CTACOR-MOV   TIPATU-MOV    VALOR-MOV


CADANT

    CHAVE-ANT
AGN-ANT CTACOR-ANT   NOME-ANT     SLDATU-ANT   SLDDISP-ANT   LIMCRED-ANT



CADATU

    CHAVE-ATU
AGN-ATU CTACOR-ATU   NOME-ATU     SLDATU-ATU   SLDDISP-ATU   LIMCRED-ATU



ARQERRO

     CHAVE-ERRO
AGN-ERR CTACOR-ERR   VALOR-ERR     OBS 1   OBS 2-ATU
Diagrama de Ação - Exercício
B) PROCEDIMENTOS
1)Atualizar o cadastro de clientes(CADANT CADATU) à partir do arquivo MOVTO.
2) Somente o campo VALOR-MOV será atualizado e deverá obedecer as seguintes condições:
      a) TIPATU-MOV = 1 (Desbloqueio). Somar VALOR-MOV no campo SLDDISP-ATU.
      b) TIPATU-MOV = 2 (Depósito de cheques). Somar VALOR-MOV no campo SLDATU-ATU.
      c) TIPATU-MOV = 3 (Depósito em dinheiro). Somar VALOR-MOV nos campos SLDATU-ATU e
          SLADDISP-ATU.
      d) TIPATU-MOV = 4 (Débito)
Na função de débito deverá ser considerado o tipo de cliente. Para clientes especiais há uma linha de
empréstimo automático que é informado no campo LIMCRED-ANT, que estará zerado quando o cliente
não tiver conta especial.
      Se VALOR-MOV for maior que o Saldo (SLDDISP-ANT + LIMCRED-ANT), gravar o ARQERRO,
       conforme layout, com a constante „SEM FUNDOS no campo OBS1, e o campo OBS2 deverá
       ser formatado com a constante „CONTA ESPECIAL‟ se for cliente especial , ou „CONTA
       NORMAL‟ se o cliente não tiver limite de crédito.
      Se VALOR-MOV for menor ou igual que Saldo (SLDDISP-ANT + LINCRED-ANT), subtraí-lo
       dos campos SADDISP-ANT e SLDATU-ANT.
      e) Não há no arquivo MOVTO tipo de atualização diferentes dos indicados
          anteriormente.
Diagrama de Ação - Exercício (Cont.)
C) PROCEDIMENTOS
   3) Poderá existir registro no CADANT sem correspondente no MOVTO, neste caso
   gravar o registro do CADANT no CADATU sem qualquer alteração.


   4) Se o registro do MOVTO não tiver correspondente no CADANT, gravar em
   ARQERRO, com a constante „NÃO CADASTRADA‟ no campo OBS1 e brancos no
   campo OBS2.


   5) Poderá haver mais que um registro do MOVTO.


Observações :

Os arquivos MOVTO e CADANT estão classificado em ordem ascendente, pelos campos
Chaves (CHAVE-MOV e CHAVE-ANT).
Diagrama de Ação - Exercício (Cont.)
D) COPYs
MOVTO

    01 REG-MOVTO
       03 CHAVE-MOV.
               05 AGN-MOV                  PIC   9(4).
               05 CTACOR-MOV               PIC   9(6).
       03 TIPATU-MOV                       PIC   X.
       03 VALOR-MOV                        PIC   S9(8)V99.
       03 FILLER                           PIC   X(59).


CADANT

    01 REG-CADANT.
       03 CHAVE-ANT.
               05 AGN-ANT                  PIC 9(4).
               05 CTACOR-ANT   PIC 9(6).
       03 NOME-ANT                         PIC   X(40).
       03 SLDATU-ANT                       PIC   S9(8)V99.
       03 SLDDISP-ANT                      PIC   S9(8)V99.
       03 LIMCRED-ANT                      PIC   S9(8)V99.
Diagrama de Ação - Exercício (Cont.)
D) COPYs
CADATU

    01 REG-CADATU.
       03 CHAVE-AUT.
               05 AGN-ATU      PIC 9(4).
               05 CTACOR-ATU              PIC 9(6).
       03 NOME-ATU             PIC   X(40).
       03 SLDATU-ATU           PIC   S9(8)V99.
       03 SLDDISP-ATU          PIC   S9(8)V99.
       03 LIMCRED-ATU          PIC   S9(8)V99.


ARQERRO

    01 REG-ERRO.
       03 CHAVE-ERRO.
               05 AGN-ERR      PIC 9(4).
               05 CTACOR-ERR              PIC 9(6).
       03 VALOR-ERR            PIC   S9(8)V99.
       03 OBS1                 PIC   X(20).
       03 OBS2                 PIC   X(20).
       03 FILLER               PIC   X(20).
   Capítulo 11
Procedure Division
Procedure Division - Unidades
Esta é a quarta divisão do COBOL, aqui descreveremos os procedimentos
necessários para serem seguido pelo computador para dar solução ao
problema. É nela que especificamos as ações de entrada e saída de dados, os
movimentos de dados e os cálculos necessários para o processamento. (AQUI
ENTRA O QUE VOCE APRENDEU EM LÓGICA)


A PROCEDURE DIVISION consiste de 4 unidades, e estão sujeitos à seguinte
hierarquia:

       SEÇÃO

       PARÁGRAFO

       SENTENÇA

       COMANDO
Seção
Os programas podem ser compostos de uma ou várias seções (SECTION), sendo que cada
seção por sua vez pode ser composta por um vários parágrafos.

Nomes para Seções:

    • Os nomes podem ser formados pelos caracteres: 0 a 9, A a Z e hífen;

    • Não podem iniciar e finalizar com hífen;

    • Um nome de seção deve ser único;

    • O nome de seção deve ser escrito à partir da margem A, seguido por um espaço em
      branco e a palavra SECTION seguida por um ponto;

    • Um nome de seção é dispensável se a PROCEDURE DIVISION consistir de somente
      uma seção;

    • Uma seção termina quando começa outra seção;

    • Uma seção deve ser imediatamente seguida por um nome de parágrafo.
Parágrafo
Um parágrafo é constituído de uma ou mais sentenças.

Nomes para os parágrafos:


   • Os nomes podem ser formados pelos caracteres: 0 a 9, A a Z e hífen. Não
     podem iniciar nem finalizar com hífen;


   • O tamanho máximo é de 30 caracteres;


   • Um nome de parágrafo é seguido por um ponto. Deve começar na margem
     A.
Sentença
Consiste de um ou vários comandos e termina sempre por um ponto.

Exemplo:

       MOVE CC-REGIAO         TO LD-REGIAO
       MOVE CC-CONTA          TO LD-CONTA

       WRITE REG-LISTAREL AFTER 2.
Comando
É a menor unidade da PROCEDURE DIVISION. Especifica a ação que se deve executar. É uma combinação
sintática válida de palavras que começam com um verbo COBOL, tais como MOVE, ADD, READ, WRITE, etc. São
quatro as categorias de comandos COBOL:
Dirigidos ao   Imperativo                  Condicional                 Abrangência
Compilador     Um comando imperativo       Um comando condicional      Em geral, um comando ou
Os             especifica que uma          especifica que uma ação     cláusula do COBOL II pode ter
comandos       ação incondicional é        deve ser tomada caso        delimitadores de abrangência na
dirigidos ao   para ser tomada pelo        uma dada condição           forma explícita ou implícita. Usa-
Compilador     programa. Uma série de      estipulada no programa      se o delimitador de abrangência
são            comandos imperativos        seja verdadeira. Na lista   na forma explícita para
comandos       podem ser                   abaixo estão alguns         transformar um comando
que            especificados sempre        comandos condicionais       condicional em um comando
especificam    que um comando              do COBOL:                   imperativo.
ações a        imperativo for permitido.   IF                          Explícitos
serem          Na lista abaixo estão a                                 Um delimitador explícito marca o
tomadas        maioria dos comandos        THEN                        fim de um comando
durante        imperativos COBOL:                                      END-ADD END-IF
normalmente    ARITMÉTICOS                 ELSE                        END-SEARCH
a compilação   CLASSIFICAÇÃO                                           Implícitos
do programa.   MOVIMENTAÇÃO                END-IF                      Um delimitador implícito é um
                                                                       ponto que termina a abrangência
               ADD MERGE ACCEPT                                        de todos os comandos anteriores
               DATE DAY COMPUTE                                        ainda não terminados. No
               RELEASE INITIALIZE          EVALUATE                    comando IF, a frase ELSE
                                                                       termina a abrangência de todas
                                                                       as condições aninhadas na
                                                                       cláusula THEN.
INITIALIZE
Um grande beneficio VS COBOL II é o novo comando INITIALIZE, que nos permite a inicialização de
diversas variáveis do programa, de acordo com sua classe de dados, num único comando.

Este comando será muito útil, principalmente em ambientes ON-LINE, onde temos a característica de
um mesmo programa executar diversas vezes, uma vez para cada transação, sem a recarga do
programa. Isto nos obrigava a inicializar as variáveis no inicio da PROCEDURE, com diversos
comandos MOVEs, ao invés de inicializá-las na WORKING-STORAGE.

A sintaxe do comando INITIALIZE:
          INITIALIZE   identifier-1 [identifier-2]...




      [   REPLACING
                       {      ALPHABETIC
                              aLPHANUMERIC
                              NUMERIC
                              ALPHANUMERIC-EDITED
                              NUMERIC-EDITED
                                                        }   DATA    BY
                                                                         {    literal-1   }]
                                                                              indentifier-3




                       {                                }
                               ALPHABETIC
                               aLPHANUMERIC
                               NUMERIC
                               ALPHANUMERIC-EDITED
                                                             DATA    BY
                                                                          {    indentifier-3
                                                                               literal-1      }]
                               NUMERIC-EDITED
INITIALIZE
Um exemplo no seu formato mais simples:
                   INITIALIZE INVENTORY-DATA.

Se INVENTORY-DATA for um item-de-grupo, todos os seus subordinados:
        Numéricos e numéricos de edição serão inicializados com zeros
        alfabéticos, alfanuméricos e alfanuméricos de edição serão
         inicializados com espaços.

Existem três exceções, que não serão inicializados:

         Indexadores
         FILLER
         Itens contendo a cláusula REDEFINIDAS (serão inicializados de
          acordo com o tipo do campo redefinido).

Se INVENTORY-DATA A for um item-elementar, será inicializado com espaços
ou zeros, dependendo de sua definição.
INITIALIZE
Você também pode inicializar diversos campos em um mesmo comando:

    INTIALIZE WS - DATA
      AC - TOTAL - 1
      AC - TOTAL – 2
      CT - PAG
      CT - LIN
      CT - REG.

Cada um, será inicializado de acordo com o seu tipo, com zero ou espaços.

EXEMPLOS

                   INTIALIZE WS-CAMPO-1.

    WS-CAMPO-1         WS-CAMPO-1          WS-CAMPO-1
     PICTURE            ANTES               DEPOIS
     9(05)              12345               00000
     X(05)              AB123               bbbbb
     99XX9              12AB3               bbbbb
     XXBX/BB            ABbC/DE             bbbb/bb
     **99,9CR           1234,5CR              **00,0
     A(05)              ABCDE                bbbbb
INITIALIZE
Cláusula REPLACING

Através da cláusula REPLACING, você pode determinar qual a forma de
inicializaçãode cada tipo de campo, por um valor literal ou por um outro
campo:

   INITIALIZE REG-CLIENTE
        REPLACING ALPHANUMERIC DATA BY LOW-VALUES
              NUMERIC     DATA BY WS-VALOR
              NUMERIC-EDITED DATA BY +999,99.
INITIALIZE
Exemplos

   01 ANJUST       PIC X (8) JUSTIFIED RIGHT
        VALUE SPACES.
   01 ALPHANUM-4PIC X (4) VALUE „1234‟.

   PROCEDURE DIVISION.

     INITIALIZE ANJUST
       REPLACING ALPHANUMERIC DATA BY ALPHANUM-4.

           ALPHANUM-4     ANJUST (ANTES)      ANJUNST (DEPOIS)
             1234           bbbbbbbb             bbbb1234


   01 NUMERIC-1 PIC 9 (8) VALUE 98765432.
   01 NUM-INT PIC 9 (7) VALUE 1234567.

   PROCEDURE DIVISION.

     INITIALIZE NUMERIC-1
       REPLACING NUMERIC DATA BY NUM-INT.

           NUM-INT        NUMERIC-1 (ANTES)           NUMERIC-1 (DEPOIS)
           1234567           98765432                    01234567
INITIALIZE
O mais importante de se destacar na cláusula REPLACING é que, ao ser
utilizado em um item-de-grupo, o comando INITIALIZE só inicializará os
campos especificados. Os demais permanecerão sem alteração.
INITIALIZE
Veja outro exemplo:
    01   WS-GROUP.
    05   WSG-NAME          PIC   X (15)           (alphanumeric)
    05   WSG-AGE           PIC   S9 (3) COMP-3.   (numeric)
    05   WS-INCOME         PIC   9 (7) V99.       (numeric)
    05   FILLER            PIC   X (3)            (alphanumeric)
    05   WSG-DATE          PIC   XX/XX/XX.        (alphanumeric-edited)
    05   WSG-CODE          PIC   A (1)            (alphabetic)
    INITIALIZE WS-GROUP.
    WSG-NAME                                      contém espaços
    WSG-AGE                                       contém zeros
    WSG-INCOME                                    contém zeros
    FILLER                                        inalterado
    WSG-DATE                                      contém bb/bb/bb
    WSG-CODE                                      contém branco
    INITIALIZE WS-GROUP
    REPLACING NUMERIC BY 2.
    WSG-NAME                                      inalterado
    WSG-AGE                                       contém 2
    WSG-INCOME                                    contém 2
    FILLER                                        inalterado
    WSG-DATE                                      inalterado
    WSG-CODE                                      inalterado
    INITIALIZE WS-GROUP
    REPLACING ALPHANUMERIC BY „*‟
      NUMERIC     BY 19.
    WSG-NAME                                      contém ***************
    WSG-AGE                                       contém 19
    WSG-INCOME                                               contém 19
    FILLER                                        inalterado
    WSG-DATE                                      inalterado
    WSG-CODE                                      inalterado
INITIALIZE
Quando utilizamos o comando INITIALIZE, ocorrerá um processo idêntico ao
comando MOVE, isto é, para cada campo a ser inicializado, será gerado uma
instrução MOVE.

Por esta razão, inicializar tabelas com INITIALIZE pode não ser o método mais
eficiente. Será mais eficiente a construção de uma rotina para esta finalidade, e
utilizar o comando PERFORM VARYING para executar a inicialização.



                                Você não pode utilizar
                                INITIALIZE para campos que
                                contenham a cláusula
                                OCCURS DEPENDING ON,
                                ou seus subordinados.
ACCEPT
Formato Geral :

ACCEPT      campo   FROM   mnemônico
                           DATE
                           DAY
                           DAY-OF-WEEK
                           TIME

Exemplo :

WORKING-STORAGE SECTION.
77 HOJE               PIC 9(06).
...
PROCEDURE DIVISION.

INICIO.

          ACCEPT HOJE FROM DATE.
ACCEPT
Considerações:

Neste exemplo o comando ACCEPT lerá a hora do sistema e armazenará essas
informações no item HOJE.

O comando ACCEPT pode receber informações contidas no sistema
especificados em registradores especiais (DATE, DAY, ou TIME). A recepção
precisa seguir as regras do comando MOVE sem a opção CORRESPONDING.

DATE: Seqüência da data no formato: "AAMMDD", a PICTURE implícita é 9(06).

DAY: Data no formato JULIANO "AADDD", a PICTURE implícita é 9(05).

TIME: Hora no formato "HHMMSSDD", a PICTURE implícita é 9(08).

DAY-OF-WEEK:          Dia da semana em formato numérico PIC 9.
                      Onde 1 = Segunda-feira, 2 = Terça-feira , ...
DISPLAY
É usado para imprimir até 120 caracteres através da impressora. Não imprime
arquivos. Os literais podem estar na forma numérica ou alfanumérica.
Exemplo:

DISPLAY TOTAL                     imprimir o conteúdo de TOTAL
DISPLAY 'FIM DO PROGRAMA'         impressão da mensagem FIM DE PROGRAMA
DISPLAY 'QTD.DE DADOS=' QUANT.      exemplo será impresso : "QUANT. DE DADOS = 0.
MOVE
A informação representada pelo literal ou data-name1 é movido para o data-
name2 e assim por diante. Por exemplo suponha que tivéssemos 2 campos,
um chamado CAMPO1 e o outro CAMPO2.
antes do MOVE: CAMPO1 = "BRADESCO"               CAMPO2 = "XXXXXXXX"

MOVE CAMPO1 TO CAMPO2

depois do MOVE: CAMPO1 = "BRADESCO" CAMPO2 = "BRADESCO"

MOVE VALOR TO PRECO1 PRECO2 PRECO3.
MOVE
Regras:

1. Quando estamos movimentando para "campos alfanuméricos" ou alfabéticos
devemos levar em consideração o seguinte:

 a. Os caracteres a serem transferidos são armazenados no campo receptor da
    esquerda para a direita
 b. Se o campo receptor é maior que o campo emissor, as posições restantes (à
    direita) são preenchidas com espaços
 c. Se o campo emissor é maior que o receptor, a transferência é terminada no
    momento em que o campo receptor estiver preenchido.

2. Quando estivermos movimentando para campos numéricos:

 a. O alinhamento é feito pela vírgula decimal e as posições não usadas são
    preenchidas com zeros.
  b. Se o campo emissor tem mais dígitos à direita ou à esquerda da vírgula
     decimal, esses dígitos em excesso serão truncados à direita
     e/ou à esquerda no campo receptor.
MOVE CORRESPONDING
A opção CORRESPONDING permite operações a serem feitas em itens
elementares de mesmo nome, se o item de grupo a qual eles pertencem estiverem
especificados.

Ambos os identificadores devem ser itens de grupo. Para um par de itens de
dados (itens subordinados), as seguintes regras são válidas:

•Ambos os itens subordinados são elementares

•Os 2 itens subordinados tem o mesmo nome e as mesmas qualificações.

•Os itens subordinados não podem ser identificados pela palavra chave FILLER.

•Os itens subordinados não podem incluir REDEFINES, OCCURS ou USAGE IS
INDEX em suas descrições.

Se um item subordinado for um grupo, os itens subordinados a ele são também
ignorado.
MOVE CORRESPONDING
Exemplo:

05 ITEM-1 OCCURS 6 INDEXED BY X.
      10 ITEM-A ....
      10 ITEM-B ....
      10 ITEM-C REDEFINES ITEM-B.
05 ITEM-2.
      10 ITEM-A ....
      10 ITEM-B ....
      10 ITEM-C ....

Se um MOVE CORR ITEM2 TO ITEM-1 (X) for codificado ITEM-A e ITEM-A
(X) e ITEM-B e ITEM-B (X) são considerados como correspondente; ITEM-C
e ITEM-C (X) não são incluídos, pois o ITEM-C (X) inclui a cláusula
REDEFINES.

Não pode ser usado o CORR no nível 77 ou 88.
Modificação de Referência
O caracter dois pontos (:) ou „cólon‟ como é conhecida na língua inglesa era um
caracter inválido na sintaxe do VS COBOL até o Release 3.

No VS COBOL II Release 3 este caracter indica uma Modificação de Referência
a uma parte de um campo, conhecido também como substring. Vamos ver
como isto funciona:

Reference Modification pode ser utilizado somente em campos no formato
DISPLAY.
Seu formato é o seguinte:

DATA FIELD (x : y)

               Número de bytes à direita, a partir da posição inicial. Sendo
               omitido, será a partir da posição inicial até o fim do campo.

               Posição inicial.
Modificação de Referência
Exemplos:

1) MOVE FIELD1(3:7) TO FIELD2

Movimenta FIELD1 do terceiro ao nono byte para FIELD2, ou em outra palavras, a partir de terceiro,
sete caracteres à direita.

2) MOVE FIELD1(5:) TO FIELD2

Movimenta FIELD1 do quinto caracter até o fim para FIELD2,

Exemplo da utilidade de Reference Modificacion:

         DATA DIVISION.
         WORKING-STORAGE SECTION.
         01 HORA-CORRENTE    PIC X (8).

         PROCEDURE DIVISION.

                   ACCEPT HORA-CORRENTE FROM TIME.

                   DISPLAY „HORA CORRENTE = „
                           HORA-CORRENTE (1:2) „:‟
                           HORA-CORRENTE (3:2) „:‟
                           HORA-CORRENTE (5:2) „:‟
Modificação de Referência
Com este novo recurso do VS COBOL II, evita-se complexas codificações para separar partes de uma
string, como por exemplo, separar de um Nome, o Sobrenome:

Em VS COBOL:

DATA DIVISION.
WORKING-STORAGE SECTION.
01 FULL-NAME.
         05 FULL-CHAR PIC X OCCURS 40 TIMES.
01 LAST-NAME.
05 LAST-CHAR          PIC X OCCURS 20 TIMES.
01 LAST-NAME-BEGIN    PIC S9 (3) COMP-3.
01 SUB-FULL           PIC S9 (4) COMP.
01 SUB-LAST           PIC S9 (4) COMP.

PROCEDURE DIVISION.
       ...
       MOVE +1 TO SUB-LAST.
       PERFORM MOVE-LAST THRU MOVE-END
                VARYNG SUB-FULL FROM LAST-NAME-BEGIN BY +1
                UNTIL SUB-FULL > 40
                OR   SUB-LAST > 20.
       ...
MOVE LAST.
       MOVE FULL-CHAR (SUB-FULL) TO LAST-CHAR (SUB-LAST).
       ADD +1 TO SUB-LAST.
MOVE-END. EXIT.
Modificação de Referência
Em VS COBOL II

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01     FULL-NAME       PIC X (40).
       01     LAST-NAME       PIC X (20).
       01     LAST-NAME-BEGIN  PIC S9 (3) PACKED-DECIMAL

       PROCEDURE DIVISION.
          ...
          MOVE FULL-NAME (LAST-NAME-BEGIN: ) TO LAST-NAME.
Modificação de Referência
Como você deve ter observado nas páginas anteriores, o Reference Modification pode
ser declarado por uma constante inteira, por um campo e ainda por expressões:

Através de constante:
                 MOVE FIELD1 (3:5) TO FIELD2.
Através de campo (binário ou compactado é recomendado):
                 MOVE FIELD (POS-INICIAL:TAMANHO) TO FIELD2.
Através das duas formas combinadas:
                 MOVE FIELD1 (POS-INICIAL:5) TO FIELD2.
Através de expressões
                 MOVE FIELD1 (POS-INICIAL +1 :TAMANHO - 2) TO FIELD2


             O segundo parâmetro é opcional. No entanto o caracter dois pontos (:) é
             obrigatório, para que o compilador não entendo como sendo uma subscrição
             ou indexação:

             MOVE FIELD1 (3:) TO FIELD2.                    Reference Modification

             MOVE FIELD1 (3) TO FIELD2.                     Subscrição
Subscrição e modificação de Referencia Combinados

Subscrição e Modificação de Referencia (Referencia Modification) podem ser
combinados para um mesmo campo, no mesmo comando:

        DATA DIVISION.
        WORKING-STORAGE SECTION.

        01 TABLE1.
           05 ENTRY1       OCCURS 20 TIMES PIC X (15).
        01 SUB1                 PIC S9 (4) BINARY.
        01 FIELD1               PIC X (7).

        PROCEDURE DIVISION.
              ...
              MOVE ENTRY1 (SUB) (5:7)           TO FIELD1.


                         O subscritor ou indexador deve
                         ser codificado sempre em
                         primeiro.
GOBACK ou STOP RUN
Tem por função terminar a execução do programa.

Onde :

STOP RUN termina a execução do programa e retorna o controle para o
Sistema Operacional.


GOBACK termina a execução do programa retornando o controle para o
programa que o chamou, se o programa for um programa principal, o GOBACK
tem a mesma função do STOP RUN.
Exercício 1
Objetivos :

Revisão dos conceitos de formação de registros, uso da cláusula redefines, uso dos comandos :

ACCEPT, INITIALIZE, DISPLAY e MOVE.

Enunciado :

Defina no programa COBOL uma área na WORKING-STORAGE SECTION com o seguinte formato :

01       REGISTRO-PACIENTE.
         05     DATA-EDITADA                     PIC 9(006).
         05     HORA                                      PIC 9(004).
         05     RESPONSAVEL                      PIC X(015).
         05     NOME-PACIENTE                    PIC X(030).
         05     IDADE-PACIENTE                   PIC 99.
         05     PLANO-SAUDE                      PIC X(015).
         05     ESTADO-GRAVE                     PIC X(003).
         05     POLICIA-AVISADA                  PIC X(003).
         05     DESCRICAO-ESTADO.
                10       DESCRICAO-01                    PIC X(060).
                10       DESCRICAO-02                    PIC X(060).
                10       DESCRICAO-03                    PIC X(060).
         05     MEDICO                           PIC X(020).
Exercício 1
1) Inicialize o campos com os comandos adequados.

2) Preencha o registro acima com os seguintes dados :

3) Luis Augusto dos Santos, 29 anos. Plano de Saúde Sul América.
Paciente chegou em estado grave, com várias lesões internas devido a atropelamento.
Policiais encaminharam o paciente ao Hospital o médico que atendeu Dr. Ailton.
A data e hora do registro deverão ser lidas do sistema operacional. (ACCEPT).

NOTA : A data deverá conter o formato DDMMAA e a hora HHMM.

4) O responsável no registro é o seu próprio nome.

5) Redefina o registro do paciente a fim de separar o campo nome em dois sub-campos :
NOME e SOBRENOME. Exiba separadamente o SOBRENOME.

6) Movimentar todo o registro para um campo alfanumérico de 300 caracteres, e exiba este
campo na sysout.
Operações Aritméticas
É de se esperar que a maioria dos programas, comerciais ou científicos,
executem cálculos, nem que seja uma simples soma. Todos os operandos
utilizados em operações aritméticas devem ser itens elementares numéricos. O
tamanho máximo de cada operando é de 18 dígitos decimais.
Operações Aritméticas - ADD
Esse comando soma dois operandos numéricos e armazena o resultado no
dataname2.
 ADD A TO B               exemplo o conteúdo do campo A será somado
                          ao de B e o resultado dessa soma será colocado
                          no campo B
 ADD 5 TO TOTAL.          se tivéssemos em TOTAL o valor 10, após a
                          execução desse comando TOTAL conteria 15
 ADD A B TO C             os conteúdos dos campos A, B, e C serão
                          somados e o resultado é colocado em C.
 ADD A B GIVING C.        o comando soma os valores que estão à
                          esquerda da palavra GIVING e coloca o
                          resultado no Data-Name à direita
 ADD A 2 C D GIVING E.    se os conteúdos dos campos A for 5, C for 10 e
                          D for 3, então após essa instrução em E, será
                          colocado o valor 20.
O propósito e efeito da cláusula CORRESPONDING são os mesmos já
considerados no comando MOVE.
Operações Aritméticas - SUBTRACT
Esse comando subtrai do data-name2 o valor do data-name1 e coloca o
resultado em data-name2.


SUBTRACT A FROM B                    o comando subtrai de B o valor de A e o
                                     resultado será colocado no campo B.

SUBTRACT 5 FROM TOTAL.               se tivéssemos em TOTAL o valor 10, após a
                                     execução desse comando TOTAL conteria 5.

                                todos os literais ou conteúdos dos campos
SUBTRACT A B FROM C.            que precedem as palavras FROM são
SUBTRACT A FROM B GIVING C.     somados, e o total é subtraído do Data-Name
SUBTRACT A 2 C FROM D GIVING E. definido após a palavra FROM. e o resultado
                                é colocado no Data-Name após a palavra
                                GIVING
Operações Aritméticas – MULTIPLY
Esse comando multiplica o valor do data-name1 pelo conteúdo do data-name2 e
coloca o resultado em data-name2.

Formato 1

MULTIPLY CAMPO-01 BY CAMPO-02
           LITERAL


Formato 2

MULTIPLY       CAMPO-01 BY           CAMPO-02       GIVING CAMPO-03 ...
               LITERAL               LITERAL
Operações Aritméticas – DIVIDE
Esse comando divide o valor do data-name1 pelo conteúdo do data-name2 e
coloca o resultado em data-name2.

Formato Geral :

DIVIDE          CAMPO-01       BY      CAMPO-02        GIVINGCAMPO-03
                LITERAL                LITERAL


                [ ROUNDED ]            [ REMAINDER CAMPO-04 ]


Observações :

   .REMAINDER : Identifica que a operação de divisão irá calcular o Resto.

   .Para utilizar o REMAINDER o campo CAMPO-04 somente com numérico e
    inteiro.
Operações Aritméticas - Operandos
Existem 5 operandos aritméticos que podem ser usados nas expressões aritméticas:

Adição     Subtração     Multiplicação   Divisão   Potenciação
(+ )          (-)            (*)            (/)        ( ** )

Regras:

Todo operador aritmético deve ser precedido e seguido por, no mínimo um espaço.

Expressões dentro de parênteses, são executadas primeiro.

Quando existir diversos parênteses, os mais internos serão executados primeiro.

Quando não há parênteses, as operações são executadas na seguinte ordem hierárquica:

           Potenciação        Multiplicação e Divisão      Adição e Subtração

Se a seqüência de operações do mesmo nível hierárquico, não for esclarecida pelos parênteses as
operações serão efetuadas da esquerda para a direita.

Exemplo:

A / B * C será interpretada como se tivesse sido escrita da seguinte forma: (A / B) * C.

A + B / C + D ** E * F + G é interpretada como: A + (B / C) + ( ( D ** E) * F) + G
Operações Aritméticas - COMPUTE
Uma vez que aprendemos como funciona expressões aritméticas, vamos agora estudar o comando
COMPUTE que utiliza expressões aritméticas.
COMPUTE calcula a expressão à direita do sinal de igual e coloca o resultado no campo à esquerda
do sinal de igual..

Exemplos:
COMPUTE SOMA      = 5.
COMPUTE VALOR     = QUANTIDADE.
COMPUTE SALARIO = (SALARIO * 1,5) + ADIC.
COMPUTE TAXA      = 5,6 * CAPITAL.
Opção ON SIZE ERROR e ROUNDED

Essas opções são utilizadas em todos os comandos aritméticos que vimos até agora.
Sabemos que o resultado de qualquer operação aritmética fica armazenado em algum campo. Porém
algumas vezes esse campo é pequeno para poder armazenar todos os dígitos do resultado da
operação.
Por exemplo se o campo determinado para receber o resultado tiver 5 posições (PIC9(5)) e o
resultado de uma operação qualquer foi 123456, não seria possível armazenar esse resultado. Então
utilizaremos a opção ON SIZE ERROR para codificarmos algum comando que só será executado se
isso acontecer. Nesse caso estamos nos referindo às casas inteiras (à esquerda do ponto decimal).
Pode ser usado em todos os comandos aritméticos já estudados, no seguinte formato:

Exemplo:

           ADD 1 TO TOTAL ON SIZE ERROR GO TO FIM.
           DIVIDE 11 INTO QUOC ON SIZE ERROR GO TO PARAG1.
Operações Aritméticas - Opção ROUNDED
Quando no campo receptor foi reservado um certo número de posições decimais e esse campo
receber o resultado de uma operação cujo número de posições decimais excede àquele, então os
dígitos mais à direita do resultado serão perdidos.
Por exemplo: Se o campo que irá receber o resultado foi definido com 3 casas inteiras e 2 decimais, e
a operação der como resultado o valor 543,212, o valor que será armazenado será 543,21 perdendo -
se os dígitos mais à direita que não couberem.
Para se eliminar tal truncamento, utilize ROUNDED, que irá arredondar o dígito menos significativo.

MULTIPLY PRECO BY QUANTIDADE GIVING PRODUTO ROUNDED.
SUBTRACT 100 FROM DIF ROUNDED.
ADD CAMPO TO TOTAL ROUNDED.

As duas opções podem ser usadas juntas, nesse caso o formato será:
comando aritmético [ ROUNDED ][ ON SIZE ERROR comando]

Exemplo:
MULTIPLY PRECO BY QUANTIDADE
           GIVING PRODUTO ROUNDED
           ON SIZE ERROR GO TO P2.
DIVIDE DIVISOR INTO 50
           GIVING QUOCIENTE ROUNDED
           ON SIZE ERROR GO TO A.
COMPUTE CALC ROUNDED = A / B + D
         ON SIZE ERROR GO TO XYZ.
Exercício 2
Objetivos :
Uso das instruções aritméticas.
Enunciado :
1) Faça um programa COBOL que calcule a seguinte fórmula matemática
         R = ( ( X6 - X4 ) + ( X3 * ( X1 - X2 ) ) ) / X5 - X1
2) A precisão de R deve ser de 4 casas decimais, sendo que o formato dos campos deve ser :
           X2, X3 e X5 binário
           X1, X4, X6 e R compactado
3) A fórmula deverá ser resolvida com os comando básicos (ADD, MULTIPLY, ....) e COMPUTE.
4) Teste o programa com os valores
           X1 = 1.507,12
           X2 = 456
           X3 = 0,9523
           X4 = 1.453,15
           X5 = -5
           X6 = 1.901,01
O resultado R deverá ser = -1.796,88
5) Divida o resultado R por 25,13 calcule utilizando as duas formas do DIVIDE com e sem o
REMAINDER
6) Utilize o DISPLAY para imprimir todos os resultados
IF / END-IF
  Com criação dos delimitadores estruturados, o comando IF ganha em
  legibilidade e facilita muito a construção de programas estruturados, pois o uso
  de IFs aninhados (IFs codificados dentro de IFs), é muito intenso. Veja a
  comparação de codificação de programa sem END-IF e com END-IF:
IF / END-IF
Codificando sem end-if

1 5 7 8 10 12 15 20 25 30 35 40 45 50 55 60 65 70 72

     100-PRODUCE-ENPLOYEE-LINE.
          PERFORM 110-READ-EMPLOYEE-RECORD.
          IF NOT EMPLOYEE-EOF
               IF SR-ACTIVE-EMPLOYEE
                      PERFORM 120-PRINT-ACTIVE-LINE
               ELSE
                      PERFORM 150-PRINT-INACTIVE-LINE.
           IF NOT EMPLOYEE-EOF
               PERFORM-160-ACCUMULATE-GAND-TOTAL.
IF / END-IF
Codificando com end-if

1 5 7 8 10 12 15 20 25 30 35 40 45 50 55 60 65 70 72

      100-PRODUCE-ENPLOYEE-LINE.
           PERFORM 110-READ-EMPLOYEE-RECORD.
           IF NOT EMPLOYEE-EOF
               IF SR-ACTIVE-EMPLOYEE
                     PERFORM 120-PRINT-ACTIVE-LINE
                ELSE
                     PERFORM 150-PRINT-INACTIVE-LINE
               END-IF
               PERFORM-160-ACCUMULATE-GAND-TOTAL.
IF Aninhados
                                                         A
Analise o seguinte fluxograma:                                   GOOD
                                                                 RISK?


                                            C
                                                                         B
                                             PERFORM
                                             BAD RISK?                       QUANT
                                                                              >100?
                                                                  D                           E

                                                             MOVE LOW-                      MOVE HIGH-
                                                              RATE TO                        RATE TO
                                                              DISCONT                        DISCONT

                                                                             F

                                                                                 COMPUTE
                                                                                  GROSS
                                                                                   =(etc)

                                                                             G

                                                                                 COMPUTE
                                                                                   NET
                                                                                   =(etc)
   Em VS COBOL, este fluxograma seria
   impossível de ser implementado, da forma                  H

   que está desenhado. Para implementar esta                 PERFORM
   lógica teremos que repetir as funções F e G,              INVOICE

   conforme é mostrado na pagina seguinte.
IF Aninhados
Em VS COBOL:

1 5 7 8 10 12 15 20 25 30 35 40 45 50 55 60 65 70 72

     IF GOOD-RISK
           IF QUANT > 100
                  MOVE HIGH-RATE TO DISCOUNT
                  COMPUTE GROSS = . . .
                  COMPUTE NET = . . .
           ELSE
                  MOVE LOW-RATE TO DISCOUNT
                  COMPUTE GROSS = . . .
                  COMPUTE NET = . . .
           ELSE
                  PERFORM BAD-RISK.

           PERFORM INVOICE.
IF Aninhados
Em VS COBOL II:

1 5 7 8 10 12 15 20 25 30 35 40 45 50 55 60 65 70 72
IF GOOD-RISK
       IF QUANT > 100
              MOVE HIGH-RATE TO DISCOUNT
       ELSE
              MOVE LOW-RATE TO DISCOUNT
       END-IF
       COMPUTE GROSS = . . .
       COMPUTE NET = . . .
ELSE
       PERFORM BAD-RISK
END-IF.

PERFORM INVOICE.
IF Aninhados
Com esse tipo de instrução o programador indica a existência de uma decisão em seu
programa, dizendo o que fazer conforme o resultado de um teste. Isto é, de acordo com
o resultado do teste, o programa será desviado para algum lugar.

Exemplo:

 IF A > B              Neste caso se o teste for verdadeiro, isto é, se o conteúdo do campo
    ADD 5 TO C         A for maior que o conteúdo de B, a operação soma (ADD 5 TO C)
 END-IF                será executada


Se A for menor que B (teste verdadeiro), o parágrafo               IF A < B
CALCULA será executado; se A não for menor que B (teste               PERFORM CALCULA.
falso), será executada a instrução seguinte ao comando             END-IF
IF Aninhados
Com o comando IF, podemos ter quatro tipos de testes:

Testes de Classe                                    Teste de Sinal

Esse tipo de teste serve para determinar se o       Este teste permite verificar se o
conteúdo de um campo definido com PIC X é           conteúdo de um campo numérico é
numérico ou alfabético.                             positivo (POSITIVE), negativo
                                                    (NEGATIVE) ou nulo (ZERO).

IF DADO IS NUMERIC
   PERFORM CALCULO
END-IF
Se o conteúdo do campo DADO for numérico,
haverá um desvio para o parágrafo CALCULO

IF NOME IS NOT ALPHABETIC
   GOBACK
END-IF
Se o conteúdo de NOME não for alfabético, o
programa termina via execução do comando
GOBACK.
Comando de Desvio - IF
Teste de Relação
Este tipo de teste serve para fazer comparações entre dois operandos, podendo ser,
conteúdo de campos, literais ou expressões aritméticas.
São operadores relacionais:
IS [NOT] GREATER THAN
IS [NOT] > MAIOR QUE [ou]
   NÃO MAIOR QUE
LESS - EQUAL
     IF SALARIO GREATER 10000
         PERFORM CALC1
     END-IF

CALC1.
    COMPUTE SALARIO = SALARIO * 50000.
São permitidos os conectores de condição
AND e OR
Se o conteúdo de SALARIO for maior que 100000, então o programa será desviado para o
parágrafo CALC1. Caso contrário o programa seguirá a seqüência normal que é o
comando:
COMPUTE SALARIO = SALARIO + 50000.
Comando de desvio – IF
                          Com opção ELSE
Sem opção ELSE            Será executada a sentença que precede a palavra
                          ELSE caso o teste seja verdadeiro, e ELSE, se o
                          teste for falso.
IF QUANT NOT = TOTAL      IF A = B
   ADD QUANT TO TOTAL        ADD 1 TO C
END-IF                       SUBTRACT 5 FROM Z
                             MOVE SPACES TO REGISTRO
IF A + B * C LESS 2          WRITE REGISTRO
   PERFORM P1             ELSE
END-IF                        ADD 5 TO NUMERO
                              DISPLAY 'FIM'
IF A > B                      GOBACK
   PERFORM ROTINA         END-IF
END-IF
                          IF A = B
IF CIDADE = 'SAO PAULO'      ADD 1 TO C
   MOVE 'SP' TO SIGLA     ELSE
END-IF                       PERFORM P1
                          END-IF
IF – CONDIÇÕES RELACIONAIS
Antes de mostrarmos as alterações nos testes de condições relacionais no VS
COBOL II, vamos rever as condições possíveis no VS COBOL:

IF A < B    IF A IS LESS THAN B IF A LESS    B
IF A = B    IF A IS EQUAL TO    B IF A EQUAL B
IF A > B    IF A IS GREATER THAN B IF A GREATER                 B

IF A NOT < B IF A IS NOT LESS THAN B IF A NOT LESS B
IF A NOT = B IF A IS NOT EQUAL THAN B IF A NOT EQUAL B
IF A NOT > B IF A IS NOT GREATER THAN B IF A NOT GREATER B

Mas o VS COBOL não suporta as condições: “less than or equal to” or ” equal to
or greater than” Se você precisar precisa fazer o seguinte teste: se A é menor ou
igual a 3 ?
IF – CONDIÇÕES RELACIONAIS
                                                      Y



                                0         1   2   3       4   5         6


                                    < 3                           > 3

                             NOT < 3
Em VS COBOL:
                                 <= 3
   IF A NOT > 3

Agora em VS COBOL II, temos disponível novas condições relacionais <= e >=
para simplificação da lógica e melhoria no entendimento do programa, pois a
condição NOT sempre foi causa de muito enganos. O mesmo teste acima é feito
simplesmente:

   IF A <= 3
IF – CONDIÇÕES RELACIONAIS
Simplificando Testes de Intervalos


WS-NUMBER possui um valor entre 2 e 4? Para codificar estes teste em VS COBOL:

       IF ((WS-NUMBER NOT < 2 ) AND (WS_NUMBER NOT > 4))
            PERFORM...



Em VS COBOL II, podemos simplificar o teste da seguinte forma:

       IF WS-NUMBER >= 2 AND WS-NUMBER <= 4
           PERFORM...
       END-IF.
NEXT SENTENCE
Nem sempre numa descrição de lógica se tem necessidade, de dado um teste no
comando IF, executar a parte verdadeira e a falsa. Opcionalmente, nesse caso
usamos as palavras NEXT SENTENCE para fazer papel de um comando nulo
(isto é, não faz nenhuma ação).


       IF A < B
          IF A > C
             NEXT SENTENCE
          ELSE
             ADD 1 TO C
          END-IF
       ELSE
          PERFORM IMPRESSAO
       END-IF.
CONTINUE
O comando CONTINUE é um comando não-operacional. É indicado quando
nenhuma instrução executável será utilizada.

Este comando foi criado para o uso de complementação de sintaxe de qualquer
comando condicional ou imperativo do VS COBOL II, principalmente o EVALUATE.
Também pode ser utilizado para o comando IF/ELSE, substituindo neste caso a
palavra-chave NEXT SENTENCE. Veja os exemplos abaixo:

       IF STATUS-CODE = SPACES
       CONTINUE
       ELSE
       PERFORM 999-ERROR
       END-IF.
CONTINUE
      Nem sempre CONTINUE tem o mesmo efeito de NEXT SENTENCE
      em um comando IF/ELSE.
      Quando NEXT SENTENCE é processado, a execução continua após o
      próximo ponto; Quando CONTINUE é processado, a execução
      continua após o próximo END-IF.

      No exemplo abaixo, se NEXT SENTENCE fosse utilizado no lugar de
      CONTINUE, PERFORM BIG-STATE não seria executado.

      Com o uso de CONTINUE, PERFORM BIG-STATE será executado.

             IF STATE-CODE = „07‟
                 IF CITY-CODE = „02‟
                     PERFORM BIG-CITY
                 ELSE
                     CONTINUE
                 END-IF
                 PERFORM BIG-STATE
             END-IF
OPEN
Sua função é preparar um arquivo para ser lido ou gravado. É obrigatório abrir o
arquivo antes de qualquer leitura ou gravação de arquivo.

OPEN INPUT CADCONTA CADCLIENTE

INPUT ......... para arquivos de entrada

OUTPUT ..... para arquivos de saída

I-O ................para arquivos indexados de entrada e saída (atualização)
CLOSE
É usado para fechar um arquivo. Para que um arquivo possa ser fechado é
necessário que ele tenha sido anteriormente aberto, por um comando OPEN.

CLOSE CADCONTA CADCLIENTE
READ
Realiza leitura de um registro dos arquivos especificados como INPUT na instrução
OPEN. Só pode ser usado após o arquivo ser aberto por OPEN.

Quando esse comando é executado um registro é lido do arquivo de entrada, esse
registro terá condições de ser processado. Quando for detectado o fim do arquivo,
desviará o programa para a sentença após a palavra AT END.


READ file-name [NEXT] [ INTO data-name ] AT END statement [ NOT AT END statement ]

Obs. : NOT AT END (Somente para COBOL II)
READ
Exemplo:

READ CADASTRO AT END
      MOVE 'Y' TO FIM-DE-ARQUIVO.

READ MOVIM INTO REGTRAB AT END
      GOBACK.

READ CARTAO
      AT END
            MOVE 'Y' TO IND-FIM-ARQ
      NOT AT END
            ADD 1 TO CT-REG-LIDO.
READ
Ao se executar a instrução READ, o registro será lido do arquivo é levado à área
de registro do arquivo reservado na FD da FILE SECTION.

Com o comando anterior, um registro do arquivo chamado CARTAO, é lido e
colocado na área de registro da FD.

Após o comando READ podemos dar o comando MOVE e transferir as
informações que foram lidas e armazenadas na área de registro para uma área de
trabalho da WORKING-STORAGE SECTION.

Entretanto podemos utilizar o comando READ com a opção INTO, que seria o
equivalente a um comando READ seguido por um comando MOVE. O registro lido
fica acessível tanto na área de registro como na área de trabalho.
WRITE
O comando WRITE providencia a saída de um registro lógico. O verbo WRITE grava o
registro em arquivos que foram especificados com OUTPUT na instrução OPEN.

Permite também a movimentação do papel na impressora.

WRITE record-name [ FROM data-name]

Exemplo:   WRITE REG-SAIDA.

Notas:

  • Um comando OPEN deve ter sido executado para o arquivo antes do primeiro comando
    WRITE.

  • O nome do registro deve ser aquele definido em nível 01 na FD da FILE SECTION.

  • Observe que um comando READ segue um nome de arquivo, mas a um comando
    WRITE segue um nome de registro.

  • Se a informação a ser emitida estiver já na área de saída de registro o
    programador deve empregar somente: WRITE nome de registro.
WRITE
Se a informação não estiver na área de saída de registro, o programador deve
executar um MOVE desta informação para essa área. Entretanto, ao invés de
usar o MOVE, você pode usar:

WRITE record-name FROM data-name

A opção FROM eqüivale a um comando WRITE precedido de um comando
MOVE para transferir os dados para a área de saída de registro.

Opção ADVANCING

Quando um arquivo for impresso em um formulário contínuo da impressora,
deve-se observar o posicionamento do carro da impressora, indicando quantas
linhas em branco deseja-se saltar em cada um dos registros impressos.
WRITE - Considerações:
A) A impressora assume que o primeiro caractere de qualquer registro transferido à ela, é
   um caractere de controle de espacejamento, conforme já consideramos.

B) Assim sendo, o primeiro caractere de cada registro de um arquivo na impressora deve
   ser reservado para o caractere de controle de impressão.

Exemplo

01 REG-LISTAREL.
05 FILLER                  PIC X. -> posição para controle de carro
05 LINHA                   PIC X(132).

Notas:

A opção ADVANCING do comando WRITE colocará automaticamente, o caractere de
controle de impressão adequado na primeira posição do registro a ser escrito pela
impressora, antes do WRITE a ser executado.

AFTER especifica que a impressão do registro deve ser efetuada depois do espacejamento.
Isto é, permite a impressão do registro após o formulário avançar o número inteiro de linhas.

BEFORE é o contrário de AFTER. A impressão é feita antes de saltar o número
inteiro de linhas especificado.
WRITE - Considerações:
O número inteiro pode ser 0, 1, 2, 3, etc...

WRITE REGISTRO BEFORE ADVANCING 2 LINES.

WRITE LINHA BEFORE 3 LINES.

WRITE LINHA FROM DETALHE AFTER 1 LINES.

WRITE CABEC AFTER PAGE.
GO TO
Em geral, em um programa COBOL, os comandos são executados na seqüência em que
eles aparecem na escrita do programa. Há, entretanto, alguns comandos que fazem com
que essa execução seqüencial seja alterada passando a executar um outro comando, por
meio de desvios.

GO TO nome-de-procedimento (deve ser um nome de parágrafo).

Exemplo:

        LER.
        ...
            GO TO CALCULAR.
        ...
        CALCULAR.
        ...


Nesse exemplo o programa vem executando o parágrafo LER, e quando atingir o GO TO
sofrerá um desvio para o parágrafo CALCULAR, mesmo que não tenha terminado o
parágrafo anterior.

Em outras palavras, assim, num programa ao ser encontrado um comando GO TO, a
seqüência de execução é desviada para o parágrafo especificado no GOTO.
Exercício 3
Objetivos :

Uso de estruturas condicionais com o comando IF, desvios incondicionais GO TO
e comandos de acesso a arquivos externos seqüenciais (OPEN/CLOSE,
READ/WRITE).

Enunciado :

1) Faça um programa COBOL que leia um arquivo com DDNAME igual a
ENTRADA, com DSNAME
   conforme padronização interna da empresa, cujos os registros tem o seguinte
LAYOUT:

01 REGISTRO.
      10     REG-NOME                  PIC     X(030).
      10     REG-IDADE                 PIC     99.
Exercício 3
2) Gerando um arquivo SAIDA com o LAYOUT:

01 REG-SAIDA.
      10     REG-SAIDA-NOME                 PIC     X(030).
      10     FILLER                PIC      X(015).
      10     REG-SAIDA-IDADE                PIC     99.
      10     FILLER                PIC      X(013).
      10     REG-SAIDA-DESCR       PIC      X(015).

3) O campo REG-NOME deve ser movido para REG-SAIDA-NOME e REG-IDADE
   para REG-SAIDA-IDADE.

4) O campo REG-SAIDA-DESCR deve ser criado conforme o conteúdo do campo
   REG-IDADE :

Se REG-IDADE maior que 60 mover “IDOSO” para REG-SAIDA-DESCR,
Se REG-IDADE maior que 40 mover “ADULTO” para REG-SAIDA-DESCR
Se REG-IDADE maior que 20 mover “ADULTO JOVEM” para REG-SAIDA-DESCR
Se REG-IDADE maior que 14 mover “ADOLESCENTE” para REG-SAIDA-DESCR
Caso contrário mover “CRIANCA” para REG-SAIDA-DESCR.
Exercício 3
5) Todas as condições acima descritas devem estar em uma única estrutura de IF.


6) Ao final da execução do programa, deverá ser emitido um TOTAL DE
   CONTROLE (DISPLAY) com o seguinte aspecto :

TOTAIS DE REGISTROS LIDOS DO ARQUIVO DE ENTRADA

               IDOSOS .................. :   XX
               ADULTOS .............. :      XX
               ADULTOS-JOVENS:               XX
               ADOLESCENTES ...:             XX
               CRIANCAS .............:       XX
               GERAL ....................:   XX
Comando INSPECT
O comando INSPECT provavelmente é o comando COBOL que apresenta a
maior variedade de formatos possíveis. No VS COBOL eram 3 formatos, e agora
no VS COBOL II é possível um novo formato que iremos mostrar mais adiante,
com substituto do chamado TRANSFORM.

INSPECT como substituto do EXAMINE

INSPECT é uma versão mais poderosa do comando EXAMINE. Tudo o que
podíamos fazer com EXEMINE também pode ser feito com INSPECT com
diferenças pouco importante no formato. Além do mais, INSPECT provê um
número de capacidades não presentes em EXAMINE.
EXAMINE FIELD1 REPLACING ALL ZEROS BY SPACES.

INSPECT FIELD1 REPLACING ALL ZERO BY SPACES.

EXAMINE FIELD1 TALLYING UNTIL FIRST ‘0’.

MOVE ZERO TO TALLY.
INPECT FIELD1 TALLYING TALLY FOR CHARACTERS BEFORE ‘0’.
Comando INSPECT
Exemplos

     77 COUNTR         PIC 9 VALUE ZERO.
     01 DATA-1       PIC X (6).

     INSPECT DATA-1
        TALLYING COUNTR FOR CHARACTER AFTER INITIAL „S‟
        REPLACING ALL „A‟ BY „O‟


    DATA-1 Antes   COUNTR Após   DATA-1 Após
      ANSELM           3           ONSELM
      SACKET           5           SOCKET
      PASSED           2           POSSED
Comando INSPECT
    77 COUNTR         PIC 9 VALUE ZERO.
    01 DATA-2       PIC X (11).

    INSPECT DATA-2
       TALLYING COUNTR FOR LEALDING „0‟
       REPLACING FIRST „A‟ BY „2‟ AFTER INITIAL „C‟.




   DATA-2 Antes COUNTR Após        DATA-2 Após
  00ACADEMY00       2             00AC2DEMY00
  0000ALABAMA       4             0000ALABAMA
  CHATHAM0000       0             CH2THAM0000
Comando INSPECT
       77 COUNTR         PIC 9 VALUE ZERO.
       01 DATA-3       PIC X (8).

      INSPECT DATA-3
   REPLACING CHARACTER BY ZEROS BEFORE INITIAL QUOTE.




  DATA-3 Antes   COUNTR Após   DATA-3 Após
   456"ABEL          0          000"ABEL
   ANDES"12          0          00000"12
   "TWAS BR          0           "twas br|
Comando INSPECT
Outros exemplos
        INSPECT FIELD1
            REPLACING ALL „A‟ BY „B„ BEFORE INITIAL „X‟
        INSPECT FIELD1
            REPLACING CHARACTERS BY SPACES AFTER INITIAL „.‟
        INSPECT FIELD1
            REPLACING ALL „X‟ BY „Y„
               „B‟ BY „Z‟
               „W‟ BY „Q‟
               AFTER INITIAL SPACE
        INSPECT FIELD1
            REPLACING FIRST „X‟
               AFTER INITIAL „Y‟ BY „Z„
        INSPECT FIELD1
            REPLACING „ABC‟ BY „XYZ‟
        INSPECT FIELD1
            TALLYING COUNT-1
                FOR CHARACTERS BEFORE INITIAL „DEPT‟
        INSPECT SAMPLE
            TALLYING INDEX-4
                FOR LEADING SPACES
            REPLACING ALL „.‟ BY „.‟ FIRST „Q‟ BY „P‟
Comando INSPECT
INSPECT como substituto do TRANSFORM

Novo Formato


   INSPECT indentifier-1CONVERTING        {                 }
                                                indentifier-2
                                                literal-1       TO   {               }
                                                                         indentifier-3
                                                                         literal-2



   [ { BEFORE}
       AFTER      INITIAL   {              }]
                                indentifier-4
                                literal-3




    TRANSFORM FIELD1 CHARACTERS FROM ‘WXYZ’ TO ‘ABCD’.


    INSPECT FIELD1 CONVERTING ‘WXYZ’ TO ‘ABCD’.
Comando INSPECT
Exemplos

  01 DATA-4            PIC X (11).
  INSPECT DATA-4
   CONVERTING ‘a b c d e f g h i j l m n o p q r s t u v w x y z’
          TO ‘A B C D E F G H I J L M N O P Q R S T U V W X Y Z’

           DATA-4 Antes               DATA-4 Após
              inspect                  INSPECT

  01 DATA-4            PIC X (11).
  INSPECT DATA-4
   CONVERTING ‘a b c d e f g h i j l m n o p q r s t u v w x y z’
           TO ‘A B C D E F G H I J L M N O P Q R S T U V W X Y Z’
     AFTER   INITIAL ‘ / ’
     BEFORE   INITIAL ‘ ? ’.
            DATA-4 Antes            DATA-4 Após
            A/five/?six             a/FIVE/?six
            R/Rexx/RRRr             r/REXX/RRRR
            Zfour?inspe             zfour?inspe
Comando INSPECT
 01 DATA-5       PIC X (11).

 INSPECT DATA-5
   CONVERTING „XBC‟ TO „YZQ‟ AFTER INITIAL „R‟.


      DATA-5 Antes              DATA-5 Após
       XBCRXBC                   XBCRYZQ
       XBC9XBC                   XBC9XBC
       RXBCXBC                   RYZQYZQ
EVALUATE
Na „Programação Estruturada’ as estruturas possíveis são:

•SEQUÊNCIA
Seqüência de comandos quaisquer.

•SELEÇÃO
Se/Senão. Nas linguagens mais populares essa estrutura é obtida pelo
comando IF/ELSE.

•REPETIÇÃO
Estrutura repetitiva (looping), nos formatos DO-UNTIL ou DO-WHILE. Cada
linguagens apresenta comandos diferentes: FOR, GOSUB, DO-WHILE, DO-
UNTIL, etc. No COBOL ambos os formatos são obtidos pelo comando
PERFORM.

•CASE
Caso 1, Caso 2, Caso 3,...,Caso n. Em algumas linguagens essa estrutura é
obtida pelo comando DO CASE/CASE/ENDCASE.
EVALUATE
Estrutura CASE

O VS COBOL não possui nenhum comando para resolver essa estrutura. Quando
projetada em um comando COBOL, tínhamos que resolver o problema através do
uso de IF/ELSE. Uma estrutura CASE obtida através de IF/ELSE, caracteriza-se
por só executar comandos na condição SE (positivo ou negativo). Na condição
SENÃO ( negativo ou falso), existe uma nova condição. Podemos representar isso
através do seguinte diagrama de blocos:
                                                   F         V


                                           F           V


                                   F           V
EVALUATE
O Diagrama da página anterior, poderia ser codificado em COBOL da seguinte forma:

   IF ESTADO - CIVIL = „SOLTEIRO‟
        PERFORM 100 - SOLTEIRO
   ELSE
   IF ESTADO - CIVIL = „CASADO‟
        PERFORM 110 - CASADO
   ELSE
   IF ESTADO - CIVIL = „DESQUITADO‟
        PERFORM 120 - DESQUITADO
   ELSE
   IF ESTADO - CIVIL = „DIVORCIADO‟
        PERFORM 130 - DIVORCIADO
   ELSE
   IF ESTADO - CIVIL = „VIUVO‟
        PERFORM 140- VIUVO
   ELSE
        PERFORM 999 - ERRO.

Observação:
 Neste tipo de estrutura, o correto era não utilizar indentação, para que visualmente fosse
 fácil de identificar a estrutura CASE (somente em IFs aninhados é que utilizamos
 indentação).
EVALUATE - SINTAXE
Com o novo comando EVALUATE do VS COBL II, agora podemos projetar a
estrutura CASE utilizando o seguinte diagrama de blocos:



                                   Integer
                                  value = ?




                                                              = m

 Case-1     Case-2     Case-3                 Case-4     Case-m
 function   function   function               function   function
EVALUATE - SINTAXE
A sintaxe do comando EVALUATE:

                          identifier-1                       identifier-2


    EVALUATE

    {{ WHEN
                  { } { } literal-1
                          espression-1
                          TRUE
                          FALSE
                                                [ ALSE
                                                             literal-2
                                                             expression-2
                                                             TRUE
                                                             FALSE
                                                                            ]...



        ANY




  {     condition -1
        TRUE
        FALSE

        [ NOT ]
                  {
                       indentifier-3
                       literal-3
                                            }[{
                       arthmetic-expression-1
                                                         THOROUGH
                                                         THRU
                                                                    }{
                                                                            indentifier-4
                                                                            literal-4
                                                                                                }]
                                                                            arthmetic-expression-2}
      {{ ALSON
        ANY




  {     condition -1
        TRUE
        FALSE

        [ NOT ]


   Imperative
                  {
                       indentifier-5
                       literal-5
                                            }[{
                       arthmetic-expression-3
                                                         THOROUGH
                                                         THRU
                                                                    }{
                                                                            indentifier-6
                                                                            literal-6
                                                                                                }]}
                                                                            arthmetic-expression-4
                                                                                                     ]...}...

   [ WHENOTHERimperative-statement-2]
   [ END-EVALUTE]
EVALUATE
A primeira vista, parece ser um comando complexo. O motivo é que existe diversas variações do
comando. Através de exemplos vamos explorar todas as suas variantes.

Em um exemplo simples, podemos traduzir a estrutura IFs que foi mostrada na página anterior para o
comando EVALUATE:

1 5 7 8 10 12 15 20 25 30 35 40 45 50 55 60 65 70 72

              IF ESTADO-CIVIL  = „SOLTEIRO‟
              PERFORM 100-SOLTEIRO
              ELSE IF ESTADO-CIVIL = „CASADO‟
              PERFORM 110-CASADO
              ELSE IF ESTADO-CIVIL = „DESQUITADO‟
              PERFORM 120- DESQUITADO
              ELSE IF ESTADO-CIVIL = „DIVORCIADO‟
              PERFORM 130- DIVORCIADO
              ELSE IF ESTADO-CIVIL = „VIUVO‟
              PERFORM 140-VIUVO
              ELSE PERFORM 999-ERRO.

              EVALUATE ESTADO-CIVIL
              WHEN „SOLTEIRO‟ PERFORM 100-SOLTEIRO
              WHEN „CASADO‟   PERFORM 110-CASADO
              WHEN „DESQUITADO‟ PERFORM 120- DESQUITADO
              WHEN „DIVORCIADO‟ PERFORM 130- DIVORCIADO
              WHEN „VIUVO‟   PERFORM 140-VIUVO
              WHEN OTHER      PERFORM 999-ERRO
              END-EVALUATE.
EVALUATE
A forma mostrada na página anterior é uma das mais simples. Vamos agora apresentar outro exemplo,
codificado em IFs e depois codificado em EVALUATE, já com a utilização na cláusula WHEN do operador
THRU:
1 5 7 8 10 12 15 20 25 30 35 40 45 50 55 60 65 70 72
      IF ITR-TRAN-CODE = 1
      PERFORM 240-EDIT-CODE-1-FIELDS
      ELSE IF ITR-TRAN-CODE = 2
      PERFORM 250-EDIT-CODE-2-FIELDS
      ELSE IF ITR-TRAN-CODE = 3
      PERFORM 260-EDIT-CODE-3-FIELDS
      ELSE IF ITR-TRAN-CODE : 4
      PERFORM 270-EDIT-CODE-4-FIELDS
      ELSE IF ITR-TRAN-CODE : 5
      PERFORM 280-EDIT-CODE-5-FIELDS
      ELSE IF ITR-TRAN-CODE NOT < 6 AND NOT > 10
      PERFORM 290-EDIT-COMMON-FIELDS
      ELSE MOVE „N‟ TO VALID-TRAN-CODE
      ADD 1 TO INVALID-TRAN-CODE-COUNT.
      EVALUATE ITR - TRAN - CODE
      WHEN 1       PERFORM 240-EDIT-CODE - 1 - FIELDS
      WHEN 2       PERFORM 250-EDIT-CODE - 2 - FIELDS
      WHEN 3       PERFORM 260-EDIT-CODE - 3 - FIELDS
      WHEN 4       PERFORM 270-EDIT-CODE - 4 - FIELDS
      WHEN 5       PERFORM 280-EDIT-CODE - 5 - FIELDS
      WHEN 6 TRHU 10 PERFORM 290-EDIT-COMMON-FIELDS
      WHEN OTHER      MOVE „N‟ TO VALID - TRAN - CODE
      ADD 1 TO INVALID-TRAN-CODE-COUNT
      END-EVALUATE.
EVALUATE - QUADRO
Este quadro simplificado,   EVALUATE Sintax Vriatons                         Examples
mostra diversas formas
de se codificar o comando
                             EVALUATE   [ ]  TRUE
                                             FALSE
                                                                 EVALUATE TRUE

EVALUATE:                        WHEN   [RELATION ]              WHEN WS-VALUE < 0.75
                                 WHEN   [CONDITION]              WHEN 88-level name
                                 WHEN   [ OTHER ]
                            END-EVALUATE.


                                        [
                               EVALUATE IDENTIFIER-1         ]   EVALUATE WS-VALUE




                                        [ ]
                                               literal           WHEN ‘F’
                                                  or             WHEN ‘PR’THRU ‘ZQ’
                                               range
                                                                 WHEN 13 THRU 175.8
                                 WHEN
                                            indentifier-2
                                                                 WHEN HRS-REG-WEEK

                                        [ ]
                                   when OTHER
                              END-EVALUATE.



                                        [
                               EVALUATE expression       ]        EVALUATE A * B



                                        [ ]]
                                               literal
                                                                  WHEN 152
                               EVALUATE
                                            imdentifier-3         WHEN 13 THRU 175.8

                                                                  WHEN HRS-REG-WEEK
                                        [
                                   WHEN OTHER

                              END-EVALUATE.
EVALUATE - Cláusula ALSO
Através desta cláusula, podemos testar condições múltiplas, em um mesmo comando EVALUATE. Veja o exemplo
abaixo, onde fazemos o teste de três campos:

1 5 7 8 10 12 15 20 25 30 35 40 45 50 55 60 65 70 72

WORKING-STORAGE SECTION.
*
01 APPLICANT-CATEGORY-FIELDS.
         05 EXPERIENCE-CATEGORY                    PIC X.
                  88 NO-EXPERIENCE                 VALUE „1‟.
                  88 UNDER-5-YERS                  VALUE „2‟.
                  88 5-AND-OVER-YEARS              VALUE „3‟.
         05 COLLEGE-DEGREE-CATEGORY                PIC X.
                  88 NO-DEGREE                     VALUE ‟N‟.
                  88 BACHELORS-DEGREE              VALUE „B‟.
                  88 MASTERS-DEGREE                VALUE „M‟.
                  88 DOCTOROL-DEGREE               VALUE „P‟.
         05 SALARY-REQUIREMENT-CATEGORY            PIC X.
                  88 UNDER-20-THOUSAN              VALUE „1‟.
                  88 FROM-20-TO-35-THOUSAND        VALUE „2‟.
                  88 OVER-35-THOUSAND              VALUE „3‟.
         ...
         PROCEDURE DIVISION.
         ...
         300-EVALUATE-APPLICATION-DATA.
             EVALUATE EXPERIENCE-CATEGORY
                  ALSO COLLEGE-DEGREE-CATEGORY
                  ALSO SALARY-REQUIREMENT-CATEGORY
EVALUATE - Cláusula ALSO

                                Utilizando os operadores
                                NOT e ANY



WHEN „1‟ ALSO „B‟ ALSO „1‟                PERFORM 310-ACTION-1
WHEN „1‟ ALSO „M‟ ALSO „2‟                PERFORM 320-ACTION-2
WHEN „1‟ ALSO „P‟ ALSO „3‟                PERFORM 330-ACTION-3
WHEN „2„ ALSO NOT „P‟ ALSO NOT „1‟ PERFORM 340-ACTION-4
WHEN „2„ ALSO „P„ ALSO ANY                PERFORM 350-ACTION-5
WHEN „3‟ ALSO NOT „P‟ ALSO ANY     PERFORM 360-ACTION-6
WHEN OTHER                                PERFORM 380-DEFAULT

END-EVALUATE.
EVALUATE – Cláusula ALSO
1 5 7 8 10 12 15 20 25 30 35 40 45 50 55 60 65 70 72

          WORKING-STORAGE SECTION.
          01 APPLICANT-CATEGORY-FIELDS.
              05 EXPERIENCE-CATEGORY PIC X.
              88 NO-EXPERIENCE VALUE „1‟.
              88 UNDER-5-YERS VALUE „2‟.
              88 5-AND-OVER-YEARS VALUE „3‟.
              05 COLLEGE-DEGREE-CATEGORY PIC X.
              88 NO-DEGREE VALUE ‟N‟.
              88 BACHELORS-DEGREE VALUE „B‟.
              88 MASTERS-DEGREE VALUE „M‟.
              88 DOCTOROL-DEGREE VALUE „P‟.
              05 SALARY-REQUIREMENT-CATEGORY PIC X.
              88 UNDER-20-THOUSAND VALUE „1‟.
              88 FROM-20-TO-35-THOUSAND VALUE „2‟.
              88 OVER-35-THOUSAND VALUE „3‟.
              ...
          PROCEDURE DIVISION.
              ...
EVALUATE – Cláusula ALSO (Cont)
    300-EVALUATE-APPLICATION-DATA.
        EVALUATE TRUE      ALSO TRUE ALSO TRUE
        WHEN NO-EXPERIENCE ALSO BACHELORS-DEGREE
            ALSO UNDER-20-THOUSAND
            PERFORM 310-ACTION-1
        WHEN NO-EXPERIENCE ALSO MASTERS-DEGREE
            ALSO FROM-20-TO-35-THOUSAND
            PERFORM 320-ACTION-2
        WHEN NO-EXPERIENCE ALSO DOCTOROL-DEGREE
            ALSO OVER-35-THOUSAND
            PERFORM 330-ACTION-3
        WHEN NO-EXPERIENCE ALSO NOT DOCTORAL-DEGREE
            ALSO NOT OVER-35-THOUSAND
            PERFORM 340-ACTION-4
        WHEN UNDER - 5 – YERS ALSO   DOCTORAL – DEGREE ALSO ANY
            PERFORM 350-ACTION-5
        WHEN 5-AND-OVER-YERS ALSO NOT DOCTORAL – DEGREE ALSO ANY
            PERFORM 360-ACTION-6
        WHEN 5-AND-OVER-YERS ALSO     DOCTORAL – DEGREE ALSO ANY
            PERFORM 370-ACTION-7
        WHEN OTHER
            PERFORM 380-DEFAULT
        END-EVALUATE.
EVALUATE - Outros exemplos
 1) Condição composta

         DATA DIVISION.
         WORKING-STORAGE SECTION.
         01 GENERO                   PIC X (5).
         01 IDADE                    PIC S9 (3) COMP-3.

         PROCEDURE DIVISION.

            EVALUATE GENERO = „MACHO‟ ALSO IDADE > 25
                   WHEN TRUE ALSO TRUE
                          PERFORM RATE - 1
                   WHEN TRUE ALSO FALSE
                          PERFORM RATE - 2
                   WHEN FALSE ALSO TRUE
                          PERFORM RATE - 3
                   WHEN OTHER
                          PERFORM RATE - 4
            END-EVALUATE.
EVALUATE - Outros exemplos
2) Idem ao exemplo acima, só que testando valores na cláusula WHEN:

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 GENERO                               PIC X (5).
       01 IDADE                                PIC S9 (3) COMP-3.

       PROCEDURE DIVISION.

               EVALUATE TRUE ALSO TRUE
                      WHEN GENERO = „MACHO‟ ALSO IDADE   > 25
                             PERFORM RATE - 1
                      WHEN GENERO = „MACHO‟ ALSO IDADE NOT > 25
                             PERFORM RATE - 2
                      WHEN GENERO = „FEMEA‟ ALSO IDADE  > 25
                             PERFORM RATE - 3
                      WHEN OTHER
                             PERFORM RATE - 4
               END-EVALUATE.
EVALUATE - Outros exemplos
3) Uso de expressões

       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 TAXA                  PIC S9V9 (4)       COMP-3.
       01 PRINCIPAL             PIC S9 (7) V99     COMP-3.
       01 JUROS                 PIC S9 (7) V99     COMP-3.

       PROCEDURE DIVISION.

           EVALUATE TRUE ALSO TRUE
              WHEN PRINCIPAL + JUROS > 50000 ALSO TAXA > 0.095
                     ADD 0.0075 TO TAXA
              WHEN PRINCIPAL + JUROS > 10000 ALSO TAXA > 0.09
                     ADD 0.005 TO TAXA
           END-EVALUATE.
EVALUATE - Outros exemplos
 4) Uso da cláusula THRU

         DATA DIVISION.
         WORKING-STORAGE SECTION.
         01 IDADE                       PIC S9 (3)     COMP-3.
         01 PESO                        PIC S9 (3)     COMP-3.
         01 PREMIO                      PIC S9 (7) V99 COMP-3.

         PROCEDURE DIVISION.

             EVALUATE IDADE   ALSO PESO
                    WHEN 21 THRU 30 ALSO 140 THRU 200
                           MOVE 200 TO PREMIO
                    WHEN 31 THRU 40 ALSO 150 THRU 225
                           MOVE 250 TO PREMIO
             END-EVALUATE.
EVALUATE - EXERCÍCIO
Você agora irá codificar um comando EVALUATE para revolver o seguinte
problema :

Tendo a informação de se há histórico de ataques cardíacos na família,
sexo, e se é fumante ou não, determine o fator de risco um ataque cardíaco,
de acordo com o seguinte quadro:

                       HOMEM                      MULHER
Famílias que não
                       FUMANTE   = 0,18           FUMANTE   = 0,14
possuem histórico
                       NÃO FUMANTE = 0,01         NÃO FUMANTE = 0,005
de ataque cardíaco

Famílias que
                       FUMANTE   = 0,32           FUMANTE   = 0,24
possuem histórico
                       NÃO FUMANTE = 0,03         NÃO FUMANTE = 0,02
de ataque cardíaco
EVALUATE - EXERCÍCIO
1) Construa abaixo, uma tabela de decisão de acordo com o quadro abaixo:

   Famílias que
   possuem                 Sexo              Fumante?         Fator de Risco
   histórico de
   ataque cardíaco
EVALUATE - EXERCÍCIO
2) Complete o programa abaixo, codificando o comando EVALUATE de acordo com a
tabela de decisão construída na página anterior:
1 5 7 8 10 12 15 20 25 30 35 40 45 50 55 60 65 70 72

          ENVIRONMENT DIVISION.
          CONFIGURATION SECTION.
              DECIMAL-POINT IS COMMA.
          DATA DIVISION.
          WORKING-STORAGE SECTION.
          01 WS-RISK       PIC Z,999.
          01 WS-DATA-TABLE-SETUP.
              05 FILLER     PIC X (3) VALUE   „NHS‟.
              05 FILLER     PIC X (3) VALUE   „NHN‟.
              05 FILLER     PIC X (3) VALUE   „***‟.
              05 FILLER     PIC X (3) VALUE   „NMS‟.
              05 FILLER     PIC X (3) VALUE   „NMN‟.
              05 FILLER     PIC X (3) VALUE   „NH*‟.
              05 FILLER     PIC X (3) VALUE   „SHS‟.
              05 FILLER     PIC X (3) VALUE   „SHN‟.
              05 FILLER     PIC X (3) VALUE   „N*S‟.
              05 FILLER     PIC X (3) VALUE   „SMS‟.
              05 FILLER     PIC X (3) VALUE   „SMN‟.
              05 FILLER     PIC X (3) VALUE   „*HS‟.
EVALUATE - EXERCÍCIO (Cont.)
      01 WS-DATA-TABLE REDEFINES WS-DATA-TABLE-SETUP.
             05 WS-DATA-ROW OCCURS 12 TIMES INDEXED BY INDX.
             10 WS-HISTORY PIC X (1).
             10 WS-SEX             PIC X (1).
             10 WS-SMOKER PIC X (1).
      01 IN-DATA.
             10 WS-HISTORY                PIC X (1).
             10 WS-SEX                PIC X (1).
             10 WS-SMOKER                  PIC X (1).
      PROCEDURE DIVISION.
      0000-MAINLINE.
             PERFORM 1000-DECISION
             VARYNG INDX FROM 1 BY 1
             UNTIL INDX > 12.
             STOP RUN.
      1000-DECISION.
      MOVE WS-DATA-ROW (INDX) TO IN-DATA.
      *----------------------------------------------------------------*
      * MOVER FATOR DE RISCO PARA WS-RISK. QUANDO INVALIDO MOVER 9,999 *
      *----------------------------------------------------------------*
             EVALUATE ... END-EVALUATE.

         DISPLAY „FATOR DE RISCO = „ WS-RISK.
EVALUATE - EXERCÍCIO (Cont.)
Indique o que está errado no comando EVALUATE abaixo:

        05 SR-LETTER-GRADE     PIC X (1).
            88 SR-EXCELENT      VALUE „A‟.
            88 SR-GOOD        VALUE „B‟.
            88 SR-OK        VALUE „C‟.
            88 SR-NEED-IMPROV     VALUE „D‟.
            88 SR-FAIL      VALUE „F‟.

        PROCEDURE DIVISION.

            EVALUATE SR-LETTER-GRADE
            WHEN SR-EXCELENT
            DISPLAY „EXCELENT TRABALHO‟
            WHEN SR-GOOD
            DISPLAY „MUITO BOM‟
            WHEN SR-OK
            ...
            END-EVALUATE.
EVALUATE - EXERCÍCIO (Cont.)
SET... TO TRUE
O comando SET... TO TRUE é para ser usado com Nomes Condicionais (Níveis
88). Com o uso deste comando você pode setar uma condição como verdadeira
sem conhecer qual o valor que teria que ser movido para o campo. Veja o
exemplo abaixo:

       05 CARGO- STATUS        PIC X.
             88 TRAINEE         VALUE „1‟.
             88 JUNIOR         VALUE „2‟.
             88 PLENO          VALUE „3‟.
             88 SENIOR         VALUE „4‟.

Para que PLENO seja verdadeiro, com o comando MOVE:
   MOVE ‘3’ TO CARGO-STATUS.
Para que PLENO seja verdadeiro, com o comando SET TO TRUE:
   SET PLENO TO TRUE.
SET... TO TRUE
O comando SET em VS COBOL II continua com sua antiga função de manipular os
Indexadores de tabelas:

        SET DT-IX TO   1.
        SET DT-IX UP BY 1.
        SET DT-IDX DOWN BY 1.

Com a cláusula TRUE ele se torna exclusivo para o uso com nomes condicionais (Níveis
88), tornando os programas mais legíveis e fáceis de manter:

        01 WS-EOF-FLAG    PIC X VALUE „N‟.
               88 MORE-RECORDS-TO-READ VALUE „N‟.
               88 END-OF-FILE     VALUE „E‟.

        PROCEDURE DIVISION.
        ...
              READ INPUT-FILE
                     AT END SET END-OF-FILE TO TRUE
              END-READ.
SET... TO TRUE (Cont.)
Em caso que o nível 88 possui múltiplos valores, SET assinale para o campo, o
valor da lista. Por exemplo,
neste caso o comando SET movimentaria o valor 4 para WS-GDATE-MONTH-9:

       01 WS-GREGHORIAN-DATE-9.
             05 WS-GDATE-MONTH-9 PIC X (2).
                   88 MONTH-WITH-31-DAYS VALUE 1 3 5 7 8 10 12.
                   88 MONTH-WITH-30-DAYS VALUE 4 6 9 11.
                   88 MONTH-OF-FEB    VALUE 2.
                   88 MONTH-VALID    VALUE 1 THRU 12.

       PROCEDURE DIVISION.

                       SET MONTH-WITH-30-DAYS TO TRUE.
Indexação
Construção de Tabelas

Freqüentemente, existe a necessidade do programador construir uma tabela contendo
informações. Esta tabela poderá estar definida no programa ou seu conteúdo poderá vir de
uma fonte externa, tal como cartões perfurados, discos ou fitas magnéticas.

O programador poderá construir a área da tabela na DATA DIVISION do seu programa, na
FILE SECTION ou na WORKING-STORAGE SECTION, utilizando a cláusula OCCURS.

Suponha, por exemplo, que necessitemos de uma área na memória, suficiente para conter
vinte índices econômicos diversos. Então, teremos:

WORKING-STORAGE SECTION.

01 REGISTRO-TRABALHO.
       03 IMPOSTO                 PIC 9(05)V99.
       03 INDICE                  PIC 9(02)V99               OCCURS 20 TIMES.
       03 VARIANCA                PIC 9(03)V99.
Indexação (Cont.)
Na memória uma área chamada de registro-trabalho é criada, contendo 92 bytes.
Vemos que a cláusula OCCURS ocasionou a reserva de vinte vezes 4 bytes, que
são necessários para o armazenamento de uma informação chamada no
programa de índice.

Durante a execução do programa, os valores serão lidos e colocados dentro da
tabela de índices.

Vejamos como isto é possível.
Indexação (Cont.)
Na PROCEDURE DIVISION, o programa poderá ter acesso a qualquer índice
apenas dando o nome da tabela, que no caso é índice, seguido de um subscrito.
Exemplo:

ADD INDICE (3)                  TO   TOTAL-INDICE.
MOVE INDICE (I)                 TO   AREA1.
MOVE INDICE (INDIC)             TO   AREA-SAIDA.
MOVE REGIAO (ESTADO)            TO   XPD.

Dentro dos parênteses é visto o algarismo 3, que representa o valor de uma
variável chamado índice. O algarismo em questão nos aponta para o terceiro
valor colocado na tabela. Na tabela dada como por exemplo, qualquer número
entre 1 e 20 pode ser um índice. Qualquer número acima de vinte, para o
exemplo particular dado é ilegal.

Os índices, entretanto, não necessitam ser itens literais numéricos, podendo ser
nomes simbólicos, conforme demonstrado nos outros exemplos.
Indexação (Cont.)
Na aplicação de sucessivos OCCURS aos nomes de dados, devemos ter em
mente que o número máximo de Indexadores permitidos em COBOL, para um
mesmo nome é 7.

77 PRODUTO PIC 99.
77 ANO     PIC 99.
77 MES             PIC 99.

01 PRODUTOS.
      05 VENDAS-PRODUTOS            OCCURS 20 TIMES.
            10 VENDAS-QUINZENAL     OCCURS 5 TIMES.
                  15 VENDAS-MENSAIS        OCCURS 12 TIMES
                                    PIC S9(08) COMP3.
Tabela de 7 níveis
Agora você poderá construir de até sete níveis! Este recurso provavelmente você
dificilmente irá utilizar pois 3 níveis já eram o suficientes:

        WORKING - STORAGE SECTION.
        01 GRADE-7
         05 TAB-1                OCCURS 10 TIMES INDEXED BY IDX-1.
           10 TAB-2              OCCURS 10 TIMES INDEXED BY IDX-2.
             15 TAB-3            OCCURS 10 TIMES INDEXED BY IDX-3.
               20 TAB-4          OCCURS 10 TIMES INDEXED BY IDX-4.
                 25 TAB-5       OCCURS 10 TIMES INDEXED BY IDX-5.
                   30 TAB-      OCCURS 10 TIMES INDEXED BY IDX-6.
                     35 TAB-7 OCCURS 10 TIMES INDEXED BY IDX-7.
                       40 TAB-ITEM PIC S9 (3) V99 PACKED-DECIMAL.

        01 TAB-DISPLAY                    PIC ZZ9,99
Tabela de 7 níveis (Cont.)
PROCEDURE DIVISION.
 ...
    PERFORM 210-DISPLAY-VALUES

    VARYING IDX-1 FROM 1 BY 1 UNTIL IDX-1 > 10
     AFTER IDX-2 FROM 2 BY 2 UNTIL IDX-2 > 10
     AFTER IDX-3 FROM 3 BY 3 UNTIL IDX-3 > 10
     AFTER IDX-4 FROM 4 BY 4 UNTIL IDX-4 > 10
     AFTER IDX-5 FROM 5 BY 5 UNTIL IDX-5 > 10
     AFTER IDX-6 FROM 6 BY 6 UNTIL IDX-6 > 10
     AFTER IDX-7 FROM 7 BY 7 UNTIL IDX-7 > 10

210-DISPLAY-VALUES.

  MOVE TAB-ITEM (IDX-1 IDX-2 IDX-3 IDX-4 IDX-5 IDX-6 IDX-7)
   TO TAB-DISPLAY.
  DISPLAY TAB-DISPLAY.
                                        Esta é a razão de o comando
                                        PERFORM VARYING aceitar até
                                        6 cláusulas AFTER.
Subscrição Relativa (Relative Subscripting)
Um subscritor, é um campo criado na WORKING_STORAGE, para ser utilizado
como apontador de um elemento de uma tabela.
É recomendado utilizar um campo tipo Binário com tamanho de uma Fillword
para todos subscritores:

       DATA DIVISION.
       WORKING-STORAGE SECTION.

       01 SUB1           PIC 9 (8) BINARY VALUE 0.
Subscrição Relativa (Relative Subscripting) (Cont.)
No VS COBOL II, é permitido utilizar três formas de subscrição de tabelas:

1) Subscrição através de constantes:

         TAB-ITEM (1)

2) Subscrição através de campo:

         TAB-ITEM (SUB1)

3) Subscrição Relativa:

         TAB-ITEM (SUB1+2)

Quando lidamos com tabelas de mais de uma dimensão (bidimensional, tridimensional, ...)
não é obrigatório separar os subscritos com virgula:

         TAB-COLUMN (SUB1 SUB2)

No entanto, se você utilizar Subscrição Relativa, a virgula melhora a legibilidade do
programa:

         TAB-COLUMN (SUB1-1, SUB2+3)
Indexação Relativa (Relative Indexing)
Um indexador, é um campo criado junto a declaração da tabela, e serve como um pointer
(endereço) dos elementos da tabela. Só pode ser utilizado para a tabela onde foi
declarado.

Como você viu na página anterior, o VS COBOL II aceita Subscrição Relativa. Também é
possível a Indexação Relativa. Veja o exemplo:

        DATA DIVISION.
        WORKING-STORAGE SECTION.

        01 SAMPLE-TABLE.
            05 TABLE-DEPT      OCCURS 3 TIMES INDEXED BY INDX-A .
                10 TABLE-COLUMN OCCURS 4 TIMES INDEXED BY INDX-B.
                    15 TABLE-ROW OCCURS 8 TIMES INDEXED BY INDX-C.

        PROCEDURE DIVISION.
           ...
           MOVE TABLE-ROW (INDX-A + 1, INDX-B + 2, INDX-C -1)
               TO ...

                                            Indexação Relativa
Indexação Relativa (Relative Indexing) (Cont.)



   ATENÇÃO   A Indexação Relativa não modifica o valor do indexador. Os
             únicos comandos que modificam o valor de um indexador são
             PERFORM VARYING, SEARCH E SET.
Colocando Valores em uma tabela
O VS COBOL II oferece três formas de colocarmos valores em uma tabela:

        Carregar a Tabela dinamicamente
        Inicializar a Tabela
        Assinalar valores na definição da Tabela

Vamos comentar as três formas mostradas acima:

Carregar a Tabela dinamicamente

Se os valores iniciais de uma tabela são diferentes a cada vez que o programa
executar , a tabela deverá ser definida sem valores iniciais, e os valores deverão
ser carregados dinamicamente, antes de se manipular a tabela

Para carregar a tabela dinamicamente, temos o comando:

        PERFORM...VARYING

utilizando subscritor ou Indexador.
Colocando Valores em uma tabela (Cont.)
Inicializar a Tabela

Você pode carregar a tabela com um valor durante a execução do programa,
utilizando o comando INITIALIZE.

        INITIALIZE TABLE-ONE

O comando INITIALIZE sem REPLACING moverá os seguintes valores:

         Spaces para itens ALPHABETIC, ALPHANUMERIC e
          ALPHANUMERIC-EDITED
         Zeros para itens NUMERIC e NUMERIC-EDITED

Para mover um valor em particular, utilize a cláusula REPLACING:

        INITIALIZE TABLE-ONE REPLACING NUMERIC DATA BY 3.
Colocando Valores em uma tabela (Cont.)



   ATENÇÃO    Você não pode utilizar INITIALIZE para
              Tabelas de tamanho variável (OCCURS
              DEPENDING ON).
Colocando Valores em uma tabela (Cont.)
Assinalar valores na definição da Tabela

Se a sua tabela contém valores estatísticos (por exemplo, uma tabela que contenha
dias e meses do ano), os valores podem ser assinalados na própria definição da
tabela, existem três formas.

Primeira forma:

       01 TABLE-ONE           VALUE “1234”.
       05 TABLE-TWO           OCCURS 4 TIMES PIC X.
Colocando Valores em uma tabela (Cont.)
Segunda forma:

      01 TABLE-MONTHS.
         05         PIC X (11) VALUE “01JANEIRO”.
         05         PIC X (11) VALUE “02FEVEREIRO”
         05         PIC X (11) VALUE “03MARÇO”.
         05         PIC X (11) VALUE “04ABRIL”.
         05         PIC X (11) VALUE “05MAIO”.
         05         PIC X (11) VALUE “06JUNHO”.
         05         PIC X (11) VALUE “07JULHO”.
         05         PIC X (11) VALUE “08AGOSTO”.
         05         PIC X (11) VALUE “09SETEMBRO”.
         05         PIC X (11) VALUE “10OUTUBRO”.
         05         PIC X (11) VALUE “11NOVEMBRO”.
         05         PIC X (11) VALUE “12DEZEMBRO”.
      01 REDEFINES TABLE-MONTHS.
         05 OCCURS 12 TIMES.
            10 MONTH-NUMBER PIC 9 (02).
            10 MONTH-NUMBER PIC X (09).
Colocando Valores em uma tabela (Cont.)
Terceira forma:

       01 TABLE-2
          05 TABLE-ITENS    OCCURS 5 TIMES.
             10 X      PIC X (2) VALUE “AA”.
             10 Y      PIC 9(2) VALUE 19.
             10 Z      PIC X (2) VALUE “BB”.

       Esta terceira é a novidade do VS COBOL II, onde podemos colocar a
       cláusula VALUE para itens da tabela. Neste caso, todas as ocorrências (no
       exemplo, 5 ocorrências) terão os mesmos valores.
PERFORM
A seguir, mostramos, algumas das sintaxes possíveis do comando PERFORM no
VS COBOL :

       PERFORM (Formato OUT-OF-LINE básico)

        PERFORM procedure-name-1 [{THROUGHTHRU } procedure-name-2]



Outras sintaxes do comando PERFORM:

       PERFORM (Formato OUT-OF-LINE com opção UNTIL)

       PERFORM procedure-name-1 [{THROUGHTHRU } procedure-name-2]


                     UNTIL condition
PERFORM (Cont.)
Codificando com Out-of-line PERFORM

1 5 7 8 10 12 15 20 25 30 35 40 45 50 55 60 65 70 72

          0000-MAINLINE.
             ...
             PERFORM 2100-DISPLAY
             UNTIL WS-COUNT > 4.
             ...
          2100-DISPLAY.

             ADD 1 TO WS-COUNT
             DISPLAY „THE COUNT NOW = „WS-COUNT.
PERFORM (Cont.)
Quando utilizar Inline PERFOM?
    Mais eficiente que o Outline PERFORM, ele otimiza o código e reduz a
     paginação de memória virtual.

    Fácil leitura porque todo o código está em um único lugar.

    Melhor, se o código a executar será executado somente em um lugar do
     programa, e não em vários lugares.

Quando utilizar Outline PERFOM?

    Se o código a executar será executado em vários lugares do programa.
    Para certeza, você pode querer cada lógica a ser executada em um
     parágrafo separado, proporcionando manutenção mais fáceis e maior
     atendimento do programa.
PERFORM (Cont.)

                  Você poderá continuar codificando Out-of-line com
                  VS COBOL II, mas lembre-se, ao utilizar Inline
  ATENÇÃO         PERFORMs, o delimitador END-PERFORM é
                  obrigatório.
PERFORM (Cont.)
Testa a condição antes de executar a função. Sua estrutura no fluxograma,
conhecida como ESTRUTURA DO-WHILE, é demostrada abaixo:

                DO-WHILE (FAÇA ENQUANTO)




                           PROCEDURE

                                                Faça enquanto condição
                       V                        for verdadeira
            CONDIÇÃO




                 F


Em VS COBOL, a estrutura DO-WHILE era obtida pelo comando PERFORM
UNTIL, pois a condição era testada sempre antes de executar a função.
PERFORM VARYING
Sintaxe Out-of-Line:

PERFORM (Formato OUT-OF-LINE com opção VARYING)


                                  [   {
      PERFORM procedure-name-1 WITH TEST
                                                          THROUGH
                                                          THRU
                                                                  }                 ]
                                                                      procedure-name-2



                 [    WITH TEST
                                  { }]  BEFORE
                                        AFTER




                                   } {                                }
                                                      Indentifier-2
      VARYING
                  {   Indentifier-1
                      Index-name-1 FROM
                                                      Index-name-2
                                                      literal-1

      BY
           {                  }
                  Indentifier-3
                  literal-2
                                  UNTIL condition-1




     [   AFTER
                  {   Indentifirer-4
                                      }
                      Index-name-3 FROM         {     Indentifier-5
                                                      Index-name-4
                                                      Lieral-3      }
         BY
              {   Indentifier-6
                  literal-4       }   UNTIL condition-2
                                                          ] ...
SEARCH - Pesquisa Seqüencial ou Serial
Pesquisa Serial ou Seqüencial
         DATA DIVISION
         WORKING-STORAGE SECTION.
         01 ARRAY-VALUES.
             05        PIC 9(3)V99 VALUE 11,11.
             05        PIC 9(3)V99 VALUE 22,22.
             05        PIC 9(3)V99 VALUE 33,33.
             05        PIC 9(3)V99 VALUE 44,44.
             05        PIC 9(3)V99 VALUE 55,55.
             05        PIC 9(3)V99 VALUE 66,66.
             05        PIC 9(3)V99 VALUE 77,77.
             05        PIC 9(3)V99 VALUE 88,88.
             05        PIC 9(3)V99 VALUE 99,99.
         01 ARRAY-TBL REDEFINES ARRAY-VALUES.
             05        ARRAY-ELEMENT OCCURS 10 TIMES
                  INDEXED BY AE-INDEX.
         01 AE-KEY      PIC 9(3)V99.
         PROCEDURE DIVISION.
              SET AE-INDEX TO 1.
              MOVE 0 TO RETURN-CODE.
              SEARCH ARRAY-ELEMENT
                  AT END MOVE 8 TO RETURN-CODE
                  WHEN AE-KEY (AE-INDEX) = 77,77
                          CONTINUE
                  WHEN AE-KEY (AE-INDEX) = 88,88
                  MOVE 4 TO RETURN-CODE.
              END-SEARCH.
SEARCH ALL - Pesquisa Binária
    Obrigatório que a tabela esteja organizada em ordem ascendente ou descendente.

        DATA DIVISION
        WORKING-STORAGE SECTION.
        01 TABLE-A.
        05 TABLE-ENTRY    OCCURS 90 TIMES
            ASCENDENTE KEY-1, KEY-2
            DESCENDENTE KEY-3
            INDEXED BY INDX-1.
            10 PART-1   PIC 99.
            10 KEY-1   PIC 9(5).
            10 PART-2   PIC 9(6).
            10 KEY-2   PIC 9(4).
            10 PART-3   PIC 9(18).
            10 KEY-3   PIC 9(5).

        PROCEDURE DIVISION.

             SEARCH ALL TABLE-ENTRY
             AT END PERFORM NOENTRY
             WHEN KEY-1 (INDEX-1) = VALUE-1 AND
             KEY-2 (INDEX-1) = VALUE-2 AND
             KEY-3 (INDEX-1) = VALUE-3
             MOVE PART-1 (INDEX) TO OUTPUT-AREA
             END-SEARCH.
Exercício 4 (Cont.)
A) FLUXOGRAMA


                ARQENT




                      ARQREL
Exercício 4 (Cont.)
B) LAY-OUTs

ARQENT

NOME-DISTRIB         PORCENT
   X(20)              99V99          X(56)

ARQREL

DEMONSTRATIVO GRÁFICO DA DISTRIBUÇÃO DE COMBSTÍVEL

               EMPRESA   ÍNDICE
                            1 5 10 15 20 25 30 35 40 45 50
               SHELL        XXXXXXXXXXXXXXXXXXXXXXXXXX
               ESSO         XXXXXXXXXXXXXXXX
               TEXACO       XXXXXXX
               IPIRANGA     XXXXXXXXXXXX
               ATLANTIC     XXXXXXX
               SAO PAULO    X
               HUDSON       XXX
Exercício 4 (Cont.)
C) PROCEDIMENTOS

1) No arquivo ARQENT existem registros, um para cada distribuidora de combustível, com
seu nome e porcentagem do mercado. Não há registro inválidos.

2) Nenhuma porcentagem de mercado é maior que 50%.

3) Leia todos os registros de ARQENT, e imprima no relatório ARQREL, o nome da empresa
e sua porcentagem em forma de gráfico, representando cada 1% em um caracter X.
Arredonde a porcentagem.

4) O relatório ARQREL, possui apenas 21 linhas:

    • Cabeçalho Principal - 4 linhas (2 em branco)
    • Cabeçalho do detalhe - 4 linhas (1 em branco)
    • Detalhe - 13 linhas (1 em branco entre cada empresa)

5) Não há necessidade de lógica para controlar quebra de página.

6) O formulário possui 80 colunas

								
To top