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.

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