Herramienta para hacer Browse en archivos y programas

Utilitarios artesanales que desarrollamos para nosotros y deseamos compartir (en REXX)
Responder
qwe2
Usuario avanzado
Usuario avanzado
Mensajes: 60
Registrado: 21 Ene 2015, 16:13
País: Argentina
Ciudad: CABA
Ocupación: Analista de desarrollo

Herramienta para hacer Browse en archivos y programas

Mensaje por qwe2 » 30 May 2016, 15:42

Hace poco que estoy entrando en esto del REXX y con info que encontré en mi instalación confeccioné una herramienta para hacer browse en librerias productivas de componentes (pgm's. copys, DCLGEN, JCL, PROC y tambien lee archivos planos) con solo posicionarse sobre el nombre de la pieza a visualizar.
El CLIST tiene 2 opciones de uso:
A) Poner BR en la barra de command y posicionarse sobre el componente a visualizar para que el macro lo seleccione (si estoy mirando un pgm, sobre la copy; si estoy mirando un JCL sobre un archivo; etc).
B) Poner BR en la barra de command y a continuacion el nombre de la pieza a browsear (cualquiera sea menos archivos planos).
*(recordar que esto tiene que hacerse ya estando dentro de un pgm/copy/jcl/etc, sino no funciona).
**(la tercera opcion que tenemos es poner BR en la barra de command y dar enter. Ahí nos mostrará la leyenda "help" que nos explica cómo funciona).

Bueno, ahí les dejo el código, se puede mejorar y no es algo definitivo, pero puedo dar fe que en mi instalación funciona bien. Dejé las librerias con 'XXXX.XXXXX.XXXX' indicando dónde tienen que poner las de su instalación. Por otro lado, no me molesta que le hagan cambios ni que lo mejoren ni que le pongan su nombre, yo lo dejo aca con ese fin.
Última aclaración, el que tenga problemas para hacerlo funcionar aviseme que yo me pase varios días para hacerlo andar en mi instalación. :saludo:

Código: Seleccionar todo

/* REXX */
/*--------------------------------------------------------------*/
/* BR                                                           */
/*                                                              */
/* MACRO PARA BROWSEAR COMPONENTES                              */
/*                                                              */
/* BY SHIVAN                               17/05/16             */
/*--------------------------------------------------------------*/
TRACE O
ADDRESS 'ISPEXEC'
'ISREDIT MACRO (PARM)'
/*------------------------------------------------*/
/* TOMO POSICION DEL CURSOR Y DATOS DE LA LINEA   */
/*------------------------------------------------*/
'ISREDIT (LINEA,COLUMNA) = CURSOR'
'ISREDIT (DATOS) = LINE' LINEA

/*------------------------------------------------*/
/* BIFURCO SI ES UNA DD O NO                      */
/*------------------------------------------------*/
   IF COLUMNA = 0 & PARM = '' THEN CALL HELP
   IF COLUMNA = 0 & PARM ¬= '' THEN CALL VIEW

/* SI NO ENTRO POR OPCION VIEW ENTRA POR ACA... */
   SELECT
      WHEN INDEX(DATOS,'DSN=')     ¬= 0  THEN CALL DSN
      WHEN INDEX(DATOS,'ORDER=')   ¬= 0  THEN CALL ORDER
      WHEN INDEX(DATOS,' EXEC ')   ¬= 0  THEN CALL EXECPROC
      WHEN INDEX(DATOS,'MEMBER=')  ¬= 0  THEN CALL INCLUDE
      WHEN INDEX(DATOS,'INCLUDE')  ¬= 0  THEN CALL INCLUDE2
      WHEN INDEX(DATOS,' COPY ')   ¬= 0  THEN CALL COPY
      WHEN INDEX(DATOS,'PROGRAM')  ¬= 0  THEN CALL PGM2
      OTHERWISE                   CALL NODD
   END

   DSN = STRIP(DSN,'B')
   DSN = "'"||DSN||"'"
   IF INDEX(DSN,'&') ¬= 0 THEN CALL MENS6

   MEMRC = SYSDSN(DSN)

   IF MEMRC ¬= 'OK' THEN CALL FINAL

   CALL VERBROW
     IF XRC ¬= 0    THEN CALL MENS4

  'ISPEXEC BROWSE DATASET('||DSN||')'

