Buscar algo en varias librerías a la vez
Imaginaos, como me pasó a mi hace algunas semanas, que
tuviésemos que identificar cuáles son los programas de nuestra aplicación que
invocan a un determinado objeto. Si nuestro sistema tiene una única librería,
podremos usar la utilidad Search-For Utility y obtener el resultado
rápidamente. Por desgracia, la instalación de este cliente tiene hasta 12
librerías distintas y, por tanto, sería algo tedioso ejecutar las búsquedas una
a una con la opción 3.14 del ISPF. ¿Cómo podríamos agilizar este proceso?
Una de las formas de subsanar este problema sería crearnos
un JCL que vaya ejecutando, de forma secuencial, la búsqueda de la cadena en
cada una de las librerías afectadas. Esta es la solución que vamos a analizar hoy
y, al final del post, no os debería resultar difícil replicar el procedimiento
en vuestra propia instalación.
Para abordar esta tarea, en primer lugar voy a mostrar uno
de los Jobs que suelo emplear para realizar las búsquedas en múltiples
librerías.
//SEARCH1B JOB (0,AT60,1440,0005),
// '60360000000.CDD',MSGLEVEL=(1,1),
// MSGCLASS=X,CLASS=A,REGION=4M,NOTIFY=&SYSUID
//*
//BORRAR1 EXEC PGM=IEFBR14
//*
//FICHERO DD DSN=JJPR.V7R01.JJST.BUSCADOR,
// DISP=(MOD,DELETE),
// SPACE=(TRK,0),
// UNIT=DISCO
//*
//BORRAR1A EXEC PGM=ABEN3333,
// COND=(4,GE,BORRAR1)
//CTRNORST DD DUMMY
//*
//SEARCH EXEC PGM=ISRSUPC,
// PARM=(SRCHCMP,'')
//*
//NEWDD DD DSN=JJPR.V7R00.CON.JJMU.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJST.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJGU.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJAN.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJPL.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJRG.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJGM.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJTF.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJBL.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJPU.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJRV.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJPR.FUENTES,DISP=SHR
//*
//OUTDD DD DISP=(NEW,CATLG,DELETE),SPACE=(TRK,(10,10)),
// DSN=JJPR.V7R01.JJST.BUSCADOR
//SYSIN DD *
SRCHFOR 'CADENATX'
/*
A continuación, voy a intentar explicaros con un poco de detalle qué es lo que tenemos que especificar en cada una de las fichas del JCL anterior.
//SEARCH1B JOB (0,AT60,1440,0005),
// '60360000000.CDD',MSGLEVEL=(1,1),
// MSGCLASS=X,CLASS=A,REGION=4M,NOTIFY=&SYSUID
//*
//BORRAR1 EXEC PGM=IEFBR14
//*
//FICHERO DD DSN=JJPR.V7R01.JJST.BUSCADOR,
// DISP=(MOD,DELETE),
// SPACE=(TRK,0),
// UNIT=DISCO
//*
//BORRAR1A EXEC PGM=ABEN3333,
// COND=(4,GE,BORRAR1)
//CTRNORST DD DUMMY
//*
//SEARCH EXEC PGM=ISRSUPC,
// PARM=(SRCHCMP,'')
//*
//NEWDD DD DSN=JJPR.V7R00.CON.JJMU.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJST.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJGU.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJAN.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJPL.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJRG.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJGM.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJTF.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJBL.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJPU.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJRV.FUENTES,DISP=SHR
// DD DSN=JJPR.V7R00.CON.JJPR.FUENTES,DISP=SHR
//*
//OUTDD DD DISP=(NEW,CATLG,DELETE),SPACE=(TRK,(10,10)),
// DSN=JJPR.V7R01.JJST.BUSCADOR
//SYSIN DD *
SRCHFOR 'CADENATX'
/*
A continuación, voy a intentar explicaros con un poco de detalle qué es lo que tenemos que especificar en cada una de las fichas del JCL anterior.
Fichas del JCL de búsqueda en librerías múltiples
A la hora de tratar de trasladar a nuestras propias
librerías cualquier JCL que encontremos publicado en un blog, lo importante es que
tengamos claro para qué sirve cada una de las fichas de las que se compone. En caso
contrario, lo más probable es que, al menor contratiempo, ya no seamos capaces
de adaptar el código.
Para que este proceso os resulte lo más sencillo posible,
vamos a ir repasando en detalle cada una de las fichas anteriores.
1º) Borrado del
fichero de salida: En primer lugar, vamos a proceder a borrar el fichero
donde se van a volcar los datos obtenidos por el proceso. Hay que tener en
cuenta que el JCL va a usar un fichero secuencial para ir almacenando toda la
información que vaya recogiendo en la búsqueda por las distintas librerías. Y,
como este dataset podría estar ya creado debido a una ejecución previa, lo
primero que tenemos que hacer es un borrado del mismo.
//BORRAR1 EXEC PGM=IEFBR14
2º) Nombre del
fichero a borrar: En la ficha FICHERO tendremos que introducir el nombre
del fichero secuencial que debe ser borrado por la utilidad IEFBR14
(especificada en el paso anterior). En el ejemplo, se trata del fichero
JJPR.V7R01.JJST.BUSCADOR.
// DISP=(MOD,DELETE),
// SPACE=(TRK,0),
// UNIT=DISCO
3º) Control de errores: En la ficha BORRAR1A establecemos un control de errores del paso anterior. En el caso de que, al ejecutar BORRAR1, se obtenga un código de retorno RC (Return Code) igual o mayor que 04, se lanzará el programa ABEN3333. Este paso no es obligatorio y lo incluiremos en nuestro JCL sólo si queremos establecer una gestión de errores específica en un proceso concreto.
// COND=(4,GE,BORRAR1)
//CTRNORST DD DUMMY
4º) Utilidad de Búsqueda:
En la ficha SEARCH incluiremos una invocación, mediante el comando PGM, a la
utilidad ISRSUPC. Esta herramienta forma parte del catálogo estándar de
servicios y permite comparar códigos mediante JCL. En la cláusula PARM se
especificarán los parámetros con los que se debe ejecutar dicha utilidad.
// PARM=(SRCHCMP,'')
El próximo día, en un nuevo post, continuaremos viendo cómo se debe implementar el Job para realizar una búsqueda en varias librerías a la vez. Recordad que es importante tener claro en qué consiste cada una de la fichas del JCL antes de ponerse a lanzar el proceso sin ton ni son.
Pues nada, eso es todo por hoy. Quedáis invitados a la segunda parte del artículo, en la que espero que os quede totalmente clara la forma en la que hay que codificar este procedimiento.
Saludos.
No hay comentarios:
Publicar un comentario