Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.
details

Libere esse material sem enrolação!

Craque NetoCraque Neto

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

details

Libere esse material sem enrolação!

Craque NetoCraque Neto

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

details

Libere esse material sem enrolação!

Craque NetoCraque Neto

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

details

Libere esse material sem enrolação!

Craque NetoCraque Neto

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

details

Libere esse material sem enrolação!

Craque NetoCraque Neto

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

details

Libere esse material sem enrolação!

Craque NetoCraque Neto

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

details

Libere esse material sem enrolação!

Craque NetoCraque Neto

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

details

Libere esse material sem enrolação!

Craque NetoCraque Neto

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

details

Libere esse material sem enrolação!

Craque NetoCraque Neto

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

details

Libere esse material sem enrolação!

Craque NetoCraque Neto

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

COBOL
Participante : ___________________________________
Treinamento: ___________________________________
Período : ___________________________________
Sala : ____________Horário: _______________ Instrutores :____________________________________
 ____________________________________
51 Legenda dos Componentes Orientativos.
2 Introdução
6
2.1 Sistema Operacional
6
2.2 Programas
6
2.3 COMPILAÇÃO
7
3 O que é Cobol?
8
3.1 Como editar um programa
8
3.2 Comentários num programa
9
3.3 Palavras
9
3.4 Caracteres
10
3.5 Estrutura da linguagem
11
4 IDENTIFICATION DIVISION
15
5 ENVIRONMENT DIVISION
17
5.1 CONFIGURATION SECTION
17
5.2 INPUT-OUTPUT SECTION
18
6. DATA DIVISION
21
6.1 FILE SECTION
21
6.2 WORKING-STORAGE SECTION
28
6.3 LINKAGE SECTION
31
7 PROCEDURE DIVISION
34
7.1 CLÁUSULA OPEN
34
7.2 CLÁUSULA READ
34
7.3 CLÁUSULA WRITE
35
7.4 CLÁUSULA CLOSE
38
7.5 CLÁUSULA STOP RUN
38
7.6 CLÁUSULA GOBACK
38
7.7 CLÁUSULA GO TO
39
7.8 CLÁUSULA MOVE
39
7.8.1 CLÁUSULA OF no COMANDO MOVE
41
7.9 CLÁUSULA ADD
42
7.9.1 OPÇÃO ROUNDED
45
7.9.2 OPÇÃO ON SIZE ERROR
45
7.10 CLÁUSULA SUBTRACT
46
7.11 CLÁUSULA MULTIPLY (multiplicação)
48
7.12 CLÁUSULA DIVIDE (divisão)
49
7.13 CLÁUSULA COMPUTE
51
7.14 CLÁUSULA DISPLAY
52
7.15 CLÁUSULA ACCEPT
53
7.16 CLÁUSULA IF
54
7.17 CLÁUSULA PERFORM
60
7.18 CLÁUSULA EXIT
66
7.19 CLÁUSULA (BLANK WHEN ZERO)
67
7.20 CLÁUSULA (SYNCHRONIZED – SYNC)
67
7.21 OPERADORES LÓGICOS
69
7.22 DATA E HORA DO SISTEMA
70
8 ARQUIVOS DE ACESSO DIRETO
74
8.1 UTILIZANDO ACESSO DIRETO – LEITURA SEQUENCIAL
75
9 TABELAS
81
9.1 CLÁUSULA OCCURS
81
9.2 TABELA SUBSCRITA
82
9.3 CLÁUSULA SET
84
9.4 CLÁUSULA SEARCH
85
9.5 TABELA INDEXADA
87
10 CLASSIFICAÇÃO DE DADOS
91
10.1 CLÁUSULA SELECT (SORT)
92
10.2 CLÁUSULA RELEASE
93
10.3 CLÁUSULA RETURN
94
10.4 CLÁUSULA SORT
94
11 OUTRAS CLÁUSULAS
105
11.1CLÁUSULA EXAMINE / INSPECT - REPLACING
105
11.2 CLÁUSULA TRANSFORM
108
11.3 CLÁUSULA EXHIBIT
110
11.4 CLÁUSULA READY/RESET (TRACE)
111
11.5 CLÁUSULA STRING
112
11.6 CLÁUSULA UNSTRING
115
11.7 RETURN-CODE
116
11.8 ABENDAR PROGRAMA
117
11.9 FILE STATUS
117
12 Exercícios
123
12.1 Programa 1
123
1. Legenda dos Componentes Orientativos.
	
	DICA
	
	LEIA
	
	TOME NOTA
	
	ATENÇÃO
	
	CURIOSIDADE
2. Introdução
	
	Este manual de Cobol oferece informações e conceitos essenciais para o desenvolvimento de programas na linguagem Cobol.
2.1 Sistema Operacional
· programas de controle;
· supervisão de sistema;
· supervisão dos arquivos;
· supervisão dos job´s.
2.2 Programas
· tradutores de linguagem (metaprogramas);
· programas de serviço (utilitários);
· programas de aplicação.
2.3 COMPILAÇÃO
-> programa fonte feito pelo programador
-> rotina do sistema operacional (tradutor)
-> módulo objeto
-> rotina do sistema operacional (LINKAGE-EDITOR)
-> módulo de carga
-> execução do programa
3. O que é Cobol?
COBOL significa Common Business Oriented Language, isto é, Linguagem Comum Orientada para o Comércio.
O Cobol é um subconjunto de palavras da língua inglesa, isto é, um número limitado de palavras inglesas sujeitas a uma sintaxe própria. É uma linguagem que lida com problemas comerciais, envolvendo os arquivos de dados de apreciáveis proporções.
3.1 Como editar um programa
 
É necessário usar uma estrutura definida da maneira de escrever. 
O compilador Cobol possui características posicionais, isto é, necessitamos da ordenação de palavras, divisões e seções, usando a seguinte estrutura:
Coluna de 1 a 6 
Essas colunas são usadas para numerar as linhas de um programa. A numeração é uma ordem crescente. Opcionalmente podem deixar de serem preenchidas ou incluir outros caracteres.
Coluna 7 
É usada para um hífen (-), que significa a continuação de não numéricos, asterisco (*), usado para a inclusão de comentários e a barra (/) para o salto de página.
Coluna de 8 a 72
São usadas para as entradas (palavras ou literais) do programa. Estas colunas estão agrupadas em duas margens ‘A’ (coluna 8 a 11) e margem ‘B’ (coluna 12 a 72).
As entradas da margem ‘A’ são:
· títulos das divisões, seções e dos parágrafos;
· descrição dos arquivos;
· títulos especiais na Procedure Division;
· os números de nível, como o ‘77’.
As entradas da margem ‘B’ são:
· espaços entre as margens (com o objetivo de comunicação visual);
· continuação das entradas.
3.2 Comentários num programa
O comentário não é considerado pelo compilador, servindo somente para documentação.
O asterisco (*) na coluna 7, determinará que toda a linha ficará como comentário.
A barra (/) na coluna 7, saltará uma página e gravará o comentário logo em seguida.
	
	Um programa deve sempre ter o máximo de informações que auxiliem a compreensão do mesmo, portanto, é aconselhável utilizar os recursos de comentários.