CALL FINAL
/*------------------------------------------------*/
/* LO BUSCO DEPENDIENDO SU TIPO                   */
/*------------------------------------------------*/
VIEW:

     UPPER PARM

     DSN = 'XXXX.XXXXX.XXX('||PARM||')'      /* BUSCA COPY */
     DSNI = "'"||DSN||"'"
     MEMRC = SYSDSN(DSNI)
       IF MEMRC = 'OK' THEN CALL VIEW2

     DSN = 'XXXX.XXXXX.XXX('||PARM||')'      /* BUSCA PGM */
     DSNI = "'"||DSN||"'"
     MEMRC = SYSDSN(DSNI)
       IF MEMRC = 'OK' THEN CALL VIEW2

     DSN = 'XXXX.XXXXX.XXX('||PARM||')'      /* BUSCA DCLGEN */
     DSNI = "'"||DSN||"'"
     MEMRC = SYSDSN(DSNI)
       IF MEMRC = 'OK' THEN CALL VIEW2

     DSN = 'XXXX.XXXXX.XXX('||PARM||')'      /* BUSCA PROC */
     DSNI = "'"||DSN||"'"
     MEMRC = SYSDSN(DSNI)
       IF MEMRC = 'OK' THEN CALL VIEW2

     DSN = 'XXXX.XXXXX.XXX('||PARM||')'     /* BUSCA JCL */
     DSNI = "'"||DSN||"'"
     MEMRC = SYSDSN(DSNI)
       IF MEMRC = 'OK' THEN CALL VIEW2

RETURN
/*------------------------------------------------*/
/* VERIFICO EL DSN, BROWSEO Y TERMINO PROCESO     */
/*------------------------------------------------*/
VIEW2:

   MEMRC = SYSDSN(DSN)
   IF MEMRC ¬= 'OK' THEN CALL FINAL

  'ISPEXEC BROWSE DATASET('||DSN||')'

CALL FINAL
/*------------------------------------------------*/
/* EXTRACCION DEL NOMBRE DESDE UNA LINEA NO DD    */
/*------------------------------------------------*/
NODD:
  TRACE N
    DATOS = TRANSLATE(DATOS,' ',',')
    DATOS = TRANSLATE(DATOS,' ','7D'X)
    X1 = INDEX(DATOS,'.')
    IF X1 = 0 THEN
    DO
       DSN= ' '
       RETURN
    END

    POS = LASTPOS(' ',DATOS,X1)
    POS1 = LASTPOS('(',DATOS,X1)

    IF POS1 > POS THEN POS = POS1
    POS = POS + 1

    DATOS = SUBSTR(DATOS,POS)

    DSN  = WORD(DATOS,1)
    POS1 = INDEX(DSN,')')
    IF POS1 ¬= 0 THEN
    DO
       DSN = SUBSTR(DSN,1,POS1)
       POS2 = INDEX(DSN,'(')
         IF POS2 = 0 THEN DSN = SUBSTR(DSN,1,POS1-1)
    END

RETURN
/*------------------------------------------------*/
/* EXTRACCION DEL NOMBRE DESDE UNA //XXX DD DSN=  */
/*------------------------------------------------*/
DSN:
     X   = INDEX(DATOS,'DSN=')
     DSN = SUBSTR(DATOS,X+4)
     X   = INDEX(DSN,',')
       IF X ¬= 0 THEN DSN = SUBSTR(DSN,1,X-1)
     X   = INDEX(DSN,' ')
       IF X ¬= 0 THEN DSN = SUBSTR(DSN,1,X-1)
RETURN
/*-----------------------------------------------------*/
/* EXTRACCION DEL NOMBRE DESDE UNA //XXX JCLLIB ORDER= */
/*-----------------------------------------------------*/
ORDER:
     X   = INDEX(DATOS,'ORDER=')
     DSN = SUBSTR(DATOS,X+6)
     X   = INDEX(DSN,',')
       IF X ¬= 0 THEN DSN = SUBSTR(DSN,1,X-1)
     X   = INDEX(DSN,' ')
       IF X ¬= 0 THEN DSN = SUBSTR(DSN,1,X-1)
