miércoles, 8 de junio de 2011

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

Continuamos con el último apartado de la sentencia DD. Vamos ha 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

6 comentarios:

Daniel Cabrera dijo...

Excelente articulo!!!
Justo lo que necesitaba para comprender mejor el sistema de archivos en un mainframe.

Daniel Cabrera dijo...

Hola,

Tengo una consulta. Que quiere decir la longitud de bloqueo (BLKSIZE)

Saludos y una vez más muy buen aporte.

Alvarito dijo...

Hola Daniel. En el BLKSIZE se indica la longitud máxima del registro físico. Este valor debe ir en bytes.

Creo que no es del todo obligatorio, si no se indica el sistema calcula el valor más próximo al que necesita.
Muchísimas gracias. Un saludo.

Robin dijo...

hola! estaria bien un par de ejemplo de la creacion de ficheros!

muchas gracias!

Anónimo dijo...

Aquí tenéis un ejemplo:

//*******************
//* PASO1
//*******************
//PASO1 EXEC PGM=SORT,PARM=ABEND
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=FICHERO_ENTRADA,
// DISP=SHR
//SORTOUT DD DSN=FICHERO_SALIDA,
// DISP=(,CATLG,DELETE),
// SPACE=(TRK,(400,100),RLSE),
// LRECL=238,RECFM=FB
//SYSIN DD *
SORT FIELDS=(98,6,PD,A)
INCLUDE COND=(33,1,CH,EQ,C'N',AND,
104,1,CH,NE,C'?')
/*
//*

Gabriel Franco dijo...

Excelente, todavía sirve