Você está na página 1de 23

EasyTrieve

Manual rápido de
referência

Conceitos..........................................................................................................................................................................3
Estrutura de um programa em EASYTRIEVE................................................................................................................3
Regras gerais para os statements .....................................................................................................................................5
Expressão.........................................................................................................................................................................6
Declaração De Dados – Áreas De I/O ............................................................................................................................6
Declaração De Dados – Áreas De Work .........................................................................................................................7
Variáveis Easytrieve; Pegar Parm Do Exec.....................................................................................................................8
Componentes de um relatório........................................................................................................................................10
Comandos......................................................................................................................................................................10
Tabelas : declaração e referência no processamento ....................................................................................................20
Dicas gerais : problemas mais comuns e outros tópicos................................................................................................21
QUICK REFERENCE...................................................................................................................................................23
2
EASYTRIEVE
3
EASYTRIEVE

Conceitos

EASYTRIEVE é uma linguagem de programação, com recursos para acesso a arquivos e bases de
dados, com comandos que trazem bastante facilidade principalmente para a geração de relatórios.

Estrutura de um programa em EASYTRIEVE

A estrutura básica de um programa em EASYTRIEVE é composta de statements para :


• PARM para indicar condições de processamento ao EASYTRIEVE (opcional)
• declaração de arquivos (opcional)
• declaração de variáveis (opcional)
• declaração dos procedimentos (obrigatório); os blocos de procedimentos (ATIVIDADES) são
delimitados a cada JOB ou SORT

Um programa com n atividades :


PARM
declaração arquivos
declaração variáveis
atividade 1
[atividade 2]
.
.
.
.
.
[atividade n]

Um programa com uma atividade (JOB) :

PARM
declaração arquivos
declaração variáveis
JOB .....
.
.
.
.
.

Um programa com uma atividade e todas as declarações possíveis para um REPORT :

PARM ...
declaração arquivos ...
declaração variáveis ...
4
EASYTRIEVE

JOB..... AFTER-LINE. PROC


... ...
. END-PROC
*---------------------- *----------------------
REPORT BEFORE-BREAK. PROC
SEQUENCE ...
CONTROL END-PROC
SUM *------------------
TITLE AFTER-BREAK. PROC
HEADING ...
LINE END-PROC
*------------------ *------------------
REPORT-INPUT. PROC ENDPAGE. PROC
... ...
END-PROC END-PROC
*------------------ *------------------
BEFORE-LINE. PROC TERMINATION. PROC
... ...
END-PROC END-PROC
*------------------ *------------------
EASYTRIEVE

Regras gerais para os statements

• o padrão é o statement estar desde a posição 1 até a 80 (pode ser mudado via parâmetro
SCANCOL de instalação)
• o padrão para comentários é o primeiro caráter não-branco do statement ser um asterisco (*)
• pode haver mais de um statement por linha; para isso, encerrar cada statement com um ponto
• para continuar um statement na próxima linha, uma linha deve ter um “+” ou um “-“ como
último caráter não-branco;
• o “+” indica que a continuação na linha seguinte começa a partir do primeiro caráter
não-branco;
• o “-” indica que a continuação na linha seguinte começa a partir da primeira
posição;
• literais devem ser colocadas entre apóstrofes
• o uso da vírgula fora de literais é opcional, usado somente para efeito de melhor visibilidade do
texto
• para qualificação de arquivos, registros e campos, se necessário, usar dois pontos “:”
• nomes de campos podem ter no máximo 40 caracteres, e podem ter caracteres alfabéticos (A a
Z), dígitos (0 a 9), e qualquer caráter especial exceto os delimitadores (espaço, apóstrofe, ponto,
vírgula, abre parênteses, fecha parênteses e dois pontos
• nomes de procedimentos e REPORTS não podem ter somente dígitos
• para fazer referência a dados em hexadecimal, usar X’nn....’, sendo nn... dígitos hexadecimais
(0 a 9, e A a F)
• operadores aritméticos ( “+” , “-“, “*” e “/” ) devem ter pelo menos um espaço antes e um
depois)
Expressão

Uma expressão é utilizada para indicar um conjunto de operações entre literais e variáveis.
As operações são : + (soma) – (subtração) * (multiplicação) e / (divisão)

A ordem de resolução segue os padrões matemáticos. Podem ser utilizados parênteses para
priorizar as operações. Exemplos :

SALARIO * 0.5 + 10.00


AL-QTDD / 100
DESPREZADOS + 1

Em geral, as expressões são utilizadas para que o resultado do cálculo seja colocado (atribuido)
numa variável receptora.

Declaração De Dados – Áreas De I/O

A declaração de variáveis é feita através do DEFINE. Observar que a própria keyword DEFINE é
opcional, caso a declaração seja feita após a declaração de arquivos. Sintaxe :

[DEFINE] [nome-arquivo:]nome-campo posição-inicial tamanho formato [decimais] outros-atributos

Posição inicial = pode ser especificada de uma das seguintes maneiras :

inteiro1 indica a posição inicial (relativa a 1) do campo dentro da área que o


contém.
* indica que a posição inicial é a próxima disponível após a última
declaração
* +inteiro2 indica que a posição inicial é n bytes após a próxima disponível após a
última declaração, sendo n indicado através de inteiro2
nome-campo +inteiro3 indica que a posição inicial é n bytes após a o campo referenciado através
do nome, sendo n indicado através de inteiro2

Tamanho = indica o tamanho, EM BYTES, do campo sendo definido

Formato = indica o formato dos dados no campo :

A alfanumérico.
N numérico decimal zonado. Máximo 16 bytes
P numérico decimal compactado (com sinal). Máximo 16 bytes
U numérico decimal compactado (sem sinal).
B numérico binário. Máximo 4 bytes.
Se especificado decimais, tem bit de sinal
Se não especificado decimais, não tem bit de sinal