RETURN
/*------------------------------------------------*/
/* EXTRACCION DEL NOMBRE DESDE UNA // EXEC PROC=  */
/*------------------------------------------------*/
EXECPROC:
   TRACE N
     X1 = INDEX(DATOS,'PGM=')
     IF X1 ¬= 0  THEN CALL PGM1                    /* ES EXEC PGM= */
     ELSE
     DO

     X1= WORDPOS('EXEC',DATOS)                     /* BUSCO WORD EXEC */
     DATOS = SUBWORD(DATOS,X1+1)                   /* DESPUES DE EXEC */

     X1 = INDEX(DATOS,'PROC=')                     /* BUSCO PROC= */

     IF X1 ¬= 0 THEN DATOS = SUBSTR(DATOS,X1+5)    /* ELIMINO PROC= */
     PROC = SUBSTR(DATOS,1,8)                      /* TOMO PROCNAME */

     X1 = INDEX(PROC,',')                         /* BUSCO PARAMETROS */
     IF X1 ¬= 0 THEN PROC = SUBSTR(PROC,1,X1-1)   /* LOS ELIMINO */

     PROC = STRIP(PROC,'B')                       /* ELIMINO BLANCOS */

     DSN = 'XXXX.XXXXX.XXX('||PROC||')'           /* ARMO DSN */
     DSNI = "'"||DSN||"'"
     MEMRC = SYSDSN(DSNI)
       IF MEMRC = 'OK' THEN RETURN

RETURN
/*------------------------------------------------*/
/* EXTRACCION DE UN MEMBER DE UN PGM              */
/*------------------------------------------------*/
PGM1:
   TRACE N
    X      = INDEX(DATOS,'PGM=')
    X      = X + 4
    Z      = INDEX(DATOS,',',X)
    MEMBER = SUBSTR(DATOS,X,Z-X)
    DSN = 'XXXX.XXXXX.XXX('||MEMBER||')'            /* ARMO DSN */
RETURN
/*------------------------------------------------*/
/* EXTRACCION DE UN MEMBER DE UN PGM              */
/*------------------------------------------------*/
PGM2:
   TRACE N
    X      = INDEX(DATOS,'(')
    X      = X + 1
    Y      = INDEX(DATOS,')',X)
    MEMBER = SUBSTR(DATOS,X,Y-X)
    DSN = 'XXXX.XXXXX.XXX('||MEMBER||')'            /* ARMO DSN */
RETURN
/*------------------------------------------------*/
/* EXTRACCION DE UN MEMBER DE UN COPY             */
/*------------------------------------------------*/
COPY:
   TRACE N
    MEMBER  = WORD(DATOS,2)
    MEMBER  = STRIP(MEMBER,'B',".")
    DSN = 'XXXX.XXXXX.XXX('||MEMBER||')'            /* ARMO DSN */
RETURN
/*------------------------------------------------*/
/* EXTRACCION DEL NOMBRE DESDE UNA //  MEMBER=    */
/*------------------------------------------------*/
INCLUDE:
     X = INDEX(DATOS,'MEMBER=')
     PROC = SUBSTR(DATOS,X+7,8)                  /* DESPUES DE INC..*/
     X = INDEX(PROC,' ')                         /* BUSCO BLANCOS */
        IF X ¬= 0 THEN PROC = SUBSTR(PROC,1,X-1) /* LOS ELIMINO */
     DSN = 'XXXX.XXXXX.XXX('||PROC||')'          /* ARMO DSN */
RETURN
/*------------------------------------------------*/
/* EXTRACCION DEL NOMBRE DESDE UNA //  INCLUDE    */
/*------------------------------------------------*/
INCLUDE2:
     X = INDEX(DATOS,'INCLUDE')
     X = X + 7
     AUX    = SUBSTR(DATOS,X)
     MEMBER = STRIP(AUX,'B')
     DSN = 'XXXX.XXXXX.XXX('||MEMBER||')'          /* ARMO DSN */
RETURN
/*------------------------------------------------*/
/* VERIFICA SI SE PUEDE BROWSEAR                  */
/*------------------------------------------------*/
VERBROW:
 XRC = 99
 X = LISTDSI(DSN)
   SELECT
       WHEN SUBSTR(SYSDSORG,1,1) ¬= 'P'         /* DEBE SER PS O PO */
            THEN CALL MESA1

       WHEN SYSDSORG = 'VS'
            THEN CALL MENS5

      /*WHEN SYSUSED < 0*/
      /*      THEN CALL MESA3*/

       /* WHEN SYSLRECL > 255 */
       /*       THEN CALL MESA2 */

     OTHERWISE XRC = 0
