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.
Ejemplo de OUTFIL en JCL
Respecto al siguiente fichero USER.FICHERO.TODOS
:
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
//SEPARAR JOB (ACCT),'Separar Ficheros',CLASS=A,MSGCLASS=X
//STEP1 EXEC PGM=SORT
//SYSPRINT DD SYSOUT=*
//SORTIN DD DSN=USER.FICHERO.TODOS,DISP=SHR
//ALUMNOS DD DSN=USER.FICHERO.ALUMNOS,DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,SPACE=(CYL,(5,5),RLSE),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=0)
//PROFESOR DD DSN=USER.FICHERO.PROFESORES,DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,SPACE=(CYL,(5,5),RLSE),
// DCB=(RECFM=FB,LRECL=80,BLKSIZE=0)
//SYSOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=COPY
OUTFIL FNAMES=ALUMNOS,INCLUDE=(26,8,CH,EQ,C'ALUMNO')
OUTFIL FNAMES=PROFESOR,INCLUDE=(26,8,CH,EQ,C'PROFESOR')
/*
Explicación del código JCL
- SORTIN: Especifica el archivo de entrada
USER.FICHERO.TODOS
. - ALUMNOS y PROFESOR: Especifican los archivos de salida, donde se almacenarán los registros que cumplen las condiciones. Se crean con el nombre
USER.FICHERO.ALUMNOS
yUSER.FICHERO.PROFESORES
. - SYSIN:
SORT FIELDS=COPY
indica que simplemente se copiarán los registros, sin ordenar.OUTFIL FNAMES=ALUMNOS,INCLUDE=(26,8,CH,EQ,C'ALUMNO')
: Filtra los registros donde en la posición 26,8 (del 26 al 33) esté la cadena «ALUMNO».OUTFIL FNAMES=PROFESOR,INCLUDE=(26,8,CH,EQ,C'PROFESOR')
: Filtra los registros donde en la posición 26,8 esté la cadena «PROFESOR».
Este JCL dividirá el archivo de entrada en dos archivos de salida según el contenido de la posición 26 a 33, guardando a los «ALUMNO» en USER.FICHERO.ALUMNOS
y a los «PROFESOR» en USER.FICHERO.PROFESORES
.
Fichero USER.FICHERO.ALUMNOS
Contendrá los registros donde en la posición 26 a 33 (26,8) esté el valor «ALUMNO»:
00001JOHN SMITH ALUMNO
00003ROBERT BROWN ALUMNO
00004EMILY DAVIS ALUMNO
00006SARAH JOHNSON ALUMNO
00008LAURA MARTIN ALUMNO
00010JESSICA WHITE ALUMNO
Fichero USER.FICHERO.PROFESORES
Contendrá los registros donde en la posición 26 a 33 (26,8) esté el valor «PROFESOR»:
00002JANE DOE PROFESOR
00005MICHAEL WILSON PROFESOR
00007DAVID LEE PROFESOR
00009DANIEL GARCIA PROFESOR
Cada archivo incluye solo los registros que corresponden a su respectivo tipo (ALUMNO
o PROFESOR
). Esto se ha logrado utilizando los filtros INCLUDE
en el JCL, los cuales han dividido los registros en función de la ocupación indicada en la posición 26 a 33.
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.
JCL: Cómo Ejecutar un Proceso
Este libro explora el Job Control Language (JCL), esencial para ejecutar procesos en sistemas mainframe. Aprender JCL es fundamental para optimizar y automatizar tareas en sistemas IBM, y esta guía te muestra cómo hacerlo de manera práctica y efectiva.
Temas principales
- Estructura y comandos esenciales de JCL
- Creación y gestión de trabajos
- Optimización de recursos y manejo de errores
- Ejemplos prácticos de configuración de procesos
Con esta lectura, podrás mejorar la eficiencia de tus trabajos en mainframe, aumentando tu productividad en proyectos complejos.