Para auxiliar na estética da listagem do programa, podemos usar a instrução ‘SKIP’ e ‘EJECT’ para pular linhas e folhas.
Digita-se na coluna 12:
EJECT ( pula 1 folha
SKIP1 ( pula 1 linha
SKIP2 ( pula 2 linhas
SKIP3 ( pula 3 linhas
3.3 Palavras 
Em comprimento, uma palavra não deve exceder a 30 caracteres. O espaço em branco não é um caracter permitido para a formação de palavras. Uma palavra não pode começar nem terminar com hífen (-). 
Exemplo: IMPOSTO-DE-RENDA.
Há palavras que são reservadas do Cobol, com propósitos próprios.
3.3.1 Constante figurativa
É uma palavra associada a um valor particular. 
Exemplos:
ZEROS, ZERO, ZEROES
( valor zero
SPACE, SPACES
( valor brancos
QUOTE, QUOTES
( apóstrofe
ALL ‘LITERAL’
 
( um ou mais ocorrências de literal
HIGH-VALUE, HIGH-VALUES
( maior valor (hexa FF)
LOW-VALUE, LOW-VALUES
( menor valor (hexa 00)
3.3.2 Palavras opcionais
Seu uso é opcional:
Exemplo:
IF
CPO-A
IS
GREATER
THAN
10
é igual a IF
CPO-A
GREATER
10
logo
IS e THAN são opcionais.
3.3.3 Palavras-chave
Determinar a função da cláusula ou comando
Exemplo: ADD, READ, WRITE, IF
Verbos : seu uso está contido na Procedure Division, comparado aos verbos 
 de gramática, já que levam a algum tipo de ação (exceto IF).
3.4 Caracteres
Há um conjunto de caracteres válidos no Cobol, como:
· De ‘0’ a ‘9’;
· De ‘A’ a ‘Z’;
· Espaços, parênteses, menor que, maior que, ponto, sinal de mais, sinal de menos, dólar, E comercial, arroba, igual, vírgula, barra, asterisco, apóstrofes.
3.5 Estrutura da linguagem
A linguagem Cobol é estruturada em:
· Divisões;
· Seções;
· Parágrafos;
· Sentenças;
· Cláusulas (nas três primeiras divisões);
· Comandos (na Procedure Division).
3.5.1 Divisões 
As divisões do Cobol para a estruturação do programa e suas funções são quatro:
· Divisão de identificação (IDENTIFICATION DIVISION);
· Divisão de equipamento (ENVIRONMENT DIVISION);
· Divisão de dados (DATA DIVISION);
· Divisão de procedimentos (PROCEDURE DIVISION).
3.5.2 Seções
Podemos identificar dois tipos de seções:
· definidos na ENVIRONMENT DIVISION e DATA DIVISION conforme requeridos. 
Exemplo:
CONFIGURATION SECTION.
WORKING-STORAGE SECTION.
· na PROCEDURE DIVISION para especificar a segmentação do programa.
3.5.3 Parágrafos
Na PROCEDURE DIVISION é utilizada para agrupar sentenças, permitindo a alteração do fluxo lógico.
3.5.4 Sentenças
As sentenças são formadas por uma ou mais cláusulas ou comandos, e terminado por um ponto.
3.5.5 Programa Cobol
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
4. IDENTIFICATION DIVISION
	
	Identifica o programa fonte (informação obrigatória), e outras informações como autor, instalação, etc. 
É a primeira das 4 divisões. 
É utilizada para identificar o programa.
Os dados introduzidos pela ‘IDENTIFICATION DIVISION’ são tratados pelo compilador Cobol como comentários, não sendo traduzidos em linguagem de máquina. Formato opcional:
IDENTIFICATION DIVISION.
PROGRAM-ID. (nome do programa)
AIUTHOR. (nome do programador)
INSTALLATION. (local de uso ou geração do programa)DATE-WRITTEN. (data em que foi escrito o programa)
DATE-COMPILED. (data em que foi compilado o programa)
REMARKS. (comentários sobre o programa. Utilizado o REMARKS em programas desenvolvidos em Cobol ANS, isto é, Cobol I).
Exemplo: 
 <...+....1....+....2....+....3....+....4....+....5....+....6....+....7...
000001 IDENTIFICATION DIVISION. 
000002 PROGRAM-ID. DEMPB012. 
000003 AUTHOR. ANA PAULA NUNES. 
000004 INSTALLATION. SAO-CENTRO. 
000005 DATE-WRITTEN. 03/08/1997. 
000006 DATE-COMPILED.
000007 SECURITY. ESTE PROGRAMA UTILIZA ARQUIVOS DE BACK-UP COMO 
000008 SEGURANCA. 
000009 REMARKS. O PROGRAMA EMITE RELATORIO A PARTIR DO ARQUIVO P-112. 
000010
Obs: a opção DATE-COMPILED não deve ser preenchida, pois é o sistema operacional que fará isso.
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
5. ENVIRONMENT DIVISION
	
	É a definição do ambiente físico.
Especifica o equipamento usado para compilação e execução do programa, além de associar os arquivos do programa aos diversos periféricos, técnicos especiais de entrada/saída. 
É a segunda divisão do Cobol. 
Identifica a máquina que está sendo usada. Contém a descrição do computador e a designação dos arquivos para as respectivas unidades de configuração do computador. 
É dividida em duas seções:
· CONFIGURATION SECTION;
· INPUT-OUTPUT SECTION.
5.1 CONFIGURATION SECTION
Esta seção é utilizada para fornecer informações sobre o computador. 
É dividida em 3 parágrafos:
· SOURCE-COMPUTER. (nome-do-computador).
· OBJECT-COMPUTER. (nome-do-computador).
· SPECIAL-NAMES. (nome-da-função IS nome-simbólico).
5.1.1 SPECIAL-NAMES
Este parágrafo relaciona funções existentes no compilador Cobol com nomes simbólicos dados pelo programador. 
Exemplo:
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA
C01 IS CANAL-1.
O ‘DECIMAL-POINT IS COMMA’ define que o ponto decimal dever ser a vírgula.
O canal de controle da impressão (CANAL-1) está no intervalo C01 a C12.
5.2 INPUT-OUTPUT SECTION
Define arquivos utilizados pelo programa efetuando ligações com o equipamento da máquina. 
Está dividida em 2 parágrafos:
· FILE-CONTROL.
· I-O-CONTROL.
5.2.1 FILE-CONTROL
É o controle de arquivos.
Cada arquivo descrito na “DATA DIVISION” deverá ter seu nome simbólico de arquivo descrito após o “select”.
5.2.1.1 SELECT
O Select tem a função de designar um arquivo para um dispositivo de entrada/saída. É necessário um “Select” para cada arquivo. 
Exemplo:
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT (nome-arquivo) ASSIGN TO(classe-organização-nome).
	
	Nome-do-arquivo -> é dado pelo programador. É o nome pelo qual o arquivo será reconhecido na “DATA DIVISION” e “PROCEDURE DIVISION”.
Classe -> especifica o tipo de dispositivo:
 DA = acesso direto (discos magnéticos)
 UT = utility (fitas e discos magnéticos)
 UR = registros unitários (leitoras, impressoras)
 UP = registro unitário (perfuradoras).
Organização -> indica a organização do arquivo:
 S = arquivos sequenciais
 D = arquivos de acesso direto
 W = arquivos de acesso direto quando o comando “REWRITE” é usado no programa
 I = arquivos de organização indexada
Nome -> é o nome pelo qual o arquivo será reconhecido pelo cartão “DD” do “JCL”. Não deve ter mais que 8 caracteres, e nem começar com caracter numérico.
5.2.2 I-O-CONTROL.
O “I-O-CONTROL” tem a finalidade de auxiliar na gravação de arquivos variáveis.
Há operação de CHECK-POINT, ou seja, para trabalhos com arquivos de grandes quantidades de registros, garantindo a execução do serviço já executado caso ocorra algum erro de “I-O”. Ele salva o que já foi feito até o instante numa área estipulada pelo programador.
Pode ser utilizado para a mesma definição de uma “FD” para vários arquivos que possuam o mesmo lay-out.
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
6. DATA DIVISION
	
	Define a estrutura lógica dos arquivos e das áreas de trabalho. Descreve os dados que o programa aceitará como entrada e os que serão produzidos como saída.
A DATA DIVISION tem a função de descrever os arquivos e seus registros. Assim como qualquer área de traballho necessária ao programa.
Essa divisão possui 5 seções que devem aparecer na ordem especificada. 
Caso alguma não seja necessária, deve ser omitida:
1 – FILE SECTION.
2 – WORKING-STORAGE SECTION.
3 – LINKAGE SECTION.
4 – COMMUNICATION SECTION (estabelece ligações entre o programa cobol e programa de controle de teleprocessamento).
5 – REPORT SECTION (descreve relatório que o programa deve emitir).
6.1 FILE SECTION
Descreve o conteúdo e a organização dos arquivos.
O primeiro nível na “FILE SECTION” é por intermédio de uma entrada (FD – FILE DESCRIPTION). 
Cada “FD” descreve o arquivo do Select. 
O segundo nível é descrito por uma entrada “01”.
	
	Indicador Uso
 FD descrição de arquivos
 SD descrição de “sort-files”
 RD descrição de relatórios
 CD descrição de comunicação
O formato dos números e níveis servem para estruturar logicamente o registro. 
As subdivisões de um registro são “itens elementares” (não possuem subdivisões) e “itens de grupo”.
Os números de níveis começam em 01 ou 1 e vão até 49. Exemplo:
 <...+....1....+....2....+....3....+....4....+....5....+....6....+....7...
 FD CARTOES
 XXXXXXXXXXXXXXXXX.
 01 RECIBO.
 02 IDENTIFICACAO.
 03 PREFIXO PIC X(02).
 03 RESTO PIC X(05).
 02 NUMERO PIC 9(03).
 02 FILLER PIC X(50).
(FD) ( indicador
(01), (02), (03) ( números de nível
(IDENTIFICACAO), (RECIBO) ( itens de grupo
(PREFIXO), (RESTO), (NUMERO), (FILLER) ( itens elementares
6.1.1 Níveis especias (2 tipos)
Níveis:
(77) ( designa itens da “WORKING-STORAGE SECTION” que não são subdivisores de outros e por sua vez não são subdivididos. Quando aparecerem devem ser descritos obrigatoriamente dentro da “WORKING-STORAGE SECTION”. 
O item (77) serve para definir acumuladores e áreas auxiliares. 
Exemplo:
WORKING-STORAGE SECTION.
77
 ACU-LIDOS PIC 9(05) VALUE 0.
77 AUX-NOME PIC X(20).
(88) -> especifica condições que devem ser associadas a valores particulares. 
Exemplos:
01 WRK-REG.
02 WRK-SEXO PIC X(01).
88 FEMI VALUE ‘F’.
88 MASC VALUE ‘M’. 
77 WRK-REG PIC 9(05) VALUE ZEROS COMP-3.
 88 MASC VALUE 0 THRU 10.
 88 FEMI VALUE 15 THRU 30
 35 THRU 40.
 88 FEMI VALUE 50.
Os valores definidos no nível “88” devem estar em ordem crescente.
6.1.2 FILE DESCRIPTION (FD)
É a descrição do arquivo. 
Formato:
FD NOME-DO-ARQUIVO
 BLOCK CONTAINS (quantidade de blocos)
 RECORD CONTAINS (tamanho do registro lógico)
 RECORDING MODE (formato do arquivo)
 LABEL RECORD (formato do label)
 DATA RECORD (nome do registro).
6.1.2.1 BLOCK CONTAINS
 (BLOCK CONTAINS 9999 RECORDS) 
Especifica o tamanho do registro físico. 
Se for colocado zero (0), assume informações do cartão “DD”. 
Se não for colocado “RECORDS”, assume “CHARACTERS”.
6.1.2.2 RECORD CONTAINS
(RECORD CONTAINS 9999 CHARACTERS)
Especifica o tamanho do registro lógico.
Se esta cláusula for colocada, é feita uma conferência pelo compilador,somando a quantidade de bytes da definição do registro.
6.1.2.3 RECORDING MODE
(RECORDING MODE IS X)
Designa o formato do arquivo:
· (F) -> comprimento fixo
· (V) -> comprimento variável
· (U) -> indefinido
· (S) -> estendido (spanned)
Se não for colocada a cláusula “RECORDING MODE”, o compilador determinará pelo cartão “DD” ou catálogo.
	
	Para arquivos sequenciais usar : F, V ou S;
Para arquivos de acesso direto usar: F, U ou S.
 
6.1.2.4 LABEL RECORD
(LABEL RECORD IS XXXXXXXX)
Especifica o formato do label.
Quando omitido assume “LABEL STANDARD”. 
· STANDARD -> padrão
· OMITTED -> omitido
Para impressora, leitora de cartões, perfuradoras, usar “OMITTED”, pois não possuem “LABELS”. Os demais casos usar “STANDARD”.
6.1.2.5 DATA RECORD
(DATA RECORD IS NOME-DO-DADO-1)
(DATA RECORD ARE NOME-DADO-1, NOME-DADO-2, ...)
Serve apenas como documentação, identificando os registros do arquivo pelo nome. 
Exemplo:
 <...+....1....+....2....+....3....+....4....+....5....+....6....+....7...
 DATA DIVISION.
 FILE SECTION.
 FD FITA
 RECORDING MODE IS F
 LABEL RECORD IS STANDARD
 RECORD CONTAINS 80 CHARACTERS
 BLOCK CONTAINS 20 RECORDS
 DATA RECORD IS RECIBO. 
 01 RECIBO.
 02 NOME PIC X(30).
 02 VALOR PIC 9(03)V9(02).
 02 FILLER PIC X(05).
6.1.3 CLÁUSULA PICTURE (PIC)
É usada para descrição de informações sobre itens, tais como: tamanho, sinal, tipo (numérico, alfanumérico ou alfabético). 
Picture possíveis:
· ALFABÉTICO -> é representado por letras mais o espaço, e o carácter usado é a letra “A”. 
Exemplos:
77 DADO1 PICTURE IS AAA VALUE ‘ABC’.
77 DADO2 PIC IS AAA VALUE ‘ABC’.
77 DADO3 PIC A(3) VALUE ‘BCD’.
· ALFANUMÉRICO -> é representado por letras, números e caracteres do Cobol. O caracter usado é a letra “X”. A representação de dados não pode exceder a 120 caracteres. 
Exemplos:
01 DADO1 PIC XXX VALUE ‘ANO’.
01 DADO2 PIC X(04) VALUE ‘KKKK’.
· NUMÉRICO -> usa-se para representação exclusiva de itens numéricos. Os caracteres usados são: “9”, “V”, “P”, “S”.
	
	“9” = é utilizado para indicar a posição do campo que contém um dígito de “0” a “9”.
“V” = é usado para mostrar a posição da vírgula decimal. O ponto decimal, se colocado, não faz parte do item.
“P” = representa um dígito numérico zero (0).
“S” = indica a presença de sinal, deve ser colocado antes do “9”. 
· EDIÇÃO -> utiliza-se para itens que devem ser impressos ou enviados para tela de programas on-line. São definidos na “WORKING-STORAGE SECTION”. 
O formato é representado por qualquer combinação dos seguintes caracteres:
(9), (V), (P), (.), (Z), (*), (CR), (DB), (,), (0), (B), ($), (+), (-)
(9), (V), (P) -> são usados de maneira semelhante ao uso dos itens numéricos;
(.) -> o ponto decimal, quando usado, é inserido na posição indicada;
(Z) -> indica a supressão de zeros não significativos;
(*) -> é usado como proteção de um número impresso;
(CR), (DB) -> significam CR (crédito) e DB (débito). Usa-se somente quando o número for negativo. Caso o número seja positivo, não aparecerá nada;
(,), (0), (B) -> são símbolos de edição que são inseridos na impressão;
($), (+), (-) -> são impressos na posição indicada.
OBS: O símbolo (-) não dever ser o próximo sinal após o ponto. Caso isso ocorrer, definir mais um (-). Exemplo:
01 
CAMPO PIC --.---.---,99.
	
	Definição Picture Valor Real Na memória
9(04) 9999 502 502
9V9(2) 9V99 1,25 125
9(03) 999PP 43700 437
S9(02) S99 -21 21-
9(05) 99.999 10.987 10987
9(04)V99 Z.ZZZ,99 25,50 002550
9(03) ZZZ 000
9(03) **9 422 422
9(03) *** *** 000
S9(03)V99 999,99CR 800,00CR 80000(-)
9(04) 990099 110025 1125
9(06) 99B99B99 12 13 15 121315
9(03) $999 $371 371
S9(02) -99 -15 15(-)
S9(02) -99 16 16 
S9(02) +99 15 15(-)
S9(02) +99 +16 16(+)
S9(02) 99- 15- 15(-)
S9(04) -.--9 -12 0012(-) 
	
	OBS: caso tenha que utilizar o caracter ‘, para se fazer entendido ao Cobol, define-se dentro das aspas duplas. 
Exemplo:
77 ASPA PIC X(01) VALUE “ ’ ”.
6.1.4 CLÁUSULA FILLER
É usada para um item elementar ou um item de grupo, e nunca será refenciado. Pode ser usada na “DATA DIVISION” e suas “SECTIONS”. 
Exemplo:
01 REGISTRO.
02 FILLER PIC X(100).
6.1.5 CLÁUSULA VALUE
É usada para definir um valor inicial para um item da “WORKING-STORAGE SECTION”. Não pode ser usada na “FILE SECTION”. 
Exemplo:
01 CABEC.
02 FILLER PIC X(10) VALUE SPACES.
02 FILLER PIC X(06) VALUE ‘FOLHAS’.
 02 DATA PIC X(10) VALUE SPACES.
6.2 WORKING-STORAGE SECTION
	
	Esta seção descreve informações sobre as áreas de trabalho, descrição de tabelas, área para DB2, lay-out, etc.
 
6.2.1 OPÇÃO COMPUTATIONAL (COMP)
Só podem ser usados para itens numéricos (COMP, COMP-1, COMP-2, COMP-3, COMP-4).
6.2.1.1 COMP ou COMP-4 (binário):
 Bytes = 2 se tamanho do campo com COMP for de 1 a 4;
 Bytes = 4 se tamanho do campo com COMP for de 5 a 9;
 Bytes = 8 se tamanho do campo com COMP for de 10 a 18;
Se quiser valorizar um campo binário este deve estar em formato decimal. Exemplo:
01 VALOR1 PIC 9(03) COMP.
01 VALOR3 PIC 9(04) COMP VALUE 1234. (Memória = 04D2)
01 VALOR5 PIC 9(07) COMP VALUE 499701. (Memória = 00079FF5).
6.2.1.2 COMP-1 e COMP-2 (ponto-flutuante):
Usados para ponto flutuante interno. 
É usado nos registradores = 0,2,4,6.
COMP-1 = 4 bytes de precisão simples.
COMP-4 = 8 bytes de precisão dupla.
6.2.1.3 COMP-3 (compactado)
É decimal interno (compactado). Campos até 18 dígitos ou 10 bytes. 1 byte usa 2 dígitos ou 1 dígito mais o sinal. 
Exemplos:
01 VALORA PIC 9(05) COMP-3 VALUE 4321. (Memória = 04 32 1F)
01 VALORB PIC S9(05) COMP-3 VALUE +486. (Memória = 00 48 6C).
6.2.2 CLÁUSULA JUSTIFIED
Posiciona itens alfabéticos ou alfanuméricos a direita no campo receptor. 
Quando item emissor maior será truncado a esquerda e quando menor preenchidos com brancos. 
Exemplos:
01 DADOS PIC X(10) JUSTIFIED RIGHT.
01 DADOS PIC X(10) JUST RIGHT.
 MOVE CAMPOX TO DADOS
CAMPOX = JOAO DADOS =40 40 40 40 40 40 D1 D6 C1 D6
6.2.3 CLÁUSULA REDEFINES
É usada para redescrever uma área.
A redefinição deverá conter a mesma quantidade de bytes do campo ou área anterior e estar no mesmo nível.
01 REGISTRO.
03 ALPINO PIC X(06).
03 BETA.
 05 LETRA PIC X(04).
 05 NUM PIC 9(02).
03 ALFA REDEFINES BETA.
 05 AUT PIC 9(01).
 05 LIVRE PIC X(05).
03 ZUM PIC X(08).
6.2.4 CONSTANTES FIGURATIVAS
São constantes definidas pelo compilador.
Constantes figurativas
Picture aplicáveis
ZERO
ALFANUMÉRICAS
ZEROS
OUZEROES
NUMÉRICAS
SPACE
ALFABÉTICAS
SPACES
OU ALFANUMÉRICAS
HIGH-VALUE (MAIOR VALOR)
ALFANUMÉRICAS
HIGH-VALUES
QUOTE (APÓSTROFE)
ALFANUMÉRICAS
QUOTES
ALL ‘CARACTER ALFANUMÉRICO’
ALFANUMÉRICAS 
LOW-VALUE (MENOR VALOR)
ALFANUMÉRICAS
LOW-VALUES
6.3 LINKAGE SECTION
É utilizada para pegar dados pelo “PARM.GO” ou ligar o programa a outros programas.
· são válidas as regras referentes as apresentadas na “WORKING-STORAGE SECTION”;
· a cláusula VALUE somente pode ser especificada para itens de nível “88”;
· assume-se que para cada item passado tem que ser de nível “01” ou nível “77” (limite de full-word);
· pelo PARM pode ser passado até 100 caracteres (bytes).
· para definição da “LINKAGE SECTION”, quando for pego algum dado pelo “PARM”, os dois primeiros bytes devem ser definidos como binário, pois estes bytes conterão o tamanho do “PARM”. 
Exemplo:
LINKAGE SECTION.
01 PARAMETROS.
 03 TAMANHO PIC 9(04) COMP.
 03 DATA-PARM PIC 9(08).
· quando se faz ligação entre programas, o programa chamado, deve conter a cláusula “LINKAGE SECTION”, e seus referidos campos de definição. Quanto ao programa chamador, este deve conter os mesmos campos da “LINKAGE” na “WORKING-STORAGE”, sendo obrigatório os campos a serem passados, estarem na mesma ordem do programa chamado.
· No exemplo acima, os dados serão jogados do “PARM” para “PARAMETROS” após a cláusula “PROCEDURE DIVISION USING PARAMETROS”.
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
7. PROCEDURE DIVISION
	
	Contém comandos executáveis do programa, isto é, os procedimentos a serem executados.
7.1 CLÁUSULA OPEN
Abre arquivo de entrada e saída. Formato:
OPEN INPUT (NOME-ARQUIVO-1) (NOME-ARQUIVO-2)
 OUTPUT (NOME-ARQUIVO-3)
 I-O (NOME-ARQUIVO-4)
INPUT -> arquivos de leitura
OUTPUT -> arquivos de gravação e impressão
I-O -> arquivos de acesso-direto (leitura e gravação)
7.2 CLÁUSULA READ
Ler um registro do arquivo de entrada. 
Formato:
READ (NOME-ARQUIVO).
ou
READ (NOME-ARQUIVO) INTO (AREA-LAYOUT).
ou
READ (NOME-ARQUIVO) INTO (AREA-LAYOUT) 
 AT END
 GO TO 100-99-FIM. 
· NOME-DO-ARQUIVO -> definido por uma descrição na “FD”
· INTO -> faz com que o registro seja lido e movido para área definida dentro da “WORKING-STORAGE” ou “LINKAGE SECTION”.
· AT END -> é uma das opções para o controle de fim de arquivo.
7.3 CLÁUSULA WRITE
Transfere um registro do programa para um arquivo de saída ou impressora de relatórios. 
Formato:
WRITE (NOME-REGISTRO) FROM (AREA-1)
 AFTER/BEFORE ADVANCING (INTEIRO) LINES 
- FROM -> faz com que uma área seja movida da “WORKING-STORAGE SECTION” para o registro, e seja gravado ou impresso. 
- ADVANCING -> refere-se ao controle do posicionamento vertical de cada linha, se não for usado o salto automático de linhas no programa. Não podem ser usados os dois controles no mesmo programa.
- AFTER ou BEFORE -> é o controle de salto. O “AFTER” indica que primeiro pula a quantidade de linhas especificadas ou (salta de página) para depois imprimir. O “BEFORE” primeiro imprime para depois saltar de linhas ou (pular de página).
Exemplos:
WRITE RELATORIO FROM CABEC1 AFTER ADVANCING 2 LINES.
WRITE AREA-ATUAL.
WRITE CADASTRO FROM REG-CAD.
O “WRITE” só deve ser dado em cima do nível “01”.
WRITE SAIDA FROM AREA-1.
FILE SECTION.
01 SAIDA.
 XXXXXXX
WORKING-STORAGE SECTION.
01 AREA-1.
 XXXXXXXXXXXX 
7.3.1 OPÇÃO ADVANCING
	C01 até C09
	Salto do canal 1 até 9
	C10 até C12
	Salto do canal 10, 11 e 12
Se um número inteiro for usado (1 a 100) serão saltadas tantas linhas quantas forem o valor do inteiro.
Exemplos:
WRITE RELATORIO
FROM 
CABEC1
AFTER ADVANCING CANAL-1.
WRITE RELATORIO
FROM 
LIN-DET1
AFTER ADVANCING 2 LINES.
7.3.2 OPÇÃO AFTER POSITIONING
Deve ser declarada como caracter alfanumérico (PICTURE X).
Por exemplo, na impressão do cabeçalho de um relatório:
FD
IMPRESSAO
LABEL OMITTED
RECORDING F
BLOCK 0.
01 RELATORIO.
02 CARRO
PIC 
X(01).
02 FILLER
PIC
X(132).
WORKING-STORAGE SECTION.
01 CABEC1.
02 FILLER
PIC X(01)
VALUE ‘1’.
02 DATA
PIC X(10)
VALUE SPACES.
02 FILLER
PIC X(40)
VALUE SPACES.
02 FILLER
PIC X(30)
VALUE
‘PROGRAMA DE INCLUSAO DE TITULOS’.
02 FILLER
PIC X(44)
VALUE SPACES.
02 HORA 
PIC X(08)
VALUE SPACES.
.............
PROCEDURE DIVISION
.........
WRITE RELATORIO
FROM CABEC1 AFTER POSITIONING CARRO.
 WRITE RELATORIO
FROM CABEC1 AFTER POSITIONING 2 LINES.
WRITE RELATORIO
FROM CABEC1.
	Branco ‘ ‘
	Espacejamento simples
	Zero ‘0’
	Espacejamento duplo
	Menos ‘-‘
	Espacejamento triplo
	Mais ‘+’
	Supressão do espacejamento
	‘1’ a ‘9’
	Salto do canal 1 a 9
	‘A’, ‘B’, ‘C’
	Salto do canal 10, 11 e 12
· No POSITIONING, o máximo de linhas que se pode pular são 3 (três);
· Não deve-se utilizar “AFTER” e “BEFORE” no mesmo programa.
	
	· AFTER = salta primeiro, depois imprime;
· BEFORE = imprime primeiro, depois salta a linha.
7.4 CLÁUSULA CLOSE
O CLOSE é utilizado para fechar os arquivos que foram abertos. Quando este comando não for utilizado, o próprio sistema se encarregará de fechá-los. Formatos:
· CLOSE normal p/ disco e fita:
CLOSE CARTAO
7.5 CLÁUSULA STOP RUN
Termina o processamento de um programa. 
Formato:
STOP RUN.
Este comando é obrigatório, podendo existir mais de um comando dentro do mesmo programa.
7.6 CLÁUSULA GOBACK
Termina o processamento de uma ligação entre programas, ou pode ser utilizado como o “STOP RUN”. 
Muito utilizado em programas on-line e módulos. 
Formato:
GOBACK.
Exemplo:
IDENTIFICATION DIVISION.
...............
LINKAGE SECTION.
...............
PROCEDURE DIVISION.
 ..............
 GOBACK.
7.7 CLÁUSULA GO TO
Permite a transferência da parte do programa que está sendo executada para uma outra. 
Formato:
LEITURA.
 ......... AT END
 GO TO FIM-LEITURA.
 ............................. 
FIM-LEITURA.
	
	Indica-se para uma melhor estruturação da lógica e do programa, não executar o comando GO TO para desviar para fora da rotina em que foi colocado.
7.8 CLÁUSULA MOVE
Este comando faz a movimentação de dados dentro do programa.
Formato 1:
MOVE (CAMPO-1) TO (CAMPO-2) (CAMPO-3)
Exemplo:
WORKING-STORAGE SECTION.
01 DADO-A PIC X(05) VALUE ‘ABC’.
01 DADO-2 PIC X(05).
01 DADO-3 PIC X(05) VALUE SPACES.
01 DADO-4 PIC X(05).
...........................
PROCEDURE DIVISION.
MOVE DADO-A TO DADO-2.
MOVE DADO-A TO DADO-3 DADO-4.
Formato 2:
MOVE CORRESPONDING (CAMPO-1) TO (CAMPO2) 
MOVE CORR (CAMPO-1) TO (CAMPO2) 
O MOVE CORRESPONDING ou MOVE CORR movimenta dados entre itens elementares de mesmo nome, bastando para tanto, citar os itens de grupo correspondentes. 
Exemplo:
WORKING-STORAGE SECTION.
01 CAMPO-1.
03 NOME PIC X(05).
03 ENDER PIC X(10).
01 CAMPO-2.
03 ENDER PIC X(10).
03 NOME PIC X(05).
....................
PROCEDURE DIVISION.
MOVE CORR CAMPO-1 TO CAMPO-2. 
Exemplo com literais figurativas:
MOVE SPACES TO WS-AREA-LIVRE 
MOVE ZEROS TO DATA-8 
MOVE 120 TO NUMERO-FIXO 
MOVE ‘CREDITO’ TO WS-CONTABIL 
MOVE ‘FAVOR’ TO WS-CABEC1 CABEC2. 
7.8.1 CLÁUSULA OF no COMANDO MOVE
Usa-se esta cláusula para campos com nomes iguais, definidos em itens de grupo com nomes diferentes. 
Formato:
MOVE WS-MES TO MES OF REGISTRO-1.
Exemplo:
WORKING-STORAGE SECTION.
01 TABELA-1.
03 NOME PIC X(05).
03 ENDER PIC X(10).
01 TABELA-2.
03 ENDER PIC X(10).
03 NOME PIC X(05).
01 SELECIONADO PIC X(10).
....................
PROCEDURE DIVISION.
MOVE ENDER OF TABELA-2 TO SELECIONADO
MOVE SELECIONADO TO ENDER OF TABELA-1.
....................
	
	Na movimentação de itens “não-elementares”,é tratado no Cobol como item alfanumérico, isto é, todo item de grupo é um item alfanumérico.
Se o item receptor for alfanumérico, alfanumérico de edição ou item alfabético:
· as posições não preenchidas pelo conteúdo do campo emissor, são preenchidas automaticamente com espaços;
· Se o tamanho do campo emissor for maior que o campo receptor, os caracteres em excesso serão truncados;
· Se o item emissor possuir sinal, o valor absoluto será adotado pelo item receptor.
Se o item receptor for numérico ou numérico de edição:
· O caracter ponto decimal (.) será alinhado;
· Os caracteres são preenchidos pelo item emissor com zeros, exceto quando os zeros forem substituídos por caracteres de edição;
· O valor absoluto do item emissor será aceito da maneira que o item receptor estiver formatado, a direita ou a esquerda do ponto decimal. Os dígitos em excesso serão truncados;
· Se o item emissor for não-numérico, os resultados serão imprevisíveis.
 Quando um comando “MOVE” é executado, qualquer conversão da representação de dados, quanto possível, é feita.
7.9 CLÁUSULA ADD
Esta cláusula é válida somente para itens elementares numéricos.
Por ela, são somados dois ou mais operandos e o resultado guardado numa variável definida pelo programa.
Formato 1:
ADD (IDENT-1) TO (IDENT-2).
Nesta forma, soma-se o conteúdo do IDENT-1 e do IDENT-2. O resultado da soma ficará no IDENT-2. 
Formato 2:
ADD (IDENT-1) (IDENT-2) TO (IDENT-N)
ADD (NUM-1) (NUM-2) ROUNDED (IDENT-N) ON SIZE ERROR (sentença imperativa).
Os campos IDENT-1 e IDENT-2 serão somados e o resultado ainda será somado em IDENT-N.
Formato 3:
ADD (IDENT-1) (IDENT-2) (IDENT-3) GIVING (IDENT-N).
Os conteúdos dos campos IDENT-1, IDENT-2 e IDENT-3 serão somados (IDENT-1 + IDENT-2 + IDENT-3) e o resultado ficará em IDENT-N.
Formato 4:
ADD CORRESPONDING (IDENT-1) TO (IDENT-2)
ADD CORR (IDENT-1) TO (IDENT-2).
Neste caso, IDENT-1 e IDENT-2 são itens de grupo. Os itens elementares contidos nestes itens de grupo serão somados e o resultado ficará em IDENT-2.
Nesta opção, os itens elementares dentro dos níveis de grupo só podem ser somados, caso haja correspondência de nomes. 
Exemplo:
01 CAMPO-1.
03 A PIC 9(03)V(02).
03 B PIC 9(04).
01 CAMPO-2.
03 A PIC 9(03)V9(02).
03 B PIC 9(04).
ADD CORR CAMPO-1 TO CAMPO-2.
Efetuará as seguintes operações:
(A do CAMPO-1 + A do CAMPO-2 )= S1
(B do CAMPO-1 + B do CAMPO-2 )= S2
No CAMPO-2 serão armazenados os resultados:
A do CAMPO-2 = S1
B do CAMPO-2 = S2
Outros exemplos:
Suponhamos A = 1, B=2, C=3 e D=4.
ADD A B TO C D.
(Cálculo 1 = A + B + C = S1
/ Cálculo 2 = A + B + D = S2
C = S1 = 6 /
D = S2 = 7)
ADD A TO B.
(A + B = S1 / B = S1 = 3)
ADD A C GIVING D
(A + C = S1 / D = S1 = 4)
	
	· Nos casos acima os identificadores que sucedem a “TO” ou “GIVING” podem ser itens elementares numéricos de edição.
· O tamanho máximo de cada operando num campo numérico é de 18 dígitos.
7.9.1 OPÇÃO ROUNDED
Quando a opção ROUNDED for colocada, haverá uma aproximação para dígito menos significativo do operando. Será somado um (1) a este dígito, se o dígito, mais significativo a ser truncado for maior ou igual a cinco (5). Esta opção só é válida para casa decimal. 
Exemplos:
CAMPO-1 = 1,99
CAMPO-2 = 0,3
Dividindo o CAMPO-1 pelo CAMPO-2, teremos: 6,6333... o campo receptor ficará = 6,63.
CAMPO-3 = 1,25
CAMPO-4 = 0,3
Dividindo o CAMPO-3 pelo CAMPO-4, resultaria em 4,2666...., ficando o campo receptor = 4,27.
Formato:
ADD CAMPO-3 TO CAMPO-4 ROUNDED.
A opção ROUNDED deverá preceder o campo receptor.
7.9.2 OPÇÃO ON SIZE ERROR
Se antes do ponto decimal, o valor do resultado exceder o número de dígitos disponíveis do operando definido para conter o resultado, será desviado para sentença imperativa e os valores permanecerão inalterados. 
Exemplo:
ADD A TO B GIVING C ROUNDED 
ON SIZE ERROR GO TO ERRO.
A opção “ON SIZE ERROR” deve sempre preceder o campo receptor.
7.10 CLÁUSULA SUBTRACT 
	
	Esta cláusula é utilizada para subtrair um ou somar dois ou mais itens numéricos para subtrair o resultado de outro ou mais itens numéricos.
Formato 1:
SUBTRACT A FROM B
No cálculo acima, faz-se = (B – A) e o resultado fica em “B”.
Formato 2:
SUBTRACT 
(IDENT-1) 
(IDENT-2) ....
 FROM (IDENT-M) 
ROUNDED (IDENT-N) 
 ON SIZE ERROR (SENTENÇA IMPERATIVA).
Formato 3:
SUBTRACT 
(IDENT-1) 
(IDENT-2) FROM (IDENT-M)
GIVING (IDENT-N).
Fomato 4:
SUBTRACT CORR 
(IDENT-1) FROM (IDENT-2)
 CORRESPONDING
No formato 2, todos os identificadores (IDENT-X) antes da palavra FROM são somados, e o total é subtraído dos identificadores “M” e “N”. O resultado fica em “M” e “N”. 
Exemplo:
SUBTRACT A B FROM D C.
São feitas as seguintes operações para o comando acima:
1) D – (A + B), o resultado é colocado em “D”.
2) C – (B + A), o resultado é colocado em “C”.
No formato 3, todos os identificadores (IDENT-X) que precedem a palavra FROM são somados, o resultado subtraído do operando após a palavra FROM. O resultado é colocado no operando após a palavra GIVING. 
Exemplo:
SUBTRACT H I J FROM L GIVING N.
Operações efetuadas acima:
L – (H + I + J), o resultando colocado em “N”.
No formato 4, temos como exemplo:
01 A.
02 B
PIC 9(04).
02 C PIC 99.
01 D.
02 B
PIC 9(04).
02 C PIC 99.
SUBTRACT CORR A FROM D.
Operações que serão efetuadas:
1) B(D) - B(A), e o resultado é colocado em B(D)
2) C(D) - C(A), e o resultado é colocado em C(D).
7.11 CLÁUSULA MULTIPLY (multiplicação)
	
	Esta cláusula é usada para multiplicar um item numérico por outro numérico.
Formato 1:
MULTIPLY A BY B.
A multiplicação é feita “A” por “B”, e o resultado é colocado em “B”.
Formato 2:
MULTIPLY A BY B GIVING C.
A multiplicação é feita “A” por “B” e o resultado é colocado em “C”. 
O campo “C” pode ser uma picture numérica de edição.
Formato 3:
MULTIPLY (IDENT-1) BY (IDENT-2) 
 ROUNDED ON SIZE ERROR (SENTENÇA IMPERATIVA).
Formato 4:
MULTIPLY (IDENT-1) BY (IDENT-2) GIVING (IDENT-3) 
 ROUNDED ON SIZE ERROR (SENTENÇA IMPERATIVA).
7.12 CLÁUSULA DIVIDE (divisão)
	
	Esta cláusula é utilizada para efetuar o comando de divisão entre campos de itens numéricos. 
Exemplo/formato 1:
DIVIDE A BY B.
Dividendo = A
Divisor = B
Quociente = B
Operações que serão efetuadas acima = (A / B) = R1 
 B = R1
Exemplo/formato 2:
DIVIDE A INTO B.
Dividendo = B
Divisor = A
Quociente = B
Operações que serão efetuadas acima = (B / A) = R1 
 B = R1
Exemplo/formato 3:
DIVIDE A BY B GIVING C.
Operações que serão efetuadas acima = (A / B) = R1 
 C = R1
DIVIDE A INTO B GIVING C.
Operações que serão efetuadas acima = (B / A) = R1 
 C = R1
Formato 4:
DIVIDE (IDENT-1) BY (IDENT-2) 
 ROUNDED ON SIZE ERROR (SENTENÇA IMPERATIVA).
DIVIDE (IDENT-1) INTO (IDENT-2) 
 ROUNDED ON SIZE ERROR (SENTENÇA IMPERATIVA).
Formato 5:
DIVIDE (IDENT-1) BY(ou INTO) (IDENT-2) GIVING 
 (IDENT-3) ROUNDED REMAINDER (IDENT-4).
7.12.1 OPÇÃO REMAINDER
	
	É utilizada para colocar o resto da divisão. 
Exemplos:
DIVIDE A INTO B REMAINDER C.
DIVIDE A INTO B GIVING C REMAINDER D.
DIVIDE A BY B REMAINDER C.
DIVIDE A BY B GIVING C REMAINDER D.
7.13 CLÁUSULA COMPUTE
	
	Operandos que a cláusula compute pode executar:
· Adição (+);
· Subtração (-);
· Multiplicação (*);
· Divisão (/);
· Exponenciação (**).
Suponhamos que desejamos calcular uma taxa cujo valor é de 5 percentuais do capital:
COMPUTE TAXA = 0.05 * CAPITAL
Outros exemplos:
COMPUTE VALOR-A = TAXA * 0.15 + NUM / DIV.
COMPUTE RESULTADO = B * B * A.
COMPUTE EXPON = B ** 2.
COMPUTE CAMPO = CMP ** 3.1 + COS / SEN * B.
COMPUTE Z = (A / B) * C.
COMPUTE RESULT1 RESULT2 RESULT3 = BRUTO * 3 / (15 – CALC).
Formato 1:
COMPUTE (N) ROUNDED (M) ROUNDED...= (EXPRESSÃOARITMETICA)
 ON SIZE ERROR (SENTENÇA IMPERATIVA).
	
	 No compute, as operações obedecem a hierarquia das operações. Caso se queira efetuar uma operação de nível mais inferior antes de uma superior, deve-se colocar a de nível de interesse primeiro entre parênteses.
Exemplo:
IF
(CAMPO / 4 * 6) EQUAL
(CAMPO2 * 2) / 4
MOVE CAMPO
TO
SAI-CAMPO.
As operações aritméticas seguem a sua hierarquia, exceto quando estiverem entre parênteses.
7.14 CLÁUSULA DISPLAY
	
	Esta cláusula serve para escrever dados em um dispositivo de saída.
Formato 1:
DISPLAY ‘TOTAL DE REGISTROS LIDOS = ‘ TOTAL-LIDOS.
Formato 2:
DISPLAY ACUM-GRAVADOS ‘REGISTROS GRAVADOS’ UPON CONSOLE.
SYSPUNCH.
Quando for omitido “UPON” assume-se “SYSOUT” e deverá ser colocado o cartão “//SYSOUT” no JCL.
Quantidade de caracteres (bytes) para cada tipo:
· Console = 100 bytes;
· Syspunch = 72 bytes;
· Sysout = 120 bytes.
7.15 CLÁUSULA ACCEPT
	
	Esta cláusula executa uma operação de entrada.
Formato:
ACCEPT (IDENT) FROM 
SYSIN.
CONSOLE.
(NOME-MNEMONICO).
(NOME-MNEMONICO) = executa uma operação de entrada do computador para um campo definido na “WORKING-STORAGE SECTION”.
Exemplos:
ACCEPT WS-DATA FROM DATE.
ACCEPT DADOS FROM SYSIN.
ACCEPT DATA-R FROM CONSOLE.
Exemplos para pedir data pelo CONSOLE:
DISPLAY ‘DIGITE A DATA DO DIA:’ UPON CONSOLE.
DISPLAY ‘NO FORMATO DD/MM/AAAA’ UPON CONSOLE.
ACCEPT DATA-DO-DIA FROM CONSOLE.
01 DATA-DO-DIA.
03 DIA
PIC 9(02).
03 FILLER 
PIC X(01).
03 MES
PIC 9(02).
03 FILLER 
PIC X(01).
03 ANO
PIC 9(04).
Ou
01
DATA-DO-DIA
PIC X(10).
Exemplo:
01 REG-CAD.
03 CAD-NOME
PIC X(40).
03 CAD-DATA
PIC 9(08).
..........
ACCEPT REG-CAD FROM SYSIN.
............
O “SYSIN” é utilizado para pegar dados de um arquivo “SYSIN DD”. 
//........
//SYSIN DD *
ARQUIVODT4573
Ou
//SYSIN DD DSN=V.POOL.ARQDATA(0),DISP=SHR
7.16 CLÁUSULA IF
	
	Esta cláusula indica a decisão de um programa.
Formato:
IF (CONDIÇÃO)
(SENTENÇA-1)
ELSE
(SENTENÇA-2)
Exemplo:
Um programa Cobol poderia testar o rendimento mensal da seguinte forma:
IF RENDIMENTO EQUAL 1000,00 OR GREATER 1000,00
 GO TO DESCONTO-MAX
ELSE
 GO
 TO DESCONTO-MIN.
Neste exemplo, o programa indica a existência de uma decisão escrevendo a palavra “IF”, seguida de palavras que contenham um teste e o que fazer conforme o resultado do teste significando uma frase condicional. 
Outros exemplos:
IF
 VALOR IS NEGATIVE
 GO TO FIM-ROTINA
ELSE
 GO TO INICIO-ROTINA
END-IF
IF NOME NOT EQUAL ‘PEDRO’
 NEXT SENTENCE
ELSE
 ADD 1 TO CONT-NOME-IGUAL.
MOVE CONT-NOME-IGUAL TO RELATORIO-NOME-IGUAL.
	
	O “NEXT SENTENCE” determina que nada será feito e deve-se continuar o processo após o primeiro ponto final ou “END-IF” encontrado.
Toda sentença condicional possui 4 elementos:
IF
TESTE
AÇÃO
VERDADEIRA
ELSE
AÇÃO
FALSA.
Tipos de testes:
· teste de condição de classe;
· teste de nome-de-condição;
· teste de condição de relação;
· teste de sinal.
7.16.1 TESTE DE CONDIÇÃO DE CLASSE
Testa o conteúdo de um campo, se é alfabético ou numérico. 
Formato:
IF (IDENT)
IS
NUMERIC
IS NOT ALPHABETIC
Exemplo:
IF CONTA IS NUMERIC
 COMPUTE SALDO = SALDO-TOTAL – TAXAS
ELSE
 DISPLAY ‘CONTA NÃO NUMÉRICA, DIGITAR NOVAMENTE’.
	
	Quando testar se um campo é numérico, e este for compactado, tomar cuidado com o sinal (C). Nestes casos, colocar o indicador de sinal (S) na frente dos 9’s. 
Exemplo:
01
CAMPO
9(08).
01
CAMPO
9(05) COMP-3.
01
CAMPO
S9(07) COMP-3.
7.16.2 TESTE DE NOME-DE-CONDIÇÃO
Efetua comparação usando palavras significativas, associadas a um nível “88”. 
Definição:
01 WS-AREA.
03
NOME
PIC X(30).
03
CODIGO
PIC 9(06).
03
STATUS
PIC
9(01).
88
HOMEM
VALUE
1.
88
MULHER
VALUE
2.
88
ERRO
VALUE
3 THRU 9.
.................
PROCEDURE DIVISION.
IF
HOMEM
GO
TO 
PROCED-HOMEM.
IF
MULHER
GO
TO 
PROCED-MULHER.
IF ERRO
GO
TO
PROCED-ERRO.
7.16.3 TESTE DE CONDIÇÃO DE RELAÇÃO
Efetua comparação entre dois (2) operandos. 
Formato:
IF
(IDENT-1) ou (LITERAL-1) ou (EXPRESSÃO ARITMÉTICA-1)
OPERADOR DE RELAÇÃO
(IDENT-2) ou (LITERAL-2) ou (EXPRESSÃO ARITMÉTICA-2)
	OPERAÇÃO DE RELAÇÃO
	SIGNIFICADO
	IS (NOT) GREATER (THAN)
IS (NOT) >
	MAIOR QUE OU NÃO MAIOR QUE
	IS (NOT) LESS (THAN)
IS (NOT) <
	MENOR QUE OU NÃO MENOR QUE
	IS (NOT) EQUAL TO
IS (NOT) =
	IGUAL OU NÃO IGUAL
Exemplos:
IF
AC-LINHA
GREATER
50
GO
TO
ROTINA-CABECALHO.
IF
CODIGO
= 
2
MOVE
CODIGO
TO
REG-CODIGO.
IF
VALOR
NOT LESS
SALDO
PERFORM
ROT-GRAVA.
7.16.4 TESTE DE CONDIÇÃO DE SINAL
Sua função é determinar o valor algébrico de um operando aritmético.
Formato:
IF
(IDENT-1)
IS
POSITIVE
IF
(EXPRESSÃO ARITMÉTICA)
IS
NOT
NEGATIVE
ZERO (ZEROS)
Exemplo:
IF
VALOR
IS POSITIVE
MOVE VALOR
TO SAI-VALOR
ADD
 VALOR
TO AC-VALOR.
Exemplo 1 cláusula IF:
IF
NUMERO
GREATER
THAN
B ** 2 – 1 
NEXT SENTENCE
ELSE
GO
TO
ROT-MOVIMENTA.
IF
NUM-2
IS
NEGATIVE
GO
TO
ERRO.
IF
VALOR – 3 EQUAL SALDO
MOVE
SALDO
TO
SALDO-SAIDA.
Exemplo 2 cláusula IF:
IF
VALOR
IS NUMERIC
IF
VALOR
IS 
ZEROS
IF
DADO
IS NEGATIVE
MOVE
‘CAMPO VALIDO’
TO
MENSAGEM
ELSE
GO
TO
ROT-LEITURA
ELSE
NEXT SENTENCE
ELSE
GO
TO
INICIO.
7.17 CLÁUSULA PERFORM
	
	Esta cláusula ocasiona a execução de um ou mais procedimentos. 
Após a execução dos procedimentos (parágrafos), o controle volta para a instrução seguinte a do “PERFORM”. 
Formato (simples):
PERFORM
(PARAGRAFO-1)
THRU
(FIM-PARAGRAFO-1).
PERFORM
(PARAGRAFO-1)
THRU
(PARAGRAFO-2).
PERFORM
(PARAGRAFO-1).
Exemplo:
IDENTIFICATION DIVISION.
ENVIRONMENT DIVISION.
DATA DIVISION.
PROCEDURE DIVISION.
PERFORM
ROT-ABC
THRU
FIM-ROT-ABC.
MOVE
A
TO
B
STOP RUN.
.....
ROT-ABC.
MOVE CAMPO-1
TO
SAI-CAMPO
COMPUTE SAI-VALOR = (B * 2)
FIM-ROT-ABC.
ROT-DEF.
COMPUTE .....
FIM-ROT-DEF.
Podemos ter um PERFORM dentro de outro PERFORM:
INICIO.
PERFORM
ROT-A
THRU
ROT-C.
..........
ROT-A.
.............
.............
ROT-B.
PERFORM
ROT-D
TRHU
ROT-E.
ROT-C.
..........
..........
ROT-D.
.........
.........
ROT-E.
...........
Quando dividimos os parágrafos em “SECTION”, o CONDITION-CODE de retorno estará na próxima SECTION ou no final da PROCEDURE.
Neste caso, você só poderá usar o GO TO para desvios dentro da mesma SECTION, pois assim, não haverá o risco de destruir o CONDITION-CODE de retorno. 
Exemplo:
00-INICIO SECTION.
00-00-A.
MOVE
1
TO
AC-VALOR.
PERFORM
10-LEITURA-CARTAO.
IF
CHAVE-FIM
EQUAL
‘NAO’
GO
TO
00-00-A.
.............
00-99-FIM.
EXIT.
10-LEITURA-CARTAO SECTION.
READ
REGCAD
AT
END
MOVE
‘FIM’
TO
CHAVE-FIM
GO
TO
10-99-FIM.
ADD
1
TO
AC-LIDOS.
IF
TIPO
EQUAL
4
PERFORM 15-TIPO-4.
10-99-FIM.
EXIT.
15-TIPO-4 SECTION.
.............
15-99-FIM.
EXIT.
7.17.1 PERFORM - TIMES
É um complemento da cláusula PERFORM. 
Como o PERFORM, esta cláusula desvia-se da sequência normal de execução para realizar um ou vários procedimentos. 
Formato:
PERFORM
(NOME-PROCEDIMENTO-1) THRU (NOME-PROCEDIMENTO-2)
(NUM-INTEIRO)
(NOME-DADO)
TIMES.
Com a opção TIMES
, os procedimentos são realizados no número de vezes especificados por “NOME-DADO” ou “NUM-INTEIRO”. 
Em seguida, passa-se ao comando seguinte ao comando “PERFORM”.
 
Se “NOME-DADO” ou “NUM-INTEIRO” for de valor negativo ou zero, o comando “PERFORM” que conter a opção “TIMES”, não será executado e o processamento continuará após o “PERFORM”.
Exemplo:
PERFORM
CALCULAR
THRU
CALCULAR-FIM
5 TIMES.
.......................
ou
PERFORM
CALCULAR
THRU
CALCULAR-FIM
VALOR-NUM TIMES.
..........................
CALCULAR.
.............
..............
CALCULAR-FIM.
O parágrafo CALCULAR, será executado 5 vezes ou dependendo do valor contido em VALOR-NUM.
7.17.2 PERFORM – UNTIL
	
	Com a opção “UNTIL”, os procedimentos serão executados até que a condição após o “UNTIL” seja verdadeira. 
No programa, aoencontrar a cláusula “UNTIL”, primeiro é verficado se a condição do “UNTIL” já está satisfeita e depois executa o “PERFORM”. 
Formato:
PERFORM
(NOME-ROTINA-1) 
THRU
(NOME-ROTINA-2)
UNTIL
(CONDIÇÃO)
ou
PERFORM
(NOME-ROTINA-1)
 UNTIL
(CONDIÇÃO)
Em seguida ao PERFORM UNTIL, é executado o comando seguinte ao “PERFORM”, se a condição já estiver satisfeita. 
Quando a condição já estiver satisfeita, no momento em que é encontrado o comando “PERFORM” referente a condição, os procedimentos chamados pelo “PERFORM” não serão executados. 
Exemplo:
PERFORM
ROT-A
THRU
FIM-ROT-A
UNTIL
WS-NUM
IS NEGATIVE.
ROT-A.
.................
SUBTRACT 1 FROM WS-NUM.
FIM-ROT-A.
EXIT.
7.17.3 PERFORM – VARYING
Formato:
PERFORM
(NOME-PROC-1)
THRU
(NOME-PROC-2)
VARYING
(NOME-DADO-1)
FROM
(LITERAL-NUMERICO-1)/(NOME-DADO-2)
BY
(LITERAL-NUMERICO-2)/(NOME-DADO-3)
UNTIL
(CONDIÇÃO-1)
São executadas as seguintes etapas de operação:
1- “NOME-DADO-1” é colocado no valor inicial (FROM) pelo “LITERAL-NUMERICO-1” ou “NOME-DADO-2”;
2- A “CONDICAO-1” é testada para determinar se ela foi satisfeita. No caso de ter sido cumprida, o comando seguinte ao comando “PERFORM” será executado;
3- No caso da condição não ter sido satisfeita, os procedimentos do “PERFORM” são realizados;
4- Em seguida, “NOME-DADO-1” é modificado por “LITERAL-NUMERICO-2” ou “NOME-DADO-3”;
5- As etapas 2, 3 e 4 são repetidas até a condição ser satisfeita.
Exemplo:
....................
WORKING-STORAGE SECTION.
....................
 
01
 INDICE
PIC
9(02)
VALUE ZEROS.
01 TABELA.
02 VENDAS-PROD
OCCURS
4
TIMES.
 03 VALOR
PIC
9(05).
.............
.............
 
PROCEDURE DIVISION.
.................
PERFORM
ZERA-TAB
VARYING
INDICE 
FROM 1 BY 1
UNTIL
INDICE
GREATER 4.
ZERA-TAB.
MOVE ZEROS
TO
VALOR(INDICE).
ZERA-FIM.
EXIT.
7.18 CLÁUSULA EXIT
É um ponto comum de finalização para uma série de procedimento(s).
NOME-PARAGRAFO.
EXIT.
A cláusula “EXIT” deve ser precedida por um nome de parágrafo e deve ser única cláusula do parágrafo.
O programa poderá ter vários EXIT’s associados com PERFORM’s. 
Exemplo:
INICIO.
PERFORM
A-1
THRU
A-99.
FIM-INICIO. 
EXIT.
A-1.
.........
A-99.
EXIT.
7.19 CLÁUSULA (BLANK WHEN ZERO)
Indica que o item descrito deve ser preenchido com espaços, sempre que um valor for zero.
Esta cláusula deve ser apenas para itens elementares numéricos ou numéricos de edição. 
Exemplo:
01 LINHA.
02 VALOR
PIC 9(05)
BLANK WHEN ZERO.
MOVE
CAMPO-NUM
TO
VALOR.
Quando o campo for movido para VALOR e todo o conteúdo dele for zero, então será substituídos os caracteres iguais a zero, por espaços.
7.20 CLÁUSULA (SYNCHRONIZED – SYNC)
Utilizada para obter alinhamento de um item elementar em uma das limitações próprias da memória (HALF-WORD) – (FULL-WORD). 
Formato:
(SYNCHRONIZED)
(LEFT)
(SYNC)
(RIGHT)
Esta cláusula assegura a eficiência das operações aritméticas das cláusulas COMP, COMP-1, COMP-2. Para as demais cláusulas, é interpretada como comentário.
A necessidade da “SYNC”, é pelo fato de não existir alinhamento em tempo de compilação para descrição de itens binários para nível superior “01”. No exemplo abaixo, os campos A e B necessitam ser alinhados:
01 REGISTRO.
02 NOME
PIC X(20).
02 FILLER
PIC X(01).
02 A
PIC S9(07) COMP.
02 CODIGO
PIC 9(02).
02 B
PIC S9(04) COMP.
Se usarmos a SYNCHRONIZED (SYNC), não precisamos nos preocupar com o problema do alinhamento. 
Exemplo:
01 REGISTRO.
02 NOME
PIC X(20).
02 FILLER
PIC X(01).
02 A
PIC S9(07) COMP SYNC.
02 CODIGO
PIC 9(02).
02 B
PIC S9(04) COMP SYNC.
....................
ADD
10
TO
A
B
SUBTRACT 5
FROM
B.
7.21 OPERADORES LÓGICOS
Existem no Cobol 3 (três) operadores lógicos:
	
	 OPERADOR LÓGICO SIGNIFICADO
 OR Se ao menos um for 
 verdadeiro, o resultado 
 será verdadeiro.
 AND Se todos forem 
 verdadeiros, o resultado 
 será verdadeiro.
 NOT Negação lógica.
Pode ser utilizado parênteses tanto para esclarecer o sentido das comparações, quanto para obter outros efeitos.
IF
VALOR
= 100,00
OR
200,00
OR
400,00
GO
TO
OK.
7.21.1 TESTES COMPOSTOS
Ocorre o teste composto, quando aparece os conectores lógicos no “IF”, como: “AND”, “OR” ou “NOT”. 
Exemplo:
IF
NOME
=
SPACES
AND
 ENDERECO
= SPACES
GO
TO
CAMPOS-BRANCO
ELSE
IF CODIGO LESS 2 OR CODIGO-2 GREATER C
MOVE 1 TO INDICE.
IF (A LESS B GREATER D) AND
(B / 2 EQUAL E) OR
 (F NOT EQUAL ZEROS)
GO
TO
MOVER-DADOS.
IF
CAMPO IS NUMERIC
AND
CAMPO LESS 500,00
NEXT SENTENCE
ELSE
MOVE CAMPO
TO SAI-CAMPO.
IF (TAXA GREATER 70 AND LESS 100) OR
(CODMAT = ‘P’ OR ‘B’) AND
(FIRMACOD LESS 40)
NEXT SENTENCE
ELSE
GO
TO
CONFIRMA.
7.22 DATA E HORA DO SISTEMA
Do sistema, pode-se obter:
· DATE 
= AAMMDD 
(6 bytes)
· DAY 
= AADDD
(5 bytes) -> data juliana
· TIME
= HHMMSSDD
(8 bytes)
Exemplos:
ACCEPT
CAMPO-DATA
FROM
DATE.
ACCEPT
CAMPO-DIA
FROM
DAY.
ACCEPT
CAMPO-HORA
FROM
TIME.
Definindo os campos acima na “WORKING-STORAGE SECTION”:
01
CAMPO-DATA
PIC
9(06).
01
CAMPO-DIA
PIC
9(05).
01
CAMPO-HORA
PIC
9(08).
 ou
01 CAMPO-DATA.
02 ANO
PIC 9(02).
02
MÊS
PIC
9(02).
02
DIA
PIC 9(02).
.................
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
8. ARQUIVOS DE ACESSO DIRETO
Na ENVIRONMENT DIVISION, definindo o arquivo:
FILE-CONTROL.
SELECT CADASTRO
ASSIGN
TO
DA-I-DDCADAST
ACCESS
MODE
IS
RANDOM
RECORD
KEY
IS
CAD-CHAVE
NOMINAL KEY
IS
W-CHAVE.
	
	ACCESS MODE IS RANDOM –> deve ser utilizado para arquivos cuja organização é direta (D) ou indexada (I).
NOMINAL KEY IS (NOME-DA-WORKING) -> campo definido na “WORKING-STORAGE SECTION” no qual deve ser movido a chave de pesquisa do arquivo.
RECORD KEY IS (NOME-DO-REGISTRO) -> campo definido no registro, na qual contém a chave de pesquisa.
 
FD
CADASTRO
LABEL STANDARD
RECORDING F
RECORD 130
BLOCK 10 RECORDS.
01 REG-CADASTRO.
03
CAD-CHAVE
PIC 9(06).
03
CAD-NOME
PIC X(40).
................
WORKING-STORAGE SECTION.
01
W-CHAVE
PIC 9(06) VALUE 2456.
8.1 UTILIZANDO ACESSO DIRETO – LEITURA SEQUENCIAL
FILE-CONTROL.
SELECT
CADASTRO
ASSIGN
TO
DA-I-DDCADAST
ACCESS MODE IS SEQUENTIAL
RECORD 
KEY
 IS CAD-CHAVE.
........
..............
FD
CADASTRO
LABEL STANDARD
RECORDING
F
RECORD
130
BLOCK
10
RECORDS.
01
REG-CADASTRO.
03
CAD-CHAVE
PIC 9(06).
03
CAD-NOME
PIC X(40).
..................
..............
READ
CADASTRO
AT
END
GO
TO
FIM-PROCESSAMENTO.
.....................
..................
Obrigatoriamente deve-se usar na leitura sequencial:
· ACCESS MODE IS SEQUENTIAL = usado para arquivos cuja organização é DA-I-XXXXXXXX e leitura sequencial;
· RECORD KEY IS (NOME-CAMPO) = define a chave do arquivo. Campo da FD;
· BLOCK CONTAINS 10 RECORDS = define o fator de BLOCK do arquivo.
8.1.1 I-O
Formato no OPEN:
OPEN
I-O
(NOME-DO-ARQUIVO)
No OPEN, a opção “I-O” (input-output) deve ser declarada para arquivos que possuem organização “DIRETA”, e quanto utilizada a cláusula “REWRITE”. Caso contrário, abrir somente com a opção “INPUT” para leitura ou “OUTPUT” para gravação.
Formato no READ:
READ
(NOME-DO-ARQUIVO)
INTO
(AREA-IDENTIF)
INVALID
KEY
(SENTENÇA IMPERATIVA)
A opção “INVALID KEY” aciona os dispositivos de programação no sentido de verificação do conteúdo das chaves, o que normalmente é substtuído pelo teste de FILE STATUS. 
Exemplo:
MOVE
150190
TO
WS-CHAVE. (->nominal-key)
READ
CADASTRO.
IF WS-FS-CADASTRO EQUAL ‘23’DISPLAY
“REGISTRO NÃO ENCONTRADO”
STOP RUN.
Formato no WRITE:
WRITE
(NOME-DO-DADO, REGISTRO)
FROM
(AREA-IDENTIF)
INVALID KEY
(SENTENÇA IMPERATIVA)
8.1.2 CLÁUSULA REWRITE
Sua função é substituir o registro código de um arquivo de acesso direto, se o conteúdo da “NOMINAL KEY” associada for válido.
	
	A cláusula “READ” deve ser dada antes da cláusula “REWRITE”. 
Formato:
REWRITE
(NOME-DO-DADO, REGISTRO) FROM (AREA-IDENTIF)
INVALID KEY (SENTENÇA IMPERATIVA)
Exemplo:
MOVE
CAR-CHAVE
TO
WS-CHAVE (-> nominal-key)
REWRITE
REG-CADASTRO.
IF WS-FS-CADASTRO NOT EQUAL ZEROS 
DISPLAY ‘FILE STATUS = ‘ WS-FS-CADASTRO
DISPLAY ‘ ERRO NO REWRITE ’
STOP RUN.
DISPLAY ‘OK, REGISTRO REGRAVADO’.
8.1.3 CLÁUSULA START
A cláusula START é utilizada, quando se quer agilizar a leitura de um arquivo de acesso direto e método de acesso sequencial. 
Posiciona-se em algum registro cuja chave de acesso seja satisfeita e daí para frente, lê-se o arquivo sequencialmente. 
Formato:
START (NOME-DO-ARQUIVO) KEY IS (EQUAL TO)
(GREATER THAN) 
(NOT LESS THAN)
 (NOME-DO-CAMPO)
INVALID KEY (SENTENÇA IMPERATIVA)
OU
START (NOME-DO-ARQUIVO)
INVALID KEY (SENTENÇA IMPERATIVA)
Nota-se que o START, só posiciona e não traz para a área de leitura o registro. Somente no primeiro READ é que acontecerá de trazer o registro. 
Exemplo:
FILE-CONTROL.
SELECT
CADSEQUE
ASSIGN
TO
DA-I-DDCADSEQ
ACCESS SEQUENTIAL
RECORD 
KEY
 CAD-KEY
NOMINAL KEY
 WS-KEY.
.........................
FD
CADSEQUE
LABEL STANDARD
RECORDING
F
BLOCK
20
RECORDS.
01
CAD-REGISTRO.
03
CAD-KEY.
 
05
CAD-CODIGO
PIC X(02).
05
CAD-NUMERO
PIC 9(04)
03
CAD-NOME
PIC X(40).
03
CAD-ENDER
PIC
X(45).
03
CAD-IDADE
PIC 9(02).
..................
WORKING-STORAGE SECTION.
77
WS-KEY
PIC X(06) VALUE ‘AB1437’.
....................
PROCEDURE DIVISION.
..............
START
CADSEQUE
INVALID KEY
PERFORM
ROTINA-NÃO-ACHADO.
LEITURA.
READ
CADSEQUE
AT
END
GO TO FIM-PROCESSA.
......
GO
TO
LEITURA.
FIM-PROCESSA.
	
	 Toda vez que se passar pelo “START”, o registro cuja chave foi satisfeita será retornado e posicionado para leitura.
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
9. TABELAS
As tabelas devem ser construídas na ‘”DATA DIVISION”.
9.1 CLÁUSULA OCCURS
Os itens 01 e 77 não podem conter a cláusula OCCURS.
Formato:
OCCURS
X
TIMES
OCCURS
X
TO
XX
DEPENDING ON (CAMPO).
Existem 2 tipos de tabelas:
· TABELA SUBSCRITA;
· TABELA INDEXADA.
As tabelas também podem ser:
· DIRECIONAL;
· BIDIMENSIONAL;
· TRIDIMENSIONAL.
	
	· O tamanho de uma tabela não pode exceder a 131.071 bytes (128K);
· O tamanho de uma tabela que tiver DEPENDING ON não pode exceder a 32.767 bytes (32K);
· Cada 1K tem em média 1.024 bytes;
· O indexador de uma tabela indexada, pode ser somado ou subtraído. Ex.: TAB (INDEX + 1) TO X.
9.2 TABELA SUBSCRITA 
Pode ser considerada, tabela subscrita, a tabela que você utiliza um índice fora dela.
Exemplo 1, definição da tabela na WORKING-STORAGE SECTION:
01 TABELA-DE-MESES.
02 TAB-MESES.
03 FILLER
PIC
X(09)
VALUE
‘JANEIRO’.
03 FILLER
PIC
X(09)
VALUE
‘FEVEREIRO’.
03 FILLER
PIC
X(09)
VALUE
‘MARCO’.
03 FILLER
PIC
X(09)
VALUE
‘ABRIL’.
03 FILLER
PIC
X(09)
VALUE
‘MAIO’.
03 FILLER
PIC
X(09)
VALUE
‘JUNHO’.
03 FILLER
PIC
X(09)
VALUE
‘JULHO’.
03 FILLER
PIC
X(09)
VALUE
‘AGOSTO’.
03 FILLER
PIC
X(09)
VALUE
‘SETEMBRO’.
03 FILLER
PIC
X(09)
VALUE
‘OUTUBRO’.
03 FILLER
PIC
X(09)
VALUE
‘NOVEMBRO’.
03 FILLER
PIC
X(09)
VALUE
‘DEZEMBRO’.
02 TAB-MESES-R
REDEFINES TAB-MESES OCCURS 12 TIMES.
03 MESES
PIC X(09).
01 DATA-DIA.
02 DIA
PIC 9(02).
02
FILLER
PIC X(01).
02
MES
PIC 9(02).
02
FILLER
PIC X(01).
02
ANO
PIC 9(04).
01 CABEC.
03
FILLER
PIC X(28) VALUE 
‘RELATORIO EMITIDO EM: ‘.
03
NOME-MÊS
PIC X(09).
..................
PROCEDURE DIVISION.
....................
DISPLAY ‘TECLE DATA – FORMATO DD/MM/AAAA’ UPON CONSOLE.
ACCEPT
 DATA-DIA FROM CONSOLE.
MOVE
MESES (MÊS)
TO
NOME-MÊS.
Exemplo 2:
WORKING-STORAGE SECTION.
.............
77
IND
PIC 9(02) COMP VALUE 0 SYNC.
.............
01 LINHA-DETALHE.
02 FILLER
PIC X(20) 
VALUE
‘TOTAL DO ESTADO DE ‘.
02 ESTADO
PIC X(15).
.............
.............
01 TABELA-ESTADO.
02 TAB.
03 FILLER
PIC X(17) VALUE ‘SPSAO PAULO’.
03 FILLER
PIC X(17) VALUE ‘BABAHIA’.
..........
..........
03 FILLER
PIC X(17) VALUE ‘PRPARANA’.
03 FILLER
PIC X(17) VALUE ‘AMAMAZONAS’.
02 TAB-R
REDEFINES
TAB
OCCURS 23 TIMES.
03 SIGLA
PIC X(02).
03
DESCRICAO
PIC X(15).
...................
PROCEDURE DIVISION.
...................
LER-FITA.
READ
ENTRADA
AT END
GO
TO FIM-LER.
FIM-LER.
EXIT.
..............
PESQUISA-ESTADO.
MOVE
1
TO
IND.
LOOP-INICIO.
IF
SIGLA(IND) EQUAL
ESTADO-FITA
GO
TO
MOVE-ESTADO
ELSE
ADD
1
TO
IND
IF
IND
 =
24
GO
TO
ROT-ERRO
ELSE
GO
TO
LOOP-INICIO.
MOVE-ESTADO.
MOVE
DESCRICAO(IND)
TO
ESTADO.
..........
9.3 CLÁUSULA SET
Esta cláusula estabelece pontos de referência na pesquisa de tabelas, colocando determinados valores nos indexadores associados com os elementos das tabelas.
	
	A cláusula SET deve ser utilizada quando quisermos inicializar um indexador antes da execução de uma cláusula SEARCH. Pode também ser utilizada na transferência dos conteúdos dos indexadores para outros itens de dados elementares ou somar ou subtrair conteúdo do indexador.
Formato 1:
SET
(INDEX NAME)
TO
(NUM-INTEIRO)
(IDENTIFICADOR)
(IDENTIFICADOR)
(INDEX NAME)
Função: seta o “INDEX NAME” ou “IDENTIFICADOR” com um valor inicial.
Formato 2:
SET
(INDEXADOR-A)
(INDEXADOR-B)
UP
BY
(IDENT-1)
ou
DOWN BY (LIT-2)
Neste formato 2, quando o comando SET é executado, o conteúdo do INDEXADOR-A é acrescido (UP BY) ou decrescido (DOWN BY) do valor que corresponde ao número de ocorrências representadas pelo LIT-2 ou IDENT-1.
Exemplos:
SET
INDEX-7
TO
25.
SET
INDEX-C
INDEX-D
TO
INDEX-7.
SET
INDEX-1
UP BY
1.
SET
INDEX-8
DOWN
BY
1.
9.4 CLÁUSULA SEARCH
Esta cláusula é utilizada para pesquisar uma tabela. Ela procura um elemento que satisfaça certas condições e determina o valor do nome indexado associado ao índice correspondente do elemento da tabela. 
Somente um único identificador da tabela pode ser referenciado por uma cláusula SEARCH.
Formato 1:
SEARCH
 IDENT-1
VARYING
(IDENT-2) / (INDEX-1)
AT END (SENTENCA IMPERATIVA 1)
WHEN
CONDICAO-1
(SENTENCA IMPERATIVA 2)
(NEXT SENTENCE)
WHEN
CONDICAO-2
(SENTENCA IMPERATIVA 3)
(NEXT SENTENCE)
Formato 2:
SEARCH
ALL IDENT-1
AT END (SENTENCA IMPERATIVA 1)
WHEN
(CONDICAO-RELACIONAL-1)
 
(NOME-CONDICAO-1)
AND 
(CONDICAO-RELACIONAL-2)....
(NOME-CONDICAO-2)
(SENTENCA IMPERATIVA 2)
(NEXT SENTENCE)
Nos formatos acima, o IDENT-1 não deve ser subscrito ou indexado. 
Sua descrição na DATA DIVISION deve conter a cláusula OCCURS associada a opção INDEXED BY. Não poderemos usar números de vírgula flutuante no IDENT-1.
Quando pesquisamos uma tabela através da cláusula SEARCH, somente o indexador associado ao nome dado ao IDENT-1 pela opção INDEXED BY é que varia.
Então, para pesquisas de tabela de mais de uma dimensão, é necessário executar a cláusula SEARCH repetidamente. 
Após cada execução, é necessário que a cláusula SET ajuste os indexadores associados aos outros níveis da tabela.
Se nas opções AT END e WHEN não existir nas sentenças imperativas nenhum desvio (GO TO ou PERFORM), o controle de execução passará para a próxima sentença após a execução so SEARCH.
9.5 TABELA INDEXADA 
	
	Tabela indexada é aquela cujo índice está embutido na tabela através da cláusula INDEXED BY.
Exemplo 1:
WORKING-STORAGE SECTION.
01 TABELA1.
03
TABELA-NOMES.
05
FILLER
PIC X(11) VALUE ‘JOAO’.
05
FILLER
PIC X(11) VALUE ‘JOSE’.
05
FILLER
PIC X(11) VALUE ‘JULIANA’.05
FILLER
PIC X(11) VALUE ‘MARIA’.
05
FILLER
PIC X(11) VALUE ‘ANA’.
05
FILLER
PIC X(11) VALUE ‘AILTON’.
05
FILLER
PIC X(11) VALUE ‘BENEDITA’.
05
FILLER
PIC X(11) VALUE ‘SERGIO’.
05
FILLER
PIC X(11) VALUE ‘CAMILA’.
05
FILLER
PIC X(11) VALUE ‘EVELYN’.
05
FILLER
PIC X(11) VALUE ‘SERAFIM’.
05
FILLER
PIC X(11) VALUE ‘PEDRO’.
05
FILLER
PIC X(11) VALUE ‘LUCAS’.
05
FILLER
PIC X(11) VALUE ‘IRACEMA’.
03
TAB-NOM
REDEFINES
TABELA-NOMES 
OCCURS 14 INDEXED BY IND.
05 NOME
PIC
X(11).
01
AUX-NOME
PIC X(11) VALUE SPACES.
..................
PROCEDURE DIVISION.
DAR-DISPL.
DISPLAY ‘TECLE O NOME A SER PESQUISADO’ UPON CONSOLE.
ACCEPT
AUX-NOME
FROM CONSOLE.
SET
IND
TO
1.
SEARCH
TAB-NOM
AT
END
GO
TO
DAR-DISPL
WHEN
NOME (IND)
EQUAL
AUX-NOME
PERFORM
ROT-ACHOU-NOME.
ROT-ACHOU-NOME.
.....................
Exemplo 2, utilizando “SEARCH ALL”:
DATA DIVISION.
.........
FD
CADENTRA
..........
03
CHAVE-COD
PIC 9(01).
........
WORKING-STORAGE SECTION.
.........
01 LINHA-IMPRESSAO.
03 FILLER
PIC X(20) VALUE SPACES.
03 LIN-MSG
PIC X(20).
......
01 TABELA2.
03 TAB-MSG.
05 FILLER
PIC X(11) VALUE ‘1DESPREZADO’.
05 FILLER
PIC X(11) VALUE ‘2DUPLICADO’.
05 FILLER
PIC X(11) VALUE ‘3EXCLUIDO’.
05 FILLER
PIC X(11) VALUE ‘4INCLUIDO’.
05 FILLER
PIC X(11) VALUE ‘5ALTERADO’.
03 FILLER
REDEFINES
TAB-MSG.
05
TAB-2
OCCURS
5 
TIMES
ASCENDING KEY IS TAB-CODIGO
INDEXED BY IND.
07 TAB-CODIGO
PIC 9(01).
07
TAB-MENSAG
PIC X(10).
.........
PROCEDURE DIVISION.
.............
SEARCH ALL TAB-2
AT END
MOVE ALL ‘*’ TO LIN-MSG
GO
TO SAIDA
WHEN
TAB-CODIGO (IND) EQUAL CHAVE-COD
MOVE TAB-MENSAG(IND) TO LIN-MSG.
OBS: Não é necessário setar o indexador quando utilizar “SEARCH ALL”. 
	
	A ordem de sequência das opções do SEARCH ALL devem ser respeitadas.
1 – OCCURS
2 – ASCENDING KEY IS ou DESCENDING KEY IS
3 – INDEXED BY.
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
10. CLASSIFICAÇÃO DE DADOS
São quatro (4) os elementos para classificação interna no programa Cobol.
Podemos classificar os arquivos em ordem ascendente ou descendente.
1 - Descrição de dados:
Para cada arquivo a ser classificado, deve existir uma descrição do arquivo de classificação na “FILE SECTION”.
Exemplo:
SD
TRABALHO
DATA
RECORD
IS
TRAB.
01 TRAB.
02 NOME
PIC X(40).
02
VALOR
PIC 9(06)V(02) COMP-3.
02 ENDERECO
PIC X(30).
2 - Comando de Sort:
O comando de sort é um item necessário na “PROCEDURE DIVISION”.
 Determina os campos de controle para classificação e indica se processamentos de entrada e saída devem ser usados.
Exemplo:
SORT TRABALHO
DESCENDING
NOME
VALOR
ASCENDING
ENDERECO
INPUT PROCEDURE
100-SELECIONA-SORT
OUTPUT PROCEDURE 500-PEGA-CLASSIFICADO.
3 - Procedimento de entrada:
É usado para tratamento dos registros a serem classificados.
Por exemplo: selecionar, gerar, intercalar registros de um ou mais arquivos de entrada.
Exemplo:
100-SELECIONA-SORT SECTION.
..........
........
RELEASE
TRAB.
.........
4 - Procedimentos de saída:
É usado para tratamento dos registros classificados. Serve para colocá-los em vários de arquivos de saída.
Exemplo:
500- PEGA-CLASSIFICADO SECTION.
LER-SORT.
RETURN
TRABALHO
AT END
MOVE ‘*’ TO CHAVE-FIM-SORT
GO TO FIM-SORT.
10.1 CLÁUSULA SELECT (SORT)
Esta cláusula fica na “ENVIRONMENT DIVISION” e “DATA DIVISION”, na descrição dos arquivos.
Formato:
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT (NOME-ARQ-CLASSIF) ASSIGN TO UT-S-SORTWK01.
.....................
.....................
DATA DIVISION.
SD
(NOME-ARQ-CLASSIF)
DATA RECORD IS (NOME-REGISTRO-1 ...).
 RECORDS ARE 
ou
SD
(NOME-ARQ-CLASSIF).
	
	· SD (SORT DESCRIPTION) é obrigatório;
· (NOME-ARQ-CLASSIF):
- não pode dar OPEN, CLOSE, READ e WRITE;
- deve ter um SELECT;
 - Cláusula DATA RECORDS é obrigatória em alguns sistemas. Atualmente, é opcional.
10.2 CLÁUSULA RELEASE
Release é um verbo de liberação.
Esta cláusula é usada no SORT, em um procedimento de entrada para transferir um registro de cada vez para ser classificado.
Formato:
RELEASE
(NOME-DO-REGISTRO)
ou
RELEASE
(NOME-DO-REGISTRO) FROM (NOME-DA-AREA).
10.3 CLÁUSULA RETURN
Return é um verbo de retorno.
O comando RETURN é usado em procedimentos de saída para receber, um de cada vez, os registros já classificados.
Formato:
RETURN
(NOME-DO-ARQ-CLASSIF)
INTO
(AREA)
AT
END
(COMANDO IMPERATIVO).
10.4 CLÁUSULA SORT
A função do comando SORT é determinar o arquivo a ser classificado, os campos de classificação, sua ordem (ascendente e/ou descendente) e se devem ser executados procedimentos de “ entrada” e/ou “saída”.
Formato:
SORT
(NOME-ARQ-CLASSIF)
ASCENDING KEY / DESCENDING KEY
(NOME-CAMPO-1...)
USING
(NOME-ARQUIVO-1)
INPUT PROCEDURE (NOME-SECAO-1)
GIVING (NOME-ARQUIVO-2)
OUTPUT PROCEDURE (NOME-SECAO-2)
1- (NOME-ARQ-CLASSIF) -> é parâmetro obrigatório e deve ser definido na “SD”;
2 - é obrigatório ao menos uma das opções “ASCENDING” ou “DESCENDING”;
3 - (NOME-CAMPO-1) -> são os nomes dos campos para classificação. Pode-se ter até doze (12) campos e pode figurar em qualquer parte do registro. O tamanho total de todos os campos de classificação não pode exceder 256 bytes;
4 - A opção USING é necessária quando não existe processamento de entrada e o (NOME-ARQUIVO-1) deve ser definido na “FD”;
5 - A opção GIVING é necessária quando não existir processamento de saída. O (NOME-ARQUIVO-2) deve ser definido na “FD”;
6 - A opção INPUT PROCEDURE é necessária quando usar o processamento de entrada:
· é uma parte separada dentro da “PROCEDURE DIVISION”;
· só pode ser referenciada pelo comando “SORT”;
· deve conter pelo menos um comando “RELEASE”.
7 - A opção OUTPUT PROCEDURE é como a INPUT PROCEDURE:
· é uma parte separada dentro da “PROCEDURE DIVISION”;
· só pode ser referenciada pelo comando “SORT”;
· deve conter pelo menos um comando “RETURN”.
10.4.1 INPUT PROCEDURE e OUTPUT PROCEDURE
IDENTIFICATION DIVISION.
........
ENVIRONMENT DIVISION.
.....
SELECT ARQENT
ASSIGN
TO
UT-S-ARQENT.
SELECT ARQSORT
ASSIGN
TO
UT-S-ARQSORT.
........
DATA DIVISION.
SD ARQSORT.
01 SRT-REGISTRO.
03
SRT-TIPO
PIC X(02).
03
SRT-CODIGO
PIC 9(07) COMP-3.
03
SRT-NOME
PIC X(30).
FD
ARQENT
LABEL STANDARD
RECORDING F
BLOCK 0.
01 ENT-REGISTRO.
03
FILLER
PIC X(20).
03
ENT-TIPO
PIC X(02).
03
FILLER
PIC X(01).
03
ENT-CODIGO
PIC 9(07) COMP-3.
03
FILLER
PIC X(10).
03
ENT-NOME
PIC X(30).
..........
PROCEDURE DIVISION.
..........
PRINCIPAL SECTION.
OPEN INPUT ARQENT.
SORT ARQSORT
ASCENDING 
KEY SRT-TIPO
DESCENDING 
KEY SRT-CODIGO
INPUT PROCEDURE
CLASSIFICA
 OUTPUT PROCEDURE CLASSIFICADO.
STOP RUN.
CLASSIFICA SECTION.
READ
ARQENT
AT END
CLOSE ARQENT
GO
TO
FIM-CLASSIFICA.
MOVE
ENT-TIPO
TO
SRT-TIPO
MOVE
ENT-CODIGO
TO
SRT-CODIGO
MOVE
ENT-NOME
TO
SRT-NOME
RELEASE
SRT-REGISTRO
GO
TO
CLASSIFICA.
FIM-CLASSIFICA.
EXIT.
CLASSIFICADO SECTION.
RETURN ARQSORT
AT END
GO TO FIM-CLASSIFICADO.
..........
FIM-CLASSIFICADO.
EXIT.
10.4.2 USING e OUTPUT PROCEDURE 
IDENTIFICATION DIVISION.
........
ENVIRONMENT DIVISION.
.....
SELECT ARQENT
ASSIGN
TO
UT-S-ARQENT.
SELECT ARQSORT
ASSIGN
TO
UT-S-ARQSORT.
........
DATA DIVISION.
SD ARQSORT.
01 SRT-REGISTRO.
03
SRT-TIPO
PIC X(02).
03
SRT-CODIGO
PIC 9(07) COMP-3.
03
SRT-NOME
PIC X(30).
FD
ARQENT
LABEL STANDARD
RECORDING F
BLOCK 0.
01 ENT-REGISTRO.
03
ENT-TIPO
PIC X(02).
03
ENT-CODIGO
PIC 9(07) COMP-3.
03
ENT-NOME
PIC X(30).
..........
PROCEDURE DIVISION.
.....
PRINCIPAL SECTION.
SORT ARQSORT
ASCENDING 
KEY SRT-TIPO
DESCENDING 
KEY SRT-CODIGO
USING
ARQENT
 OUTPUT PROCEDURE CLASSIFICADO.
STOP RUN.
..............
CLASSIFICADO SECTION.
RETURN ARQSORT
AT ENDGO TO FIM-CLASSIFICADO.
..........
.........
FIM-CLASSIFICADO.
EXIT.
	
	· O arquivo a ser utilizado na opção USING, deve ser definido na FD;
· É obrigatório o arquivo utilizado na opção USING ter o mesmo tamanho do arquivo do SORT;
· Arquivos de tamanhos variáveis não devem ser sorteados com a opção USING, mas sim pela “INPUT PROCEDURE”.
10.4.3 INPUT PROCEDURE e GIVING
IDENTIFICATION DIVISION.
........
ENVIRONMENT DIVISION.
........
SELECT ARQENT
ASSIGN
TO
UT-S-ARQENT.
SELECT ARQSAI
ASSIGN
TO
UT-S-ARQSAI.
SELECT ARQSORT
ASSIGN
TO
UT-S-SORTWK01.
........
DATA DIVISION.
SD ARQSORT.
01 SRT-REGISTRO.
03
SRT-TIPO
PIC X(02).
03
SRT-CODIGO
PIC 9(07) COMP-3.
03
SRT-NOME
PIC X(30).
FD
ARQENT
LABEL STANDARD
RECORDING F
BLOCK 0.
01 ENT-REGISTRO.
03 FILLER
PIC X(20).
03
ENT-TIPO
PIC X(02).
03 FILLER
PIC X(01).
03
ENT-CODIGO
PIC 9(07) COMP-3.
03 FILLER
PIC X(10).
03
ENT-NOME
PIC X(30).
FD
ARQSAI
LABEL STANDARD
RECORDING F
BLOCK 0.
01 SAI-REGISTRO.
03 FILLER
PIC X(36).
..........
PROCEDURE DIVISION.
PRINCIPAL SECTION.
OPEN INPUT
ARQENT
SORT ARQSORT
ASCENDING 
KEY SRT-TIPO
DESCENDING 
KEY SRT-CODIGO
 INPUT PROCEDURE CLASSIFICA
GIVING ARQSAI.
STOP RUN.
..............
CLASSIFICA SECTION.
READ
ARQENT
AT END
CLOSE ARQENT
GO
TO
FIM-CLASSIFICA.
MOVE
ENT-TIPO
TO
SRT-TIPO
MOVE
ENT-CODIGO
TO
SRT-CODIGO
MOVE
ENT-NOME
TO
SRT-NOME
RELEASE
SRT-REGISTRO
GO
TO
CLASSIFICA.
FIM-CLASSIFICA.
EXIT.
	
	· O arquivo a ser utilizado na opção GIVING, deve ser definido na FD;
· É obrigatório o arquivo utilizado na opção GIVING ter o mesmo tamanho do arquivo do SORT;
· Arquivos de tamanhos variáveis não devem ser sorteados com a opção GIVING, mas sim pela “OUTPUT PROCEDURE”.
10.4.4 USING e GIVING
IDENTIFICATION DIVISION.
........
ENVIRONMENT DIVISION.
........
SELECT ARQENT
ASSIGN
TO
UT-S-ARQENT.
SELECT ARQSAI
ASSIGN
TO
UT-S-ARQSAI.
SELECT ARQSORT
ASSIGN
TO
UT-S-SORTWK01.
........
DATA DIVISION.
SD ARQSORT.
01 SRT-REGISTRO.
03
SRT-TIPO
PIC X(02).
03
SRT-CODIGO
PIC 9(07) COMP-3.
03
SRT-NOME
PIC X(30).
FD
ARQENT
LABEL STANDARD
RECORDING F
BLOCK 0.
01 ENT-REGISTRO.
03
ENT-REG
PIC X(36).
FD
ARQSAI
LABEL STANDARD
RECORDING F
BLOCK 0.
01 SAI-REGISTRO.
03 FILLER
PIC X(36).
..........
PROCEDURE DIVISION.
.....................
PRINCIPAL SECTION.
SORT ARQSORT
ASCENDING 
KEY TIPO
DESCENDING 
KEY CODIGO
 USING ARQENT
GIVING ARQSAI.
STOP RUN.
	
	 Não se pode dar os comandos OPEN e CLOSE nos arquivos que se utilizam da opção USING ou GIVING.
*****************************
OBS: Exemplo de JCL para SORT com no máximo 6 SORTWK. 
 O SPACE pode ser um TRK ou CYL:
//SORTLIB
DD
DSN=SYS1.SORTILIB,DISP=SHR
//SORTWK01
DD
UNIT=DISCO,SPACE=(TRK,(1,1),RLSE)
//SORTWK02
DD
UNIT=DISCO,SPACE=(TRK,(1,1),RLSE)
//’’’’’’03’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
//’’’’’’04’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
//’’’’’’05’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
//’’’’’’06’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
11. OUTRAS CLÁUSULAS 
11.1 CLÁUSULA EXAMINE / INSPECT - REPLACING
A função desta cláusula é substituir um determinado caracter num item, por outro determinado caracter. Semelhante a essa função, temos outra cláusula no Cobol II, a cláusula INSPECT.
Formato:
 EXAMINE (NOME-CAMPO) REPLACING ALL (LITERAL-1) BY (LITERAL-2)
 - LEADING -
 - UNTIL FIRST -
 - FIRST -
 EXAMINE (NOME-CPO) TALLYING ALL (LIT-3) REPLACING BY (LIT-4)
 - LEADING -
 - UNTIL FIRST -
 
 - FIRST -
 INSPECT (NOME-CAMPO) REPLACING ALL (LITERAL-1) BY (LITERAL-2)
 - LEADING -
REPLACING -> substitui um determinado caracter num item por outro determinado caracter.
TALLYING -> conta o número de vezes que um determinado caracter figura num item (sendo possível substituir este caracter por um outro determinado caracter).
	
	Os campos para o EXAMINE e INSPECT só podem estar / ser zonados.
11.1.1 Regras para EXAMINE
1- Serve somente para campos numéricos zonados, alfabéticos e alfanuméricos;
2- A opção TALLYING gera um número inteiro cujo valor é armazenado num item binário denominado “TALLY”. Este número representa o seguinte:
· quantas vezes ocorre a LITERAL-3 com o uso da opção “ALL”;
· quantas vezes ocorre a LITERAL-3, antes de encontrar um campo diferente da LITERAL-3, com o uso da opção “LEADING”;
· número de caracteres diferentes da LITERAL-3 até o primeiro caracter igual a LITERAL-3 ser encontrado, com o uso da opção “UNTIL FIRST”.
3- No caso de ser usada a opção “REPLACING” (alterando):
· com a opção “ALL”, cada LITERAL-1 (ou LITERAL-3) é substituído pela LITERAL-2 (ou LITERAL-4);
· com a opção “LEADING” a substituição pela LITERAL-2 (ou LITERAL-4) termina no momento em que é encontrado um LITERAL-1(ou LITERAL-3);
· com a opção “UNTIL FIRST” a substituição pelo LITERAL-2 (ou LITERAL-4) termina no momento em que é encontrado um LITERAL-1 (ou LITERAL-3);
· com a opção “FIRST”, a primeira LITERAL-1 (ou LITERAL-3) que aparecer, é substituído pelo LITERAL-2 (ou LITERAL-4).
11.1.2 Exemplos de EXAMINE
- 1)
EXAMINE/INSPECT CAMPO-A REPLACING ALL ‘7’ BY ‘0’.
CAMPO-A antes = 44 75 72 
CAMPO-A depois = 44 05 02
- 2)
EXAMINE/INSPECT IMPORTANCIA REPLACING LEADING ZEROS BY ‘2’.
IMPORTANCIA antes = 00 08 40
IMPORTANCIA antes = 22 28 40
- 3)
EXAMINE CAMPO-B RELACING UNTIL FIRST 5 BY ZERO.
CAMPO-B antes = 44 75 72
CAMPO-B depois = 00 05 72
- 4)
EXAMINE CAMPO-A REPLACING FIRST 7 BY ZERO.
CAMPO-A antes = 44 75 72
CAMPO-A depois = 44 05 72
- 5)
EXAMINE IMPORTANCIA TALLYING ALL ‘,’.
IMPORTANCIA antes = $3 ,4 11 ,2 2. 15
TALLY antes = 00 32
TALLY depois = 00 02
- 6)
EXAMINE INDICACAO TALLYING ALL ‘A’ REPLACING ‘B’.
INDICACAO antes = A8 66 AC
TALLY antes = 00 13
INDICACAO depois = B8 66 BC
TALLY depois = 00 02
- 7)
EXAMINE CONTROLE TALLYING LEADING ZEROS.
CONTROLE antes = 00 08 44
TALLY antes = 00 32
TALLY depois = 00 03
- 8)
EXAMINE NOME TALLYING UNTIL FIRST ‘X’.
NOME antes = ID AX XX BX
TALLY antes = 00 13
TALLY depois = 00 03
11.2 CLÁUSULA TRANSFORM
	
	O comando TRANSFORM é usado para transformação de caracteres conforme uma regra de transformação. Por exemplo: os caracteres de um campo podem ser transformados em uma outra sequência.
Formato:
TRANSFORM (NOME-DADO-3)
CHARACTERS
 FROM (CONSTANTE FIGURATIVA-1) TO (CONSTANTE FIGURATIVA-2)
 (LITERAL NÃO NUMERICO-1) (LITERAL NÃO NUMERICO-2)
 (NOME-DADO-1) (NOME-DADO-2)
11.2.1 Regras para o TRANSFORM
1- NOME-DADO-3 -> tem que ser um item elementar alfabético, alfanumérico ou um item de grupo com um comprimento fixo com menos de 257 bytes;
2- A regra de transformação é estabelecida por combinação da opção “FROM” e “TO”;
3- Para os operandos da opção “FROM” e “TO” valem as seguintes regras:
· literais não numéricas devem estar sempre entre “apóstrofes”;
· na LITERAL-NÃO-NUMERICA ou NOME-DADO-1, o mesmo caracter não pode figurar mais de uma vez, se for repetido o resultado não é previsível;
· são permitidos como constantes figurativas: zeros, spaces, quotes, high-values, low-values.
11.2.2 Exempos de TRANSFORM
- 1)
TRANSFORM CAMPO-A CHARACTERS FROM ZEROS TO QUOTE.
CAMPO-A antes = 10 70 0A BC
CAMPO-A depois = 1’ 7’ ‘A BC
- 2)
TRANSFORM CAMPO-B CHARACTERS FROM ‘17CB’ TO ‘QRXT’.
CAMPO-B antes = 1X 7X XA BC
CAMPO-B depois = QX RX XA TX
- 3)
TRANSFORM CAMPO-C
CHARACTERS
FROM CAMPO-X TO CAMPO-Y.
CAMPO-X = X1 7A BC
CAMPO-Y = CB A7 1X
CAMPO-C antes = 1X 7X XA BC
CAMPO-C depois = BC AC C7 1X
11.3 CLÁUSULA EXHIBIT
	
	O EXHIBIT tem a finalidade de mostrar o conteúdo dos campos.