RETURN
/*------------------------------------------------*/
/* FINAL                                          */
/*------------------------------------------------*/
FINAL:
   EXIT  1        /* RC 1 PONE EL CURSOR EN COMMAND LINE */
/*------------------------------------------------*/
/* HELP                                           */
/*------------------------------------------------*/
HELP:
SAY  '/*------------------------------------------------------------*/'
SAY  '/* BR.                                                        */'
SAY  '/*                                                            */'
SAY  '/* ESTA MACRO SIRVE PARA HACER BROWSE DE UN ARCHIVO O         */'
SAY  '/* MIEMBRO. LAS OPCIONES PUEDEN SER LAS SIGUIENTES:           */'
SAY  '/* DSN=               ARCHIVOS PLANOS                         */'
SAY  '/* ORDER=                                                     */'
SAY  '/* EXEC               PROCEDIMIENTOS                          */'
SAY  '/* MEMBER=                                                    */'
SAY  '/* INCLUDE            DCL DE UNA TABLA                        */'
SAY  '/* COPY               COPYS DE PROD                           */'
SAY  '/* PROGRAM            PROGRAMAS (TANTO BATCH COMO ONLINE)     */'
SAY  '/*                    *SE LOS PUEDE LLAMAR DESDE LA EXEC      */'
SAY  '/*                    COMO DESDE EL RUN PROGRAM               */'
SAY  '/*                                                            */'
SAY  '/* PARA EJECUTAR, SE DEBE HACER LO SIGUIENTE:                 */'
SAY  '/* 1. TIPEAR EN LA LINEA "COMMAND ===>" BR                    */'
SAY  '/* 2. NO DAR ENTER                                            */'
SAY  '/* 3. POSICIONAR EL CURSOR DEBAJO DEL NOMBRE DEL ARCHIVO      */'
SAY  '/*    A HACER BROWSE                                          */'
SAY  '/* 4. DAR ENTER                                               */'
SAY  '/*                                                            */'
SAY  '/*     O ENTRAR INDICANDO LA PIEZA A BROWSEAR                 */'
SAY  '/*                                                            */'
SAY  '/* 1. TIPEAR EN LA LINEA "COMMAND ===>" BR "+ NOM"            */'
SAY  '/*    DONDE NOM ES EL PGM/COPY/JCL/PROC/DCL A BROWSEAR        */'
SAY  '/* 2. DAR ENTER                                               */'
SAY  '/*------------------------------------------------------------*/'
CALL FINAL

MESA1:
SAY  '/*------------------------------------------------------------*/'
SAY  '/*                                                            */'
SAY  '/* EL ARCHIVO DEBE SER   PO   O   PS                          */'
SAY  '/*                                                            */'
SAY  '/*------------------------------------------------------------*/'
CALL FINAL

MESA2:
SAY  '/*------------------------------------------------------------*/'
SAY  '/*                                                            */'
SAY  '/* LONGITUD DEL REGISTRO MAYOR A 255                          */'
SAY  '/*                                                            */'
SAY  '/*------------------------------------------------------------*/'
CALL FINAL

MESA3:
SAY  '/*------------------------------------------------------------*/'
SAY  '/*                                                            */'
SAY  '/* ARCHIVO VACIO                                              */'
SAY  '/*                                                            */'
SAY  '/*------------------------------------------------------------*/'
CALL FINAL

MENS4:
SAY  '/*------------------------------------------------------------*/'
SAY  '/* EL ARCHIVO NO SE PUEDE BROWSEAR                            */'
SAY  '/*                                                            */'
SAY  '/*------------------------------------------------------------*/'
CALL FINAL

MENS5:
SAY  '/*------------------------------------------------------------*/'
SAY  '/* EL ARCHIVO ES VSAM                                         */'
SAY  '/*                                                            */'
SAY  '/*------------------------------------------------------------*/'
CALL FINAL

MENS6:
SAY  '/*------------------------------------------------------------*/'
SAY  '/* EL ARCHIVO ES DE LONGITUD VARIABLE                         */'
SAY  '/*                                                            */'
SAY  '/*------------------------------------------------------------*/'
CALL FINAL

Responder