Continuamos con el último apartado de la sentencia DD. Vamos a hablar de todos los posibles parámetros que se pueden indicar en una sentencia DD DSN.
DSN ó DSNAME
Sirve para indicar el nombre del fichero en donde vamos ha guardar la salida. Por ejemplo, un programa con dos ficheros de entrada y dos de salida quedaría del siguiente modo:
//PAS01 EXEC PGM=MIPROGRAMA
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//ENTRADA2 DD DSN=xxxx.nombre.fichero2,DISP=SHR
//SALIDA1 DD DSN=xxxx.nombre.fichero3,
// ...
//SALIDA2 DD DSN=xxxx.nombre.fichero4,
// ...
¿Qué nombre he de dar al fichero?
El nombre que des a un fichero es libre pero teniendo en cuenta las reglas obligatorias que marca el host y las reglas opcionales que te marque la arquitectura donde te encuentres.
Como las reglas de arquitectura van en función del entorno donde te encuentres voy a comentar las reglas del host:
- Nombres simples: Un único nombre de 8 posiciones alfanuméricas en donde el primer carácter alfabético ha de ser uno de los siguientes: @ $ #
- Nombres compuestos: Puede tener varios nombres simples separados por puntos siempre y cuando el total de posiciones(incluidos los puntos) no supere las 44 posiciones.
- Nombres de ficheros particionados: los explicaré más adelante
- Nombres de ficheros temporales: los explicaré más adelante
- Nombres de ficheros generacionales: los explicaré más adelante
- Nombres que referencian a ficheros anteriores:
Una opción es utilizar "DSN=NULLFILE" en vez de "DD DUMMY"
Estos dos ejemplo son lo mismo:
//PAS01 EXEC PGM=MIPROGRAMA
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//ENTRADA2 DD DSN=xxxx.nombre.fichero2,DISP=SHR
//SALIDA1 DD DSN=xxxx.nombre.fichero3,
// ...
//SALIDA2 DD DSN=NULLFILE
//PAS01 EXEC PGM=MIPROGRAMA
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
//ENTRADA2 DD DSN=xxxx.nombre.fichero2,DISP=SHR
//SALIDA1 DD DSN=xxxx.nombre.fichero3,
// ...
//SALIDA2 DD DUMMY
DISP
Se usa para indicar la disposición del fichero. Tiene hasta 3 posibles subparámetros:
- El primero indica la disposición del fichero en el estado inicial. Este estado puede ser: NEW, OLD, SHR ó MOD.
- El segundo indica la disposición del fichero en caso de que la ejecución sea correcta. Este estado puede ser: DELETE,KEEP,PASS,CATLG,UNCATLG
- El tercero indica la disposición del fichero en caso de que la ejecución falle. Este estado puede ser DELETE,KEEP,CATLG,UNCATLG
Explico cada uno de ellos:
NEW - El fichero es de nueva creación.
OLD - El fichero existe y se abrirá para uso exlusivo del proceso que lo lance.
SHR - El fichero existe y será compartido con cualquier otro proceso que quiera usarlo.
MOD - Si el fichero existe se abrirá para uso exlusivo del proceso que lo lance. Se posicionará en el ultimo registro y comenzará a escribir a partir de ese último registro. Si el fichero no existe asume DISP=(NEW)
NOTA: Si no se codifica el primer subparámetro (,xxx,xxx) por defecto el sistema pone NEW
DELETE - Se elimina el fichero tras la ejecución.
Si (,DELETE,xxx) --> en caso de que el paso termine bien se borra el fichero
Si (,xxx,DELETE) --> en caso de error se borra el fichero
Si (,DELETE,DELETE) --> tanto si el paso termina bien como si no, en cualquier caso se borra el fichero
KEEP - El fichero se guarda al final del paso. El sistema no guarda la dirección del fichero y por ello deberemos referenciar todos los datos para recuperar la información del mismo
Si (,KEEP,xxx) --> en caso de que el paso termine bien se guarda
Si (,xxx,KEEP) --> en caso de error se guarda el fichero
Si (,KEEP,KEEP) --> tanto si el paso termina bien como si no, en cualquier caso se guarda el fichero
PASS - Permite utilizar el fichero solo durante la ejecución del jcl. Una vez terminada la ejecución el fichero se borra solo.
CATLG - Permite guardar el fichero una vez creado. Puedes utiliar el fichero una vez terminada la ejecución. Siguiendo con el ejemplo:
Si (,CATLG,xxx) --> en caso de que el paso termine bien se cataloga
Si (,xxx,CATLG) --> en caso de error se cataloga el fichero
Si (,CATLG,CATLG) --> tanto si el paso termina bien como si no, en cualquier caso se cataloga el fichero
UNCATLG - Se borra la dirección del catalogo del acceso a un fichero
NOTA: Los valores por defecto son:
Si no pones nada o pones DISP=(NEW) por defecto el sistema toma --> DISP=(NEW,DELETE,DELETE)
Si pones solo DISP=(OLD) el sistema toma por defecto DISP=(OLD,KEEP,KEEP)
Si pones solo DISP=(SHR) el sistema toma por defecto DISP=(SHR,KEEP,KEEP)
Como ejemplos de estas combinaciones pueden salir muchos, os lo dejo en vuestras manos. Simplemente es ir combinando los 3 subparámetros para obtener el resultado esperado.
UNIT
Sirve para especificar en que tipo de dispositivo queremos guardar el fichero:
UNIT=dispositivo
SYSALLDA - Dispositivo de acceso directo (Disco). Uso: UNIT=SYSALLDA
TAPE - Cinta. Uso: UNIT=TAPE
TA80 - Cartucho. Uso: UNIT=TA80
TA90 - Cartucho de alta densidad . Uso: UNIT=TA90
SPACE
Se utiliza para asignar el espacio necesario para catalogar un fichero. Consta de varios subparámetros:
SPACE=(unidad,(mem_primaria,mem_secundaria,num_bloq),RLSE,tipo_asig,ROUND)
Un ejemplo: SPACE=(CYL,(250,125),RLSE,,)
Unidad --> Lo primero en hacer es elegir la unidad de medida del espacio, teniendo en cuenta que:
- TRK: El espacio necesario se pide en pistas. PISTAS = (LONG.REGISTRO * NUM.REGISTROS) / 47474
- CYL: El espacio necesario se pide en cilindros.
Generalmente este se utiliza para cadenas de JCL que utiliza 15 pistas.
Ojo este prácticamente no libera pistas. CILINDROS = PISTAS / 15
Memoria primaria --> Cantidad de memoria que se estima que necesitará el fichero
Memoria secundaria --> cantidad a añadir en caso de sobrepasar la memoria primaria
Número de bloques --> Número de bloques del directorio. Este dato se obtiene mediante:
- FICHEROS PEQUEÑOS Y MEDIANOS.
BLOQUE = (15476 / LONG.REGISTRO) ENTERO * LONG.REGISTRO
- FICHEROS GRANDES.
BLOQUE = (23476 / LONG.REGISTRO) ENTERO * LONG.REGISTRO
RLSE --> Se encarga de liberar el espacio no ocupado tras crear el fichero
Tipo de Asignación:
-CONTIG. Pide que el espacio asignado para la petición primaria sea contiguo
-MXIG. Solicita la asignación del área mayor de espacio libre
-ALX. Solicita la asignación del área mayor de espacio libre no inferior a 5 áreas contiguas
ROUND --> Tiene sentido en espacio por bloques y efectúa el redondeo a número entero de cilindros.
DCB
Con el DCB se definen parámetros del fichero tales como la longitud fija o variable, el tipo de organización o el tipo de particionamiento. Su estructura es:
DCB=(RECFM=?,LRECL=?,BLKSIZE=?,DSORG=?,DEN=?)
Ejemplo: DCB=(RECFM=FB,LRECL=80,BLKSIZE=8000,DSORG=PS)
RECFM:
U-Indefinido
V-Longitud variable
VB-longitud variable bloqueado
F-Longitud fija
FB-Longitud fija bloqueada
FBA-Longitud fija bloqueda con caracteres ASA (para impresión)
LRECL --> Longitud del registro
BLKSIZE --> Longitud del bloqueo. Poner un número múltiplo del LRECL
DSORG --> Tipo de organización
PS-Secuancial
IS-Secuancial Indexado
DA-Organización directa
PO-Particionado
Mostrando entradas con la etiqueta DD. Mostrar todas las entradas
Mostrando entradas con la etiqueta DD. Mostrar todas las entradas
miércoles, 8 de junio de 2011
lunes, 28 de marzo de 2011
JCL Básico IV: Sentencia DD (Parte I)
Sentencia que describe los ficheros con los que se va a trabajar (una sentencia DD por cada fichero). Identifica cada fichero lógico definido en la SELECT del programa con su fichero físico.
No puede existir mas de una sola DD identificada con el mismo nombre lógico.
//FICHERO1 DD DSN=xxxx.nombre.fichero
// DISP=(NEW,CATLG,DELETE),VOL=SER=SYSWKl,
// UNIT=3380,LABEL=3,SPACE=(TRK,(10,5),RLSE),
// COPIES=4,DEST=RMT005,OUTLIM=1500,
// RECFM=FB,LRECL=150,BLKSIZE=1500
La no especificación de nombre lógico en una ficha DD presupone la concatenación al fichero de la sentencia DD anterior. En ocasiones un paso puede precisar de mas de un fichero para una determinada entrada de datos y ello es posible por medio de la concatenación de DD.s. La forma en codificarse es:
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
// DD DSN=xxxx.nombre.fichero2,DISP=SHR
//SALIDA1 DD DSN=xxxx.nombre.fichero3,
// DISP=(NEW,CATLG,DELETE),VOL=SER=SYSWKl,
// UNIT=3380,LABEL=3,SPACE=(TRK,(10,5),RLSE),
// COPIES=4,DEST=RMT005,OUTLIM=1500,
// RECFM=FB,LRECL=150,BLKSIZE=1500
NOTA. En este caso ambos ficheros de entrada han de tener la misma longitud.
Anteriormente a este artículo he hablado de las líneas de la cabecera de un jcl y de las sentencias que ejecutan programas (EXEC). Podemos tener sentencias DD tanto en la cabecera como en cada uno de los pasos de nuestro jcl:
La sentencia DD es bastante amplia, por lo tanto, continuaré con ella en el próximo artículo...(JCL Básico IV: Sentencia DD (Parte II)
No puede existir mas de una sola DD identificada con el mismo nombre lógico.
//FICHERO1 DD DSN=xxxx.nombre.fichero
// DISP=(NEW,CATLG,DELETE),VOL=SER=SYSWKl,
// UNIT=3380,LABEL=3,SPACE=(TRK,(10,5),RLSE),
// COPIES=4,DEST=RMT005,OUTLIM=1500,
// RECFM=FB,LRECL=150,BLKSIZE=1500
La no especificación de nombre lógico en una ficha DD presupone la concatenación al fichero de la sentencia DD anterior. En ocasiones un paso puede precisar de mas de un fichero para una determinada entrada de datos y ello es posible por medio de la concatenación de DD.s. La forma en codificarse es:
//ENTRADA1 DD DSN=xxxx.nombre.fichero1,DISP=SHR
// DD DSN=xxxx.nombre.fichero2,DISP=SHR
//SALIDA1 DD DSN=xxxx.nombre.fichero3,
// DISP=(NEW,CATLG,DELETE),VOL=SER=SYSWKl,
// UNIT=3380,LABEL=3,SPACE=(TRK,(10,5),RLSE),
// COPIES=4,DEST=RMT005,OUTLIM=1500,
// RECFM=FB,LRECL=150,BLKSIZE=1500
NOTA. En este caso ambos ficheros de entrada han de tener la misma longitud.
Anteriormente a este artículo he hablado de las líneas de la cabecera de un jcl y de las sentencias que ejecutan programas (EXEC). Podemos tener sentencias DD tanto en la cabecera como en cada uno de los pasos de nuestro jcl:
- Sentencias DD en la cabecera del jcl.
Las únicas DD asociadas a la ficha JOB son aquellas destinadas a definir librerías de acceso a las que deberán acudir los trabajos en tiempo de ejecución. El nombre lógico que las identifica es:- JOBLIB --> La ejecución de un programa se inicia en la busca del objeto (código en lenguaje maquina) en las librerías estandars de la instalación (SYS1.LINKLIB) pero en según que casos puede sernos de utilidad el desplazar esa búsqueda a otras librerías.
La especificación de una o varias librerías no evita en ultimo caso el acudir a las estandars de la instalación si no se encontrase en ninguna de las referidas.
Ha de codificarse después de la ficha JOB y antes de cualquier paso EXEC.
No puede utilizarse en procedimientos catalogados.
La codificación de JOBLIB predispone a los pasos EXEC posteriores a que todos acudan a esas librerías para la obtención del objeto a ejecutar. Será excepción de lo dicho los pasos EXEC que dispongan de una DD STEPLIB en cuyo caso serán esas las librerías de captura. - JOBCAT --> La diferencia de la JOBCAT con la JOBLIB radica en que mientras la anterior buscaba el objeto a ejecutar, esta marca el camino a seguir para la búsqueda y obtención del catalogo de ficheros. sigue las mismas pautas y en ultimo extremo acude a las estancadas de la instalación.
Ha de codificarse después de la ficha JOB y de la JOBLIB y antes de cualquier paso EXEC.
La codificación de JOBCAT predispone a los pasos EXEC posteriores a que todos acudan a esas librerías para la obtención del catalogo de ficheros. Será excepción de lo dicho los pasos EXEC que dispongan de una DD STEPCAT en cuyo caso serán esas las librerías de catalogo. - SYSCHK --> Define el fichero de grabación de CHEKPOINTS (puntos de control) de un programa que se guardan para rearranque posterior.
Debe ser anterior a cualquier paso EXEC de un JOB puesto que en rearranque y especificando la identificación del punto de control se deberá acudir a este fichero antes que al paso para obtener la información del programa que se pretende arrancar.
- JOBLIB --> La ejecución de un programa se inicia en la busca del objeto (código en lenguaje maquina) en las librerías estandars de la instalación (SYS1.LINKLIB) pero en según que casos puede sernos de utilidad el desplazar esa búsqueda a otras librerías.
- Sentencias DD en cada paso (EXEC) del jcl.
Destinadas a definir librerías de acceso a las que deberán acudir los pasos de un trabajos en tiempo de ejecución. El nombre lógico que las identifica es:- STEPLIB --> La ejecución de un programa se inicia en la busca del objeto (código en lenguaje maquina) en las librerías estándar de la instalación (SYS1.LINKLIB) pero en según que casos puede sernos de utilidad el desplazar esa búsqueda a otras librerías.
La especificación de una o varias librerías no evita en ultimo caso el acudir a las stándar de la instalación si no se encontrase en ninguna de las referidas.
Ha de codificarse después de la ficha EXEC aunque no tiene porque ser la primera DD
A diferencia de la JOBLIB puede utilizarse en procedimientos catalogados.
En el siguiente ejemplo, cuando se lance el job, éste buscará el ejecutable del programa PROGRAMA1 en la libreria1 y si no lo encuentra lo buscará en la librería2:
//PASO01 EXEC PGM=PROGRAMA1
//STEPLIB DD DSN=xxxx.nombre.libreria1,DISP=SHR
// DD DSN=xxxx.nombre.libreria2,DISP=SHR
...
...
¿Para que puede servir la STEPLIB? Son muchas las utilidades que tiene:
Pongo un ejemplo:
- Para pruebas en el entorno de explotación, imagina que quieres hacer una prueba de un programa que has creado pero que todavía no está subido al entorno de explotación, pero el cliente insiste en probarlo bien y no te queda otra que hacerlo con datos de explotación.
SOLUCIÓN: Lo que debes hacer es dejar la compilación de tu programa en una librería a la que tengas acceso en el entorno de producción (una librería que hayas creado tú o alguna puente o de intercambio que exista, en muchas plataformas existe una librería preparada para este fin). Una vez copiado tu ejecutable en dicha librería, únicamente tienes que indicar en tu paso de jcl donde se ejecuta el programa, la STEPLIB del siguiente modo:
//PASO01 EXEC PGM=MIPROGRAMA
//STEPLIB DD DSN=xxxx.nombre.libreria1,DISP=SHR
...
Cuando se ejecute el jcl, el programa "tirará" de la librería indicada en la STEPLIB.
Pongo otro ejemplo:
- Imagina que puntualmente se necesita modificar un programa durante un periodo en concreto. Por ejemplo, tienes un programa con información acerca de la velocidad máxima en las autovías (120 km/h). Pero resulta que de la noche a la mañana lo que creías que no iba a ocurrir ocurre, y es que la velocidad ha de ser bajada a 110 km/h durante un plazo determinado. Bien, lo normal sería modificar tu programa, implantarlo, y esperar a que dentro de X meses tengas que volver a modificar el programa para devolverlo a su estado original(120 km/h), con todo lo que eso conlleva, volver a bajar el programa, modificar, probar, implantar, etc....
SOLUCIÓN: Modificas el programa para que admita los 110 km/h pero no lo implantas en producción sino que copias el ejecutable en una librería auxiliar(temporal, puente o como quieras llamarla). Luego, en el jcl que ejecuta tu programa, lo único que haces es añadir al paso una línea de STEPLIB donde indicas esa librería puente donde has dejado la compilación. De este modo durante los próximos meses tu jcl ejecutará la versión del programa que está preparada para los 110 km/h. Cuando la norma cambie y volvamos a poder "correr" en las carreteras a 120, únicamente has de quitar la línea del jcl, o bien borrar el programa modificado de la librería auxiliar (si el jcl no encuentra el programa en la librería indicada en la STEPLIB irá a buscarlo a la librería original). - STEPCAT --> La diferencia de la STEPCAT con la STEPLIB radica en que mientras la anterior buscaba el objeto a ejecutar, esta marca el camino a seguir para la búsqueda y obtención del catalogo de ficheros. sigue las mismas pautas y en ultimo extremo acude a las stándar de la instalación.
Ha de codificarse después de la ficha EXEC aun que no tiene porque ser la primera DD.
La sentencia STEPCAT solo puede referirse a catálogos de usuario del tipo VSAM. - SYSABEND --> Determina el fichero donde el sistema efectuara el vuelco de memoria por terminación anormal ABENDED. La información que aporta hace referencia a:
Núcleo del sistema
Área del programa problema
Tabla de Trace - SYSUDUMP --> Determina el fichero donde el sistema efectuara el vuelco de memoria por terminación anormal ABENDED. A diferencia de la anterior tan solo facilita información del área del programa.
- DUMMY --> representa un fichero ficticio, el programa lo abrirá, efectuará operaciones de E/S sobre el (ficticias), pero el sistema no dará error. Muy útil cuando no queremos que, por lo que sea, no queremos obtener el fichero de salida de un programa, ponemos el fichero a DUMMY y la ejecución será exactamente igual que si lo tuviéramos pero sin escribir nada en la salida.
- STEPLIB --> La ejecución de un programa se inicia en la busca del objeto (código en lenguaje maquina) en las librerías estándar de la instalación (SYS1.LINKLIB) pero en según que casos puede sernos de utilidad el desplazar esa búsqueda a otras librerías.
La sentencia DD es bastante amplia, por lo tanto, continuaré con ella en el próximo artículo...(JCL Básico IV: Sentencia DD (Parte II)
miércoles, 16 de febrero de 2011
JCL Básico I: ¿Qué es JCL?
¿Qué es JCL?
Vamos con un poco de teoría sobre este lenguaje.
JCL (Job Control Language) - Es un lenguaje de programación que permite codificar las instrucciones necesarias para la ejecución de un proceso batch. Estas instrucciones o sentencias son interpretadas y ejecutadas por el Gestor de trabajos (JES).
JCL (Job Control Language) - Es un lenguaje de programación que permite codificar las instrucciones necesarias para la ejecución de un proceso batch. Estas instrucciones o sentencias son interpretadas y ejecutadas por el Gestor de trabajos (JES).
La codificación de éste, se realiza con el editor ISPF.
Ésta introducción igual es un poco complicada porque solo hace referencia a la definición de términos generales del lenguaje. En los siguientes volúmenes se entra más al detalle, no os preocupéis si no os quedáis con nada de lo que se dice. No me entero ni yo... :-)
Sentencias JOB / EXEC / DD
- JOB - Identifica el trabajo a realizar. Es procesada por la parte de lectura del JES(Reader). Aporta un registro contable para el trabajo.
- EXEC - Identifica el programa o procedimiento que se va a ejecutar. Se procesa por parte del JES en el apartado (Converter) destinado a modificar el JCL por rutinas y sentencias estándar del sistema . Se abre un registro contable que identifica el paso de trabajo.
- DD - Identifica los recursos que va a utilizar el programa (por ejemplo, ficheros). Como la sentencia anterior la ejecución de la sentencia es procesada en primer lugar por el apartado (Converter) del JES. En algunos casos si ello fuese preciso se acude al Gestor de Recursos del Sistema (SRM)
Suscribirse a:
Comentarios (Atom)