mf easytrieve

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

Upload: robson-rodrigues-freitas

Post on 30-Jul-2015

469 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: MF Easytrieve

EasyTrieve

Manual rápido de referência

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

Page 2: MF Easytrieve

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 :

PARMdeclaração arquivosdeclaração variáveisatividade 1[atividade 2].....[atividade n]

Um programa com uma atividade (JOB) :

PARMdeclaração arquivosdeclaração variáveisJOB ..........

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

PARM ...declaração arquivos ...declaração variáveis ...JOB.........*----------------------REPORT

AFTER-LINE. PROC...END-PROC*----------------------BEFORE-BREAK. PROC

2

Page 3: MF Easytrieve

EASYTRIEVE

SEQUENCECONTROLSUMTITLEHEADINGLINE*------------------REPORT-INPUT. PROC...END-PROC*------------------BEFORE-LINE. PROC...END-PROC*------------------

...END-PROC*------------------AFTER-BREAK. PROC...END-PROC*------------------ENDPAGE. PROC...END-PROC*------------------TERMINATION. PROC...END-PROC*------------------

3

Page 4: MF Easytrieve

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)

Page 5: MF Easytrieve

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.00AL-QTDD / 100DESPREZADOS + 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 bytesP numérico decimal compactado (com sinal). Máximo 16 bytesU numérico decimal compactado (sem sinal).B numérico binário. Máximo 4 bytes.

Se especificado decimais, tem bit de sinalSe 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 :

