Desarrollando en Cobol y Natural sobre Plataforma Mainframe

jueves, 4 de junio de 2015

Error de SORTIN LRECL - REASON CODE IS 05

Cuando trabajamos con concatenación de ficheros secuenciales, uno de los errores típicos que puede aparecer en nuestro JCL es el asociado al mensaje: “INVALID DATA SET ATTRIBUTES: SORTIN   LRECL   - REASON CODE IS 05”. En primera instancia, el problema puede parecer algo confuso (ya que la salida del JCL no suele detallar demasiado el error), pero veremos que en realidad es algo bastante sencillo de resolver.

Error SORTIN LRECL – REASON CODE IS 05


Aprovechando que hace unos días le apareció este error a un compañero, vamos a tratar de explicar cuál es el origen del problema. En nuestro caso, la ejecución del JCL se tradujo inicialmente en un código de retorno RC de tipo ABEND USER COMPLETION CODE=0043 y, por supuesto, el job finalizó incorrectamente.

 

Lo primero que hicimos fue entrar en el SPOOL a verificar la salida del JCL. En ese momento pudimos ver que el mensaje de retorno era “INVALID DATA SET ATTRIBUTES: SORTIN   LRECL   - REASON CODE IS 05”. En concreto, el detalle de la salida era el siguiente.

ICE805I 1 JOBNAME: JJ13RAP0 , STEPNAME: PASO1
ICE802I 0 BLOCKSET     TECHNIQUE IN CONTROL
ICE143I 0 BLOCKSET     SORT  TECHNIQUE SELECTED
ICE250I 0 VISIT http://www.ibm.com/storage/dfsort FOR DFSORT PAPERS ICE000I 1 - CONTROL STATEMENTS FOR 5694-A01, Z/OS DFSORT V1R12 - 

          *-----------------------------------------------------
          * <<< TABLA JJRA >>>
          *-----------------------------------------------------
            SORT FIELDS=(1,4,PD,A,7,4,PD,A,5,2,PD,A,11,2,PD,A,
                        13,3,PD,A,16,3,PD,A),
                        DYNALLOC=3390
            SUM  FIELDS=NONE
ICE043A 3 INVALID DATA SET ATTRIBUTES: SORTIN LRECL - REASON CODE 05
ICE751I 0 C5-I12416 C6-K90026 C7-K94453 C8-K94453 E7-I12416
ICE052I 3 END OF DFSORT


Tal y como se puede apreciar, el error se estaba produciendo en un paso en el que se ejecuta un SORT sobre un fichero secuencial de entrada. Por tanto, teniendo en cuenta que el mensaje era INVALID DATA SET ATTRIBUTES, resultaba obvio que el problema estaba en ese dataset de entrada.

JCL con INVALID DATA SET ATTRIBUTES


Una vez que determinamos el origen de un error, lo siguiente es irnos al paso del JCL en el que se ha producido el fallo. Parece una obviedad, pero en numerosas ocasiones me encuentro con programadores que empiezan a darle vueltas a la salida del SPOOL, sin decidirse a revisar el contenido del JCL (es importante perderle el miedo al lenguaje JCL ya que, si no, estaremos continuamente perdiendo más tiempo del necesario).

//JJ1309  EXEC PGM=SORT
//*           ***************************************************** //*           * JUNTAMOS LOS FICHEROS PARA QUEDARNOS CON TODO     *

//*           *****************************************************
//SYSOUT   DD  SYSOUT=*                                             
//SORTIN  DD DSN=&INDICE1..JJ1307S1.X0060X.DDD.F&FECHA..&TABLA..MD2,
//             DISP=SHR
//        DD DSN=&INDICE1..JJ1307S2.X0060X.DDD.F&FECHA..&TABLA..RS2,
//             DISP=SHR                                             
//*           *****************************************************
//*           * FICHERO CON LOS TODOS LOS REGISTROS CRUZADOS      *
//*           *****************************************************
//SORTOUT  DD DSN=&INDIC1..JJ1309S1.X0060X.DDD.F&FECHA..&TABLA..S2,
//             UNIT=DISCO,                                          
//             DISP=(,CATLG,DELETE),                                
//             SPACE=(CYL,(00010,00010),RLSE)
//SYSIN    DD  DSN=&INDICE..SYSIN(JJ130009),
//             DISP=SHR


