lunes, 21 de mayo de 2012

Utilidades REXX II: editar fichero desde JCL.

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:

Anónimo dijo...

Revisa la rexx :

71 +++ ?
3 +++ MENSA=MSG('OFF')
IRX0013I Error running REXEDI, line 71: Invalid character in program
***

Abraham RV dijo...

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?

Tallian dijo...

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 : )

Jesus Gutierrez dijo...

wenas, se puede entrecomillar el nombre del fichero dentro de la variable FILE?