Decimais = indica a quantidade de casas decimais a considerar para o número contido

Outros atributos :
HEADING = indica a(s) literal(is) a ser(em) utilizada(s) nas linhas de cabeçalho que
identificam os campos listados.
Sintaxe : HEADING (literal1 [literal2] ... [literaln])
Cada literal será colocada numa linha de cabeçalho.

MASK = indica a máscara de edição para campos numéricos a listar.


Sintaxe :
MASK BWZ (blank when zero) ou
MASK HEX (para exibir em formato hexadecimal) ou
MASK (máscara)
A máscara pode ter Z’s e 9’s, ponto(s) (separador de visualização) e vírgula (separador
decimal), além dos caracteres especiais desejados.

Outra forma de declaração é :

[DEFINE] [nome-arquivo:] [nome-campo] posição-inicial [nome-arquivo2:]nome-campo2

Neste caso, o tamnho, o formato e as decimais de nome-campo


serão as mesmas de [nome-arquivo2:]nome-campo2

Declaração De Dados – Áreas De Work

Declaração de área que NÃO é sub-divisão de outra área.

[DEFINE] nome-campo W tamanho formato [decimais] outros-atributos

W = indica área de work (trabalho), não vinculada a área de I/O.


Tamanho = indica o tamanho, EM BYTES, do campo sendo definido
Formato = idem áreas de I/O
Decimais = indica a quantidade de casas decimais a considerar para o número contido
Outros atributos : HEADING , MASK (idem áreas de I/O)

Declaração de área que é sub-divisão de outra área.

[DEFINE] [nome-arquivo:]nome-campo posição-inicial tamanho formato [decimais] outros-atributos

Posição inicial = pode ser especificada de uma das seguintes maneiras : idem áreas de I/O
Tamanho = indica o tamanho, EM BYTES, do campo sendo definido
Formato = idem áreas de I/O
Decimais = indica a quantidade de casas decimais a considerar para o número contido
Outros atributos : HEADING , MASK (idem áreas de I/O)
VALUE = indica o conteúdo inicial do campo. Assume zero para campos numéricos
e brancos para alfanuméricos
RESET = indica que o conteúdo inicial deve ser restaurado a cada execução de um
comando JOB ou SORT
Variáveis Easytrieve; Pegar Parm Do Exec

SYSDATE = campo alfanumérico de 8 bytes com a data do dia (AA/MM/DD)

SYSTIME = campo alfanumérico de 8 bytes (HH.MM.SS – ver Características de instalação)

PARM-REGISTER = campo numérico binário de 4 bytes que contém o conteúdo do registrador 1


quando da entrada da execução do Easytrieve. O registrador 1 contém o endereço de uma lista de
parâmetros fornecida através do PARM do EXEC. Deve ser usado através da chamada da subrotina
EZTPX01 (ver Uso de PARM no cartão EXEC).

RETURN-CODE = campo numérico binário de 4 bytes cujo conteúdo é retornado ao sistema


operacional ao término da execução do Easytrieve, para poder ser testado via COND.

RECORD-LENGTH = campo numérico binário de 2 bytes cujo conteúdo é colocado pelo Easy, e é
o tamanho do registro lógico processado.

RECORD-COUNT = campo numérico binário de 4 bytes cujo conteúdo é colocado pelo Easy, e é o
número sequencial do registro dentro do arquivo.

FILE-STATUS = campo com o file-status de um arquivo VSAM, cujo conteúdo é colocado pelo
Easy e indica o resultado da última operação de I/O efetuada para o arquivo.
Os file-status retornados são :

00 = OK
04 = EOF no GET
08 = DUP KEY no PUT ou WRITE
12 = KEY fora de sequência no PUT
16 = RECORD NOT FOUND no READ
128 = falta DD no JCL para o arquivo

LEVEL = campo numérico que indica qual quebra está sendo processada (detalhes e exemplos
adiante, no capítulo referente a relatórios).

TALLY = campo numérico cujo conteúdo é a quantidade de registros utilizados para a obtenção de
um total.

Exemplo - Utilização de variáveis Easytrieve; pegar PARM do EXEC

*--------------------------------------------------
* DECLARACAO DE ARQUIVOS E RESPECTIVAS AREAS DE I/O
*--------------------------------------------------
FILE RELAT PRINTER
FILE ENTRA VS
AL 1 80 A
AL-NOME 1 15 A
AL-DATA 16 08 N
AL-SALDO 24 10 N 2
*--------------------------------------------------
* DECLARACAO DE VARIAVEIS DE TRABALHO
*--------------------------------------------------
WLL W 7 N
PARMVEIO W 32 A
PARMLEN PARMVEIO 2 B
PARMTXT PARMVEIO +2 30 A
*--------------------------------------------------
* DECLARACAO DE PROCEDIMENTOS
*--------------------------------------------------
*-------------
* ROTINA PRINCIPAL
*-------------
JOB INPUT ENTRA START ANTESDETUDO FINISH DEPOISDETUDO
WLL = WLL + 1
DISPLAY '* DISPLAY DO REGISTRO - INICIO *****'
DISPLAY 'FILE-STATUS = ' ENTRA:FILE-STATUS
DISPLAY 'RECORD-LENGTH = ' ENTRA:RECORD-LENGTH
DISPLAY 'RECORD-COUNT = ' ENTRA:RECORD-COUNT
DISPLAY '* DISPLAY DO REGISTRO - FIM ********'
PRINT SYSREL
GO TO JOB
*-------------
* ROTINA DE INICIALIZACAO
*-------------
ANTESDETUDO. PROC
CALL EZTPX01 USING (PARM-REGISTER, PARMVEIO)
DISPLAY '************************************'
DISPLAY 'PARMLEN= ' PARMLEN
DISPLAY 'PARMTXT=/' PARMTXT '/'
DISPLAY 'SYSDATE= ' SYSDATE
DISPLAY HEX SYSDATE
DISPLAY 'SYSTIME= ' SYSTIME
DISPLAY HEX SYSTIME
DISPLAY '************************************'
END-PROC
*-------------
* ROTINA DE FINALIZACAO
*-------------
DEPOISDETUDO. PROC
DISPLAY '************************************'
DISPLAY '* FINAL ****************************'
DISPLAY '************************************'
IF WLL EQ 0
RETURN-CODE = 0
ELSE
RETURN-CODE = 4
END-IF
END-PROC
*-------------
* DECLARACAO DO RELATORIO
*-------------
REPORT SYSREL PRINTER RELAT NOADJUST
CONTROL FINAL
TITLE 1 ' PROGRAMA EXEMPLO 016'
LINE 1 TALLY AL-NOME AL-DATA AL-SALDO
* FIM **************************************************
Componentes de um relatório

