Mostrando entradas con la etiqueta cond. Mostrar todas las entradas
Mostrando entradas con la etiqueta cond. Mostrar todas las entradas

lunes, 7 de mayo de 2012

JCL Avanzado I. Incluir condiciones IF THEN

Actualizado: Paso para comprobar si un fichero existe y otro modo de incluir condiciones IF/ELSE.

Os dejo otra pequeña utilidad para que un jcl ejecute un paso o no en función de una condición.
Vamos a aplicar las condiciones para hacer que un jcl ejecute un paso u otro en función de si un fichero tiene datos o está vacío

Lo primero que hacemos es verificar que el fichero tiene datos o no:

//**=======================================================*
//** PASO01 - COMPRUEBA SI EL FICHERO TIENE DATOS O ESTÁ VACIO
//**=======================================================*
//PASO01   EXEC PGM=IDCAMS
//IN       DD DSN=nombre.fichero.prueba1,DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
  PRINT INFILE(IN) COUNT(1)
  IF MAXCC=12 THEN SET MAXCC=4
/*

Lo segundo es incluir la condición en el paso para que se ejecute en función de éste:


//**=======================================================*
//** PASO02 - REALIZA EL PASO SI SE CUMPLE LA CONDICIÓN    
//**=======================================================*
//PASO02   EXEC SORTD,COND=(4,EQ,PASO01)
//SYSOUT   DD SYSOUT=*
//SORTIN   DD DSN=nombre.fichero.prueba1,DISP=SHR
//SORTOUT  DD DSN=nombre.fichero.prueba2,
//            DISP=(,CATLG),
//            SPACE=(CYL,(100,100),RLSE)
//SYSIN    DD *
  SORT FIELDS=COPY

Posibles resultados:

- Si existe y tiene datos --> El primer paso dice que todo es correcto (MAXXCC=0) y se ejecuta el segundo paso.
- Si existe pero está vacío --> El primer paso da un MAXXCC=4 y no se ejecuta el siguiente paso
- Si no existe --> El jcl abenda dando un FLUSH

Si lo que quieres es lo contrario, es decir, que ejecute el paso solo cuando el fichero esté vacío, pon: COND=(0,EQ,PASO01) en vez de COND=(4,EQ,PASO01).

NOTAS:
- Si se quiere aplicar la condición a más pasos posteriores únicamente añadir el COND=(X,EQ,PASO01) en cada paso.
- Ojo con poner correctamente el nombre del paso en el COND=(0,EQ,PASO01). Puede ser cualquier nombre pero debe coincidir con el que hace la validación de fichero vacío.


Otra manera de incluir condiciones IF/ELSE:
Vamos a construir un paso de JOB que comprueba si un fichero existe.
OJO! No estamos comprobando si lleva datos, sólo si existe.

//**=======================================================*
//** PASO01 - COMPRUEBA SI EL FICHERO EXISTE
//**=======================================================*
//PASO01 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
 LISTCAT ENTRIES (nombre.fichero.prueba1) ALL
 IF LASTCC NE 0 THEN DO
    SET MAXCC=4
    END
/*
//**********************************************************
//**CONDICION PARA EJECUTAR EL SIGUIENTE PASO
//**SOLO SI EL FICHERO EXISTE*
//**********************************************************
//CONDIC1 IF (PASO01.RC > 0) THEN
//* NO EJECUTA BLOQUE CONDIC1 PORQUE EL FICHERO NO EXISTE
//CONDIC1 ELSE
//*******************************************************
//** PASO 02 A EJECUTAR. POR EJEMPLO UN SORT:
//*******************************************************
//PASO02 EXEC SORTD
//SYSOUT  DD SYSOUT=*
//SORTIN  DD DSN=nombre.fichero.prueba1,DISP=SHR
//SORTOUT DD DSN=nombre.fichero.prueba2,
//           DISP=(,CATLG),
//           SPACE=(CYL,(100,100),RLSE)
//SYSIN DD *
SORT FIELDS=COPY
/*
//CONDIC1 ENDIF

En primer lugar utilizamos el programa IDCAMS para comprobar si el fichero existe con la instrucción LISTCAT. Si el fichero no existe, el Return Code (RC) será 4.

Lo siguiente que hacemos es crear un paso CONDIC1 con la sentencia IF, donde preguntamos si el RC del PASO01 es mayor que cero. Si es mayor que cero significa que el fichero no existe, por lo que no haremos nada. En otro caso, ejecutamos los siguientes pasos del JOB.

OJO! Todas las partes de un mismo IF deben ir precedidas del mismo nombre de paso. En nuestro ejemplo CONDIC1.
Todo IF debe terminar con un ENDIF.
La sentencia ELSE no es obligatoria.

miércoles, 2 de marzo de 2011

JCL Básico II: La Cabecera

LENGUAJE DE CONTROL DE TRABAJOS

Campos de las sentencias de JCL
     Cada sentencia de control está compuesta por los siguientes campos:
  • IDENTIFICADOR - Indica al sistema de que tipo de sentencia se trata:
    //   --> sentencia de JCL
    /*   --> sentencia de delimitador
    //*  --> sentencia de comentarios
  • NOMBRE - Identifica una sentencia de control a la que otras sentencias y el sistema pueden hacer referencia.
  • OPERACIÓN - Especifica el tipo de sentencia de control que sigue al campo de nombre (JOB, EXEC, DD).
  • PARÁMETROS - Especifica las características particulares de las sentencias de JCL. Existen dos tipos de parámetros:
    • Posicionales: su significado viene determinado por la position que ocupa en la sentencia. Su ausencia debe indicarse con una coma.
    • De Palabra Clave: su significado viene determinado por la palabra especial que lo identifica. Siempre van después de los posicionales.
  • COMENTARIOS - Ira a continuación del campo de parámetros, precedido de un espacio en blanco, y puede codificarse hasta la posición 80. No debe utilizarse si no hay campo de parámetros, en éste caso se utilizaría la Sentencia de Comentarios (//*).

Sentencia JOB - CABECERA

     //NAMEJCLX JOB 102,'DESCRIPCION',CLASS=A,
     //      MSGCLASS=H,MSGLEVEL=(2,1),
     //      NOTIFY=&SYSUID,REGION=4M,
     //      TIME=NOLIMIT,COND=(0,NE),PRTY=15,
     //      RESTART=PASO15,TYPRUN=SCAN

    Sentencia obligatoria que indica el principio del trabajo, y solo puede existir una por trabajo.
  • Parámetros posicionales en la sentencia JOB:
    • INFORMACIÓN DE CONTABILIDAD - especifica la information de contabilidad exigida por la instalación.
    • NOMBRE DEL PROGRAMADOR - identifica al grupo responsable del trabajo.
  • Parametros de Palabra Clave en la sentencia JOB:
    • CLASS - indica la cola de entrada donde esperara el trabajo para ser ejecutado. Ha de ser cualquier carácter alfanumérico según decida la instalación
    • MSGCLASS - indica la cola de salida de los mensajes del sistema. Si no se especifica se toma el que tenga por defecto la plataforma donde nos encontremos.
    • MSGLEVEL - indica el tipo de mensajes que ha de imprimir el sistema.
      Es un parámetro compuesto de dos subparámetros posicionales: 
      • El primero (Sentencias) acepta los valores :        
        0      Solo sentencias de Job        
        1      Sentencias de JCL  y resolución de parámetros simbólicos por parte del JES       
        2      Sentencias de JCL
      • El segundo (Mensajes):        
        0      Mensajes de JCL y todos si acaba mal        
        1      Todos siempre
    • NOTIFY - indica el usuario de TSO al que el sistema enviara un mensaje cuando termine el trabajo. La opción: NOTIFY=&SYSUID, hace que cuando el jcl acabe se muestre un mensaje al usuario que ha submitido el jcl.
    • TIME - indica el tiempo máximo de CPU que puede emplear el job.
    • REGION - indica la cantidad de memoria que va a utilizar el job en su ejecución.
      - En el caso de trabajar con memoria real ADDRSPC=REAL indica el total de memoria a utilizar
      - En el caso de trabajar con memoria virtual ADDRSPC=VIRT evita el exceso de paginación cuando se codifican valores bajos
      La medida se expresa en valor superior a cero en numero par y como unidad K(1024 octetos) 
    • COND - Indica un código de condición para permitir o evitar ejecutar los diferentes pasos de un JOB en función del código de retorno que devuelve el sistema por la ejecución de cada  uno de los paso. El job deja de ejecutarse cuando el código de condición devuelto cumple el código del pa´rametro COND. Ejemplos:
      • COND=(0,NE) --> Si el jcl no da un 0 en algún paso se cancela la ejecución.
      • COND=(4,NE) --> Si el jcl no da un 4 en algún paso se cancela la ejecución.
      • COND=(12,LE) --> Si el jcl no da un error menor o igual a 12 en algún paso, se cancela la ejecución.
      • El primer valor puede estar comprendido entre 0 y 4095 (los mas habituales son el 0, 4, 8, 12,16)
      • Las condiciones posibles son: EQ (igual), LT(menor que), LE(menor o igual), GT(mayor que), GE(mayor o igual), NE(distinto)
      • Se puede poner en la cabecera, en un paso en concreto, o en ambos sitios.
    • ADDRSPC - Especifica si el proceso se ejecuta en memoria Real (ADDRSPC=REAL) o Virtual(ADDRSPC=VIRT). Si no se indica por defecto usa la memoria Virtual.
    • DYNAMNBR Este parámetro esta asociado con la alocación dinámica de ficheros y no se debe codificar en otras circunstancias. Alocación dinámica es aquella que efectuamos por medio del programa en ejecución  que marca la pauta de que ficheros debe o no coger o crear .Cada fichero a crear será una unidad de asignación al parámetro. Debe de asociarse el paso  al parámetro para que el JOB sepa en que momento debe de reservar recursos para la asignación dinámica de ficheros.
      DYNAMNBR.PASO01=10
      El numero máximo de ficheros a poder asignar de forma dinámica es de 1635
      //TRAB1   JOB    DEPEXT,PUIG,MSGCLASS=V,CLASS=C,NOTIFY=T515214,
      //                            DYNAMNBR.PASO01=10,........
      La alocación dinámica suele especificarse en la sentencia EXEC o por medio de una DD
    • PRTY - se establece una prioridad al job dentro de la clase de entrada.El parámetro consta de dos subparámetros posicionales numéricos, el primero con valores comprendidos entre 0 y 14 y el segundo entre 0 y 15. La prioridad final se obtiene del producto de 16x (valor 1)+(valor 2)
DPRTY =(10,5)
    • RESTART - rearrancar un trabajo desde el paso especificado, saltando los pasos anteriores. Que queremos lanzar el jcl desde el PASO15 (por ejemplo) saltándose los 14 pasos anteriores, pues le indicamos: RESTART=PASO15
    • TYPRUN - indica el tipo de ejecucion del job. Los posibles valores que adopta este parámetro:
      • HOLD Deja el trabajo en HOLD (pendiente de ejecución para el JES) y queda a la espera que el operador de consola lo libere (Se hace habitualmente cuando el JOB requiere de unos recursos especiales que han de ser cedidos por Explotación.)
      • SCAN Analiza sintácticamente el JOB Control.
      • JCLHOLD El job queda retenido antes de ser procesado por el converter.No pasa a cola de selección hasta que el operador lo libera
      • COPY Lista el JCL sin ejecutarlo
    • RD - Especifica la posible forma de arrancar un JOB

RD=


{
R
RNC
NC
NR

}
          R           Rearranque automático combinado con la macro CHKPT
          RNC      Rearranque automático a nivel de paso (no de checkpoint)
                      NC        No se permiten rearranques automáticos
                      NR        No permite arranque automático, pero se puede tomar 
                                   checkpoint para el arranque posterior

                       Este parámetro no suele utilizarse y en su lugar se utiliza 
                       frecuentemente el parámetro restart como rearranque manual.

    • PERFORM Grupo de rendimiento al que se aplica al JOB PERFORM="numero con valores comprendidos entre 1 y 255"



    Ejemplo de una cabecera:
     //NAMEJCLX JOB (101, 'MI JCL'),MSGLEVEL=(2,1) , CLASS=A,
     //                              MSGCLASS=H,NOTIFY=&SYSUID
     //*