Pues mira tú por dónde que una piensa que ya nadie necesita de sus conocimientos técnicos y de repente surge la oportunidad de hacer algo interesante :-)
La necesidad es lo que tiene.
Hoy os traigo un programa rexx que se recorre todos los miembros de una librería y le añade unas líneas de código. En mi caso una cabecera con comentarios, pero puedes usarlo para lo que necesites, o para hacer reemplazos de código modificándolo un poco.
/* REXX** PGM POUR AJOUTER UNE ENTETE A TOUS LES MEMBRES D'UN PDS*/
ADDRESS "ISPEXEC"
/*INDIQUER LE PDS D'ORIGIN:*/
PDSORI="NOM.DU.PDS"
/*INDIQUER LE PDS DESTINATEUR:*/
PDSDES="NOM.DU.PDS"
"LMINIT DATAID(LMID) DATASET('"PDSORI"')"
"LMOPEN DATAID("LMID")"
/*BOUCLE POUR TRATIER TOUS LES MEMBRES DU PDS ORI*/
DO FOREVER = 1
ADDRESS "ISPEXEC"
"LMMLIST DATAID("LMID") MEMBER(LMMEM) STATS(YES)"
IF RC > 0 THEN LEAVE
/*NOM DU PGM A TRAITER:*/
SAY "MEMBRE=" LMMEM
FICHIERIN=PDSORI'('LMMEM')'
ADDRESS TSO
/*ALOCATION FICHIER ORIGIN*/
"ALLOC FI(INDD) DA('"FICHIERIN"')"
/*LECTURE DU FICHIER COMPLET*/
"EXECIO * DISKR INDD (STEM INDD. FINIS"
"FREE FI(INDD)"
FICHIEROUT=PDSDES'('LMMEM')'
ADDRES TSO
"ALLOC FI(OUTDD) DA('"FICHIEROUT"') SHR REUSE"
/*PREPARATION DE L'ENTETE*/
/*AQUI PONED TANTOS OUTDD. COMO OS HAGAN FALTA*/
OUTDD.1 = "***************"
OUTDD.2 = "*CABECERA*"
OUTDD.3 = "***************"
/*AQUI CAMBIAD EL 4 POR EL SIGUIENTE NUMERO AL ULTIMO OUTDD. ANTERIOR*/
J=4
DO I=1 TO INDD.0
OUTDD.J = INDD.I
J=J+1
END
/*ECRITURE DU PGM AVEC L'ENTETE*/
"EXECIO * DISKW OUTDD (STEM OUTDD. FINIS"
"FREE FI(OUTDD)"
END
"LMFREE DATAID("LMID")"
Disculpad el francés pero es que creé este código para usarlo en el curro, y trabajo en francés xd Pero creo que se entiende bien.
Lo primero que hacemos lo tenéis también en el artículo Utilidades Rexx IV: listar miembros que es precisamente eso, recuperar la lista de miembros que hay en una librería.
El nombre de la librería podríamos pasarla como un parámetro desde el job, pero me dio pereza. Se trata de recorrerse la librería origen, y crear en la librería destino una copia de cada miembro con el código modificado. Lo he hecho así porque no quería "cargarme" el código original pero lo podéis personalizar al gusto.
El JCL para ejecutarlo:
// CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1),COND=(4,LT)
//REXXPGM EXEC PGM=IKJEFT01
//SYSEXEC DD DSN=librería donde tengo el programa rexx,DISP=SHR
//ISPPROF DD DSN=&&PROF,UNIT=SYSDA,SPACE=(TRK,(5,5,5)),
// RECFM=FB,LRECL=80
//ISPSLIB DD DISP=SHR,DSN=ISP.SISPSLIB
//ISPPLIB DD DISP=SHR,DSN=ISP.SISPPENU
//ISPMLIB DD DISP=SHR,DSN=ISP.SISPMENU
//ISPTLIB DD DISP=SHR,DSN=ISP.SISPTENU
//ISPLOG DD SYSOUT=*,DCB=(LRECL=125,RECFM=VBA)
//SYSTSPRT DD SYSOUT=*,DCB=LRECL=125
//SYSPRINT DD SYSOUT=*
//SYSTSIN DD *
ISPSTART CMD(REXXENT)
/*
Espero que os sea útil. Cualquier duda, os leo comentarios :-)
3 comentarios:
Que bien, se nota el buen empleo de los comandos adecuados para lograrlo
Gracias , encontré un problema
Si el archivo anterior de la lista tiene más registros que el archivo actual que se está procesando.. al ejecutar las escritura de este último graba registros de más. Ejemplo arch1 tiene 100 líneas y el arch2 tiene 500 .. el respaldo tendrá 2 archivos df 1000 lineas
Continua... si el pdsori es diferente al pdsdes.. lo estoy ocupando para respaldar una biblioteca