lunes, 25 de abril de 2011

JCL Básico IV: Sentencia DD (Parte II)

Continuamos con la segunda parte de este artículo. Vamos a hablar ahora de los diferentes parámetros que puede tener la sentencia DD. Los parámetros pueden ser de dos tipos, posicionales o de palabras clave. Vamos a ver ambos por separado:

PARÁMETROS POSICIONALES:
Asterisco *
El asterisco evita tener que definir un fichero, únicamente indicaremos los datos. La finalización de datos se indica con ( /* ) o con ( // ). Por ejemplo:

//PAS01 EXEC PGM=MIPROGRAMA
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//ENTRADA2 DD *
AQUI_ESCRIBIMOS_LOS_DATOS_DE_ENTRADA2
//SALIDA1  DD DSN=xxxx.nombre.fichero3,
//            DISP=(NEW,CATLG,DELETE),...


Otra utilidad es en los SORT:
//SYSIN DD *
SORT FIELDS=(1,4,CH,A)
/*


DATA
Similar al asterisco con la diferencia de que la finalización de datos se indica con el delimitador /*.

NOTA: Aunque poco usado, este delimitador puede ser modificado para no llevarnos a confusión.
Indicando DLM='##', sustituimos el delimitador /* por el ##. Sirve también para el parámetro asterisco *
Ejemplo de uso:

//PAS01 EXEC PGM=MIPROGRAMA
//SYSIN DD DATA,DLM=‘##’
SORT FIELDS=(1,1,CH,A)

##--> Delimitador modificado


DUMMY
Indica un fichero ficticio. El jcl tratará este fichero como si fuera real pero no
leerá o escribirá ningun dato sobre él. Muy útil cuando se quiere ejecutar un job sin generar algún fichero que no nos interese.

Aclaraciones: El programa utilizado ha de realizar el open y el close como si de un fichero real se tratara. En el siguiente ejemplo se ejecuta el programa MIPROGRAMA del mismo modo que lo haría normalmente, pero en el fichero de SALIDA1 no se obtendrán datos, sin embargo el funcionamiento del programa será exactamente el mismo.

//PAS01 EXEC PGM=MIPROGRAMA
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//SALIDA1  DD DUMMY
//SALIDA2  DD DSN=xxxx.nombre.fichero3,
//            DISP=(NEW,CATLG,DELETE),...


DYNAM
Sirve para asignar memoria dinámica a nuestro paso. Pondremos tantas DD DYNAM como
ficheros tengamos. Si no la indicamos el jcl se sirve de la memoria dinámica indicada en la sentencia EXEC con el DYNAMNBR. Pero también se pueden combinar ambas utilidades.
Veamos 3 posibles ejemplos prácticos(los 3 asignan la misma memoria, dejo a vuestra elección el que más os guste):

//PAS01 EXEC PGM=MIPROGRAMA
//DD1 DD DYNAM
//DD2 DD DYNAM
//DD3 DD DYNAM
//DD4 DD DYNAM

//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//SALIDA1  DD DUMMY
//SALIDA2  DD DSN=xxxx.nombre.fichero3,
//            DISP=(NEW,CATLG,DELETE),...


//PAS01 EXEC PGM=MIPROGRAMA,DYNAMNBR=4
//DD1 DD DYNAM
//DD2 DD DYNAM
//DD3 DD DYNAM
//DD4 DD DYNAM

//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//SALIDA1  DD DUMMY
//SALIDA2  DD DSN=xxxx.nombre.fichero3,
//            DISP=(NEW,CATLG,DELETE),...


//PAS01 EXEC PGM=MIPROGRAMA,DYNAMNBR=4
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//SALIDA1  DD DUMMY
//SALIDA2  DD DSN=xxxx.nombre.fichero3,
//            DISP=(NEW,CATLG,DELETE),...


PARÁMETROS PALABRAS CLAVE
Pueden codificarse en cualquier orden y son opcionales.

DDNAME
Funciona de forma similar a un procedimiento o copy. Tú defines una variable(por
ejemplo TEXTO) y almacenas en ella los datos que quieras. Después únicamente has de hacer una llamada (DDNAME=ENTR1) para utilizar ese texto. Se ve muy claro con un ejemplo:

//PAS01 EXEC PGM=MIPROGRAMA,DYNAMNBR=4
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//ENTRADA1 DD DDNAME=FICHERO2
//SALIDA1  DD DSN=xxxx.nombre.fichero2,
//            DISP=(NEW,CATLG,DELETE),...
...
...
//PAS01 EXEC FERPROC
//PASO01.FICHERO2 DD *
AQUI_ESCRIBIMOS_LOS_DATOS_DE_NUESTRO_FICHERO
/*



SYSOUT
Con ella indicas al jcl a qué cola enviar la salida.
Con SYSOUT=* la ejecución del jcl va a la cola que tengas indicada en el MSGCLASS de la cabecera.
Con SYSOUT=2 la ejecución del jcl va a la cola que el host considere que es la cola 2 (según la arquitectura donde nos encontremos variará).


COPIES
Indica el número de copias que queremos del fichero donde se indica. Hay un máximo de 255 copias.

//PAS01 EXEC PGM=MIPROGRAMA,DYNAMNBR=4
//SYSPRINT DD SYSOUT=2,COPIES=2
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//SALIDA1  DD DSN=xxxx.nombre.fichero2
//            DISP=(NEW,CATLG,DELETE),...
//SALIDA2  DD DSN=xxxx.nombre.fichero3,
//            DISP=(NEW,CATLG,DELETE),...


DEST
Sirve para indicar el destino del SYSOUT. Por ejemplo, con DEST=LOCAL la ejecución va al terminal por defecto de la instalación:

//PAS01 EXEC PGM=MIPROGRAMA,DYNAMNBR=4
//SYSPRINT DD SYSOUT=2,DEST=LOCAL
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//SALIDA1  DD DSN=xxxx.nombre.fichero2
//            DISP=(NEW,CATLG,DELETE),...
//SALIDA2  DD DSN=xxxx.nombre.fichero3,
//            DISP=(NEW,CATLG,DELETE),...


FREE
Este comando libera un fichero cuando el jcl no lo use y, de ese modo, que otro jcl lo pueda usar. Para los amantes del rendimiento, muy útil para evitar esperas innecesarias. Puede tener dos valores:
FREE=END --> el fichero se libera al terminar el paso donde se esté ejecutando
FREE=CLOSE --> el fichero se libera en cuanto el programa lo cierra


HOLD
Retiene la ejecución de la salida del jcl hasta que el operador de la consola lo
libera. Solo se usa en el SYSOUT. Si no se indica, por defecto está desactivado(HOLD=NO). Para activarlo: HOLD=YES.

//PAS01 EXEC PGM=MIPROGRAMA,DYNAMNBR=4
//SYSPRINT DD SYSOUT=2,HOLD=YES
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//SALIDA1  DD DSN=xxxx.nombre.fichero2
//            DISP=(NEW,CATLG,DELETE),...


UCS
Solo dejo reseñado lo que he leído sobre este comando, no sé muy bien como funciona pues nunca lo probé, pero si a alguien le sirve ahí va:
Sirve para indicar el juego de caracteres que utilizará la cola de impresión. Los posibles valores son:
UCS=indicar_Juego_de_Caracteres,FOLD,VERIFY

En juego de caracteres se indican los caracteres
FOLD - es opcional, permite modificar el juego de caracteres por otro(por ejemplo cambiar mayúsculas a minúsculas)
VERIFY - el operador verificará el juego de caracteres

//PAS01 EXEC PGM=MIPROGRAMA,DYNAMNBR=4
//SYSPRINT DD SYSOUT=2,UCS=(YN,,VERIFY)
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//SALIDA1  DD DSN=xxxx.nombre.fichero2
//            DISP=(NEW,CATLG,DELETE),...


OUTLIM
Sirve para indicar el número máximo de registros que saldrán en los ficheros de tipo SYSOUT. Muy útil para cuando tenemos muchos displays y se nos desborda la ejecución.

Por ejemplo con OUTLIM=1000 cuando la ejecución llegue a 1000 registros se para el job.

//PAS01 EXEC PGM=MIPROGRAMA,DYNAMNBR=4
//SYSPRINT DD SYSOUT=2,OUTLIM=1000
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//SALIDA1  DD DSN=xxxx.nombre.fichero2
//            DISP=(NEW,CATLG,DELETE),...


El valor máximo es 16777215. Si no se indica se considera ilimitado.

Hemos explicado los posibles parámetros en la ficha DD. En el próximo artículo explicaré algo mucho más interesante, los posibles parámetros para los ficheros de salida de nuestros pasos: cilindros, space, ficheros en cinta, longitudes de ficheros, etc...

1 comentario:

Anónimo dijo...

FREE=END --> el fichero se libera al terminar el paso donde se esté ejecutando
FREE=CLOSE --> el fichero se libera en cuanto el programa lo cierra


eso en que parte va? cuando definis la EXEC, o al costado de cada fichero cuand se crea ?

saluds