Os componentes de um relatório podem ser exemplificados da seguinte forma :

régua para simples referência


literal controlada
data controlada por NODATE pelo PARM PAGEWRD
.... 1 1
1 2 3 4 5 .... 2 3
123456789012345678901234567890123456789012345678901....90123456789012

18/05/01 PROGRAMA EXEMPLO 001 .... PAGINA 1

AL-NOME AL-DATA AL-SALDO

ALBERTO 19880229 ,01


ZIGOMAR 20010530 ,10
MAFALDA 20001015 1,00
VALDICE 19991223 10,00

11,11

linha de total (controlada pelo CONTROL)

linhas de detalhe (controlada pelo(s) LINE(s)

linha (de cabeçalho) identificadora dos campos (controlada pelos HEADING’s)

linha de cabeçalho (controlada pelo(s) TITLE(s))

Comandos

Atribuição variavelreceptora [INTEGER] [ | ROUNDED | TRUNCATED | ] =


| variavel | literal | expressao |
(cópia /
movimento) ou

variavelreceptora [INTEGER] [ | ROUNDED | TRUNCATED | ] EQ


| variavel | literal | expressao |

ou

variavelreceptora = variavel | AND | OR | XOR | | variavel | literal |

sendo

INTEGER = despreza a parte decimal do campo emissor


ROUNDED = soma 5 ao último algarismo decimal significativo (ex. 10.75 é movido como 10.8)
TRUNCATED = trunca os algarismos à direita da parte decimal e/ou os algarismos à esquerda da
parte inteira.
Exemplos :

ADICIONAL = SALARIO * 0.5 + 10.00


UMPORCENTO = AL-QTDD / 100
DESPREZADOS = DESPREZADOS + 1
SUBTOTAL = 0

Uma outra forma de atribuição é através dos comandos MOVE e MOVE LIKE.

MOVE | arquivo1 | registro1 | campo1 | literal1 | [ | campo3 | literal3 | ]


TO
| arquivo2 | registro2 | campo2 | [ campo4 | literal4 ] [FILL literal5]
ou

MOVE | SPACE | SPACES | ZERO | ZEROS | ZEROES | TO nome-campo

sendo :

nome-arquivo1 = nome do arquivo cuja area de I/O será a emissora do movimento


nome-registro1 = nome da area de I/O que será a emissora no movimento
nome-campo1 = campo emissor
literal1 = campo emissor

nome-arquivo2 = nome do arquivo cuja area de I/O será a receptora do movimento


nome-registro2 = nome da area de I/O que será a receptora no movimento
nome-campo2 = campo receptor

nome-campo3 = variável com um número que indica a quantidade de bytes no campo emissor
literal3 = literal numérica que indica a quantidade de bytes no campo emissor

nome-campo4 = variável com um número que indica a quantidade de bytes no campo receptor
literal4 = literal numérica que indica a quantidade de bytes no campo receptor

literal5 = literal que indica o preenchimento a ser efetuado caso o tamanho do campo receptor seja
maior que o tamanho do campo emissor.

MOVE LIKE | nome-arq1 | nome-reg1 | TO | nome-arq2 | nome-reg2 |

Os campos cujos nomes forem iguais tanto nos campos emissores quanto nos receptores serão
movidos. Na sintaxe, temos :

nome-arq1 = nome do arquivo cuja area de I/O será a emissora do movimento


nome-reg1 = nome do campo (área de I/O de arquivo) cujas areas serão as emissoras do movimento
nome-arq2 = nome do arquivo cuja area de I/O será a receptora do movimento
nome-reg2 = nome do campo (área de I/O de arquivo) cujas áreas serão as receptoras do movimento

Exemplo :

FILE ENTRA
REG-ENTRA 1 80 A
COD-CLI 1 5 N
COD-AREA 6 3 A
NOME-CLI 9 30 A
SALDO 39 9 N 2
FILE SAI
REG-SAI 1 80 A
COD-CLI 1 5 N
COD-AREA 6 3 A
NOME-CLI 9 30 A
VALOR 39 9 N 2
.
.
MOVE LIKE ENTRA TO SAI ou
MOVE LIKE REG-ENTRA TO REG-SAI

Os campos COD-CLI, COD-AREA e NOME-CLI do arquivo ENTRA serão movidos para os campos
COD-CLI, COD-AREA e NOME-CLI do arquivo SAI.

CALL Através do comando CALL pode-se chamar para execução uma sub-rotina, mesmo desenvolvida em
outra linguagem, desde que siga as linkage conventions.

Sintaxe :

CALL nomerotina [ USING |campo1|literal| [|campo2|literal|] ... ] +


[ RETURNS nome-campo ]

Os nomes de campo e/ou literais indicam os parâmetros que são passados PARA a sub-rotina.

O nome do campo em RETURNS indica um campo numérico que deve receber um return-code DA
sub-rotina.

CASE CASE nome-campo


WHEN literal [THRU] literal
.
.
.
[ WHEN literal [THRU] literal
.
.
.]
[ OTHERWISE
.
.]
END-CASE
DISPLAY DISPLAY | lit1 | var1 | [ | lit2 | var2 | ] ... [ | litn | varn | ]
Exibe o conteúdo da(s) variável(eis) e/ou literal(is) especificada(s).

DISPLAY [HEX] nome-relatorio | lit1 | var1 | [ ... | litn | varn


| ]
Para exibir constantes e/ou variáveis na SYSPRINT ou outro DD. Sintaxe :
Se nome do relatório for omitido, será assumida impressão no DD SYSPRINT.
Se for especificado, colocar o nome declarado na cláusula FILE.
Exemplos :

DISPLAY ‘REG DELETADOS = ‘ CONT-DEL


DISPLAY ‘ERRO ! PGM CANCELADO.’
DISPLAY HEX REG-CTL
DISPLAY RELVEND ‘******* FIM *********’
DISPLAY CADCLI:FILE-STATUS

DO DO WHILE condição
END-DO (primeiro testa a condição depois, se verdadeira, executa)
...
END-DO
Ou

DO UNTIL condição
(primeiro executa e depois testa a condição)
...
END-DO

A condição pode ser especificada da mesma forma como no comando IF.


Os blocos de DO / END-DO podem ser aninhados (nested); a indentação não é obrigatória, apesar de
facilitar a visualização :

DO WHILE condição
.
.
DO UNTIL condição
.
.
DO WHILE
.
.
END-DO
.
END-DO
.
.
DO WHILE condição
.
END-DO
.
.
END-DO

FILE FILE nome-arquivo [ | PRINTER | VS | ]


Declara um arquivo.
Se for para relatorio, declarar FILE nome-arquivo PRINTER
Se for arquivo em disco sequencial, declarar FILE nome-arquivo.
Se for arquivo em disco VSAM, declarar FILE nome-arquivo VS

GET GET nome-arquivo [STATUS]


Para efetuar a leitura sequencial de um registro lógico, em arquivos SAM ou VSAM.
STATUS aplica-se somente para arquivos VSAM.
Status 4 = EOF; Status 8 = existem registros com mesma chave em índice alternado

GO TO GO TO nome-instrução
Os pontos de uma atividade, onde há comandos a executar, podem ser identificados através de um
nome.

Para IDENTIFICAR uma instrução, basta atribuir um nome no local onde ela se encontra.

Se a referência é para executar um desvio, via GO TO, a identificação é somente o nome da instrução.

Se a referência é para a execução de uma sub-rotina (chamada ou referenciada através de PERFORM,


DO, START, FINISH, a identificação deve ser acrescida de PROC.

O comando GO TO desvia para a instrução identificada através do nome indicado.

IF, ELSE, IF condição


ELSE-IF, comandos se condição satisfeita
END-IF END-IF
ou

IF condição
comandos se condição satisfeita
ELSE
comandos se condição não satisfeita
END-IF

ou

IF condição
comandos se condição satisfeita
ELSE-IF condição
comandos se condição satisfeita
[ELSE-IF condição
comandos se condição satisfeita
ELSE-IF condição
comandos se condição satisfeita]
ELSE
comandos se nenhuma condição satisfeita
END-IF

Os IF’s podem ser aninhados (nested), devendo haver pares correspondentes de IF’s e
respectivos END-IF’s; a indentação não é obrigatória, apesar de facilitar a visualização
:
IF condição
(satisfeita)
IF condição
comandos se condição satisfeita
END-IF
ELSE
(não satisfeita)
IF condição
comandos se condição satisfeita
ELSE
comandos se condição não satisfeita
END-IF
END-IF

A condição pode ser especificada da seguinte forma :

• Relacionamento de campos
• Classes de campos
• Série de campos
• Bits de campos
• Presença de arquivos
• Presença de série de arquivos
• Relacionamento de registros

RELACIONAMENTO DE CAMPOS

Testa como o conteúdo de um campo é em relação ao conteúdo de outro campo. Sintaxe :

IF campo |EQ|=|NE|NQ|¬=|LT|LS|<|LE|LQ|<=|GT|GR|>|GE|GQ|>=|
|campo|literal|expressão|
Sendo :
EQ ou = equal (igual)
NE ou NQ ou ¬= not equal (não igual / diferente)
LT ou LS ou < less than (menor que)
LE ou LQ ou <= less or equal (menor ou igual que)
GT ou GR ou > greater than (maior que)
GE ou GQ ou >= greater or equal (maior ou igual)

CLASSES DE CAMPOS

Testa se um campo tem determinada característica ou não. Sintaxe :

IF campo |NOT| classe

classe podendo ser :

ALPHABETIC
NUMERIC
SPACE
SPACES
ZERO
ZEROS
ZEROES

Exemplos :

IF DATA-NASC NOT NUMERIC ...


IF NOME-CLI NOT ALPHABETIC ...
IF SALDO ZERO ...

SÉRIE DE CAMPOS

Testa se campo1 está ou não dentro dos limites de uma série delimitada por desde e até, cada qual
podendo ser especificado através de uma literal numérica ou alfanumérica, ou outra variável. Sintaxe:

IF campo1 |EQ|=|NE|NQ|¬=| desde THRU até

Exemplos :

IF ANO-NASC EQ 1890 THRU 1990 ...


IF COD-PROD NE 001 thru 870 ...

BITS DE CAMPOS

Testa se bit(s) de um campo está(ão) ou não ligado(s). Sintaxe :

IF campo [NOT] |ON|OFF| |campo|literalhexa|

Exemplos :

IF ULTDIGANO ON X‘01’ ...


IF BIT4567DOBYTE ON X‘0F’ ...
IF ULTDIGNRO OFF X’01’ ...

PRESENÇA DE ARQUIVOS

Testa se um registro do arquivo em referência está ou não disponível para processamento. Sintaxe :

IF [NOT] [EOF] |nome-arquivo|PRIMARY|SECONDARY|


PRESENÇA DE SÉRIE DE ARQUIVOS

Testa se registro(s) do arquivo tem correspondente em outro ou não. Sintaxe :

IF [NOT] MATCHED |nome-arquivo|PRIMARY|SECONDARY|

RELACIONAMENTO DE ARQUIVOS

Testa se registro(s) do arquivo tem duplicidade (ou qual duplicidade) em outro ou não. Sintaxe :

IF [NOT] |DUPLICATE|FIRST-DUP|LAST-DUP| |nome-arq|PRIMARY|SECONDARY|

JOB Na estrutura de um programa em Easytrieve, o que caracteriza a parte de procedimentos é um


conjunto de ATIVIDADES (muitas vezes é uma única atividade).

Cada atividade é declarada através de um statement JOB ou um statement SORT.

JOB [START nome-proc1] [FINISH nome-proc2] [NAME nome-job]


O statement JOB sem a especificação de INPUT faz o Easy assumir como INPUT o primeiro FILE
que não seja PRINTER definido.

JOB INPUT NULL [START nome-proc1] [FINISH nome-proc2] [NAME nome-


job]
O statement JOB com a especificação de INPUT NULL indica ao Easy que não há arquivo de entrada
a ser lido automaticamente por ele.

JOB INPUT nome-arquivo [START nome-proc1] [FINISH nome-proc2] +


[NAME nome-job]
O statement JOB com a especificação de INPUT com nome-de-arquivo indica ao Easy que o arquivo
de entrada a ser lido automaticamente por ele é aquele cujo nome está especificado.
A cláusula START indica o nome de uma procedure (PROC) que deve ser executada ANTES do
início da leitura do arquivo.
A cláusula FINISH indica o nome de uma procedure (PROC) que deve ser executada APÓS a leitura
automática de todo o arquivo, antes de encerrar a atividade.
A cláusula NAME dá nome à atividade JOB (somente para documentação).

PERFORM O comando PERFORM executa uma procedure (ou rotina) : desvia para seu início (instrução
identificada por uma nome, seguido de PROC), executa as instruções até o final da rotina (identificado
com END-PROC) e volta para a instrução subsequente ao PERFORM. Sintaxe :

PERFORM nome-rotina

Os nomes referenciados no START e/ou no FINISH devem ser de rotinas delimitadas por PROC e
END-PROC.

POINT Para efetuar o posicionamento de um arquivo VSAM num determinado ponto de seus registros.
IMPORTANTE : o registro somente fica disponível após o GET subsequente feito com sucesso (ou
uma leitura automática via JOB INPUT).

POINT nome-arquivo |=|EQ|GE|GQ|>=| |campo|literal| [STATUS]

PRINT Imprime linha(s) de detalhe, conforme especificado na(s) declaração(ões) LINE do REPORT.

PRINT nome-relatorio

PUT Para efetuar a gravação sequencial de um registro lógico em arquivos SAM ou VSAM.
FROM indica de qual arquivo ou área de I/O o registro a ser gravado deve ser copiado.
STATUS aplica-se somente para arquivos VSAM.
Status 8 = chave duplicada; Status 12 = chave fora de sequência

PUT nome-arquivo [ FROM | nome-arquivo | nome-reg | ] [STATUS]

READ Para efetuar a leitura aleatória (“randômica”) de um registro lógico em um arquivo VSAM.
Status 16 = registro não localizado

READ nome-arquivo KEY |campo|literal-alfa| [STATUS]

REPORT Faz a declaração das características de um relatório, como por exemplo : linha(s) de cabeçalho,
linha(s) de detalhe, linha(s) de total, sequencia, etc...

REPORT nome-relatório [cláusulas do REPORT] [statements complementares]

simplificadamente :

REPORT nome-relatorio PRINTER nome-arquivo

Cláusulas do REPORT

nome-relatorio nome para referência no PRINT ou DISPLAY. Pode haver n relatórios


para cada FILE (DD)
DTLCTL |EVERY|FIRST|NONE| indica características das linhas de detalhe.
EVERY indica que o conteúdo dos campos de controle deve ser impresso em todas as linhas de
detalhe
FIRST indica que o conteúdo dos campos de contrile deve ser impresso sempre na primeira linha
de detalhe de cada págian , e na primeira linha após cada quebra de controle.
NONE indica que os campos de controle não devem ser impressos nas linhas de detalhe.

EVERY literal indica que deve ser impressa somente 1 linha a cada n PRINTs.
Se especificar EVERY 10 e forem dados 1000 PRINTs para 1000 re-
gistros de um arquivo, somente os registros 10, 20, 30 ... serão impressos
FILE nome-arquivo Indica nome do arq p/ relatórios mto grandes (o VFM é insuficiente)
LIMIT literal indica o número máximo de registros a processar no relatório
LINESIZE literal Modifica o tamanho máximo, em bytes, das linhas.
NOADJUST Vai colocando os dados nas linhas de detalhe da esquerda para a direita.
Se omitido, centraliza na linha.
NODATE Faz com que NÃO seja impressa a data do dia na primeira linha de cabeçalho
NOHEADING Faz com que NÃO seja(m) impressa(s) a(s) linha(s) de cabeçalho
identificadora(s) d(s) campo(s)
NOPAGE Faz com que NÃO sejam impressas a constante identificadora de página,
e o número da página, nas linhas de cabeçalho
NOSPREAD Indica para não espalhar os dados por toda a linha (junta-los pela esquerda)
PAGESIZE literal1 literal2 Modifica o tamanho máximo, em linhas, da página.
literal1 aplica-se às linhas de LINE
literal2 aplica-se aos DISPLAYS
PRINTER nome-arquivo Indica o nome do FILE a ser utilizado por este REPORT
SKIP literal Indica o número de linhas em branco entre um PRINT e outro (entre um
LINE nn e o próximo LINE 01
SPACE literal Coloca tantos espaços em branco entre um campo e outro, quanto
especificado na literal. Assume 3.
SPREAD Indica para espalhar os dados por toda a linha de detalhe
SUMCTL ([x] [y]) Indica características das linhas de total.
x pode ser :
ALL = campos de controle devem ser impressos em todas as linhas de total
HIAR = imprimir somente os campos de controle de mesmo nível, ou de nível mais alto
NONE = não imprimir campos de controle nas linhas de total
TAG = deve ser impresso o nome do campo de total à esquerda da linha de total (deve haver
espaço suficiente)
y pode ser :
DTLCOPY = imprimir variáveis de detalhe nas linhas de total, se LEVEL=1
DTLCOPYALL = idem, para todos os LEVEL
SUMMARY devem ser impressos somente os totais especificados na cláusula CONTROL
SUMSPACE literal indica o tamanho para impressão dos campos de total. O nro especificado
através da literal é somado ao tamanho (em dígitos) do campo para
determinar o tamanho do campo de total (máximo possível resultante = 18)
TALLYSIZE Indica tamanho do TALLY do relatório (existe um TALLY para cada REPORT)
TITLESKIP literal Indica o número de linhas em branco entre a última linha de cabeçalho
Geral e a primeira de cabeçalho identificador dos campos

Statements complementares ao REPORT

SEQUENCE para indicar a sequência de impressão das linhas de detalhe. Sintaxe:


SEQUENCE campo1 [D] campo2 [D] ...
Indica a ordem (campo ou campos chave) com que as linhas devem ser impressas.
Especificar D se a sequência for decrescente (o default é crescente).

CONTROL para indicar os campos de controle de quebra. Sintaxe:


CONTROL | campo1 [D] campo2 [D] ... | FINAL |
| NEWPAGE | RENUM |
NOPRINT
Indica em qual(is) quebra(s) deve(m) ser impressa(s) a(s) linha(s) de total.
Se algum campo for especificado, a linha de total final também será impressa.
FINAL indica para imprimir só a linha de total final.

SUM para indicar os campos a totalizar. Sintaxe:


SUM campo1 [campo2 ... campon]
Indica quais os campos numéricos que devem ser totalizados. Devem ter especificação da
Quantidade de decimais na sua declaração (se necessário, colocar zero; caso contrário, ocorrerá erro
de compilação).

TITLE para declarar as linhas de cabeçalho. Sintaxe:


TITLE nrolin |campo|literal |+nro|-nro| COL nro
Nrolin = número da linha de cabeçalho
|campo|literal| = conteúdo a ser impresso
+nro -nro = o nro especificado é somado ou subtraido do valor de SPACE para
indicar quantos espaços em branco são desejados entre o campo anterior e
o atual
COL nro = indica o número da coluna em que se deseja colocar o próximo campo

HEADING para declarar as constantes identificadoras dos campos listados. Sintaxe:


HEADING campo (‘xxx’ [‘yyy’ ...])
Indica a constante que deve identificar um campo nas linhas de cabeçalho que os identificam.
Cada literal é colocada numa linha.
Pode-se especificar colocando em sequência, ou separadamente, indicando o número da linha.

LINE para declarar as linhas de detalhe. Sintaxe:


LINE nrolin |campo|literal |+nro|-nro| |COL|POS| nro
nrolin = número da linha de cabeçalho
|campo|literal| = conteúdo a ser impresso
+nro -nro = o nro especificado é somado ou subtraido do valor de SPACE para
indicar quantos espaços em branco são desejados entre o campo anterior e
o atual
COL nro = indica o número da coluna em que se deseja colocar o próximo campo
POS nro = indica o número do ítem da LINE 01 na direção do qual o campo sendo
especificado deve ser colocado

procedures para declarar procedimentos que são invocados pelo Easy automaticamente em
eventos relacionados à impressão do relatório. As procedures podem ser :

REPORT-INPUT para selecionar e/ou modificar dados do relatório


BEFORE-LINE para algum procedimento após a linha de detalhe ser montada, antes de ser impressa
AFTER-LINE para algum procedimento após a linha de detalhe impressa
BEFORE-BREAK para algum procedimento após a linha de total ser montada, antes de ser impressa
AFTER-BREAK para algum procedimento após a linha de total ser impressa
ENDPAGE para imprimir linhas de rodapé
TERMINATION para algum procedimento após o término da impressão do relatório

STOP STOP
Termina a execução da atividade (JOB ou SORT).
WRITE
WRITE nome-arquivo [|UPDATE|ADD|] [FROM |nome-arq|campo| ] [STATUS]
Para efetuar a gravação de novos registros, update de registros já existentes, ou delete de um registro
lógico num arquivo VSAM
ou
WRITE nome-arquivo DELETE [STATUS]
Para efetuar o delete (lógico) de um registro num arquivo VSAM.
Status 8 = chave duplicada
Tabelas : declaração e referência no processamento

A utilização de tabelas internas de memória é indicada na declaração das variáveis através da


indicação da quantidade de ocorrências do campo, e, na parte de procedimentos, da indicação de
um índice que indica qual das ocorrências deseja-se referenciar.
A quantidade de ocorrências é indicada através da cláusula OCCURS.
A referência ao indexador é feita colocando-se o nome do campo ou literal numérica que tenham o
número a ser usado para indexar, entre parênteses, após o nome da variável que tenha OCCURS
(ou que seja subordinada a um campo com OCCURS). Exemplo :
TB-MESES W 132 A
TB-1MES TB-MESES 11 A OCCURS 12
TB-CODM TB-1MES 2 N
TB-EXTM TB-1MES +002 9 A
TB-MES01 TB-MESES 11 A VALUE ‘01JANEIRO ’
TB-MES02 TB-MESES +011 11 A VALUE ‘02FEVEREIRO’
TB-MES03 TB-MESES +022 11 A VALUE ‘03MARCO ’
TB-MES04 TB-MESES +033 11 A VALUE ‘04ABRIL ’
TB-MES05 TB-MESES +044 11 A VALUE ‘05MAIO ’
TB-MES06 TB-MESES +055 11 A VALUE ‘06JUNHO ’
TB-MES07 TB-MESES +066 11 A VALUE ‘07JULHO ’
TB-MES08 TB-MESES +077 11 A VALUE ‘08AGOSTO ’
TB-MES09 TB-MESES +088 11 A VALUE ‘09SETEMBRO ’
TB-MES10 TB-MESES +099 11 A VALUE ‘10OUTUBRO ’
TB-MES11 TB-MESES +110 11 A VALUE ‘11NOVEMBRO ’
TB-MES12 TB-MESES +121 11 A VALUE ‘12DEZEMBRO ’
...
WIX = 1
PROXCODMES
IF WIX GT 12
GO TO MESEXTOK
END-IF
IF W-MON NE TB-CODM (WIX)
WIX = WIX + 1
GO TO PROXCODMES
ELSE
WEXTMES = TB-EXTM (WIX)
END-IF
MESEXTOK

Outro exemplo :

TB-MESES W 132 A
TB-1MES TB-MESES 11 A OCCURS 12
TB-CODM TB-1MES 2 N
TB-EXTM TB-1MES +002 9 A
TB-MES01 TB-MESES 11 A VALUE +
‘01JANEIRO 02FEVEREIRO03MARCO 04ABRIL 05MAIO 06JUNHO +
07JULHO 08AGOSTO 09SETEMBRO 10OUTUBRO 11NOVEMBRO 12DEZEMBRO ’
...
WIX = 1
PROXCODMES
IF WIX GT 12
GO TO MESEXTOK
END-IF
IF W-MON NE TB-CODM (WIX)
WIX = WIX + 1
GO TO PROXCODMES
ELSE
WEXTMES = TB-EXTM (WIX)
END-IF
MESEXTOK
Dicas gerais : problemas mais comuns e outros tópicos

a) Resultados de acumulação aparentemente errados


Campos W tem o conteúdo colocado como está em tempo de PRINT.
Campos S tem o conteúdo colocado como está o último conteúdo.

b) Campos não são totalizados


Só totaliza campos que tenham número de decimais especificado (se necessário, colocar zero).

c) Uso de TALLY não aceito; TALLY para sumarizar


