jueves, 25 de noviembre de 2010

Ficheros Generacionales GDG

Ficheros generacionales GDG (Generation Data Group)

El mejor modo de entender el comportamiento de estos ficheros es mediante un ejemplo:
Para hacer referencia a cada versión de fichero se sigue lo siguiente:

XXXXXXXX.YYYYYYYY.ZZZZZZZZ(0) --> Última versión / versión actual
XXXXXXXX.YYYYYYYY.ZZZZZZZZ(+1) --> Versión nueva
XXXXXXXX.YYYYYYYY.ZZZZZZZZ(-1) --> Versión anterior a la actual


Supongamos que tenemos un fichero de 7 versiones con los datos de los últimos 7 días de la semana.

Nuestro fichero tendría este aspecto:

XXXXXXXX.YYYYYYYY.ZZZZZZZZ --> Base (no contiene información)
XXXXXXXX.YYYYYYYY.ZZZZZZZZ.G0001V00 --> Datos Martes 12
XXXXXXXX.YYYYYYYY.ZZZZZZZZ.G0002V00 --> Datos Miércoles 13
XXXXXXXX.YYYYYYYY.ZZZZZZZZ.G0003V00 --> Datos Jueves 14
XXXXXXXX.YYYYYYYY.ZZZZZZZZ.G0004V00 --> Datos Viernes 15
XXXXXXXX.YYYYYYYY.ZZZZZZZZ.G0005V00 --> Datos Sábado 16
XXXXXXXX.YYYYYYYY.ZZZZZZZZ.G0006V00 --> Datos Domingo 17
XXXXXXXX.YYYYYYYY.ZZZZZZZZ.G0007V00 --> Datos Lunes 18


Para hacer referencia a la versión que queramos lo indicaremos de este modo:

XXXXXXXX.YYYYYYYY.ZZZZZZZZ(-6) --> Datos Martes 12
XXXXXXXX.YYYYYYYY.ZZZZZZZZ(-5) --> Datos Miércoles 13
XXXXXXXX.YYYYYYYY.ZZZZZZZZ(-4) --> Datos Jueves 14
XXXXXXXX.YYYYYYYY.ZZZZZZZZ(-3) --> Datos Viernes 15
XXXXXXXX.YYYYYYYY.ZZZZZZZZ(-2) --> Datos Sábado 16
XXXXXXXX.YYYYYYYY.ZZZZZZZZ(-1) --> Datos Domingo 17
XXXXXXXX.YYYYYYYY.ZZZZZZZZ(0) --> Datos Lunes 18


Imaginemos que queremos guardar los datos del Martes 19. En nuestro jcl, para crear la nueva versión de datos le indicaremos:
XXXXXXXX.YYYYYYYY.ZZZZZZZZ(+1)

Una vez creada una nueva versión nuestro fichero, la versión (+1) que hemos usado pasará a ser la (0), y la que era (0) pasará a ser (-1), es decir, quedará del siguiente modo:

XXXXXXXX.YYYYYYYY.ZZZZZZZZ(-6) --> Datos Martes 12. (La versión más antigua se pierde)
XXXXXXXX.YYYYYYYY.ZZZZZZZZ(-6) --> Datos Miércoles 13
XXXXXXXX.YYYYYYYY.ZZZZZZZZ(-5) --> Datos Jueves 14
XXXXXXXX.YYYYYYYY.ZZZZZZZZ(-4) --> Datos Viernes 15
XXXXXXXX.YYYYYYYY.ZZZZZZZZ(-3) --> Datos Sábado 16
XXXXXXXX.YYYYYYYY.ZZZZZZZZ(-2) --> Datos Domingo 17
XXXXXXXX.YYYYYYYY.ZZZZZZZZ(-1) --> Datos Lunes 18
XXXXXXXX.YYYYYYYY.ZZZZZZZZ(0) --> Datos Martes 19


Si quisiéramos utilizar la versión del Martes 19 en otro jcl, ya no haríamos referencia a la versión (+1), sino a la (0).

Sin embargo, si dentro del mismo jcl, creamos una versión nueva y a continuación, en otro paso, la utilizamos(en un programa que lea el fichero por ejemplo), hay que referirse al fichero como (+1).
Esto es porque hasta que no acaba la ejecución del jcl, no se actualiza la información de las versiones, por lo tanto si utilizáramos la versión (0) en el programa, no estaríamos cogiendo la versión creada en el paso anterior, sino la versión anterior a esa.

Paso de Creación de la base de un fichero generacional:

//PASO1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DEFINE GDG(NAME(XXXXXXXX.YYYYYYYY.ZZZZZZZZ) LIMIT(XX) EMPTY/NOEMPTY SCRATCH/NOSCRATCH)


Detalle:
- NAME --> Nombre del fichero. Una buena manera de nombrar los fichero es la siguiente:
XXXXXXXX --> Indentificador de la aplicación
YYYYYYYY --> Nombre del JCL donde se crea
ZZZZZZZZZ --> Nombre del JCL donde se actualiza
- LIMIT --> Indicar el número de versiones que va a tener como máximo.
- EMPTY : Opcional. Especifica que se descataloguen todos los nombres de fichero
cuya versión supere la especificada en LIMIT.
- NOEMPTY : Sirve para especificar que según se vayan generando versiones
nuevas, se vayan borrando las mas antiguas, de forma que solo estén activas
las ultimas LIMIT.
- SCRATCH : Opcional. Especifica que se borre físicamente el fichero cuando
se descatalogue.

Este paso crea únicamente la base del fichero, pero en ésta no se pueden almacenar datos. Se han de crear versiones +1 donde guardaremos los datos.

Los ficheros generacionales son independientes de la longitud. Es decir, cada versión del fichero puede tener una longitud distinta a la anterior.

Paso para modificar el número de versiones de un fichero generacional:

En caso de querer aumentar o disminuir el número de versiones de un fichero GDG, el paso a seguir es el siguiente:

//PASO2 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
ALTER XXXXXXXX.YYYYYYYY.ZZZZZZZZ -
LIMIT(XX)


Si reducimos el número de versiones que tiene un fichero, la máquina por defecto, elimina de la versión más antigua a la más reciente.

Paso para crear una versión vacía de un fichero generacional

En caso de querer crear una versión en vacío de un fichero GDG, el paso a seguir es el siguiente:

//PASO3 EXEC PGM=ICEGENER
//SYSPRINT DD SYSOUT=*
//SYSIN DD DUMMY
//SYSUT1 DD DSN=NULLFILE,
// DCB=(LRECL=XXX,RECFM=FB)
//SYSUT2 DD UNIT=SYSDA,DISP=(NEW,CATLG,DELETE),
// DSN=XXXXXXXX.XXXXXXXX.XXXXXXXX(+1),
// SPACE=(TRK,(1,1),RLSE)
// DCB=(LRECL=XXX,RECFM=FB)


Recordar que cada versión del fichero puede tener una longitud distinta a la anterior.
Si no se sabe o no se quiere indicar la longitud, se puede omitir el:

// DCB=(LRECL=XXX,RECFM=FB)

Ojo. Si se borra esta línea se ha de eliminar la coma de la línea anterior.

Paso de borrado de un fichero generacional

Para borrar un fichero generacional se ha de seguir el siguiente proceso:
- Primero se han de borrar cada una de las versiones del fichero, dejando únicamente su base. Para borrar una versión se puede hacer “a mano” o con un paso de borrado normal. Es importante indicar el número de versión del fichero a borrar (XXXXXXXX.YYYYYYYY.ZZZZZZZZ.G0003V00).
- Una vez eliminadas todas las versiones se ha de lanzar por jcl el siguiente paso:

//PASO4 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DELETE (XXXXXXXX.YYYYYYYY.ZZZZZZZZ) GDG PURGE

8 comentarios:

Tallian dijo...

Se puede decir más alto pero no más claro.

Anónimo dijo...

muy buen post con todos los detalles necesarios para la gestion de ficheros generacionales, sigue haciendo post tan buenos y utiles

Jorge dijo...

De gran gran ayuda. Estupendo aporte. Me ha venido al pelo, muchísimas gracias.

Un saludo!

Tallian dijo...

Muchas gracias Jorge : )

Unknown dijo...

Muy muy buen aporte =D Mas claro ni el agua =)

Anónimo dijo...

Estos ficheros se puede meter cualquier tipo de datos, ya sea bajada de tablas y despues verla con alguna copy?..

Saluds

Tallian dijo...

Sí, la única diferencia es que cada vez que los crees se guardará una versión nueva y se perderá la última : )

Patxi dijo...

Está muy bien el post, pero aun así me surgen dos preguntas:
1 - Si tengo un GDG con varias versiones (pero no se cuantas versiones puedo llegar a tener), y quiero realizar un paso de SORT, para unir todas las versiones en otro fichero, ¿puedo de alguna manera realizar este paso y que una todas las versiones existentes? Me suena que si no especificas la versión, te recoge todas la versiones... ¿es verdad?

2 - Y lo mismo para borrar todas las versiones sin especificar el número