• principal_3

    Desde 2015, enseñando sobre el sistema operativo z/OS de IBM en esta web. z/OS se utiliza en máquinas llamadas Mainframe.

  • principal_1

    Para realizar el contenido, utilizo el producto de IBM llamado z/Development and Test Environtment Personal Edition. Este software permite emular un Mainframe y así poder utilizar z/OS para aprender.

  • principal_2

    Es utilizado por grandes empresas (bancos, aseguradoras...). Aquí aprenderás a instalar y configurar productos relacionados con z/OS.

  • principal_4

    ADCD es una distribución de z/OS que contiene productos de IBM como IMS, DB2, CICS, ZOWE, TWS, NetView, System Automation, etc.

Modificando el panel de errores (5.4) - Hora y ver salidas del Spool (OPC)

En esta entrada vamos a añadir dos nuevas funciones al panel de errores de OPC (5.4). La primera consiste en añadir la hora del sistema. Nos puede venir bien para saber si el panel se ha quedado “pillado” cuando trabajamos monitorizando procesos en error. También vamos a añadir una nueva opción al panel para ver la salida de un job fallado sin tener que ir a buscarlo al spool.

 

Para hacer la parte de ver las salidas del spool, usaremos un REXX al que llamaremos desde el panel. Para saber dónde debemos guardarlo para poder ejecutarlo, tendremos que mirar en el miembro de nuestro procedimiento de logon de TSO (por ejemplo, ISPFPROC, DBSPROC9, etc.) y ver las librerías que tenemos disponibles en la DD “SYSPROC”.

 

En este caso, yo usaré la librería ADCD.Z113.PROCLIB para guardarlo. El REXX que usaremos, de nombre OPCSPOOL, es el siguiente:

 

/* REXX */                                                          

PARSE ARG JOBID ' ' JOBNAME                                         

ENCONTRADO=0                                                        

ADDRESS TSO                                                         

"PROFILE NOPREFIX"                                                  

"DELETE" USERID()".OPC.SALIDA SCRATCH NONVSAM"                      

"ALLOCATE DATASET("USERID()".OPC.SALIDA) NEW DIR(0) DSORG(PS)       

  BLOCK(3200) SPACE(1,1) RECFM(V,B) LRECL(240) BLKSIZE(3120) REUSE" 

RC=ISFCALLS('ON')                                                   

     /* ACCESS THE ST PANEL */                                      

ADDRESS SDSF "ISFEXEC ST"                                           

LRC=RC                                                              

CALL MSGRTN                                                         

IF LRC<>0 THEN                                                       

  EXIT 20                                                           

ISFPRTBLKSIZE=3120                                                  

ISFPRTLRECL=240                                                

ISFPRTRECFM=VBA                                                 

ISFPRTPRIMARY=1                                                

ISFPRTSECONDARY=1                                              

ISFPRTSPACETYPE=CYLS                                           

ISFPRTDSNAME=USERID().OPC.SALIDA                                

ISFPRTDISP=OLD                                                 

DO IX=1 TO JNAME.0                                             

  IF JNAME.IX = JOBNAME & JOBID.IX = JOBID THEN                

   DO                                                           

      ADDRESS SDSF "ISFACT ST TOKEN('"TOKEN.IX"') PARM(NP XDC)"

      ENCONTRADO=1                                             

      LRC=RC                                                   

      CALL MSGRTN                                               

      ADDRESS ISPEXEC "BROWSE DATASET('"USERID()".OPC.SALIDA')"

      IF LRC<>0 THEN                                           

        EXIT 20                                                

  END                                                          

END                                                         

IF ENCONTRADO = 0 THEN                                      

  SAY "JOB NO ENCONTRADO EN EL SPOOL"                       

EXIT                                                         

     /* SUBROUTINE TO LIST ERROR MESSAGES */                

MSGRTN: PROCEDURE EXPOSE ISFMSG ISFMSG2.                    

     /* THE ISFMSG VARIABLE CONTAINS A SHORT MESSAGE */     

