ACTUALIZADO: corregido el error que daba cuando el fichero no existía.
En esta ocasión os traemos un programa REXX, pequeño, fácil y para toda la familia. Con él podremos entrar a "ver" o "editar" un fichero desde el JCL, sólo con posicionar el cursor encima del nombre del fichero.
Unos lo llamarán comodidad, otros vagancia^^
Veamos el código REXX:
/* REXX */
/*EDIT DE FICHERO SEGUN POSICION DEL CURSOR DSN= */
MENSA=MSG('OFF')
"PROFILE NOPREFIX"
TRACE OFF
ARG A_OPC .
ADDRESS ISPEXEC "ISREDIT MACRO"
ADDRESS ISPEXEC "ISREDIT (LIN,COL) = CURSOR "
ADDRESS ISPEXEC "ISREDIT (LINEA) = LINE " LIN
X=OPCION() /* IDENTIFICAR OPCIÓN */
X=BFILE() /* BUSCA NOMBRE */
X=VFILE() /* VALIDA FILE */
RETURN 0
OPCION: /* IDENTIFICA LA OPCIóN ELEGIDA, EDIT O VIEW */
IF A_OPC = '' THEN
DO
SAY 'SELECCIONE OPCIóN: E (EDITAR) ó V (VIEW)'
PARSE EXTERNAL A_OPC .
IF A_OPC = '' THEN
EXIT
UPPER A_OPC
END
RETURN 0
BFILE: /* BUSCA NOMBRE FICHERO EN LA LINEA */
F = INDEX(LINEA,'DSN=')
IF F=0 THEN
DO
FILE=STRIP(SUBWORD(SUBSTR(LINEA,COL),1,1),T,',')
FILE=STRIP(FILE,,"'")
F=INDEX(FILE,"')")
IF F=0 THEN
DO
FILE=SUBSTR(FILE,1,F-1)
END
END
ELSE
DO
FILE=SUBWORD(SUBSTR(LINEA,F+4),1,1)
F=INDEX(FILE,',')
IF F<>0 THEN
DO
FILE = SUBSTR(FILE,1,F-1)
END
F = INDEX(FILE,'(')
IF F <> 0 THEN
DO
/*-- EXTRAER VERSION DEL GDG --*/
GDGVERS = SUBSTR(FILE, F+1, INDEX(FILE,')')-F-1)
IF SUBSTR(GDGVERS, 1, 1) = '+' THEN
IN = 0
ELSE
DO
IF SUBSTR(GDGVERS, 1, 1) = '-' THEN
IN = SUBSTR(GDGVERS, 2, LENGTH(GDGVERS)-1)
ELSE
IN = 0
END
FILE = SUBSTR(FILE,1,F-1)
/*-- LISTA TODAS LAS VERSIONES DEL GDG. --*/
Q = OUTTRAP(DATA.)
"LISTC ENT('"||FILE||"')"
Q = OUTTRAP(OFF)
/*-- DETERMINA EL NOMBRE DE LA VERSION ACTUAL --*/
REC = DATA.0 -(2*IN+1)
PARSE VAR DATA.REC . . FILE
END
END
FILE=STRIP(FILE,,' ')
RETURN 0
VFILE: /* VALIDA FILE */
IF SYSDSN(FILE) <> 'OK' THEN
ADDRESS ISPEXEC "ISREDIT LINE_AFTER "LIN" = MSGLINE <1>"
ELSE
DO
IF A_OPC = 'E' THEN
ISPEXEC "EDIT DATASET('"FILE"')"
IF A_OPC = 'V' THEN
ISPEXEC "VIEW DATASET('"FILE"')"
END
RETURN 0
Donde:
ARG A_OPC:
Variable donde guardaremos la opción "E" o "V"
"ISREDIT MACRO":
Es una macro
"ISREDIT (LIN,COL) = CURSOR ":
Posición del cursor
"ISREDIT (LINEA) = LINE " LIN:
Línea
PARSE EXTERNAL A_OPC:
Guarda el valor introducido en la variable A_OPC
INDEX(LINEA,'DSN='):
El nombre del fichero estará después del 'DSN='.
FILE=STRIP(SUBWORD(SUBSTR(LINEA,COL),1,1),T,','):
Recupera la cadena de caracteres que contiene el nombre del fichero.
GDGVERS = SUBSTR(FILE, F+1, INDEX(FILE,')')-F-1):
Recupera la versión en la que estamos para el caso de que el fichero sea un GDG. Por ejemplo (-1).
SUBSTR(GDGVERS, 1, 1) = '+' THEN IN = 0:
Para las versiones positivas mostraremos la última versión del GDG.
SUBSTR(GDGVERS, 1, 1) = '-':
Si se trata de versiones negativas del GDG calculamos a cual corresponde.
"EDIT DATASET('"FILE"')":
Abre el fichero en modo EDIT.
"VIEW DATASET('"FILE"')":
Abre el fichero en modo VIEW.
Para ejecutar el programa tenemos dos opciones:
1. Escribir en la linea de comando el nombre del programa (por ejemplo REXEDI), colocar el cursor encima del nombre del fichero que queremos abrir y pulsar intro. Elegimos E o V y damos intro.
2. Guardar el nombre del programa REXX en una de nuestras KEYS. Colocamos el cursor encima del nombre del fichero y pulsar intro. Elegimos E o V y damos intro.
En el caso de que no os funcione, habrá que hacer esta comprobación:
En la línea de comandos escribimos "TSO ISRDDN". Nos saldrá algo de este estilo:
Volume Disposition Act DDname Data Set Name Actions: B E V
TSST50 NEW,DEL > ISPCTL0 LIBRERIA1
CXDR21 SHR,KEEP > ISPILIB LIBRERIA2
MVSC04 SHR,KEEP > ISPLLIB LIBRERIA3
CXDR21 SHR,KEEP > LIBRERIA4
MVSC04 SHR,KEEP > ISPMLIB LIBRERIA5
(...)
Buscaremos SYSEXEC escribiendo "O SYSEXEC". Nos mostrará algo de este estilo:
Volume Disposition Act DDname Data Set Name Actions: B E V
CXDS01 SHR,KEEP > SYSEXEC LIBRERIA6
MVSC09 SHR,KEEP > LIBRERIA7
PSTS01 SHR,KEEP > LIBRERIA8
MVSC09 SHR,KEEP > LIBRERIA9
Nuestro programilla REXX deberá estar en una de las librerías del SYSEXEC. La razón es que lo que estamos ejecutando es en realidad una macro.
Si se da el caso de que no tenemos acceso a ninguna de las librerías del SYSEXEC podemos añadir una nuestra. Para ello tenemos el siguiente código:
CONTROL NOFLUSH LIST
ALLOC F(SYSEXEC) SHR REUSE DA('LIBRERIA6' +
'LIBRERIA7' +
'LIBRERIA8' +
'LIBRERIA9' +
'MILIBRERIA')
que escribiremos en un fichero (es un CLIST).
Lo ejecutaremos con un TSO EX FICHERO.CON.CODIGO.ANTERIOR.
Ahora al consultar el ISRDDN veremos que ya aparece en el SYSEXEC nuestra librería.
Perfecto, ya podemos ejecutar macros!
Si preferís que no os pida elegir entre editar "E" o visualizar "V", podemos tener dos macros: una para edit y otra para view.
Guardando el nombre de la macro en una de las KEYS, o escribiéndolo en la línea de comandos, sólo tendremos que posicionarnos en el nombre del fichero que queremos ver y dar intro. Según estemos ejecutando la macro de edit o la de view nos abrirá el fichero en edición o visualización respectivamente.
ACTUALIZADO: corregido el error que daba cuando el fichero no existía.
Os dejo la última versión del código REXX para la opción de editar:
Descargar EDI-FILE
Si tenéis cualquier problema con esto nos contáis e intentamos solucionarlo : )
4 comentarios:
Revisa la rexx :
71 +++ ?
3 +++ MENSA=MSG('OFF')
IRX0013I Error running REXEDI, line 71: Invalid character in program
***
Buen dia.
Muy buena la aportacion, solo tengo un punto en el que me gustaria que me apoyaran.
- Cuando meto mi libreria en la SYSEXEC esta perfecto, pero cuando termino mi sesion y vuelvo a iniciar, ya no aparece mi libreria en la SYSEXEC y tengo que volver a ejecutar el CLIST.
¿Hay alguna forma de dejarlo permanente?
Pues hasta donde yo sé no... Lo suyo sería poder meterlo en alguna de las librerías que aparecen en el SYSEXEC siempre. Esto es un apaño : )
wenas, se puede entrecomillar el nombre del fichero dentro de la variable FILE?