En el paso anterior podemos ver que el fichero secuencial de salida del SORT (&INDICE1..JJ1309S1.X0060X.DDD.F&FECHA..&TABLA..S2), ficha SORTOUT, proviene de la ordenación de un fichero concatenado. Del mismo modo, la entrada del SORT la constituye la concatenación de los dos ficheros que se especifican en la ficha SORTIN (dataset &INDICE1..JJ1307S1.X0060X.DDD.F&FECHA..&TABLA..MD2 y dataset &INDICE1..JJ1307S2.X0060X.DDD.F&FECHA..&TABLA..RS2).

Por tanto, el error que está siendo provocado por el fichero concatenado tendrá su causa, en realidad, en alguno de los dos ficheros origen: TABLA.MD2 y TABLA.RS2.


Recordemos que el retorno hacía referencia a la longitud de los ficheros de entrada (mensaje SORTIN LRECL). Por tanto, aprovecho para comentar que, cuando un SORT utiliza más de un fichero secuencial como entrada (en este caso, dos datasets), todos ellos deben tener la misma longitud de registro. Esto es, en la entrada no se podrán concatenar, por ejemplo, un secuencial con registros de longitud 100 posiciones y otro secuencial con registros de 80 posiciones.

Longitud de los ficheros de entrada de un SORT


Por tanto, una vez que somos conscientes de que la causa del error debe encontrarse en la longitud de los registros de los ficheros de entrada TABLA.MD2 y TABLA.RS2, nuestra siguiente acción será proceder a revisar la estructura de ambos datasets.

En este caso, vamos a entrar en el entorno ISPF (Opción 3.4) y realizamos la búsqueda de los dos ficheros implicados en el paso de SORT del JCL. En la librería encontramos los dos datasets afectados, que son los siguientes.

Command - Enter "/" to select action                
------------------------------------------------------
         JJPR.JJ1307S1.X0060X.DDD.F070715.TABL.MD2
         JJPR.JJ1307S2.X0060X.DDD.F070715.TABL.RS2
***************************** End of Data Set list ***


A continuación, seleccionamos el fichero TABL.MD2 con el comando ‘S’ (SELECT) y pulsamos INTRO para ver sus características asociadas.


Del mismo modo, podemos seleccionar el fichero TABL.RS2 con el comando ‘S’ y pulsamos INTRO para verificar la estructura del dataset.

 
En las pantallas anteriores, donde se muestra el detalle de ambos ficheros, podemos ver la causa del error del JCL. El problema es que el dataset TABL.MD2 está definido con una longitud de registro de 71 posiciones y, en cambio, el dataset TABL.RS2 está definido con longitud 70 posiciones (tal y como podemos observar en los recuadros rojos de ambas imágenes).

En esta situación, el paso SORT del JCL es incapaz de concatenar TABL.MD2 y TABL.RS2 al encontrarse que sus respectivos registros son de diferente longitud. Por tanto, el job cancela su ejecución y devuelve el mensaje de error mencionado al principio: “INVALID DATA SET ATTRIBUTES: SORTIN   LRECL   - REASON CODE IS 05”.

Solución al error INVALID DATA SET ATTRIBUTES


La solución, en este caso, es bastante sencilla. Bastará con redefinir el formato de alguno de los dos ficheros de entrada, para igualar la longitud de sus registros con la del otro dataset. Una vez hecho eso, la ejecución del JCL no debería darnos ningún problema (o, al menos, no nos dará el anterior error de INVALID DATA SET ATTRIBUTES).

Como vemos, lo que al principio parecía un error JCL con un mensaje confuso y difícil de desenmarañar, al final se ha convertido en un simple fallo de longitud de registro de un fichero. Por eso decíamos al principio que, cuando tengamos un ABEND en un job, lo importante es no asustarse e ir revisando metódicamente el código JCL que provocó el problema.

 
 
En este caso, así lo hice con el JCL del ejemplo y la corrección del ABEND llevó menos de una hora. De hecho, en esta ocasión no había ningún otro error adicional en el código y, por tanto, el job terminó correctamente con un retorno RC=0000.

Pues nada. Espero que os sea útil el detalle de la causa de este tipo de problema y la explicación de la forma de solucionarlo. Seguro que, si trabajáis con JCL, tarde o temprano os encontraréis con un ABEND de este estilo.

Saludos.
Related Posts Plugin for WordPress, Blogger...