• 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.

Cíclicos, dependencias condicionadas y OPC Control Language (OCL)

En esta entrada vamos a combinar varias cosas: una aplicación que sea cíclica con dos jobs que se ejecutará cada 10 minutos. Además el segundo job de esta aplicación, sólo se ejecutará si uno de los pasos del job anterior ha terminado con RC=04 y su estado es “completo”. Este segundo job añadirá una nueva aplicación al Current Plan usando OCL (OPC Control Language).

Para crear la aplicación cíclica, desde OPC vamos a la opción 1 (Database).

 

Entramos en la opción 4 (Application description).

 

Entramos en "Create" (opción 2).

 

Rellenamos los datos del panel. En mi caso, he llamado a la aplicación CICLICO10MINUTOS. Tenemos que poner un Owner, en mi caso, IBMUSER. Importante poner “A” en el parámetro “Status”. Por último, hemos establecido un calendario.

 

Ahora escribimos OPER, para añadir los jobs que ejecutará esta aplicación.

 

La primera operación será un inicio, cuya WS será de tipo Non-reporting, ya que solo sirve como inicio de aplicación y no debe ejecutar ningún JCL. Es bueno poner un inicio y un fin con este tipo de WS porque, si tenemos dos aplicaciones encadenadas, podemos añadir o quitar jobs sin tener que tocar las dependencias externas porque las encadenaremos al inicio/fin de cada aplicación.

 

Insertamos una nueva línea.

 

En esta segunda operación vamos a poner un JCL que será un IDCAMS con un “SET MAXCC=04” en la sysin, para forzar ese código de retorno y poder probar las dependencias condicionadas.

NOTA: Este JCL debemos guardarlo, como cualquier job de OPC, en la librería de JOBS. Para saber de cual se trata, podemos ir al SDSF, buscar la tarea Controller de OPC y mirar la DD “EQQJBLIB”. Deberemos elegir una de las librerías que aparezcan concatenadas en esa DD. En mi caso se llama OPC.OP1C.JOBLIB.

Aquí dejo el JCL para que sea más fácil.

//CICLI01  JOB (9999),'OPCSAMPLES',CLASS=A,MSGCLASS=Q,    

// MSGLEVEL=(1,1),REGION=0M                               

//RCPRUEB   EXEC PGM=IDCAMS                               

//SYSPRINT  DD SYSOUT=*                                   

//SYSIN DD *                                              

  SET MAXCC = 4                                            

 

 

Volvemos a OPC y continuamos añadiendo esta operación. Se trata de la operación 002, en WS debemos poner una que nos sirva para ejecutar JCLs y el nombre del job será CICLI01. Debemos poner como predecesor interno el inicio de la aplicación.

NOTA: Si no sabemos que WS tenemos disponibles, podemos mirarlo en la opción 1.1 de OPC (Database – WS).

 

Ahora vamos a vamos a preparar el OPC para poder añadir una aplicación mediante OCL. Para hacerlo nos dirigiremos a librería de ejemplos (SEQQSAMP) de OPC. En mi caso, TWS860.SEQQSAMP. Primero modificaremos el miembro EQQYRPRC.

NOTA: Para ampliar la información podéis ir a esta página de IBM:

http://www.ibm.com/support/knowledgecenter/en/SSTG2Y_8.6.0/com.ibm.tivoli.itws.doc_8.6.0.1/eqqn1conlangocl.htm

 

Este fichero es un procedimiento que ejecuta el programa EQQOCL de OPC. A este procedimiento lo llamaremos mediante el JCL que será la operación 002 de nuestra aplicación cíclica, pero antes debemos modificar el procedimiento para que se ajuste a nuestra instalación.

 

Si bajamos, vemos que tenemos que cambiar varias librerías.

 

Modificamos el nombre de las librerías de forma que coincidan con las que tenemos.

Las librerías SEQQLMD0, SEQQSAMP, SEQQMISC, SEQQMSG0 vienen de base con OPC. Para saber cómo se llama la librería que indica “PLI_RUNTIME_LIBRARY”, debemos buscar en 3.4 las librerías que empiezan por “IEL” y, como se trata de la librería de módulos, el nombre es IELXXX.SIBMZCMP. En mi caso se llama IEL420.SIBMZCMP.

La DD EQQYPARM se puede asteriscar.

 

Ahora vamos a editar el miembro “EQQYRPRM” de la DD OCLPARM que se encuentra en la misma librería de ejemplos.

 

Aquí lo más importante es poner el controller y el tracker correctamente. Si queremos podemos modificar el resto de parámetros también, pero, en principio, no sería necesario. En mi caso, mi Controller se llama OP1C y mi Tracker se llama OP1T.

 

Una vez tenemos hecho, ya podemos copiar el siguiente JCL a nuestra librería de JOBS de OPC. Este job será el que se encargue de añadir una nueva aplicación al Current Plan usando OCL.

//CICLI02  JOB (9999),'OPCSAMPLES',CLASS=A,MSGCLASS=Q, 

// MSGLEVEL=(1,1),REGION=0M         

//*                                                            

//MYJCLLIB JCLLIB ORDER=TWS860.SEQQSAMP                        

//*                                                             

//EQQOCL   EXEC  EQQYRPRC                                      

//SYSPRINT DD SYSOUT=*,DCB=(RECFM=FB,LRECL=133,BLKSIZE=1330)   

//SYSTSPRT DD SYSOUT=*                                         

//EQQOCL.SYSIN    DD *                                         

ADD APPL(PRIMERAAPLI) IAD(170125) IAT(1933)                    

