Documentos de Académico
Documentos de Profesional
Documentos de Cultura
desde 0.
Jos Navero
Este documento trata de explicar que es un Jcl y
como construir uno a un nivel muy bsico.
Posteriormente habr ms entregas con diferentes
utilities que profundizar ms el tema
http://www.namocode.com
http://devthisblog.namocode.es/
http://www.namocode.com
http://devthisblog.namocode.es
ndice
A.
Introducin............................................................................................................ 3
B.
C.
Introduccin: .............................................................................................................. 9
DISP .............................................................................................................................. 9
SPACE ........................................................................................................................ 10
UNIT ........................................................................................................................... 11
DCB ............................................................................................................................. 12
VOL............................................................................................................................. 12
D.
E.
2.
F.
G.
Bibliografa. ........................................................................................................ 21
http://www.namocode.com
http://devthisblog.namocode.es
A. Introducin
Job Control Languaje (JCL), Es un lenguaje de programacin que realiza tareas del
sistema operativo generalmente usado en Mainframe. Podramos decir que es un tipo de
lenguaje Script.
Segn Wikipedia: Mediante declaraciones y sentencias de JCL se informa al
sistema operativo de las tareas (por lotes o Bach) que debe realizar, la secuenciacin de
las mismas y los contenedores de datos de entrada y salida (ficheros) para cada uno de
los trabajos a ejecutar. Proporciona un alto grado de flexibilidad e independencia
respecto de la localizacin fsica de los ficheros y de los programas.
NOTA:
Este manual no pretende sustituir ningn otro, simplemente, es un intento de aclarar
otros manuales que me cost seguir, por otro lado, este manual es una versin beta, por
lo que se ir actualizando con el paso del tiempo
http://www.namocode.com
http://devthisblog.namocode.es
http://www.namocode.com
http://devthisblog.namocode.es
Explicacin paso a paso
No os asustis, como se puede ver, es un poco diferente a todo lo que has podido ver
con anterioridad. Paso a explicar cada una de las lneas.
Estas sentencias estn especificadas en uno (MVC JCL Users Guide de IBM).
Las // indican un comando o la finalizacin del JCL, todos los JCL finalizan con
una //
Por otro lado //* indica un comentario mientras que /* son delimitadores.
Un JOB tiene un mnimo de 3 sentencias obligatorias y claramente diferenciadas
que son:
JOB:
Marca el principio del trabajo, asignndole un nombre de trabajo adems de dar
informacin como criterios de contabilidad accounting (Parmetros posicionales).
EXEC:
Marca el principio de un paso dndole el nombre de este paso que identifica
dicho paso. Cada JOB puede tener uno o ms EXECs.
DD:
Identifican y describen los ficheros de entrada y salida que sern usados en los
pasos. Cada EXEC tiene uno o ms DDs.
Pasamos a analizar la primera lnea:
Linea 1: //HMUNJOB JOB '@HMUNDO', CLASS=E, MSGCLASS=X, REGION=6M
Accounting:
Es el primer parmetro posicional (y opcional). Este cdigo es con lo que se
identifica al JOB y podemos obtener informacin sobre los recursos que consume.
Nombre del programador:
Es el segundo parmetro y es donde se puede poner el nombre del programador
que ha realizado el JOB.
http://www.namocode.com
http://devthisblog.namocode.es
CLASS:
Asigna un JOB a una clase determinada para su ejecucin. Depende de las
caractersticas del JOB.
MSGCLASS:
Se usa para asignar el JOB a una clase de salida
MSGLEVEL:
Mediante dos sub-parmetros posicionales (van entre parntesis) que como veis
se separan asimismo por comas, indican que queremos todos los mensajes JCL que se
generen en el sistema (el primer 1) y luego, que tambin queremos los mensajes
relacionados si reservamos o allocamos ficheros que vaya a usar el job (el segundo 1).
Si slo quisiramos los mensajes JCL, el MSGLEVEL quedara as: MSGLEVEL(1,0).
REGION:
Asigna la capacidad de almacenamiento (espacio) Central o virtual que requiere
el JOB.
Linea 3: //PASO1
EXEC PGM=IEBGENER
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
//SYSUT1
DD DATA,DLM=$$
/*******************************************************/
/*
*/
/*
Hola, Mundo en JCL!!
*/
/*
*/
/*******************************************************/
$$
//SYSUT2
DD SYSOUT=A
//SYSPRINT DD SYSOUT=A
//SYSIN
DD DUMMY
//
http://www.namocode.com
http://devthisblog.namocode.es
DUMMY:
Se utiliza este parmetro para no reservar espacio en la memoria es como decir
en Linux que algo se copie a /dev/null, Se ver con mas detalle.
SYSOUT = A:
Define este data ser como un data set de salida y asigna la clase de salida,
procesos externos de escritura, impresiones identificadas etc.
SYSUT1:
Indica desde donde se van a copiar los datos. Posteriormente vemos DD que es
la definicin de los datos, es decir, como si fusemos a declarar una variable.
SYSUT2:
Indica hacia donde se copiaran los datos.
SYSIN:
Son parmetros opcionales que indican hacia donde se copiarn dichos datos
SYSPRINT:
Indica la salida del resultado de esos parmetros adicionales.
Por ultimo como ya indique anteriormente, la // final indica el final de JCL.
Primer ejemplo y comentarios
//@BORRADO JOB (999),'@BORRADO',CLASS=E,MSGCLASS=X,REGION=6M
//*
//*************************************************************
//*
*
//* BORRADO PREVIO DE LOS FICHEROS
*
//*
*
//*************************************************************
//DELETE EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN
DD *
DELETE (PRUEBA.FICHERO1.SALIDA1 . . . . . . . . . . . <--tantas lineas como fich. a borrar
PRUEBA.FICHERO1.SALIDA2 )
IF MAXCC < 9 THEN SET MAXCC = 0
/*
//** RESTO DEL JCL EN SU CASO
Como podemos ver y como hemos visto en el ejemplo del hola mundo este no es
muy diferente del anterior. Comienzo destripando este JCL comentndolo lnea a lnea
ya que creo que es la mejor forma de aprender poco a poco, o como me diran y me
dicen ltimamente ladrillito a ladrillito.
La primera lnea indica el JCL a ejecutar, @Borrado, la clase donde se ejecuta
(que es la cola de ejecucin), tambin sabemos que las lneas que hay despus son
comentarios de lo que hace el JCL, es decir, todo lo que esta entre //*.
http://www.namocode.com
http://devthisblog.namocode.es
En la siguiente lnea:
//DELETE
EXEC
PGM=IDCAMS
Vemos el nombre del paso (Delete) que ejecuta una librera (PGM = ) la librera
afectada en este caso es IDCAMS.
Las lneas de continuacin indican los parmetros necesarios para IDCAMS.
//SYSPRINT DD
//SYSIN
DD
SYSOUT=*
*
SYSIN: Indica que lo que va a continuacion sern los parmetros de entrada que
se usaran la utiliti IDCAMS. En este caso el DELETE
Mientras que SYSPRINT muestra la salida del JCL (generalmente por pantalla).
Segn el JCL Reference de IBM, SYSOUT es un parmetro que especifica la clase
de salida. Cuando ponemos el sysout = * estamos especificando una clase de salida por
defecto.
http://www.namocode.com
http://devthisblog.namocode.es
'JNAVERO',URD,CLASS=E,MSGCLASS=A,
MSGLEVEL=(1,1),REGION=256K
PGM=IEBGENER
DSN=USUARIO.FICHERO.NOM_DATASET,DISP=SHR
SYSOUT=A
SYSOUT=A
DUMMY
Como vemos SYSUT1 tiene una definicin que apunta a un DSN (data set
name). Si en vez de un data set normal (como este caso) fuese un data set particionado,
solo cambiaria en esto: FICHERO.NOM_DATASET(ARCHIVO).
De esa forma tendramos el contenedor y dentro el data set que hace referencia.
Despus de esto nos encontramos con DISP. Esto es la disposicin en la que se
encuentra nuestro data set. Indica la disposicin o bloqueo que vamos a realizar sobre
un DSN (fichero) en el momento de ejecutar el job.
DISP
Puede tener hasta tres sub-parmetros, el primero de los sub-parmetros es el
bloqueo del data set en la ejecucin del job, existiendo las siguientes opciones:
DISP=SHR
Para un data set que existe y que solo lo voy a leer (SHR de Shared es porque
como solo lo leo, muchos otros pueden leerlo tambin).
DISP=OLD
Para un data set que existe y que voy a re-escribir/cambiar/borrar.
DISP=MOD
Para un data set al que le quiero aadir nueva informacin al final, no cambiando
la existente.
http://www.namocode.com
http://devthisblog.namocode.es
DISP=NEW
Para un data set que crear nuevo en ese paso.
En las ultimas 3 disposiciones, el bloqueo ser exclusivo: mientras mi job este
en ejecucin, ninguna otra persona podr acceder a ese data set.
El segundo sub-parmetro sirve para saber que hacer con ese data set cuando el
paso termine. Puede tener los siguientes valores:
KEEP
Deja el data set como est.
CATLG:
Deja el data set como esta y lo cataloga en el catalogo correspondiente.
UNCATLG:
Si el data set termina anormalmente le sistema lo borra.
PASS:
Deja el fichero como esta, pero la decisin de que hacer con l lo decidir el
siguiente paso.
DELETE:
Borra el data set del disco y del catalogo
El tercer parmetro se utiliza para indicar que hacer si el job deja de funcionar,
tiene los mismos valores que el segundo por ejemplo: DISP=(NEW,CATLG,CATLG)
En este ejemplo le indicamos que nos cree un fichero, lo catalogue funcione o no el jcl.
Cuando se crea un data set, es necesario reservar el espacio que va a ocupar
dicho data set. Para ello, se usa el parmetro SPACE. Dicho parmetro tiene varios subparmetros, viene a ser algo as:
SPACE
SPACE= ({Metric,}(primary-qty[,second-qty][,directory]) [,RLSE] [,CONTIG] )
Todo lo que viene entre parntesis puede ser omitido. Paso a explicar esto que
aunque parece complejo, no lo es (casi)
Metric:
Se refiere a la forma en la que se almacena el espacio, pueden ser:
TRK: Indica el espacio a reservar en pistas (tracks)
CYL: Indica el espacio a reservar en cilindros (cylinders)
Blklgth: Indica el espacio a reservar en longitud de bloques.
Reclgth: Indica el espacio a reservar en longitud de registros.
10
http://www.namocode.com
http://devthisblog.namocode.es
Primary-qty:
Especifica una de las siguientes:
Para TRK, el numero de pistas a reservar
Para CYL, el numero de cilindros a reservar
Para la longitud de un bloque, el numero de datos del bloque en el data set
Para la longitud de un registro, el numero de registros nuevos en el data set
Second-qty:
Especifica un espacio adicional de pistas, cilindros, bloques o registros.
Directory:
Especifica el numero de de registros de 256 bytes necesarios en el directorio de
un data set particionado.
Nota: Cuando se crea un data set particionado, se debe reservar el espacio para el
directorio
RSLE:
Solicita el espacio reservado para la salida del data set, pero no se usa, este es
liberado cuando el data set se cierra. Este parmetro de liberacin parcial causa el cierre
de la funcin que libera el espacio no usado solo si el data set es abierto en modo de
escritura y la ultima operacin no hizo lecturas.
CONTIG:
Indica que el espacio reservado para el data set debe ser contiguo, solo afecta al
primero parmetro de reserva de espacio.
Veamos un ejemplo de este sub-parmetro.
SPACE=(CYL,(10,,10),,CONTIG)
En este caso, el sistema, reserva 10 cilindros para el data set con 10 registros de
256byte para Un directorio. El ltimo parmetro (Contig) indica que reserve los 10
cilindros de forma contigua (seguidos).
A continuacin pongo un ejemplo de un DNS completo as seguimos
avanzando
//CCH10081 DD DSN=USUARIO.fichero.file,
//
UNIT=SYSDA,
//
DCB=(LRECL=9999,RECFM=FB,BLKSIZE=0,DSORG=PS),
//
SPACE=(9999,(100,10),RLSE),
//
DISP=(NEW,CATLG,CATLG)
11
http://www.namocode.com
http://devthisblog.namocode.es
DCB
Data control block.
En el DCB especificaremos 3 cosas: Formato del registro (RECFM, RECord
ForMat), El tamao del registro lgico (LRECL Logical RECord Length) y el tamao
del bloque (BLKSIZE, BLocK SIZE). Usando un ejemplo, si decimos que tenemos un
data set con DCB=(RECFM=FB,LRECL=80,BLKSIZE=5600), le estamos diciendo que
nuestro data set tiene un tamao de registro Fijo distribuido en Bloques (FB), cuya
longitud de registro lgico es de 80 bytes y que el tamao del bloque utilizado es de
5600 bytes. El formato puede ser Fijo (F), Variable (V) y no especificado (U). As
pues, si queremos que nuestro nuevo data set tenga ese tipo de disposicin, aadimos al
JCL esa lnea.
VOL
Este parmetro se usa para identificar el nmero de serie del volumen donde residirn
los dataset.
12
http://www.namocode.com
http://devthisblog.namocode.es
Una vez visto los campos de los JCLs, vamos a ver algunos ejemplos de JCLs.
Jcl de ejecucin de un programa
//@EJECUTA JOB (999),'@EJECUTA',CLASS=E,MSGCLASS=X,REGION=6M
//*
//************************************************************
//* EJECUCION DEL PROGRAMA CUALQUIERA
*
//************************************************************
//*
//PASO10
EXEC PGM=IKJEFT01,DYNAMNBR=5,REGION=6M
//STEPLIB DD DISP=SHR,DSN=LOADLIB
//
DD DISP=SHR,DSN=PROGRAM.LOAD
//*
//ENTRADA DD DSN=USUARIO.ARCHIVO.ENTRADA1,
//
DISP=SHR
//*
//SALIDA DD DSN=USUARIO.ARCHIVO.SALIDA,
//
UNIT=SYSDA,
//
DCB=(LRECL=9999,RECFM=FB,BLKSIZE=0,DSORG=PS),
//
SPACE=(9999,(100,10),RLSE),
//
DISP=(NEW,CATLG,CATLG)
//*
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSABEND DD SYSOUT=*
//SYSOUT
DD SYSOUT=*
//SYSABOUT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(DSN)
RUN PROGRAM(CUALQUIERA) PLAN(PLAN)
END
/*
Pasamos a comentar este JCL para que podamos entenderlo y veamos que
realmente es ms sencillo de lo que parece a simple vista.
Linea 1: //@EJECUTA JOB (999),'@EJECUTA',CLASS=E,MSGCLASS=X,REGION=6M
Inicio del JCL pasandole los parametros necesarios como vimos en las paginas 4 y 5
de este manual.
Estas, nos indica que leer un archivo ya catalogado (fichero de entrada) que se
le pasar a nuestra aplicacin de Cobol, adems vemos que la disposicin a este fichero
es SHR es decir compartida, por lo que otros usuarios podrn acceder al mismo tiempo
que nosotros.
13
http://www.namocode.com
http://devthisblog.namocode.es
Por otro lado el siguiente DSN. USUARIO.ARCHIVO.SALIDA, se puede ver que
vamos a crear un nuevo fichero con new adems nos lo catalogar funcione nuestro
programa o no, de error o no, siempre estar en el catalogo.
Para finalizar, comentar que se almacenar en SYSDA que como se dijo
anteriormente es el primer dispositivo libre que haya ademas de usar un control del
bloque para el fichero (DCB).
En este JCL solo queda comentar esto:
//SYSTSIN DD *
DSN SYSTEM(DSN)
RUN PROGRAM(CUALQUIERA) PLAN(PLAN)
END
/*
14
http://www.namocode.com
http://devthisblog.namocode.es
FROM
FROM
SYSIN
SYSIN
Esto asignara nuestras variables del JCL a nuestra aplicacin. En nuestro JCL
debemos aadir la siguiente lnea:
//SYSIN DD *
Parametro1
Parametro2
Los dos parmetros los pasaremos a nuestro programa de cobol que podremos
almacenar en variables, tablas internas y las podremos tratas como ms nos guste.
2. DUMMY o DSN = NULLFILE
Algunas veces necesitamos testear programas sin data set. Podemos usar
DUMMY o DSN = NULLFILE si lo que deseamos es pasarle un valor nulo sin archivos
de entrada o salida, o bien para generar algn tipo de error o por cualquier otro motivo.
Cuando usamos estos valores, el sistema simula la presencia de un fichero. Cuando se
lea el fichero, el sistema enviara un final de fichero. Ya hemos visto parte del
funcionamiento en el hola mundo de JCL en las primeras pginas.
3. Concatenacin de data Sets
Como dice el titulo, podemos concatenar diferentes ficheros en otro. Todos los
data set concatenados deben ser del mismo tipo. Por ejemplo los data set particionados
solo se pueden concatenar con otros data set particionados.
15
http://www.namocode.com
http://devthisblog.namocode.es
Un ejemplo de esta concatenacin puede ser el siguiente:
//UNION
//SYSPRINT
//ENTRADA
//
//
//
//
//
//
//
EXEC PGM=IDCAMS
DD SYSOUT=*
DD DSN=fichero1,
DISP=SHR
DD DSN= fichero2,
DISP=SHR
DD DSN= fichero3,
DISP=SHR
DD DSN= fichero4,
DISP=SHR
16
http://www.namocode.com
http://devthisblog.namocode.es
Dni
1111111
2222222
1111111
333333
333222
Apellido
Ccccccc
AAAAA
BBBBB
GGGGG
BBBBBB
El fragmento del JCL que nos interesa, sera algo como esto:
//***************************************************************
//*
ORDENACION DEL FICHERO TEMPORAL
*
//***************************************************************
//SORT
EXEC PGM=SORT
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSDBOUT DD SYSOUT=*
//SYSABOUT DD SYSOUT=*
//SYSOUT
DD SYSOUT=*
//*
//SORTIN
DD DSN=Fichero_Entrada,
//
DISP=SHR
//SORTOUT DD DSN=Fichero_Salida,
//
DISP=(NEW,CATLG,CATLG),
//
UNIT=SYSDA,
//
SPACE=(1940,(7000,10000),RLSE),
//
DCB=(LRECL=1940,RECFM=FB,BLKSIZE=0,DSORG=PS)
//*
//SORTWK01 DD UNIT=SYSDA,
//
SPACE=(TRK,(10,20))
//SORTWK02 DD UNIT=SYSDA,
//
SPACE=(TRK,(10,20))
//SORTWK03 DD UNIT=SYSDA,
//
SPACE=(TRK,(10,20))
//SYSIN
DD *
SORT FIELDS=(1,3,CH,A,6,3,CH,A)
OUTREC FIELDS=(1,1940)
17
http://www.namocode.com
http://devthisblog.namocode.es
El fichero resultado sera algo as:
Nombre
AAAAAA
BBBBBB
CCCCCC
CCCCCC
FFFFFF
Dni
333222
111111
111111
222222
333333
Apellido
BBBBBB
CCCCCC
BBBBBB
AAAAAA
GGGGGG
Explicacin:
La sintaxis de SORT para ordenar registros depende de las palabras que nosotros
le pasamos como parmetros (Podemos usar dos campos principales para realizar la
ordenacin)
En nuestro ejemplo:
SORT FIELDS=(1,3,CH,A,6,3,CH,A)
18
http://www.namocode.com
http://devthisblog.namocode.es
2. JCL de Transferencias:
El JCL que a continuacin se explica, sirve para realizar la transferencia de
ficheros entre diferentes entornos o diferentes usuarios dentro del mismo entorno.
//FTP JOB (1),'FTP',CLASS=A,MSGLEVEL=(1,1),MSGCLASS=X,
//
REGION=3000K
//********************************************************************
//* ENVIA FICHEROS POR FTP
//********************************************************************
//PASOFTP EXEC PGM=FTP,REGION=4096K
//SYSPRINT DD
SYSOUT=*
//OUTPUT
DD
SYSOUT=*
//SYSFTPD DD
DISP=SHR,DSN=TCPIP.MDRVSJ.FTPSDATA.TCPIP
//SYSTCPD DD
DISP=SHR,DSN=TCPIP.MDRVSJ.FTPCDATA.TCPIP
//***************************
//INPUT
DD *
HOSTNAME ( EXIT=8
USUARIO CONTRASEA
<COMANDOS>
QUIT
/*
Este JCL es un ejemplo para realizar FTP. Paso a describir las diferentes
opciones que se pueden realizar:
19
http://www.namocode.com
http://devthisblog.namocode.es
IEBCOMPR:
Esta utilidad se usa para comparar dos registros secuenciales o en data set
particionados, durante el proceso IEBCOMPR compara cada registro de cada data set
uno a uno.
Ejemplo:
//XXXXXXXW JOB
XXXXXXX,AAAA.A.A,CLASS=G,MSGCLASS=1,NOTIFY=XXXXX
//STEP01
EXEC PGM=IEBCOMPR,ACCT=PJ00000000
//
INCLUDE MEMBER=@BATCHS
//SYSIN
DD DUMMY
//SYSUT1
DD DSN=XXXXXXX.OLDFILE,UNIT=DASD,DISP=SHR
//SYSUT2
DD DSN=XXXXXXX.NEWFILE,UNIT=DASD,DISP=SHR
//SYSUT#
DD
IEBCOPY:
Copia y fusiona data sets particionados. Puede seleccionar o excluir miembros
especificados durante la operacin de copiado adems de reemplazar o renombrar
miembros del data set.
Ejemplo:
//stepname EXEC PGM=IEBCOPY
//SYSPRINT DD SYSOUT=class
//MYDD1
DD DSN=xxxx.ppp.psps,DISP=shr
//MYDD2
DD DSN=xxxx.ppp.pssp,DISP=shr
//SYSIN
DD *
COPY INDD=MYDD1,
OUTDD=MYDD2
SELECT MEMBER=(mem1,mem2,mem3)/ EXCLUDE member=(sf,df,sa)
/*
//
IEBGENER:
Utilizado para copiar, crear o imprimir ficheros secuenciales y / o
particionados. Tambin para manipular su contenido.
IEBDG:
Crea data sets con un patrn de datos. Usado para realizar pruebas
20
http://www.namocode.com
http://devthisblog.namocode.es
G. Bibliografa.
MVC JCL User Guide de IBM. (RedBooks)
Wikipedia.
http://en.wikipedia.org/wiki/IBM_mainframe_utility_programs
21