TALLY só pode ser especificado se tiver CONTROL.

d) Trocar sinal de um campo compactado ou zonado


Às vezes, temos um campo positivo com sinal F, mas precisamos que seja C, ou vice-versa.
Para efetuar o teste e eventual troca, podemos fazer conforme o exemplo a seguir.
WNROZONADO W 5 N MASK HEX
WNROZULTDIR WNROZONADO +4 1 B
WNROCOMPAC W 5 P MASK HEX
WNROPULTDIR WNROCOMPAC +4 1 B

WNROZONADO = 12345
IF WNROZULTDIR ON X'C0'
WNROZULTDIR = WNROZULTDIR - 48
END-IF
IF WNROZULTDIR ON X'F0'
WNROZULTDIR = WNROZULTDIR + 48
END-IF
* SABE O QUE EH 48? EH X'30', A DIFERENCA ENTRE X'F0' E X'C0'

WNROCOMPAC = 123456789
IF WNROPULTDIR ON X'0C'
WNROPULTDIR = WNROPULTDIR - 3
END-IF
IF WNROPULTDIR ON X'0F'
WNROPULTDIR = WNROPULTDIR + 3
END-IF
* SABE O QUE EH 3? EH X'03', A DIFERENCA ENTRE X'0F' E X'0C'

