martes, 4 de mayo de 2021

Utilidades REXX V: modificar todos los miembros de una librería.

 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.

Vamos al lío:

/* 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.=''
    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:

//REXXJCL  JOB (OPC0,001),'CONSU',REGION=0M,NOTIFY=&SYSUID,
//            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:

Marcos Balvin dijo...

Que bien, se nota el buen empleo de los comandos adecuados para lograrlo

Anónimo dijo...

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

Anónimo dijo...

Continua... si el pdsori es diferente al pdsdes.. lo estoy ocupando para respaldar una biblioteca