Formato:
EXHIBIT
NAMED
(IDENTIFICADOR-1) (IDENTIFICADOR-2)...
CHANGED NAMED (LITERAL NÃO NUMERICA)
CHANGED
- NAMED -> imprime / mostra o conteúdo do campo todas as vezes que passar pelo EXHIBIT;
- CHANGEDNAMED -> imprime / mostra o conteúdo do campo somente na troca de valores;
- CHANGED -> imprime / mostra o conteúdo dos campos somente na troca de valores em forma de colunas.
	
	· O EXHIBIT não pode ser utilizado para contadores especiais;
· O EXHIBIT mostra o nome do campo e em seguida o seu conteúdo.
Exemplos:
EXHIBIT
NAMED
CAMPO-A.
EXHIBIT
CHANGED NAMED
CAMPO-A.
EXHIBIT
CHANGED
CAMPO-A.
EXHIBIT
CHANGED
CAMPO-1
CAMPO-A CAMPO-G.
11.4 CLÁUSULA READY/RESET (TRACE)
	
	O READY tem a finalidade de mostrar os passos do programa assinalando os parágrafos pelo qual já passou.
Formato:
READY
TRACE.
RESET
TRACE.
READY TRACE
Imprime / mostra a sequência de parágrafos ou SECTION’s, pelo qual o programa está passando.
RESET TRACE
Encerra a operação do “READY TRACE”.
Exemplo:
PROCEDURE DIVISION.
A0.
READY TRACE.
.........
A1.
.........
...........
A5.
...........
A99.
EXIT.
Caso ocorra um ABEND, os últimos parágrafos que antecederam o ABEND, podem não aparecerem.
11.5 CLÁUSULA STRING
Formato:
STRING 
IDENT-1 IDENT-2... DELIMITED BY SIZE
 INTO
