Controlar la existencia de un fichero en un JCL

La existencia de un fichero se puede controlar mediante el comando LISTCAT de la utilidad IDCAMS. Esta devolverá código de retorno 4 si el fichero que se le pasa como parámetro no existe en el catálogo.

Ejemplo:

Tenemos un JOB que recibe un fichero de entrada. En caso de que dicho fichero no exista, queremos que el JOB no haga nada pero termine sin JCL Error.

//PA0010   EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
  LISTCAT ENTRIES (FIC.ENTRAD.EJEMPLO) ALL   
/*
//IFPAS1  IF  PA0010.RC EQ 0 THEN
//PA0020   …
//PA0030   …
//…
//ENPAS1 ENDIF

Recordemos que IDCAMS nos permite cambiar el código de retorno de la ejecución. Por ejemplo, si nos interesa que el job termine con retorno 1 en vez de 4, podemos forzarlo así:

LISTCAT ENTRIES (FIC.ENTRAD.EJEMPLO) ALL
  IF LASTCC NE 0 THEN DO
    SET MAXCC=1
  END

4 comentarios sobre Controlar la existencia de un fichero en un JCL

  • Ana

    ¿cómo hay que hacer para preguntar por la existencia de varios ficheros?
    Este ejemplo sólo es para un fichero

    • admin

      Con los siguientes comandos, IDCAMS devolverá 0 si existen los dos ficheros y 4 si no existe alguno de ellos:

      //SYSIN DD *
      LISTCAT ENTRIES (FIC.ENTRADA.PRUEBA1) ALL
      LISTCAT ENTRIES (FIC.ENTRADA.PRUEBA2) ALL

      Se puede conseguir lo mismo con un solo comando si sustituimos el último calificador por un asterisco:

      //SYSIN DD *
      LISTCAT ENTRIES (FIC.ENTRADA.*) ALL

  • Mayte

    Tengo un fichero datado AAAAMM (se guardan los últimos 2-3 meses y el del mes actual se genera sobre el día 20). Debo quedarme con el último fichero existente de los tres últimos meses, para tratar los datos más actuales ¿Cómo lo hago?

    He puesto lo siguiente, pero se queda siempre con el último, exista o no (en mi prueba, existen los dos anteriores pero no el actual, al ser antes del día 20), por lo que el siguiente paso que es el SORT, falla porque el fichero actual no existe:

    //* SI HAY DATOS DE HACE DOS MESES, SE GUARDAN.
    //EXISTES3 EXEC PGM=IDCAMS
    //SYSPRINT DD SYSOUT=*
    //SYSIN DD *
    LISTCAT ENTRIES (FICHERO.F201908) ALL
    /*
    //ICONS3 IF (EXISTES3.RC=00) THEN
    // SET FILE1=FICHERO.F201908
    //FCONS3 ENDIF
    /*
    //* SI HAY DATOS DEL MES PASADO, SE GUARDAN, QUE SON MAS ACTUALES
    //EXISTES2 EXEC PGM=IDCAMS
    //SYSPRINT DD SYSOUT=*
    //SYSIN DD *
    LISTCAT ENTRIES (FICHERO.F201909) ALL
    /*
    //ICONS2 IF (EXISTES2.RC=00) THEN
    // SET FILE1=FICHERO.F201909
    //FCONS2 ENDIF
    /*
    //* SI HAY DATOS DEL MES ACTUAL, SE GUARDAN, QUE SON LOS MAS ACTUALES
    //EXISTES1 EXEC PGM=IDCAMS
    //SYSPRINT DD SYSOUT=*
    //SYSIN DD *
    LISTCAT ENTRIES (FICHERO.F201910) ALL
    /*
    //ICONS1 IF (EXISTES1.RC=00) THEN
    // SET FILE1=FICHERO.F201910
    //FCONS1 ENDIF
    /*

    En el SORT:
    SORTIN DD DISP=SHR,DSN=&FILE1 es donde me aperece siempre el último, exista o no.

    Por favor, ¿me podrías ayudar? Gracias!

  • admin

    El manual de IBM dice lo siguiente:
    The SET statement is not executed conditionally. For example, if the SET statement appears in an IF/THEN/ELSE/ENDIF statement construct, the value is assigned to the symbolic parameter regardless of the logic of the construct.

    Es decir, la instrucción SET no se ve afectada por las condiciones lógicas de los IF, así que en tu caso se ejecutan todos los SET y la variable queda siempre con el último valor asignado.

    Lo que podrías hacer sería:
    IF existe el fichero 201910
       Copiarlo al fichero MASRECIENTE
    ELSE
       IF existe el fichero 201909
          Copiarlo al fichero MASRECIENTE
       ELSE
          IF existe el fichero 201908,
             Copiarlo al fichero MASRECIENTE
          END-IF
       END-IF
    END-IF

    Aunque este ejemplo solo te valdría para los ficheros de octubre, septiembre y agosto. Si quieres montar un ejemplo genérico que valga para todos los meses, tendrías que montar los nombres de los ficheros a partir de variables de fecha del planificador. La sintaxis para esto dependerá del planificador que se use en tu instalación (Control-M o IWS-TWS-OPC)..

Deja un comentario