IF ISFMSG<>"" THEN                                          

  SAY "ISFMSG IS:" ISFMSG                                   

     /* THE ISFMSG2 STEM CONTAINS ADDITIONAL DESCRIPTIVE */ 

     /* ERROR MESSAGES                                   */ 

DO IX=1 TO ISFMSG2.0                                         

  SAY "ISFMSG2."IX "IS:" ISFMSG2.IX                         

END                                                         

RETURN                                                      

 

Este REXX recibe en JobID y el JobName que queremos buscar, crea un dataset que contendrá la salida, busca en la opción ST de SDSF el job que coincida con los datos que le hemos pasado y, si lo encuentra, copia la salida de ese job al dataset que hemos creado en el REXX. Si no lo encuentra, mostrará un mensaje indicando que no se ha encontrado.

 

Una vez hemos guardado el REXX en la librería correspondiente. Vamos a ir a modificar el panel de OPC. Para saber el nombre del panel que tenemos que modificar, vamos a la opción 5.4 de OPC y escribimos “panelid”.

 

Arriba a la izquierda, veremos que se llama “EQQMEP1L”.

 

Ahora vamos a la librería que contiene los paneles, en mi caso, TWS860.SEQQPENU. Para saber cómo se llama tu librería que contiene los paneles de OPC, deberás revisar tu procedimiento de logon de TSO (por ejemplo, ISPFPROC) y mirar la DD “ISPPLIB”. Ahí debe estar incluida la librería que contiene el panel EQQMEP1L.

 

Entramos en la librería de paneles, en mi caso, TWS860.SEQQPENU.

 

Editamos el miembro EQQMEP1L.

NOTA: Recomiendo hacer una copia del panel antes de modificarlo, por si acaso.

 

Bajamos hasta la línea que pone “%I,O,J,L,RC,FSR,FJR,FSC,RI,C,MH,MR,SJR”, en mi caso, la línea 94. Añadimos una línea nueva con el texto “%S+Buscar en Spool”.

NOTA: El texto “%V+Buscar en Virtual” no hace falta ponerlo ya que no lo vamos a usar.

 

En la línea siguiente a la que hemos añadido (la que pone “<LAYOUT ID…”), añadiremos, al final de la línea, el texto <HORA &ZTIME, para que aparezca la hora del sistema en el panel.

 

Seguimos bajando hasta encontrar la línea que pone “&delgrp   = 'DG'     /* Delete group */” (línea 145) e insertamos una nueva línea. Pondremos el texto “&bspool   = 'S' /* BUSCAR SPOOL   */”.  Esto sirve para asignar al comando de línea “S” la acción que debe realizar.

 

Seguimos bajando hasta encontrar la línea que contiene el texto “&delgrp ,'MOD(EQQMMMQX,GDEL,&maaid,…” y añadimos una nueva línea. Pondremos el texto “&bspool , 'CMD(%OPCSPOOL &opjes &opjbn)' /* BUSCAR SPOOL  */”. Esto sirve para que, cuando pongamos “S” en uno de los jobs fallados en OPC, llame al REXX que hemos guardado anteriormente y le pase el JobID y el JobName.

 

Ya hemos terminado de hacer las modificaciones en el panel. Lo guardamos, salimos de la sesión de TSO y volvemos a entrar para poder ver los cambios que hemos realizado.

Al entrar en la opción 5.4 de OPC, vamos que ya aparece la hora y la opción nueva que hemos añadido. Ponemos una “S” en uno de los jobs fallados.

 

Aparecerá lo siguiente, pulsamos intro.

 

Ya veremos la salida del job, si está en el spool.

NOTA: Observamos que la librería que contiene la salida se llama, en este caso, IBMUSER.OPC.SALIDA.

 

Si no queremos que salga tanta traza en rojo cuando buscamos una salida, en el REXX, podemos comentar la línea “CALL MSGRTN” y saldrá de la siguiente manera:

 

Si queremos ver uno que ya no tenemos en el spool, aparecerá el siguiente mensaje.

 

Hasta aquí todo lo relacionado con esta entrada.

 

Publish modules to the "offcanvs" position.