BlogJCL

OUTFIL en JCL: SORT de un fichero

En el mundo del mainframe, JCL (Job Control Language) es la columna vertebral para la ejecución de trabajos y la gestión de datos. Dentro de JCL, uno de los componentes más poderosos y versátiles es la declaración OUTFIL, que se utiliza principalmente en combinación con las utilidades de IBM, como DFSORT y ICETOOL, para el reformateo de ficheros.

Definición de OUTFIL en JCL

Respecto al siguiente fichero:

CONT NOMBRE    APELLIDOS ESTADO
---------------------------------
00001JOHN      SMITH     ALUMNO   
00002JANE      DOE       PROFESOR 
00003ROBERT    BROWN     ALUMNO   
00004EMILY     DAVIS     ALUMNO   
00005MICHAEL   WILSON    PROFESOR 
00006SARAH     JOHNSON   ALUMNO   
00007DAVID     LEE       PROFESOR 
00008LAURA     MARTIN    ALUMNO   
00009DANIEL    GARCIA    PROFESOR 
00010JESSICA   WHITE     ALUMNO   

Para separar los registros del fichero anterior en dos ficheros distintos (uno para «alumno» y otro para «profesor») utilizando OUTFIL en JCL, se puede emplear la utilidad DFSORT. A continuación se muestra un ejemplo de cómo hacerlo.

Código JCL para separar los registros con OUTFIL