IDENT-7
 COMANDO-IMPERATIVO ON OVERFLOW
Na cláusula STRING, os caracteres são transferidos dos campos emissores (IDENT-1, IDENT-2, ETC) para o campo receptor (IDENT-7) da esquerda para a direita.
O campo emissor completo, ao qual se deu o primeiro nome (IDENT-1), é movido para as posições mais a esquerda do campo receptor (IDENT-7). Depois o campo emissor completo ao qual foi dado o próximo nome (IDENT-2) é movido, imediatamente, para a direita das posições preenchidas do campo receptor.
Este processo continua até que todos os campos emissores tenham sido transferidos ou que os campos estejam cheios.
	
	Os campos emissores podem ser colocados em qualquer lugar e em qualquer ordem na DATA DIVISION. A ordem na qual eles são nomeados governa a ordem da transferência de dados.
Se ON OVERFLOW não estiver especificado, o próximo comando seguinte ao comando STRING é executado.
Quando o(s) campo(s) emissor(es) for menor que os campos receptores, estes não são completados com brancos como é comum no comando MOVE.
11.5.1 Regras para STRING
1- Todos os identificadores devem ser descritos como USAGE IS DISPLAY;
2- O identificador receptor (IDENT-7) deve ser um item de dados elementar sem nenhum símbolo de edição;
3- A frase DELIMITED BY SIZE é exigida e significa que a transferência de dados para quando o campo receptor está cheio, isto é, quando encontra o campo delimitador.
11.5.2 Exemplos de STRING
FD
ARQENTRA
.........
.........
01 REG-ENTRA.
03 DATA-HOJE.
05 DIA-HOJE
PIC 99.
05 MES-HOJE
PIC 99.
05 ANO-HOJE
PIC 99.
...............................
WORKING-STORAGE SECTION.
................
01 LIN-IMPRIME.
03 
FILLER
PIC X(20) VALUE SPACES.
03 
LIN-DATA.
 
