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