//SEPARA   JOB (ACCT),'SEPARAR FICHEROS',
// CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID
//*
//STEP1 EXEC PGM=IEFBR14
//ALUMNO DD DSN=USER.FICHERO.ALUMNOS,
// DISP=(NEW,CATLG,DELETE),
// SPACE=(CYL,(1,1),RLSE),
// DCB=(DSORG=PS,RECFM=FB,LRECL=35,BLKSIZE=350)
//PROFESOR DD DSN=USER.FICHERO.PROFESORES,
// DISP=(NEW,CATLG,DELETE),
// SPACE=(CYL,(1,1),RLSE),
// DCB=(DSORG=PS,RECFM=FB,LRECL=35,BLKSIZE=350)
//*
//STEP2 EXEC PGM=SORT
//SORTIN DD DSN=USER.FICHERO.DATOS,DISP=SHR
//ALUMNO DD DSN=USER.FICHERO.ALUMNOS,DISP=OLD
//PROFESOR DD DSN=USER.FICHERO.PROFESORES,DISP=OLD
//SYSOUT DD SYSOUT=*
//SORTOUT DD DUMMY
//SYSIN DD *
SORT FIELDS=COPY
OUTFIL FILES=01,INCLUDE=(26,7,CH,EQ,C'ALUMNO')
OUTFIL FILES=02,INCLUDE=(26,8,CH,EQ,C'PROFESOR')
/*
//

Explicación del código JCL

Job Card:

//SEPARA   JOB (ACCT),'SEPARAR FICHEROS',
//             CLASS=A,MSGCLASS=A,NOTIFY=&SYSUID

Define el trabajo JCL con el nombre SEPARA, especifica la cuenta (ACCT), y configura las clases y notificación.

STEP1: Crear los ficheros de salida:

//STEP1    EXEC PGM=IEFBR14
//ALUMNO   DD DSN=USER.FICHERO.ALUMNOS,
//             DISP=(NEW,CATLG,DELETE),
//             SPACE=(CYL,(1,1),RLSE),
//             DCB=(DSORG=PS,RECFM=FB,LRECL=35,BLKSIZE=350)
//PROFESOR DD DSN=USER.FICHERO.PROFESORES,
//             DISP=(NEW,CATLG,DELETE),
//             SPACE=(CYL,(1,1),RLSE),
//             DCB=(DSORG=PS,RECFM=FB,LRECL=35,BLKSIZE=350)

Este paso utiliza IEFBR14 para crear dos archivos nuevos: USER.FICHERO.ALUMNOS y USER.FICHERO.PROFESORES. Ambos archivos tienen una longitud de registro (LRECL) de 35 caracteres y un tamaño de bloque (BLKSIZE) de 350 caracteres.

Aquí se puede calcular el BLKSIZE de un fichero.

STEP2: Separar los registros con SORT y OUTFIL:

//STEP2 EXEC PGM=SORT
//SORTIN DD DSN=USER.FICHERO.DATOS,DISP=SHR
//ALUMNO DD DSN=USER.FICHERO.ALUMNOS,DISP=OLD
//PROFESOR DD DSN=USER.FICHERO.PROFESORES,DISP=OLD
//SYSOUT DD SYSOUT=*
//SORTOUT DD DUMMY
//SYSIN DD *
SORT FIELDS=COPY
OUTFIL FILES=01,INCLUDE=(26,7,CH,EQ,C'ALUMNO')
OUTFIL FILES=02,INCLUDE=(26,8,CH,EQ,C'PROFESOR')
/*

Este paso utiliza la utilidad SORT para copiar los registros del archivo de entrada (USER.FICHERO.DATOS) a dos archivos de salida diferentes:

  • USER.FICHERO.ALUMNOS (FILES=01): Incluirá solo los registros que tengan «ALUMNO» en las posiciones 26 a 32.
  • USER.FICHERO.PROFESORES (FILES=02): Incluirá solo los registros que tengan «PROFESOR» en las posiciones 26 a 33.

La instrucción SORT FIELDS=COPY indica que los registros deben copiarse sin ninguna clasificación adicional. Las cláusulas INCLUDE en las instrucciones OUTFIL especifican las condiciones para seleccionar los registros que se escribirán en cada archivo de salida.

Elementos compatibles con OUTFIL

OUTFIL en JCL se puede combinar con varios elementos y opciones para la filtración y manipulación de datos. Aquí hay algunos de los más comunes:

INCLUDE/OMIT:

INCLUDE y OMIT permiten seleccionar o excluir registros basándose en condiciones específicas.

OUTFIL INCLUDE=(start,length,format,operator,value)
OUTFIL OMIT=(start,length,format,operator,value)

BUILD/OUTREC:

BUILD (o OUTREC) se utiliza para reformatear los registros de salida, especificando las posiciones y formatos de los campos.

OUTFIL BUILD=(newpos1:start1,length1,...)

REMOVECC/NOREMOVECC:

REMOVECC o NOREMOVECC controlan si se deben eliminar o mantener los caracteres de control de columnas (carriage control characters) en el archivo de salida.

OUTFIL REMOVECC
OUTFIL NOREMOVECC

Ejemplo Combinando Varios Elementos

A continuación, se muestra un ejemplo combinando varios elementos en OUTFIL:

//STEP1    EXEC PGM=SORT
//SORTIN   DD DSN=USER.FICHERO.DATOS,DISP=SHR
//SORTOUT  DD DUMMY
//OUT1     DD DSN=USER.FICHERO.ALUMNOS,DISP=(NEW,CATLG,DELETE),
//             SPACE=(CYL,(1,1),RLSE),
//             DCB=(DSORG=PS,RECFM=FB,LRECL=35,BLKSIZE=350)
//OUT2     DD DSN=USER.FICHERO.PROFESORES,DISP=(NEW,CATLG,DELETE),
//             SPACE=(CYL,(1,1),RLSE),
//             DCB=(DSORG=PS,RECFM=FB,LRECL=35,BLKSIZE=350)
//SYSOUT   DD SYSOUT=*
//SYSIN    DD *
  SORT FIELDS=COPY
  OUTFIL FILES=01,INCLUDE=(26,7,CH,EQ,C'ALUMNO'),BUILD=(1,35)
  OUTFIL FILES=02,INCLUDE=(26,8,CH,EQ,C'PROFESOR'),BUILD=(1,35)
/*

En este ejemplo:

  • Se usa INCLUDE para filtrar registros específicos.
  • BUILD se usa para reformatear los registros de salida.
  • FILES=01 y FILES=02 se usan para especificar múltiples archivos de salida.