05
LIN-DIA
PIC 9(02)B.
05 LIN-DATA-EXT PIC X(40).
.............
01 TABELA-MESEXT.
03
FILLER
PIC X(20) VALUE ‘DE JANEIRO DE 19*’.
03
FILLER
PIC X(20) VALUE ‘DE FEVEREIRO DE 19*’.
03
FILLER
PIC X(20) VALUE ‘DE MARCO DE 19*’.
03
FILLER
PIC X(20) VALUE ‘DE ABRIL DE 19*’.
03
FILLER
PIC X(20) VALUE ‘DE MAIO DE 19*’.
03
FILLER
PIC X(20) VALUE ‘DE JUNHO DE 19*’.
03
FILLER
PIC X(20) VALUE ‘DE JULHO DE 19*’.
03
FILLER
PIC X(20) VALUE ‘DE AGOSTO DE 19*’.
03
FILLER
PIC X(20) VALUE ‘DE SETEMBRO DE 19*’.
03
FILLER
PIC X(20) VALUE ‘DE OUTUBRO DE 19*’.
03
FILLER
PIC X(20) VALUE ‘DE NOVEMBRO DE 19*’.
03
FILLER
PIC X(20) VALUE ‘DE DEZEMBRO DE 19*’.
01 FILLER
REDEFINES
TABELA-MESEXT.
03
MÊS-EXT
PIC X(20) OCCURS 12 TIMES.
PROCEDURE DIVISION.
.............
MOVE DIA-HOJE
TO
LIN-DIA
STRING
MÊS-EXT (MÊS-HOJE) ANO-HOJE DELIMITED BY ‘*’
INTO
LIN-DATA-EXT.
O resultado acima será:
DATA-HOJE
=
150897
LIN-DATA-EXT =
15 DE AGOSTO DE 1997
ou
DATA-HOJE
=
010497
LIN-DATA-EXT =
01 DE ABRIL DE 1997
11.6 CLÁUSULA UNSTRING
Formato:
UNSTRING 
IDENT-1 INTO IDENT-2 IDENT-3... 
COMANDO IMPERATIVO ON OVERFLOW
Na cláusula UNSTRING, os caracteres são transferidos dos campos receptores (IDENT-2, IDENT-3, ETC) para o campo emissor (IDENT-1) da esquerda para a direita.
O campo receptor ao qual foi dado o nome primeiro (IDENT-2) é completamente preenchido com os caracteres mais a esquerda do campo emissor. Então, o próximo campo emissor, este processo continua até que todos os campos estejam cheios ou o campo emissor inteiro tenha sido transferido.
	
	Os campos receptores podem ser colocados em qualquer lugar e em qualquer ordem na DATA DIVISION. 