/*                      

 

Lo primero que tenemos que adaptar es la librería de la JCLLIB, que debe ser la librería que contenga el procedimiento EQQYRPRC, que hemos editado antes.

Debemos poner en el parámetro APPL una aplicación que ya tengamos definida. En el parámetro IAD, pondremos una fecha de “Input Arrival” teniendo en cuenta que si ponemos la fecha del día se añadirá al Current Plan y si ponemos una fecha posterior, se añadirá al Long Term Plan. En el parámetro IAT (Input Arrival Time) pondremos la hora correspondiente.

NOTA: Si queremos que coja los parámetros IAD e IAT de la fecha que tenga el sistema cuando se ejecuta el JCL, pondremos lo siguiente: ADD APPL(PRIMERAAPLI) IA(=)


 

Volvemos a OPC y añadimos la operación 003 cuya WS será la misma que hayamos usado para la operación 002 y el nombre del job será el mismo que le hemos puesto al JCL, en mi caso, CICLI02.

Ahora vamos a entrar en la operación 003 con la “S” para crear la dependencia condicionada a la ejecución del job anterior.

 

Entramos en la opción 1 (Predecessors).

 

Escribimos COND.

 

Ponemos el número de condición 001 y un texto descriptivo. Entramos en esta condición poniendo una “S” en esa fila.

 

Rellenamos los datos de la siguiente forma para que compruebe si da un RC=04 en el paso RCPRUEB.

NOTA: Si ejecutamos un paso que no tiene procedimiento, pondremos el nombre del paso en la columna "ProcStep"

 

Ahora vamos a añadir la condición de que el job CICLI01 esté completo.

En mi OPC, versión 8.6.0, si pongo en una misma regla dos condiciones, una referencia al estado en OPC (completo, error, etc.) y otra condición al RC de un paso de un mismo job, la operación se queda en estado “UNDEFINED” y no se ejecuta, por lo tanto, voy a hacer una nueva regla. Además debo de poner primero las reglas referentes a PASOS y después las reglas relacionadas con estados de jobs, siempre que se trate del mismo job en los dos casos.

Volvemos al panel anterior e insertamos una nueva fila.

 

Ponemos número de condición 002 y un texto explicativo.

 

Añadimos la condición de que el job CICLI01 esté completo de la siguiente forma:

 

Salimos con F3 hasta llegar a la pantalla donde estábamos añadiendo todas las operaciones de la aplicación. Nos fijamos que, en la columna “No. Of Conds”, ahora pone 2, que son las que hemos añadido.

Le añadimos, como predecesor interno, el inicio de la aplicación (operación 001).

 

Por último añadimos la operación 099 con WS de Non-reporting y el nombre de job será FIN. Como predecesor interno pondremos la operación 002, porque la operación 003 puede que se haga o no, al estar condicionada.

 

Salimos con F3 y entramos en RUN.

 

Añadimos una regla de ejecución y entramos con una “S”.

 

Marcaremos lo siguiente para que se ejecute todos los días de la semana (Every – Day – Week) y pondremos el comando E, para en entrar en las opciones y poder definirlo como cíclico.

 

Ponemos “Repeat Every = 00.10” para que se ejecute cada 10 minutos y ponemos la opción “Until = 23.50” para que se ejecute hasta esa hora.

 

Salimos con F3 hasta que nos salga el mensaje “VALID RULE”.

 

Pulsamos F3 y volvemos a entrar a OPER.

 

Entramos con una “S” en la operación “Inicio”.

 

Entramos en la opción “4 - Automatic Options”.

 

Marcamos la opción “TIME DEPENDENT” como Yes.

 

Salimos con F3 hasta que aparezca el mensaje “APPLICATION CREATED”.

 

Una vez se ejecuta nuestra aplicación, el job CICLI01 terminará en error, puesto que hemos forzado el RC=04 y no hemos validado en OPC ese código como bueno.

 

Podemos entrar con MOD y comprobar que la operación CICLI02 está esperando. Teniendo en cuenta que habíamos puesto como predecesor la operación 001 (el inicio), podríamos pensar que se ha debido de ejecutar, pero hasta que no se resuelvan las condiciones que hacen referencia al job CICLI01, el OPC no puede determinar si se tiene que ejecutar o no.

 

 

Salimos y completamos la operación CICLI01.

 

Ahora vamos a la opción 5.2 para comprobar si el job CICLI02 se ha ejecutado.

 

Vemos que se ha ejecutado ya que está completado. Si no tuviera que ejecutarse, aparecería una "X" en el estado de la operación 003.

 

Vamos al SDSF y buscamos la salida en el spool para confirmar si se ha añadido la aplicación al Current Plan. Nos fijamos en el mensaje que indica "The occurrence was added".

 

Si buscamos la aplicación en la opción 5.2 de OPC, veremos que ha añadido la aplicación con fecha 25/01/2017 y hora 19:35h.

 

Ahora vamos a la opción 5.2 y vamos a cambiar el JCL de una ejecución futura y pondremos SET MAXCC = 0 de la operación 002 - CICLI01.

 

Modificamos el JCL poniendo “SET MAXCC=0” para que no se cumplan las condiciones y que la operación 003 “CICLI002” no se ejecute.

 

Salimos con F3 y esperamos a que se ejecute para comprobar el resultado. Una vez se haya ejecutado, entramos con la opción “B – Browse” desde la opción 5.2.

 

Entramos en la opción 2.

 

Vemos que la operación 003 -CICLI02 aparece marcada con una X. Entramos con una “S” en esa operación para ver el detalle del estado.

 

Vemos que el estado es “Suppr by cond”, esto quiere decir que, como no se han cumplido las condiciones que habíamos puesto, este job no se ejecuta.

 

Pues ya hemos probado tres cosas del planificador: aplicaciones cíclicas, dependencias condicionadas y añadir aplicaciones al Current Plan mediante JCL.

 

 

Publish modules to the "offcanvs" position.