Escolar Documentos
Profissional Documentos
Cultura Documentos
O processamento em lote e online difere no aspecto de entrada, saída e solicitação de execução do programa.
No processamento em lote, esses aspectos são alimentados em um JCL que, por sua vez, é recebido pelo
sistema operacional.
Processamento de JOB
Um JOB é uma unidade de trabalho que pode ser composta de várias etapas de trabalho. Cada passo (step)
do JOB é especificado em uma JCL (Job Control Language) por meio de um conjunto de Instruções de
Controle de Trabalho.
O Sistema Operacional usa o Sistema de Entrada de Trabalhos (JES) para receber trabalhos no Sistema
Operacional, para agendá-los para processamento e para controlar a saída.
O processamento do trabalho passa por uma série de etapas, conforme indicado abaixo:
Cada usuário válido recebe um id de login para entrar na interface Z/OS (TSO/E ou ISPF). Na interface do
Z/OS, o JCL pode ser codificado e armazenado como um membro em um Partitioned Dataset (PDS).
Quando o JCL é enviado, ele é executado e a saída recebida conforme explicado na seção de processamento
de trabalho do capítulo anterior.
Estrutura de um JCL
A estrutura básica de um JCL com as instruções comuns é dada abaixo:
Descrição do Programa
As instruções JCL numeradas foram explicadas abaixo:
(1) JOB statement (Declaração de JOB): Especifica as informações necessárias para o SPOOLing do job,
como ID do job, prioridade de execução, ID do usuário a ser notificado após a conclusão do job.
(3) Declaração EXEC: Especifica o PROC/Program a ser executado. No exemplo acima, um programa
SORT está sendo executado (ou seja, ordenando os dados de entrada em uma ordem específica)
(4) Instrução DD de Entrada: Especifica o tipo de entrada a ser passado para o programa mencionado em
(3). No exemplo acima, um arquivo Physical Sequential (PS) é passado como entrada no modo
compartilhado (DISP = SHR).
(5) Instrução DD de saída: Especifica o tipo de saída a ser produzida pelo programa na execução. No
exemplo acima, um arquivo PS é criado. Se uma instrução se estender além da 70ª posição em uma linha, ela
continuará na próxima linha, que deve começar com “//” seguido por um ou mais espaços.
(6) Pode haver outros tipos de instruções DD para especificar informações adicionais ao programa (no
exemplo acima: A condição SORT é especificada na instrução SYSIN DD) e para especificar o destino do
log de erro/execução (Exemplo: SYSUDUMP/SYSPRINT). As instruções DD podem estar contidas em um
conjunto de dados (arquivo de mainframe) ou como em dados de fluxo (informações codificadas no JCL),
conforme fornecido no exemplo acima.
Todas as instruções JCL, exceto em dados de fluxo, começam com //. Deve haver pelo menos um espaço
antes e depois das palavras-chave JOB, EXEC e DD e não deve haver espaços no restante da instrução.
Eles são codificados após os parâmetros posicionais, mas podem aparecer em qualquer ordem. Os
parâmetros de palavra-chave podem ser omitidos se não forem necessários. A sintaxe genérica é
KEYWORD= valor. Exemplo: MSGCLASS=X, ou seja, o log do job é redirecionado para o SPOOL
de saída após a conclusão do job.
No exemplo acima, CLASS, MSGCLASS e NOTIFY são parâmetros de palavras-chave da instrução
JOB. Também pode haver parâmetros de palavras-chave na instrução EXEC.
Esses parâmetros foram detalhados nos capítulos subsequentes, juntamente com exemplos apropriados.
JCL – JOB Stãtement
A instrução JOB é a primeira instrução de controle em uma JCL. Isso dá a identidade do trabalho ao Sistema
Operacional (SO), no spool e no agendador. Os parâmetros na instrução JOB ajudam os sistemas
operacionais na alocação do agendador correto, tempo de CPU necessário e emissão de notificações ao
usuário.
Sintaxe
A seguir está a sintaxe básica de uma instrução JCL JOB:
Descrição (Description)
Vamos ver a descrição dos termos usados na sintaxe da instrução JOB acima.
Isso fornece um id ao trabalho ao enviá-lo ao sistema operacional. Pode ter comprimento de 1 a 8 com
caracteres alfanuméricos e começa logo após //.
JOB
Palavra-chave (Keyword-param)
A seguir estão os vários parâmetros de palavras-chave, que podem ser usados na instrução JOB. Você pode
usar um ou mais parâmetros com base nos requisitos e eles são separados por vírgula:
Parâmetro de
Descrição
palavra-chave
Com base na duração do tempo e no número de recursos exigidos pelo JOB, as empresas
atribuem diferentes classes de trabalho. Estes podem ser visualizados como agendadores
individuais usados pelo sistema operacional para receber os trabalhos. Colocar os
trabalhos no agendador correto ajudará na fácil execução dos trabalhos. Algumas
empresas possuem classes diferentes para trabalhos em ambiente de teste e produção.
CLASS
Os valores válidos para o parâmetro CLASS são caracteres de A a Z e numéricos de 0 a 9
(de comprimento 1). Segue a sintaxe:
CLASSE=0 a 9 | A a Z
Para especificar a prioridade do trabalho em uma classe de trabalho. Se esse parâmetro
não for especificado, o trabalho será adicionado ao final da fila na CLASS especificada.
Segue a sintaxe:
PRTY
PRTY=N
Aqui o sistema envia a mensagem para o usuário “userid”, mas se usarmos NOTIFY =
&SYSUID, a mensagem é enviada para o usuário que envia o JCL.
Para especificar o destino de saída para as mensagens do sistema e do trabalho quando o
trabalho for concluído. Segue a sintaxe:
MSGCLASS=CLASS
MSGCLASS
Os valores válidos de CLASS podem ser de “A” a “Z” e “0” a “9”. MSGCLASS = Y
pode ser definido como uma classe para enviar o log de trabalho para o JMR (Joblog
Management and Retrieval: um repositório dentro de mainframes para armazenar as
estatísticas de trabalho).
Especifica o tipo de mensagens a serem gravadas no destino de saída especificado no
MSGCLASS. Segue a sintaxe:
MSGLEVEL=(ST, MSG)
Especifica o intervalo de tempo a ser usado pelo processador para executar o trabalho.
Segue a sintaxe:
Este parâmetro pode ser útil ao testar um programa recém-codificado. Para garantir que o
programa não seja executado por muito tempo devido a erros de loop, um parâmetro de
tempo pode ser codificado para que o programa termine de forma anormal quando o
tempo de CPU especificado for atingido.
Especifica o espaço de endereço necessário para executar uma etapa de trabalho dentro do
trabalho. Segue a sintaxe:
REGION=nK | nM
REGION Aqui, a região pode ser especificada como nK ou nM onde n é um número, K é kilobyte e
M é Megabyte.
Exemplo
//URMISAMP JOB (*),"tutpoint",CLASS=6,PRTY=10,NOTIFY=&SYSUID,
// MSGCLASS=X,MSGLEVEL=(1,1),TYPRUN=SCAN,
// TIME=(3,0),REGION=10K
Aqui, a instrução JOB está sendo estendida além da 70ª posição em uma linha, então continuamos na
próxima linha que deve começar com “//” seguido por um ou mais espaços.
Parâmetros diversos
Existem alguns outros parâmetros que podem ser usados com a instrução JOB, mas eles não são usados com
frequência:
ADDRSPC Tipo de armazenamento usado: Virtual ou Real
Tamanho dos dados a serem gravados no log de saída e a ação a ser tomada quando o
BYTES
tamanho for excedido.
LINES Número máximo de linhas a serem impressas no log de saída.
PAGES Número máximo de páginas a serem impressas para o log de saída.
USER ID do usuário usado para enviar o trabalho
PASSWORD Senha do ID do usuário especificado no parâmetro USER.
COND AND Eles são usados no processamento condicional da etapa de trabalho e são explicados
RESTART em detalhes ao discutir o processamento condicional.
Declãrãção JCL - EXEC
Cada JCL pode ser composto de várias etapas de trabalho. Cada etapa do JOB pode executar um programa
diretamente ou pode chamar um procedimento, que por sua vez executa um ou mais programas (etapas de
trabalho). A instrução, que contém as informações do programa/procedimento da etapa da tarefa, é a
instrução EXEC.
Sintaxe
A seguir está a sintaxe básica de uma instrução JCL EXEC:
Descrição (Description)
Vejamos a descrição dos termos usados na sintaxe da instrução EXEC acima.
STEP-NAME
Isso identifica a etapa da tarefa dentro da JCL. Pode ter comprimento de 1 a 8 com caracteres alfanuméricos.
EXEC
POSITIONAL-PARAM
Positional
Descrição
Parameter
A seguir estão os vários parâmetros de palavra-chave para a instrução EXEC. Você pode usar um ou mais
parâmetros com base nos requisitos e eles são separados por vírgula:
Keyword
Descrição
Parameter
Usado para fornecer dados parametrizados ao programa que está sendo executado na etapa de
trabalho. Este é um campo dependente do programa e não possui regras definidas, exceto que
o valor PARM deve ser incluído entre aspas no caso de ter caracteres especiais.
PARM
Por exemplo dado abaixo, o valor “CUST1000” é passado como um valor alfanumérico para
o programa. Se o programa estiver em COBOL, o valor passado por meio de um parâmetro
PARM em um JCL é recebido na LINKAGE SECTION do programa.
Isso é usado para especificar se a etapa do trabalho requer armazenamento virtual ou real
para execução. O armazenamento virtual é paginável, enquanto o armazenamento real não é e
é colocado na memória principal para execução. As etapas de trabalho, que exigem execução
ADDRSPC mais rápida, podem ser colocadas em armazenamento real. Segue a sintaxe:
ADDRSPC=VIRT | REAL
ACCT=(userid)
ACCT
Isso é semelhante às informações de contabilidade de parâmetros posicionais na instrução
JOB. Se estiver codificado na instrução JOB e EXEC, as informações de contabilidade na
instrução JOB se aplicarão a todas as etapas do trabalho em que um parâmetro ACCT não
estiver codificado. O parâmetro ACCT em uma instrução EXEC substituirá aquele presente
na instrução JOB somente para essa etapa de trabalho.
Se TIME estiver codificado em uma instrução EXEC, ele se aplicará somente a essa etapa de
trabalho. Se for especificado na instrução JOB e EXEC, ambos entrarão em vigor e poderão
TEMPO
causar um erro de tempo limite devido a qualquer um deles. Não é recomendado usar o
parâmetro TIME na instrução JOB e EXEC juntos.
REGIÃO Se REGION estiver codificado em uma instrução EXEC, ele se aplicará somente a essa etapa
de trabalho.
Exemplo
A seguir está um exemplo simples de script JCL junto com instruções JOB e EXEC:
JCL - Declaração DD
Conjuntos de dados são arquivos de mainframe com registros organizados em um formato específico. Os
conjuntos de dados são armazenados no dispositivo de armazenamento de acesso direto (DASD) ou nas fitas
do mainframe e são áreas básicas de armazenamento de dados. Se esses dados precisarem ser usados/criados
em um programa em lote, o nome físico do arquivo (ou seja, conjunto de dados) junto com o formato e a
organização do arquivo serão codificados em um JCL.
A definição de cada conjunto de dados usado na JCL é fornecida usando a instrução DD. Os recursos de
entrada e saída necessários para uma etapa de trabalho precisam ser descritos em uma instrução DD com
informações como a organização do conjunto de dados, requisitos de armazenamento e tamanho do registro.
Sintaxe
A seguir está a sintaxe básica de uma instrução JCL DD:
//DD-name DD Parameters
Descrição
Vamos ver a descrição dos termos usados na sintaxe da instrução DD acima.
DD-NAME
PARÂMETROS
A seguir estão os vários parâmetros para a instrução DD. Você pode usar um ou mais parâmetros com base
nos requisitos e eles são separados por vírgula:
Parâmetro Descrição
O parâmetro DSN refere-se ao nome do conjunto de dados físico de um conjunto de dados
recém-criado ou existente. O valor DSN pode ser composto por subnomes de 1 a 8 caracteres de
comprimento cada um, separados por pontos e de comprimento total de 44 caracteres
(alfanuméricos). Segue a sintaxe:
Se um conjunto de dados temporário criado por uma etapa de trabalho for usado na próxima
etapa de trabalho, ele será referenciado como DSN=*.stepname.ddname. Isso é chamado de
referência para trás.
O parâmetro DISP é usado para descrever o status do conjunto de dados, disposição no final da
etapa do trabalho na conclusão normal e anormal. O DISP não é necessário em uma instrução
DD somente quando o conjunto de dados é criado e excluído na mesma etapa de trabalho (como
os conjuntos de dados temporários). Segue a sintaxe:
Quando algum dos subparâmetros de DISP não é especificado, os valores padrão são os
seguintes:
RECFM é o formato de registro do conjunto de dados. RECFM pode conter valores FB, V ou
VB. FB é uma organização de bloco fixo onde um ou mais registros lógicos são agrupados em
um único bloco. V é a organização variável onde um registro lógico de comprimento variável é
colocado dentro de um bloco físico. VB é uma organização de bloco variável onde um ou mais
registros lógicos de comprimento variável são colocados dentro de um bloco físico.
DCB
BLKSIZE é o tamanho do bloco físico. Quanto maior o bloco, maior é o número de registros
para um arquivo FB ou VB.
Quando há a necessidade de replicar os valores DCB de um conjunto de dados para outro dentro
do mesmo jobstep ou JCL, ele é especificado como DCB=*.stepname.ddname em que stepname
é o nome da etapa do job e ddname é o conjunto de dados do qual o DCB é copiado.
Os parâmetros UNIT e VOL são listados no catálogo do sistema para conjuntos de dados
catalogados e, portanto, podem ser acessados apenas com o nome DSN físico. Mas para
conjuntos de dados não catalogados, a instrução DD deve incluir esses parâmetros. Para que
novos conjuntos de dados sejam criados, os parâmetros UNIT/VOL podem ser especificados ou
o Z/OS aloca o dispositivo e o volume adequados.
UNIDADE=DASD | SYSDA
Onde DASD significa Direct Access Storage Device e SYSDA significa System Direct Access
e refere-se ao próximo dispositivo de armazenamento em disco disponível.
O parâmetro VOL especifica o número do volume no dispositivo identificado pelo parâmetro
UNIT. Segue a sintaxe:
VOL=SER=(v1,v2)
VOL Onde v1, v2 são números de série do volume. Você também pode usar a seguinte sintaxe:
VOL=REF=*.DDNAME
Onde se a classe for A, ela direcionará a saída para a impressora e, se a classe for *, ela
direcionará a saída para o mesmo destino do parâmetro MSGCLASS na instrução JOB.
Exemplo
A seguir está um exemplo, que faz uso de instruções DD junto com vários parâmetros explicados acima:
Sintaxe
A seguir está a sintaxe básica de uma instrução JCL JOBLIB:
//JOBLIB DD DSN=dsnname,DISP=SHR
A instrução JOBLIB é aplicável a todas as instruções EXEC dentro da JCL. O programa especificado na
instrução EXEC será pesquisado na biblioteca JOBLIB seguido pela biblioteca do sistema.
Por exemplo, se a instrução EXEC estiver executando um programa COBOL, o módulo de carregamento do
programa COBOL deve ser colocado na biblioteca JOBLIB.
Declaração STEPLIB
Uma instrução STEPLIB é usada para identificar a localização do programa a ser executado dentro de um
Job Step. A instrução STEPLIB é especificada após a instrução EXEC e antes da instrução DD da etapa da
tarefa.
Sintaxe
A seguir está a sintaxe básica de uma instrução JCL STEPLIB:
//STEPLIB DD DSN=dsnname,DISP=SHR
O programa especificado na instrução EXEC será pesquisado na biblioteca STEPLIB seguido pela
biblioteca do sistema. STEPLIB codificado em uma etapa de trabalho substitui a instrução JOBLIB.
Exemplo
O exemplo a seguir mostra o uso de instruções JOBLIB e STEPLIB:
INCLUDE Statement
Um conjunto de instruções JCL codificadas em um membro de um PDS pode ser incluído em um JCL
usando uma instrução INCLUDE. Quando o JES interpreta o JCL, o conjunto de instruções JCL no membro
INCLUDE substitui a instrução INCLUDE.
Sintaxe
A seguir está a sintaxe básica de uma instrução JCL INCLUDE:
O objetivo principal da instrução INCLUDE é a reutilização. Por exemplo, arquivos comuns a serem usados
em muitas JCLs podem ser codificados como instruções DD no membro INCLUDE e usados em uma JCL.
Instruções DD fictícias, especificações de cartão de dados, instruções PROCs, JOB, PROC não podem ser
codificadas em um membro INCLUDE. Uma instrução INLCUDE pode ser codificada em um membro
INCLUDE e aninhamento adicional pode ser feito em até 15 níveis.
Declaração JCLLIB
Uma instrução JCLLIB é usada para identificar as bibliotecas privadas usadas na tarefa. Pode ser usado
tanto com procedimentos instream quanto catalogados.
Sintaxe
A seguir está a sintaxe básica de uma instrução JCL JCLLIB:
As bibliotecas especificadas na instrução JCLLIB serão pesquisadas na ordem indicada para localizar os
programas, procedimentos e membros INCLUDE usados no trabalho. Pode haver apenas uma instrução
JCLLIB em uma JCL; especificado após uma instrução JOB e antes da instrução EXEC e INCLUDE, mas
não pode ser codificado em um membro INCLUDE.
Exemplo
No exemplo a seguir, o programa MYPROG3 e o membro INCLUDE MYINCL são pesquisados na ordem
de MYPROC.BASE.LIB1, MYPROC.BASE.LIB2, biblioteca do sistema.
Você pode usar um procedimento para obter a execução paralela de um programa usando vários arquivos de
entrada. Um JCL pode ser criado para cada arquivo de entrada e um único procedimento pode ser chamado
simultaneamente passando o nome do arquivo de entrada como um parâmetro simbólico.
Sintaxe
A seguir está a sintaxe básica de uma definição de procedimento JCL:
//*
//Step-name EXEC procedure name
No exemplo acima, o procedimento INSTPROC é chamado em STEP1 e STEP2 usando arquivos de entrada
diferentes. Os parâmetros DSNAME e DATAC podem ser codificados com diferentes valores ao chamar o
procedimento e estes são chamados como parâmetros simbólicos. A entrada variável para o JCL, como
nomes de arquivos, cartões de dados, valores PARM, etc., são passados como parâmetros simbólicos para
procedimentos.
Os parâmetros simbólicos definidos pelo usuário são chamados de Símbolos JCL. Existem certos símbolos
chamados símbolos do sistema, que são usados para execuções de tarefas de logon. O único símbolo do
sistema usado em trabalhos em lote por usuários normais é &SYSUID e é usado no parâmetro NOTIFY na
instrução JOB.
Dentro do procedimento, os parâmetros simbólicos PROG e BASELB são codificados. Observe que o
parâmetro PROG dentro do procedimento é substituído pelo valor no JCL e, portanto, o PGM assume o
valor CATPRC1 durante a execução.
No exemplo acima, a JCL chama o procedimento INSTPRC1 em JSTEP1 e o procedimento INSTPRC2 está
sendo chamado dentro do procedimento INSTPRC1. Aqui, a saída de INSTPRC1 (SORTOUT) é passada
como entrada (SORTIN) para INSTPRC2.
Uma instrução SET é usada para definir símbolos comumente usados em etapas ou procedimentos de
trabalho. Inicializa os valores anteriores nos nomes simbólicos. Ele deve ser definido antes do primeiro uso
dos nomes simbólicos na JCL.
Vamos dar uma olhada na descrição abaixo para entender um pouco mais sobre o programa acima:
0 = Normal – tudo OK
4 = Aviso – pequenos erros ou problemas.
8 = Erro – erros ou problemas significativos.
12 = Erro grave – grandes erros ou problemas, os resultados não devem ser 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 parâmetro COND e a construção IF-THEN-ELSE, que foi explicada neste tutorial.
Parâmetro COND
Um parâmetro COND pode ser codificado na instrução JOB ou EXEC de JCL. É um teste no código de
retorno das etapas de trabalho anteriores. Se o teste for avaliado como verdadeiro, a execução da etapa de
trabalho atual será ignorada. Ignorar é apenas omissão da etapa de trabalho e não um término 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
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 da instrução EXEC e, em ambos os casos, ele se
comporta de maneira diferente, conforme explicado abaixo:
COND dentro da instrução JOB
Quando COND é codificado na instrução JOB, a condição é testada para cada etapa da tarefa. Quando a
condição é verdadeira em qualquer etapa de trabalho específica, ela é ignorada junto com as etapas de
trabalho que a seguem. Segue um exemplo:
COND=EVEN
Quando COND=EVEN é codificado, a etapa de 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 de trabalho será executada se nenhuma das condições RC for verdadeira.
Quando COND=ONLY é codificado, a etapa de trabalho atual é executada, somente quando qualquer uma
das etapas anteriores termina de forma anormal. Se qualquer outra condição RC for codificada juntamente
com COND=ONLY, a etapa de trabalho será executada se nenhuma das condições RC for verdadeira e
qualquer uma das etapas de trabalho anteriores falhar de forma anormal.
IF-THEN-ELSE Construct
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: 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 as
KEYWORDS podem ser RC (Código de Retorno), ABENDCC (Código de conclusão do sistema ou
usuário), ABEND, RUN (execução da etapa iniciada). Um OPERADOR pode ser operador lógico
(AND (&), OR (|)) ou operador relacional (<, <=, >, >=, <>).
Exemplo
A seguir está um exemplo simples mostrando o uso de IF-THEN-ELSE:
Vamos tentar analisar 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. Ela é
chamada de instrução NULL ELSE.
Em IF4, se STP01.RC = 0 e STP02.RC <=4 forem TRUE, então STP05 será executado.
Em IF5, se o proc-step PST1 no PROC PRC1 no jobstep STP05 ABEND, então STP06 é executado.
Caso contrário, STP07 é executado.
Se IF4 for avaliado como falso, o STP05 não será 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 encerramento anormal do trabalho, como o usuário
cancelando o trabalho, expiração do tempo de trabalho ou um conjunto de dados é referenciado para trás a
uma etapa que é ignorada.
Um 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 de vários
volumes de entrada/saída.
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 processamento
Você pode reiniciar o processamento de éter de forma automatizada usando o parâmetro RD ou manual
usando o parâmetro RESTART.
Se houver um requisito para fazer a reinicialização automatizada apenas para códigos de encerramento
anormal específicos, ele poderá ser especificado no membro SCHEDxx da biblioteca parmlib do sistema
IBM.
No exemplo acima, chk5 é o checkid, ou seja, STP01 é reiniciado no checkpoint5. Observe que uma
instrução SYSCHK é adicionada e a instrução SYSCKEOV é comentada no programa anterior explicado na
seção Definindo o ponto de verificação.
JCL – Definindo conjuntos de dãdos (Dãtãsets)
Um nome de conjunto de dados especifica o nome de um arquivo e é indicado por DSN em JCL. O
parâmetro DSN refere-se ao nome do conjunto de dados físico de um conjunto de dados recém-criado ou
existente. O valor DSN pode ser composto por subnomes de 1 a 8 caracteres de comprimento cada um,
separados por pontos e de comprimento total de 44 caracteres (alfanuméricos). Segue a sintaxe:
DSN=&name | *.stepname.ddname
Conjuntos de dados temporários precisam de armazenamento apenas para a duração do trabalho e são
excluídos na conclusão do trabalho. Esses conjuntos de dados são representados como DSN=&name ou
simplesmente sem um DSN especificado.
Se um conjunto de dados temporário criado por uma etapa de trabalho for usado na próxima etapa de
trabalho, ele será referenciado como DSN=*.stepname.ddname. Isso é chamado de referência para trás.
No exemplo acima, três conjuntos de dados são concatenados e passados como entrada para o programa
SORT no nome SORTIN DD. Os arquivos são mesclados, classificados nos campos-chave especificados e,
em seguida, gravados em um único arquivo de saída SAMPLE.OUTPUT no nome SORTOUT DD.
No exemplo acima, o conjunto de dados IN1 usa o arquivo MYDATA.URMI.INPUT no PROC, que é
substituído no JCL. Portanto, o arquivo de entrada usado na execução é MYDATA.OVER.INPUT. Observe
que o conjunto de dados é referido como STEP1.IN1. Se houver apenas uma etapa no JCL/PROC, o
conjunto de dados poderá ser referido apenas com o nome DD. Da mesma forma, se houver mais de uma
etapa no JCL, o conjunto de dados deverá ser substituído como JSTEP1.STEP1.IN1.
No exemplo acima, dos três conjuntos de dados concatenados em IN1, o primeiro é sobrescrito no JCL e o
restante é mantido como o presente no PROC.
As versões GDG podem ter parâmetros DCB iguais ou diferentes. Um DCB de modelo inicial pode ser
definido para ser usado por todas as versões, mas pode ser substituído ao criar novas versões.
No exemplo acima, o utilitário IDCAMS define a base GDG em GDGSTEP1 com os parâmetros abaixo
passados na instrução SYSIN DD:
No GDGSTEP2, o utilitário IEFBR14 especifica os parâmetros do modelo DD a serem usados por todas as
versões.
IDCAMS pode ser usado para alterar os parâmetros de definição de um GDG como aumentar LIMIT, mudar
EMPTY para NOEMPTY, etc., e suas versões relacionadas usando o comando SYSIN é ALTER
MYDATA.URMI.SAMPLE.GDG LIMIT(15) EMPTY.
No exemplo acima, a versão mais recente de MYDATA.URMI.SAMPLE.GDG foi excluída. Observe que o
parâmetro DISP na conclusão normal do trabalho é codificado como DELETE. Portanto, o conjunto de
dados é excluído quando o trabalho conclui a execução.
IDCAMS pode ser usado para excluir o GDG e suas versões relacionadas usando o comando SYSIN
DELETE(MYDATA.URMI.SAMPLE.GDG) GDG FORCE/PURGE.
FORCE exclui as versões GDG e a base GDG. Se qualquer uma das versões do GDG estiver
definida com uma data de expiração que ainda não expirou, elas não serão excluídas e, portanto, a
base do GDG será mantida.
PURGE exclui as versões GDG e a base GDG, independentemente da data de expiração.
No exemplo a seguir, a versão mais recente de MYDATA.URMI.SAMPLE.GDG é usada como entrada para
o programa e uma nova versão de MYDATA.URMI.SAMPLE.GDG é criada como saída.
Aqui, se o GDG tiver sido referido pelo nome real como MYDATA.URMI.SAMPLE.GDG.G0001V00, isso
levará à alteração do JCL todas as vezes antes da execução. Usar (0) e (+1) faz com que substitua
dinamicamente a versão GDG para execução.
Metodos de entrãdã-sãídã
Qualquer programa em lote executado por meio de um JCL requer entrada de dados, que é processada e uma
saída é criada. Existem diferentes métodos para alimentar a entrada do programa e escrever a saída recebida
de uma JCL. No modo em lote, não há necessidade de interação do usuário, mas os dispositivos de entrada e
saída e a organização necessária são definidos em JCL e enviados.
INSTREAM DATA
Os dados instream para um programa podem ser especificados usando uma instrução SYSIN DD.
No Exemplo 1, a entrada para MYPROG é passada por meio de SYSIN. Os dados são fornecidos dentro do
JCL. Dois registros de dados são passados para o programa. Observe que /* marca o fim dos dados SYSIN
instream.
“CUST1 1000” é record1 e “CUST2 1001” é record2. A condição de fim de dados é atendida quando o
símbolo /* é encontrado durante a leitura dos dados.
Conforme mencionado na maioria dos exemplos nos capítulos anteriores, a entrada de dados para um
programa pode ser fornecida por meio de arquivos PS, VSAM ou GDG, com o nome DSN relevante e os
parâmetros DISP junto com as instruções DD.
No Exemplo 1, SAMPLE.INPUT1 é o arquivo de entrada pelo qual os dados são passados para MYPROG.
É referido como IN1 dentro do programa.
Saída de dados em um JCL
A saída em uma JCL pode ser catalogada em um conjunto de dados ou passada para o SYSOUT. Conforme
mencionado no capítulo de instruções DD, SYSOUT=* redireciona a saída para a mesma classe mencionada
no parâmetro MSGCLASS da instrução JOB.
Especificar MSGCLASS=Y salva o log de tarefas no JMR (Joblog Management and Retrieval). Todo o log
de JOB pode ser redirecionado para o SPOOL e pode ser salvo em um conjunto de dados fornecendo o
comando XDC em relação ao nome do trabalho no SPOOL. Quando o comando XDC é dado no SPOOL,
uma tela de criação de dataset é aberta. O registro de trabalho pode então ser salvo com a definição
apropriada de PS ou PDS.
Os logs de trabalho também podem ser salvos em um conjunto de dados mencionando um conjunto de dados
já criado para SYSOUT e SYSPRINT. Mas todo o log de tarefas não pode ser capturado dessa maneira (ou
seja, JESMSG não será catalogado) como feito em JMR ou XDC.
Existem muitos utilitários de compilador de mainframe disponíveis para compilar um programa COBOL.
Algumas empresas corporativas usam ferramentas de Gerenciamento de Mudanças como o Endevor, que
compila e armazena todas as versões do programa. Isso é útil para rastrear as alterações feitas no programa.
IGYCRCTL é um utilitário de compilador IBM COBOL. As opções do compilador são passadas usando o
parâmetro PARM. No exemplo acima, RMODE instrui o compilador a usar o modo de endereçamento
relativo no programa. O programa COBOL é passado utilizando o parâmetro SYSIN e o copybook é a
biblioteca utilizada pelo programa em SYSLIB.
Essa JCL produz o módulo de carregamento do programa como saída que é usada como entrada para a JCL
de execução.
No exemplo acima, MYCOBB é o programa COBOL-DB2 executado usando IKJEFT01. Observe que o
nome do programa, DB2 Sub-System Id (SSID), nome do plano DB2 são passados na instrução SYSTSIN
DD. A biblioteca DBRM é especificada no STEPLIB.
JCL – Progrãmãs Utilitãrios
Utilitários de conjunto de dados IBM
Os programas utilitários são programas pré-escritos, amplamente utilizados em mainframes por
programadores de sistemas e desenvolvedores de aplicativos para atender aos requisitos do dia-a-dia,
organizar e manter dados. Alguns deles estão listados abaixo com suas funcionalidades:
Nome do
Funcionalidade
utilitário
IEHMOVE Move ou copia conjuntos de dados sequenciais.
Excluir e renomear conjuntos de dados; catalogar ou não catalogar conjuntos de dados que
IEHPROGM
não sejam VSAM.
IEHCOMPR Compara dados em conjuntos de dados sequenciais.
IEBCOPY Copiar, mesclar, compactar, fazer backup ou restaurar PDS.
Nenhum utilitário de operação. Usado para devolver o controle ao usuário e encerrar.
Geralmente é usado para criar um conjunto de dados vazio ou excluir um conjunto de dados
existente.
IEFBR14
Por exemplo, se um conjunto de dados for passado como entrada para um programa
IEFBR14 com DISP=(OLD,DELETE,DELETE), o conjunto de dados será excluído na
conclusão do trabalho.
Usado para copiar partes selecionadas de um JCL. Por exemplo, se uma JCL tiver 5 etapas e
precisarmos executar apenas as etapas 1 e 3, uma JCL IEBEDIT pode ser codificada com
IEBEDIT um conjunto de dados que contém a JCL real a ser executada. No SYSIN do IEBEDIT,
podemos especificar STEP1 e STEP3 como parâmetros. Quando este JCL é executado, ele
executa o STEP1 e STEP3 do JCL real.
Criar, excluir, renomear, catalogar, descatalogar conjuntos de dados (exceto PDS).
IDCAMS
Geralmente usado para gerenciar conjuntos de dados VSAM.
Esses programas utilitários precisam ser usados com instruções DD apropriadas em uma JCL para atingir a
funcionalidade especificada.
SORT: ordenar o(s) arquivo(s) de entrada na ordem da posição do(s) campo(s) especificado(s) no
arquivo.
INCLUDE ou OMIT: incluir ou omitir registros do(s) arquivo(s) de entrada com base na condição
especificada.
SORT MERGE: ordenar/mesclar arquivo(s) de entrada na ordem da posição do(s) campo(s)
especificado(s) no arquivo.
SORT JOIN: ordenar/unir dois ou mais arquivos de entrada com base em uma JOIN KEY
especificada (campos em cada arquivo de entrada).
Quando houver processamento adicional a ser feito nos arquivos de entrada, um programa USER
EXIT pode ser chamado a partir do programa SORT. Por exemplo, se houver um cabeçalho/trailer a
ser incluído no arquivo de saída, um programa COBOL escrito pelo USUÁRIO poderá ser chamado
a partir do programa SORT para executar essa funcionalidade. Usando um cartão de controle, os
dados podem ser passados para o programa COBOL.
Por outro lado, um SORT pode ser chamado internamente de um programa COBOL para organizar o
arquivo de entrada em uma ordem específica antes de ser processado. Normalmente, isso não é
recomendado devido ao desempenho de arquivos grandes.
Ele pode ser usado nas mesmas linhas do DFSORT e pode alcançar os mesmos recursos. Ele pode ser
invocado por uma JCL ou de dentro de um programa codificado em linguagem COBOL, PL/1 ou
Assembler. Ele também suporta programas User Exit a serem chamados a partir do programa SYNCSORT.
Os truques de classificação usados com frequência usando esses utilitários são explicados no próximo
capítulo. Requisitos complexos, que exigem uma grande programação em COBOL/ASSEMBLER, podem
ser alcançados usando os utilitários acima em etapas simples.
JCL – Truques bãsicos de clãssificãção
Os requisitos de aplicação do dia-a-dia em um mundo corporativo que podem ser alcançados usando
Programas Utilitários são ilustrados abaixo:
1. Um arquivo tem 100 registros. Os primeiros 10 registros precisam ser gravados no arquivo de
saída.
A opção STOPAFT interromperá a leitura do arquivo de entrada após o 10º registro e encerrará o programa.
Portanto, 10 registros são gravados na saída.
2. O arquivo de entrada possui um ou mais registros para o mesmo número de funcionário. Gravar
registros exclusivos para saída.
SUM FIELDS=NONE remove duplicatas em campos especificados em SORT FIELDS. No exemplo acima,
o número do funcionário está na posição de campo 1,15. O arquivo de saída conterá os números exclusivos
de funcionários classificados em ordem crescente.
A saída será:
data1 1000
data2 1002
data3 1004
A saída será:
HDR 20110131
data1
data2
data3
TRL 000000003
TOT calcula o número de registros no arquivo de entrada. HDR e TRL são adicionados como
identificadores ao cabeçalho/trailer, que é definido pelo usuário e pode ser personalizado de acordo com as
necessidades dos usuários.
6. Processamento Condicional
A saída será:
data1select
data2 EMPTY
data3select
Com base na 6ª posição do arquivo, a BUILD (CONSTRUÇÃO) do arquivo de saída varia. Se a 6ª posição
for SPACES, o texto “EMPTY” será anexado ao registro de entrada. Caso contrário, o registro de entrada é
gravado na saída, como está.
IEBGENER copia o arquivo em SYSUT1 para arquivo em SYSUT2. Observe que o arquivo no SYSUT2
usa o mesmo DCB do SYSUT1 no exemplo acima.
8. Comparação de arquivos
A saída será:
MATCH File
1000
1003
NOMATCH1 File
1001
1005
NOMATCH2 File
1002