A ordem na qual eles estão nomeados governa a ordem da transferência de dados.
11.6.1 Regras para UNSTRING
1- O campo emissor (IDENT-1) deve ser alfanumérico;
2- Os campos receptores (IDENT-2, IDENT-3, etc) devem ser descritos como USAGE IS DISPLAY;
3- Os campos receptores podem ser alfabéticos, numéricos ou alfanuméricos.
11.7 RETURN-CODE
É uma área que contém um código de retorno qualquer para que este seja checado pelo STEP posterior ao executado, através do cond do JCL.
Exemplo:
IDENTIFICATION DIVISION.
..........
ENVIRONMENT DIVISION.
.........
DATA DIVISION.
.........
PROCEDURE DIVISION.
OPEN INPUT ARQTESTE.
READ ARQTESTE
AT END
MOVE +020 TO RETURN-CODE
CLOSE ARQTESTE
STOP RUN.
IF TIPO EQUAL 1
MOVE +010
TO RETURN-CODE
CLOSE ARQTESTE
STOP RUN.
	
	Deve-se procurar enviar o RETURN-CODE valorizado sempre ao final do processamento, isto é, antes do STOP RUN ou GOBACK.
11.8 ABENDAR PROGRAMA
Para abendar um programa da maneira que vamos definir neste subcapítulo, deve-se definir um campo na WORKING-STORAGE SECTION com 4 bytes binários com qualquer valor, que não ultrapasse a 4095.
Exemplo:
WORKING-STORAGE SECTION.
77
WRK-ABEND
PIC S9(04) VALUE +1234 COMP.
PROCEDURE DIVISION.
OPEN INPUT ARQTESTE.
READ ARQTESTE
AT END
CLOSE ARQTESTE
STOP RUN.
IF
TIPO-TESTE
EQUAL
3
DISPLAY ‘ERRO REGISTRO DE ENTRADA ARQTESTE’
 
