JCL - Processamento Condicional
O Job Entry System usa duas abordagens para realizar o processamento condicional em um JCL. Quando um trabalho é concluído, um código de retorno é definido com base no status de execução. O código de retorno pode ser um número entre 0 (execução bem-sucedida) e 4095 (diferente de zero mostra a condição de erro). Os valores convencionais mais comuns são:
0 = Normal - tudo OK
4 = Aviso - pequenos erros ou problemas.
8 = Erro - erros ou problemas significativos.
12 = Erro grave - erros ou problemas graves, os resultados não são confiáveis.
16 = Erro de terminal - problemas muito sérios, não use os resultados.
A execução de uma etapa de trabalho pode ser controlada com base no código de retorno da (s) etapa (s) anterior (es) usando o COND parâmetro e IF-THEN-ELSE construção, que foi explicada neste tutorial.
Parâmetro COND
UMA CONDO parâmetro pode ser codificado na instrução JOB ou EXEC do JCL. É um teste do código de retorno das etapas anteriores do trabalho. Se o teste for avaliado como verdadeiro, a execução da etapa do trabalho atual será ignorada. Ignorar é apenas omissão da etapa de trabalho e não um encerramento anormal. Pode haver no máximo oito condições combinadas em um único teste.
Sintaxe
A seguir está a sintaxe básica de um parâmetro JCL COND:
COND=(rc,logical-operator)
or
COND=(rc,logical-operator,stepname)
or
COND=EVEN
or
COND=ONLY
Aqui está a descrição dos parâmetros usados:
rc : Este é o código de retorno
logical-operator : Pode ser GT (maior que), GE (maior que ou igual a), EQ (igual a), LT (menor que), LE (menor que ou igual a) ou NE (diferente a).
stepname : Esta é a etapa do trabalho cujo código de retorno é usado no teste.
As duas últimas condições (a) COND = EVEN e (b) COND = ONLY, foram explicadas abaixo neste tutorial.
O COND pode ser codificado dentro da instrução JOB ou EXEC e, em ambos os casos, se comporta de maneira diferente conforme explicado a seguir:
COND dentro da instrução JOB
Quando COND é codificado na instrução JOB, a condição é testada para cada etapa do trabalho. Quando a condição é verdadeira em qualquer etapa específica do trabalho, ela é ignorada junto com as etapas seguintes. A seguir está um exemplo:
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID,COND=(5,LE)
//*
//STEP10 EXEC PGM=FIRSTP
//* STEP10 executes without any test being performed.
//STEP20 EXEC PGM=SECONDP
//* STEP20 is bypassed, if RC of STEP10 is 5 or above. //* Say STEP10 ends with RC4 and hence test is false. //* So STEP20 executes and lets say it ends with RC16.
//STEP30 EXEC PGM=SORT
//* STEP30 is bypassed since 5 <= 16.
COND dentro da instrução EXEC
Quando COND é codificado na instrução EXEC de uma etapa de trabalho e é considerado verdadeiro, apenas essa etapa de trabalho é ignorada e a execução continua a partir da próxima etapa.
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=SORT
//* Assuming STP01 ends with RC0.
//STP02 EXEC PGM=MYCOBB,COND=(0,EQ,STP01)
//* In STP02, condition evaluates to TRUE and step bypassed.
//STP03 EXEC PGM=IEBGENER,COND=((10,LT,STP01),(10,GT,STP02))
//* In STP03, first condition fails and hence STP03 executes. //* Since STP02 is bypassed, the condition (10,GT,STP02) in //* STP03 is not tested.
COND = EVEN
Quando COND = EVEN é codificado, a etapa do trabalho atual é executada, mesmo se qualquer uma das etapas anteriores terminar de forma anormal. Se qualquer outra condição RC for codificada junto com COND = EVEN, a etapa do trabalho será executada se nenhuma das condições RC for verdadeira.
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=SORT
//* Assuming STP01 ends with RC0.
//STP02 EXEC PGM=MYCOBB,COND=(0,EQ,STP01)
//* In STP02, condition evaluates to TRUE and step bypassed.
//STP03 EXEC PGM=IEBGENER,COND=((10,LT,STP01),EVEN)
//* In STP03, condition (10,LT,STP01) evaluates to true, //* hence the step is bypassed.
COND = SÓ
Quando COND = ONLY é codificado, a etapa do trabalho atual é executada, apenas quando qualquer uma das etapas anteriores termina de forma anormal. Se qualquer outra condição RC for codificada junto com COND = ONLY, a etapa do trabalho será executada se nenhuma das condições RC for verdadeira e qualquer uma das etapas anteriores falhar de forma anormal.
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=SORT
//* Assuming STP01 ends with RC0.
//STP02 EXEC PGM=MYCOBB,COND=(4,EQ,STP01)
//* In STP02, condition evaluates to FALSE, step is executed //* and assume the step abends.
//STP03 EXEC PGM=IEBGENER,COND=((0,EQ,STP01),ONLY)
//* In STP03, though the STP02 abends, the condition //* (0,EQ,STP01) is met. Hence STP03 is bypassed.
Construção IF-THEN-ELSE
Outra abordagem para controlar o processamento do trabalho é usando construções IF-THEN-ELSE. Isso dá mais flexibilidade e uma maneira amigável de processamento condicional.
Sintaxe
A seguir está a sintaxe básica de uma construção JCL IF-THEN-ELSE:
//name IF condition THEN
list of statements //* action to be taken when condition is true
//name ELSE
list of statements //* action to be taken when condition is false
//name ENDIF
A seguir está a descrição dos termos usados na construção IF-THEN-ELSE acima:
name : Isso é opcional e um nome pode ter de 1 a 8 caracteres alfanuméricos começando com alfabeto, #, $ ou @.
Condition : Uma condição terá um formato: KEYWORD OPERATOR VALUE, Onde KEYWORDSpode ser RC (código de retorno), ABENDCC (código de conclusão do sistema ou usuário), ABEND, RUN (etapa iniciada execução). AOPERATOR pode ser operador lógico (AND (&), OR (|)) ou operador relacional (<, <=,>,> =, <>).
Exemplo
A seguir está um exemplo simples que mostra o uso de IF-THEN-ELSE:
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//PRC1 PROC
//PST1 EXEC PGM=SORT
//PST2 EXEC PGM=IEBGENER
// PEND
//STP01 EXEC PGM=SORT
//IF1 IF STP01.RC = 0 THEN
//STP02 EXEC PGM=MYCOBB1,PARM=123
// ENDIF
//IF2 IF STP01.RUN THEN
//STP03a EXEC PGM=IEBGENER
//STP03b EXEC PGM=SORT
// ENDIF
//IF3 IF STP03b.!ABEND THEN
//STP04 EXEC PGM=MYCOBB1,PARM=456
// ELSE
// ENDIF
//IF4 IF (STP01.RC = 0 & STP02.RC <= 4) THEN
//STP05 EXEC PROC=PRC1
// ENDIF
//IF5 IF STP05.PRC1.PST1.ABEND THEN
//STP06 EXEC PGM=MYABD
// ELSE
//STP07 EXEC PGM=SORT
// ENDIF
Vamos tentar examinar o programa acima para entendê-lo com um pouco mais de detalhes:
O código de retorno de STP01 é testado em IF1. Se for 0, então STP02 é executado. Caso contrário, o processamento vai para a próxima instrução IF (IF2).
Em IF2, se STP01 iniciou a execução, então STP03a e STP03b são executados.
Em IF3, se STP03b não ABEND, então STP04 é executado. Em ELSE, não há declarações. É chamado de instrução NULL ELSE.
Em IF4, se STP01.RC = 0 e STP02.RC <= 4 forem TRUE, então STP05 é executado.
Em IF5, se a etapa proc PST1 em PROC PRC1 na etapa de trabalho STP05 ABEND, então STP06 é executado. Caso contrário, STP07 é executado.
Se IF4 for avaliado como falso, então STP05 não é executado. Nesse caso, IF5 não são testados e as etapas STP06, STP07 não são executadas.
O IF-THEN-ELSE não será executado no caso de término anormal do trabalho, como o cancelamento do trabalho pelo usuário, a expiração do tempo do trabalho ou um conjunto de dados retrocedido para uma etapa que é ignorada.
Definir pontos de verificação
Você pode definir o conjunto de dados do ponto de verificação dentro do seu programa JCL usando SYSCKEOV, que é uma instrução DD.
UMA CHKPTé o parâmetro codificado para conjuntos de dados QSAM de vários volumes em uma instrução DD. Quando um CHKPT é codificado como CHKPT = EOV, um ponto de verificação é gravado no conjunto de dados especificado na instrução SYSCKEOV no final de cada volume do conjunto de dados multivolume de entrada / saída.
//CHKSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=MYCOBB
//SYSCKEOV DD DSNAME=SAMPLE.CHK,DISP=MOD
//IN1 DD DSN=SAMPLE.IN,DISP=SHR
//OUT1 DD DSN=SAMPLE.OUT,DISP=(,CATLG,CATLG)
// CHKPT=EOV,LRECL=80,RECFM=FB
No exemplo acima, um ponto de verificação é escrito no conjunto de dados SAMPLE.CHK no final de cada volume do conjunto de dados de saída SAMPLE.OUT.
Reiniciar o processamento
Você pode reiniciar o processamento do éter de forma automatizada usando o RD parameter ou manual usando o RESTART parameter.
RD parameter é codificado na instrução JOB ou EXEC e ajuda na reinicialização JOB / STEP automatizada e pode conter um dos quatro valores: R, RNC, NR ou NC.
RD=R permite reinicializações automatizadas e considera o ponto de verificação codificado no parâmetro CHKPT da instrução DD.
RD=RNC permite reinicializações automatizadas, mas substitui (ignora) o parâmetro CHKPT.
RD=NRespecifica que o trabalho / etapa não pode ser reiniciado automaticamente. Mas quando ele é reiniciado manualmente usando o parâmetro RESTART, o parâmetro CHKPT (se houver) será considerado.
RD=NC não permite reinicialização automatizada e processamento de ponto de verificação.
Se houver um requisito para fazer o reinício automatizado apenas para códigos de abend específicos, ele pode ser especificado no SCHEDxx membro da biblioteca parmlib do sistema IBM.
RESTART parameterestá codificado na instrução JOB ou EXEC e ajuda na reinicialização manual do JOB / STEP após a falha do trabalho. RESTART pode ser acompanhado por um checkid, que é o checkpoint escrito no conjunto de dados codificado na instrução SYSCKEOV DD. Quando um checkid é codificado, a instrução SYSCHK DD deve ser codificada para fazer referência ao conjunto de dados do ponto de verificação após a instrução JOBLIB (se houver), caso contrário, após a instrução JOB.
//CHKSAMP JOB CLASS=6,NOTIFY=&SYSUID,RESTART=(STP01,chk5)
//*
//SYSCHK DD DSN=SAMPLE.CHK,DISP=OLD
//STP01 EXEC PGM=MYCOBB
//*SYSCKEOV DD DSNAME=SAMPLE.CHK,DISP=MOD
//IN1 DD DSN=SAMPLE.IN,DISP=SHR
//OUT1 DD DSN=SAMPLE.OUT,DISP=(,CATLG,CATLG)
// CHKPT=EOV,LRECL=80,RECFM=FB
No exemplo acima, chk5 é o checkid, ou seja, STP01 é reiniciado no checkpoint5. Observe que uma instrução SYSCHK foi adicionada e a instrução SYSCKEOV foi comentada no programa anterior explicado na seção Configurando o ponto de verificação.