e) Instruções aparentemente executadas erradas


Muitas vezes, um sinal C ou D num campo numérico, aliado ao uso de um campo declarado
como numérico ou alfa, pode nos fazer pensar que uma instrução está sendo executada de forma
errada.

f) Abends na execução
0C7= Data exception :
Algum campo numérico está sendo manuseado pelo EASY, e seu conteúdo não é numérico.
Normalmente é indicado o statement Easy onde o problema ocorreu. Se o statement referir-se a um
REPORT, é um campo numérico que se está tentando imprimir, e que não está com conteúdo
numérico. Mude o(s) campo(s) numérico(s) para alfa (pode-se redefini-los) e faça referência aos
nomes alfa na(s) LINE(S).
Não esqueça que pode ser um arquivo com lay-outs diferentes (um header, trailler, etc...).
0C4 = Specification exception :
Verifique se algum índice de tabela interna está fora de range ou
se algum arquivo sequencial está com VS ou
se falta algum DD para um arquivo

g) Arquivos VFM

Arquivos VFM (Virtual File Manager) é um método de acesso sequencial bastante apropriado para
manipulação de arquivos de trabalho (temporários).

Normalmente, quando se usa arquivos de trabalho, cada um deles precisa ter uma definição, tanto
no programa quanto em JCL.