DISPLAY ‘0 PROGRAMA AFGT0904 SERÁ CANCELADO’
CALL ‘ILBOABN0’
USING
WRK-ABEND.
11.9 FILE STATUS
O FILE STATUS permite ao usuário monitorar a execução de operações de entrada e saída (I/O) requisitadas para os arquivos de um programa.
Após cada operação de I/O, o sistema move um valor para a STATUS KEY (campo alfanumérico, com 2 caracteres definidos na WORKING-STORAGE SECTION e especificado na ENVIRONMENT DIVISION, através do SELECT) que acusa o sucesso ou o insucesso da operação.
Qualquer valor movido para a STATUS KEY diferente de zeros, revela que a execução não foi bem sucedida.
	
	Alguns exemplos de operações de I/O que podem ser testadas o FILE STATUS:
· OPEN
· START
· WRITE
· READ
· REWRITE
· CLOSE
Exemplo:
IDENTIFICATION DIVISION.
.............
ENVIRONMENT DIVISION.
............
SELECT 
ARQ-IN
ASSING 
TO 
UT-S-ENTRADA
FILE STATUS
IS
WS-ARQ-IN.
SELECT 
ARQ-OUT
ASSING 
TO 
UT-S-SAIDA
FILE STATUS
IS
WS-ARQ-OUT.
..........
WORKING-STORAGE SECTION.
......
77
WS-ARQ-IN
PIC X(02).
77
WS-ARQ-OUT
PIC X(02).
77
WS-OPERACAO
PIC X(05).
77
WS-FILE-STATUS
PIC X(02).
77
WS-ARQUIVO
PIC X(07).
77 WS-FIM
PIC X(01) VALUE ‘N’.
........
PROCEDURE DIVISION.
PERFORM INICIO
PERFORM PROCESSA UNTIL WS-FIM EQUAL ‘S’
PERFORM FINAL.
INICIO SECTION.
OPEN INPUT 
ARQ-IN
 OUTPUT ARQ-OUT.