Page 6: MF Easytrieve

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) ouMASK HEX (para exibir em formato hexadecimal) ouMASK (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 definidoFormato = idem áreas de I/ODecimais = indica a quantidade de casas decimais a considerar para o número contidoOutros 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/OTamanho = indica o tamanho, EM BYTES, do campo sendo definidoFormato = idem áreas de I/ODecimais = indica a quantidade de casas decimais a considerar para o número contidoOutros 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

Page 7: MF Easytrieve

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 READ128 = 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

Page 8: MF Easytrieve

*-------------------------------------------------- * 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 **************************************************

Page 9: MF Easytrieve

Componentes de um relatório

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

régua para simples referêncialiteral controlada

data controlada por NODATE pelo PARM PAGEWRD

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

(cópia / movimento)

variavelreceptora [INTEGER] [ | ROUNDED | TRUNCATED | ] = | variavel | literal | expressao |

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 emissorROUNDED = 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.

.... 1 1 1 2 3 4 5 .... 2 3123456789012345678901234567890123456789012345678901....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

Page 10: MF Easytrieve

Exemplos :

ADICIONAL = SALARIO * 0.5 + 10.00UMPORCENTO = AL-QTDD / 100DESPREZADOS = DESPREZADOS + 1SUBTOTAL = 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 movimentonome-registro1 = nome da area de I/O que será a emissora no movimentonome-campo1 = campo emissorliteral1 = campo emissor

nome-arquivo2 = nome do arquivo cuja area de I/O será a receptora do movimentonome-registro2 = nome da area de I/O que será a receptora no movimentonome-campo2 = campo receptor

nome-campo3 = variável com um número que indica a quantidade de bytes no campo emissorliteral3 = 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 receptorliteral4 = 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 movimentonome-reg1 = nome do campo (área de I/O de arquivo) cujas areas serão as emissoras do movimentonome-arq2 = nome do arquivo cuja area de I/O será a receptora do movimentonome-reg2 = nome do campo (área de I/O de arquivo) cujas áreas serão as receptoras do movimento

Exemplo :

FILE ENTRAREG-ENTRA 1 80 ACOD-CLI 1 5 NCOD-AREA 6 3 ANOME-CLI 9 30 ASALDO 39 9 N 2FILE SAIREG-SAI 1 80 A COD-CLI 1 5 N

Page 11: MF Easytrieve

COD-AREA 6 3 ANOME-CLI 9 30 AVALOR 39 9 N 2..MOVE LIKE ENTRA TO SAI ouMOVE 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-DELDISPLAY ‘ERRO ! PGM CANCELADO.’DISPLAY HEX REG-CTLDISPLAY RELVEND ‘******* FIM *********’DISPLAY CADCLI:FILE-STATUS

DO END-DO

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

Page 12: MF Easytrieve

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 PRINTERSe 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çãoOs 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, ELSE-IF, END-IF

IF condição comandos se condição satisfeitaEND-IF

Page 13: MF Easytrieve

ou

IF condição comandos se condição satisfeitaELSE comandos se condição não satisfeitaEND-IF

ou

IF condição comandos se condição satisfeitaELSE-IF condição comandos se condição satisfeita[ELSE-IF condição comandos se condição satisfeitaELSE-IF condição comandos se condição satisfeita]ELSE comandos se nenhuma condição satisfeitaEND-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-IFELSE (não satisfeita) IF condição comandos se condição satisfeita ELSE comandos se condição não satisfeita END-IFEND-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|

Page 14: MF Easytrieve

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 :

ALPHABETICNUMERICSPACESPACESZEROZEROSZEROES

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 :

Page 15: MF Easytrieve

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.

Page 16: MF Easytrieve

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 impressosFILE 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órioLINESIZE 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çalhoNOHEADING 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çalhoNOSPREAD 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 DISPLAYSPRINTER nome-arquivo Indica o nome do FILE a ser utilizado por este REPORTSKIP literal Indica o número de linhas em branco entre um PRINT e outro (entre um LINE nn e o próximo LINE 01SPACE 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 detalheSUMCTL ([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

Page 17: MF Easytrieve

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 LEVELSUMMARY 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

Page 18: MF Easytrieve

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 impressaAFTER-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 impressaAFTER-BREAK para algum procedimento após a linha de total ser impressaENDPAGE para imprimir linhas de rodapéTERMINATION para algum procedimento após o término da impressão do relatório

STOP STOPTermina a execução da atividade (JOB ou SORT).

WRITEWRITE 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 VSAMouWRITE nome-arquivo DELETE [STATUS]Para efetuar o delete (lógico) de um registro num arquivo VSAM.Status 8 = chave duplicada

Page 19: MF Easytrieve

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

Page 20: MF Easytrieve

Dicas gerais : problemas mais comuns e outros tópicos

a) Resultados de acumulação aparentemente erradosCampos 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 totalizadosSó totaliza campos que tenham número de decimais especificado (se necessário, colocar zero).

c) Uso de TALLY não aceito; TALLY para sumarizarTALLY 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...).

Page 21: MF Easytrieve

0C4 = Specification exception : Verifique se algum índice de tabela interna está fora de range ou

se algum arquivo sequencial está com VS ouse 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-NOMEJOB INPUT CADCLIALFA...

Page 22: MF Easytrieve

QUICK REFERENCEDeclaração de campos I/O

[DEFINE] [nome-arquivo:]nome-campo pos-inicial tambytes |A|N|P|U|B| [decimais] [HEADING (‘...’)] [MASK (‘...’)]

Declaração de campos work

[DEFINE] nome-campo W tamanho |A|N|P|U|B| [decimais] [HEADING (‘...’)] [MASK (‘...’)]

Atividade JOB normalPARMFILE arq PRINTER |DEFER|FILE arqseq-es |DEFER|FILE arqseq-es VBS maxlrecl [maxblk] [FULLTRK] [DEFER]FILE arqvs-e VS [DEFER]FILE arqvs-u VS UPDATE [DEFER]FILE arqvs-s VS CREATE |NOVERIFY| |RESET| [DEFER]declaração áreas I/Odeclaração variáveis work*-------------------------------------------JOB INPUT [START proc] [FINISH proc]JOB INPUT NULL [START proc] [FINISH proc]JOB INPUT arq [START proc] [FINISH proc]JOB INPUT arq KEY cpo1 [cpo2...]comandosREPORT....

Atividade SORT PARMFILE arq PRINTER [DEFER]FILE arqseq-es [DEFER]FILE arqseq-es VBS maxlrecl [maxblk] [FULLTRK] [DEFER]FILE arqvs-e VS [DEFER]FILE arqvs-u VS UPDATE [DEFER]FILE arqvs-s VS CREATE |NOVERIFY| |RESET| [DEFER]declaração áreas I/Odeclaração variáveis work*-------------------------------------------SORT arq1 TO arq2 USING campo1 [D] [BEFORE proc] +

[SIZE literal1] [WORK literal2] comandos, exceto de I/O (só DISPLAY sem nomearq)

Atividade JOB INPUT SQLPARMFILE arq PRINTER |DEFER|FILE arqseq-es |DEFER|FILE arqseq-es VBS maxlrecl [maxblk] [FULLTRK| |DEFER|FILE arqvs-e VS |DEFER|FILE arqvs-u VS UPDATE |DEFER|FILE arqvs-s VS CREATE |NOVERIFY| |RESET| |DEFER|declaração áreas I/Odeclaração variáveis work*-------------------------------------------JOB INPUT SQL [START proc1] [FINISH proc2] SELECT coluna1 [, coluna2..... , colunan ] + FROM nometabela + [WHERE condição] + [ORDER coluna1 [... , colunan] ] + INTO :campo1 [ ... , campon] comandosREPORT ....

Variáveis EASY

SYSDATE = AA/MM/DD SYSTIME = HH.MM.SSRETURN-CODE = uso JCL RECORD-LENGTH = lreclRECORD-COUNT = qt regs FILE-STATUS = status I/O VSAMLEVEL = qual quebra TALLY = qtdd regs do total.PARM-REGISTER = para pegar PARM via CALL EZTPX01

REPORT REPORT nome-relatorio +

[SUMMARY] +[SUMFILE] +[SUMSPACE] +[TALLYSIZE] +[DTLCTL |EVERY|FIRST|NONE|] +[SUMCTL ([x] [y])] +[LABELS [ACROSS literal] ] +[DOWN literal SIZE literal NEWPAGE]+[FILE nome-arquivo] +[PRINTER nome-arquivo] +[PAGESIZE literal literal] +[LINESIZE literal] +[SKIP literal] +[SPACE literal] +[TITLESKIP literal] +[| SPREAD | NOSPREAD |] +[NOADJUST] +[| NODATE | NOKDATE |] +[| NOPAGE | NOKPAGE |] +[NOHEADING] +[LIMIT literal] +[EVERY literal]

SEQUENCE campo1 [D] campo2 [D] ...CONTROL cpo1 [D] ... |FINAL| |NEWPAGE| +

|RENUM| |NOPRINT|SUM campo1 [campo2 ... campon]TITLE nrolin |cpo| literal |+nro|-nro| [COL nro]HEADING campo (‘xxx’ [‘yyy’ ...]) LINE nrolin |cpo|literal |+nro|-nro| [|COL|POS| nro]*-------------------------------------------REPORT-INPUT. PROC...END-PROC*-------------------------------------------BEFORE-LINE. PROC...END-PROC*-------------------------------------------AFTER-LINE. PROC...END-PROC*-------------------------------------------BEFORE-BREAK. PROC...END-PROC*-------------------------------------------AFTER-BREAK. PROC...END-PROC*-------------------------------------------ENDPAGE. PROC...END-PROC*-------------------------------------------TERMINATION. PROC...END-PROC*-------------------------------------------

Return Codes VSAM

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 READ128 = falta DD no JCL para o arq