Utilizando VFM, basta declarar todos os arquivos de trabalho como VIRTUAL na especificação do
FILE, e os arquivos são manipulados, dentro do possível (depende da memória disponível) em
memória, sem necessidade de especificação em JCL. Caso a memória disponível não seja
suficiente, uma única área em disco é utilizada como “extensão” (através do DD EZTVFM).

Arquivos declarados como VIRTUAL são deletados quando seu processamento como input é
terminado. Exemplo :

FILE CADCLI
...
FILE CADCLIALFA VIRTUAL
...
SORT CADCLI TO CADCLIALFA USING CLI-NOME
JOB INPUT CADCLIALFA
...
QUICK REFERENCE REPORT
Declaração de campos I/O REPORT nome-relatorio +
[SUMMARY] +
[DEFINE] [nome-arquivo:]nome-campo pos-inicial tambytes [SUMFILE] +
|A|N|P|U|B| [decimais] [HEADING (‘...’)] [MASK (‘...’)] [SUMSPACE] +
[TALLYSIZE] +
Declaração de campos work [DTLCTL |EVERY|FIRST|NONE|] +
[SUMCTL ([x] [y])] +
[DEFINE] nome-campo W tamanho |A|N|P|U|B| [decimais] [LABELS [ACROSS literal] ] +
[HEADING (‘...’)] [MASK (‘...’)] [DOWN literal SIZE literal NEWPAGE] +
[FILE nome-arquivo] +
Atividade JOB normal [PRINTER nome-arquivo] +
PARM [PAGESIZE literal literal] +
FILE arq PRINTER |DEFER| [LINESIZE literal] +
FILE arqseq-es |DEFER| [SKIP literal] +
FILE arqseq-es VBS maxlrecl [maxblk] [FULLTRK] [DEFER] [SPACE literal] +
FILE arqvs-e VS [DEFER] [TITLESKIP literal] +
FILE arqvs-u VS UPDATE [DEFER] [| SPREAD | NOSPREAD |] +
FILE arqvs-s VS CREATE |NOVERIFY| |RESET| [DEFER] [NOADJUST] +
declaração áreas I/O [| NODATE | NOKDATE |] +
declaração variáveis work [| NOPAGE | NOKPAGE |] +
*------------------------------------------- [NOHEADING] +
JOB INPUT [START proc] [FINISH proc] [LIMIT literal] +
JOB INPUT NULL [START proc] [FINISH proc] [EVERY literal]
JOB INPUT arq [START proc] [FINISH proc] SEQUENCE campo1 [D] campo2 [D] ...
JOB INPUT arq KEY cpo1 [cpo2...] CONTROL cpo1 [D] ... |FINAL| |NEWPAGE| +
comandos |RENUM| |NOPRINT|
REPORT.... SUM campo1 [campo2 ... campon]
TITLE nrolin |cpo| literal |+nro|-nro| [COL nro]
Atividade SORT HEADING campo (‘xxx’ [‘yyy’ ...])
PARM LINE nrolin |cpo|literal |+nro|-nro| [|COL|POS| nro]
FILE arq PRINTER [DEFER] *-------------------------------------------
FILE arqseq-es [DEFER] REPORT-INPUT. PROC
FILE arqseq-es VBS maxlrecl [maxblk] [FULLTRK] [DEFER] ...
FILE arqvs-e VS [DEFER] END-PROC
FILE arqvs-u VS UPDATE [DEFER] *-------------------------------------------
FILE arqvs-s VS CREATE |NOVERIFY| |RESET| [DEFER] BEFORE-LINE. PROC
declaração áreas I/O ...
declaração variáveis work END-PROC
*------------------------------------------- *-------------------------------------------
SORT arq1 TO arq2 USING campo1 [D] [BEFORE proc] + AFTER-LINE. PROC
[SIZE literal1] [WORK literal2] ...
comandos, exceto de I/O (só DISPLAY sem nomearq) END-PROC
*-------------------------------------------
Atividade JOB INPUT SQL BEFORE-BREAK. PROC
PARM ...
FILE arq PRINTER |DEFER| END-PROC
FILE arqseq-es |DEFER| *-------------------------------------------
FILE arqseq-es VBS maxlrecl [maxblk] [FULLTRK| |DEFER| AFTER-BREAK. PROC
FILE arqvs-e VS |DEFER| ...
FILE arqvs-u VS UPDATE |DEFER| END-PROC
FILE arqvs-s VS CREATE |NOVERIFY| |RESET| |DEFER| *-------------------------------------------
declaração áreas I/O ENDPAGE. PROC
declaração variáveis work ...
*------------------------------------------- END-PROC
JOB INPUT SQL [START proc1] [FINISH proc2] *-------------------------------------------
SELECT coluna1 [, coluna2..... , colunan ] + TERMINATION. PROC
FROM nometabela + ...
[WHERE condição] + END-PROC
[ORDER coluna1 [... , colunan] ] + *-------------------------------------------
INTO :campo1 [ ... , campon]
comandos
REPORT .... Return Codes VSAM

Variáveis EASY 00 = OK
04 = EOF no GET
SYSDATE = AA/MM/DD SYSTIME = HH.MM.SS 08 = DUP KEY no PUT ou WRITE
RETURN-CODE = uso JCL RECORD-LENGTH = lrecl 12 = KEY fora de sequência no PUT
RECORD-COUNT = qt regs FILE-STATUS = status I/O VSAM 16 = RECORD NOT FOUND no READ
LEVEL = qual quebra TALLY = qtdd regs do total. 128 = falta DD no JCL para o arq
PARM-REGISTER = para pegar PARM via CALL EZTPX01

Você também pode gostar