IF WS-ARQ-IN
NOT EQUAL
‘00’
 MOVE ‘OPEN’ 
TO WS-OPERACAO
 MOVE WS-ARQ-IN 
TO WS-FILE-STATUS
 MOVE ‘ARQ-IN’ 
TO WS-ARQUIVO
 GO TO DISPLAY-ERROS.
IF WS-ARQ-OUT
NOT EQUAL
‘00’
 MOVE ‘OPEN’ 
TO WS-OPERACAO
 MOVE WS-ARQ-OUT 
TO WS-FILE-STATUS
 MOVE ‘ARQ-OUT’ 
TO WS-ARQUIVO
 GO TO DISPLAY-ERROS.
FIM-INICIO. 
EXIT.
PROCESSA SECTION.
READ ARQ-IN.
IF 
WS-ARQ-IN EQUAL ‘10’
MOVE ‘S’ TO WS-FIM
GO
 TO FIM-PROCESSA
ELSE
IF 
WS-ARQ-IN NOT EQUAL ‘00’
 
MOVE ‘READ’ 
TO WS-OPERACAO
 
MOVE WS-ARQ-INT 
TO WS-FILE-STATUS
 
MOVE ‘ARQ-IN’ 
TO WS-ARQUIVO
 
GO TO DISPLAY-ERROS.
.............
WRITE REG-OUT.
IF WS-ARQ-OUT
NOT EQUAL
‘00’MOVE ‘WRITE’ 
TO WS-OPERACAO
 MOVE WS-ARQ-OUT 
TO WS-FILE-STATUS
 MOVE ‘ARQ-OUT’ 
TO WS-ARQUIVO
 GO TO DISPLAY-ERROS.
FIM-PROCESSA.
EXIT.
DISPLAY-ERROS SECTION.
DISPLAY ‘* ERRO ‘ WS-OPERACAO ‘ ‘ WS-ARQUIVO
DISPLAY ‘* FILE STATUS = ‘ WS-FILE-STATUS
STOP RUN.
FIM-DISPLAYS-ERROS. 
EXIT.
	
	É aconselhável que se teste a STATUS KEY após cada operação de I/O. 
Se um valor diferente de zero for encontrado, o correto será terminar o programa e corrigir o erro. Se outra medida for tomada, é provável que ocorra um abend em uma outra instrução.
11.9.1 Alguns insucessos em operações de I/O
1) FILE STATUS = 90
DD STATEMENT MISSING (PARA ARQUIVO)
2) FILE STATUS = 92
READ APOS AT END
READ ANTES DO OPEN – FILE STATUS 92 NA LEITURA
WRITE ANTES DO OPEN
OPEN COM INPUT PARA ARQUIVO DE OUTPUT
OPEN COM OUTPUT PARA ARQUIVO DE INPUT – FILE STATUS 92 NA LEITURA.
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
12. Exercícios
12.1 Programa 1
12.1.1 Nome do programa 
EXERC001
12.1.2 Arquivos utilizados neste programa:
Entrada = CADASTRO e MOVIMENTO
Saída = CADATU e RELINCL
12.1.3 Layout dos arquivos
Arquivo CADASTRO, MOVIMENTO e CADATU – tamanho de 60 bytes:
 Numérico Numérico Alfanum. Alfanumérico Num. Compactado
 Tam. 04 Tam. 06 Tam. 01 Tam. 40 Tam. 15 inteiros, 
 2 decimais, com sinal 
 
Relatório RELINCL:
12.1.4 Procedimentos:
1) Ler os arquivos de entrada CADASTRO e MOVIMENTO.
2) Processar até o final dos arquivos de entrada
2.1) Efetuar comparação das chaves (AGENCIA, CONTA e DÍGITO)
Se existir registro correspondente no CADASTRO e no MOVIMENTO
Mover o VALOR do MOVIMENTO no CADASTRO
Gravar CADATU com base no CADASTRO
Senão
Se existir apenas o registro no CADASTRO
Gravar CADATU com base no CADASTRO
Senão
Se existir apenas o registro no MOVIMENTO
Gravar CADATU com base no MOVIMENTO
Imprimir registro MOVIMENTO no relatório de incluídos (RELINCL).
3) A data do relatório é a data recebida no parm, no formato DD/MM/AAAA.
divisões
seções
parágrafos
sentenças
comandos cláusulas
CADASTRO
MOVI
MENTO
EXERC001
PARM
DD/MM/AAAA
CAD
ATU
RELINCL
AGENCIA CONTA DÍGITO NOME VALOR
_1377421586.bin
_1377421602.bin
_1377421611.bin
_1377421615.bin
_1377421619.bin
_1377421621.bin
_1377421623.bin
_1377421624.bin
_1377421622.bin
_1377421620.bin
_1377421617.bin
_1377421618.bin
_1377421616.bin
_1377421613.bin
_1377421614.bin
_1377421612.bin
_1377421606.bin
_1377421608.bin
_1377421610.bin
_1377421607.bin
_1377421604.bin
_1377421605.bin
_1377421603.bin
_1377421594.bin
_1377421598.bin
_1377421600.bin
_1377421601.bin
_1377421599.bin
_1377421596.bin
_1377421597.bin
_1377421595.bin
_1377421590.bin
_1377421592.bin
_1377421593.bin
_1377421591.bin
_1377421588.bin
_1377421589.bin
_1377421587.bin
_1377421569.bin
_1377421577.bin
_1377421582.bin
_1377421584.bin
_1377421585.bin
_1377421583.bin
_1377421580.bin
_1377421581.bin
_1377421579.bin
_1377421573.bin
_1377421575.bin
_1377421576.bin
_1377421574.bin
_1377421571.bin
_1377421572.bin
_1377421570.bin
_1377421561.bin
_1377421565.bin
_1377421567.bin
_1377421568.bin
_1377421566.bin
_1377421563.bin
_1377421564.bin
_1377421562.bin
_1377421557.bin
_1377421559.bin
_1377421560.bin
_1377421558.bin
_1377421555.bin
_1377421556.bin
_1377421554.bin

Mais conteúdos dessa disciplina