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.

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

  1. SORTIN: Especifica el archivo de entrada USER.FICHERO.TODOS.
  2. 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 y USER.FICHERO.PROFESORES.
  3. 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 y FILES=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.