sábado, 5 de marzo de 2011

Comparar fuentes de librerías en AS400 (CMPPFM)

Esto lo puedes hacer usando la opción 54 desde la pantalla Trabajar con Miembros utilizando PDM y pulsando F13 para procesar toda la lista de fuentes, pero sería de manera interactiva y tendríamos que pulsar Enter a cada momento. Es necesario hacerlo de manera Batch si es que se tratan de muchos fuentes.

Para comparar las versiones de fuentes (ya sean programas, archivos, etc.) de dos librerías diferentes utilizamos el comando CMPPFM desde un programa CL y monitoreamos los mensajes del sistema.

1.- Generamos en archivo la lista de miembros del archivo fuente que vamos a comparar con la librería de producción

DSPFD  FILE(MILIBRERIA/QRPGLESRC) TYPE(*MBRLIST)  OUTPUT(*OUTFILE) OUTFILE(MILIBRERIA/FUENTES)
    
2.- Generamos 2 archivos idénticos al anterior para depositar en ellos los fuentes diferentes y los fuentes que no existan en alguna de las 2 librerías.

CRTDUPOBJ  OBJ(FUENTES) FROMLIB(JUANVASQ1) OBJTYPE(*FILE) NEWOBJ(DIFERENTES)          


CRTDUPOBJ  OBJ(FUENTES) FROMLIB(JUANVASQ1) OBJTYPE(*FILE) NEWOBJ(NOEXISTEN)           

3.- Procesamos la lista de fuentes y comparamos los fuentes con el comando CMPPFM. Al haber una diferencia el sistema envía un mensaje informativo de código SPC6002 el cual lo “capturamos” y evaluamos para grabar en el archivo DIFERENTES.

4.- Monitoreamos los mensaje de excepción y los evaluamos para controlar los fuentes que no existan (Lo grabamos en archivo NO EXISTEN)

Aquí el fuente del programa.

            PGM        PARM(&LIBDESA &SRCDESA &LIBPROD &SRCPROD)      
                                                                      
            DCL        VAR(&LIBDESA)    TYPE(*CHAR) LEN(10)           
            DCL        VAR(&SRCDESA)    TYPE(*CHAR) LEN(10)           
            DCL        VAR(&LIBPROD)    TYPE(*CHAR) LEN(10)           
            DCL        VAR(&SRCPROD)    TYPE(*CHAR) LEN(10)           
            DCL        VAR(&MSGID)      TYPE(*CHAR) LEN(7)            
                                                                      
            DCLF       FILE(QTEMP/FUENTES)                            
                                                                      
            DLTF       FILE(QTEMP/FUENTES)                             
            MONMSG     MSGID(CPF2105)                                 
                                                                      
            DSPFD      FILE(&LIBDESA/&SRCDESA) TYPE(*MBRLIST) +       
                         OUTPUT(*OUTFILE) OUTFILE(QTEMP/FUENTES)      
                                                                      
            CRTDUPOBJ  OBJ(FUENTES) FROMLIB(QTEMP) OBJTYPE(*FILE) +   
                         TOLIB(&LIBDESA) NEWOBJ(DIFERENTES)            
            CRTDUPOBJ  OBJ(FUENTES) FROMLIB(QTEMP) OBJTYPE(*FILE) +   
                         TOLIB(&LIBDESA) NEWOBJ(NOEXISTEN)            
      LOOP:                                                           
 /* Lee Archivo que contiene la lista de Fuentes */                   
            RCVF                                                      
            MONMSG     MSGID(CPF0864) EXEC(RETURN)                   
                                                                     
/* Compara fuentes de ambas librerias */                             
            CMPPFM     NEWFILE(&MLLIB/&MLFILE) NEWMBR(&MLNAME) +     
                         OLDFILE(&LIBPROD/&SRCPROD) +                
                         OLDMBR(&MLNAME) OUTPUT(*OUTFILE) +          
                         OUTFILE(QTEMP/SALIDA)                       
                                                                     
            MONMSG     MSGID(SPC5003 SPC5005 SPC5010 SPC5034)        
            RCVMSG     MSGTYPE(*LAST) MSGID(&MSGID)                  
                                                                     
           /* Si no encuentra fuente en alguna libreria */           
            IF         COND(&MSGID *EQ 'SPC5003' *OR &MSGID *EQ +    
                         'SPC5005' *OR &MSGID *EQ 'SPC5010' *OR +    
                         &MSGID *EQ 'SPC5034') THEN(CPYF +           
                         FROMFILE(QTEMP/FUENTES) +                   
                         TOFILE(&LIBDESA/NOEXISTEN) MBROPT(*ADD) +   
                         INCREL((*IF MLNAME *EQ &MLNAME)))           
                                                                     
           /* Si encuentra diferencia copia el registro */           
           /* a archivo de diferencias                 */            
            IF         COND(&MSGID *EQ 'SPC6002') THEN(CPYF +        
                         FROMFILE(QTEMP/FUENTES) +                   
                         TOFILE(&LIBDESA/DIFERENTES) MBROPT(*ADD) +  
                          INCREL((*IF MLNAME *EQ &MLNAME)))   
             GOTO       CMDLBL(LOOP)                          
             ENDPGM                                           




Parámetros:

LIBDESA – Librería de desarrollo
SRCDESA – Archivo fuente de desarrollo
LIBPROD – Librería de Producción
SRCPROD – Archivo fuente de Producción

CALL MILIBRERIA/COMPARA PARM(‘MILIBRERIA’ ‘QRPGLESRC’ ‘PRODUCCION’ ‘QRPGLESRC’)

Nota: Para la compilación del programa, previamente, crear el archivo FUENTES, luego puede ser eliminado.
Si queremos saber que fuentes son idénticos, solo bastará crear un archivo que contenga los fuentes similares. Monitoreamos el códigos de mensaje SPC6001 y grabamos al archivo el registro.


No hay comentarios:

Publicar un comentario