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
yFILES=02
se usan para especificar múltiples archivos de salida.