SORT vol.2: OUTREC.
La estructura general de un SORT es la siguiente:
//SORT001 EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//SORTIN DD DSN=nombre.fichero.entrada1,DISP=SHR
// DD DSN=nombre.fichero.entrada2(opcional),DISP=SHR
//SORTOUT DD DSN=nombre.fichero.salida1,
// DISP=(,CATLG,DELETE),SPACE=CYL,500,100))
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
…
…
PGM=SORT --> Indica el programa a utilizar, en es
te caso el SORT.
PARM=('DYNALLOC=(SYSALLDA,32)') --> Cantidad de memoria que se da a la ejecución del paso. Si se queda corto, aumentarla en valores de 8,12,32,64,128, 256 (como las memorias RAM)
SORTIN --> Ficheros de entrada
SORTOUT --> Ficheros de salida
SYSIN --> Indica el tipo de sort a realizar, las opciones disponibles son muchas y muy variadas, pudiendo utilizarse varias juntas en un mismo paso. Algunas de ellas son SORT, SUM, OMIT, INCLUDE, INREC, OUTREC, OUTFIL, OPTION … .
En este documento se explica en detalle algunas de estas funciones:
OUTREC
OUTREC FIELDS. --> Toma los registros del fichero de entrada y los guarda formateados en el fichero de salida:
//SORT001 EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//SORTIN DD DSN=nombre.fichero.entrada1,DISP=SHR
// DD DSN=nombre.fichero.entrada2,DISP=SHR
//SORTOUT DD DSN=nombre.fichero.salida1,
// DISP=(,CATLG,DELETE),SPACE=CYL,500,100))
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=COPY
OUTREC FIELDS=(I,L,D(opcional))
I – Inicio. Posición donde empieza el campo.
L – Longitud máxima del campo.
D – Dato a incluir (opcional).
¡OJO! En este ejemplo hemos utilizado el SORT FIELDS=COPY, para indicar que no queremos ordenar el fichero, sino sólo copiarlo, pero podría indicarse cualquier tipo de ordenación. Podéis ver el uso del SORT en el artículo Sort vol.1: SORT, INCLUDE.
Hay diferentes formas de utilizar el OUTREC, voy a intentar señalar unas cuantas:
OUTREC – FORMATEO DE FICHEROS
Situación 1. Tenemos un fichero de entrada con los siguientes datos: Número de cliente, Nombre, Apellido1, Apellido2 y Situación Laboral(AUTONOMO ó ASALARIADO).
Supongamos que queremos obtener un fichero que contenga sólo el Nombre seguido de una coma, y a continuación la Situación Laboral:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000006ANTONIO VILLA SUSO AUTONOMO
000000005YOLANDA LOPEZ ALONSO AUTONOMO
000000001JOSE LOPEZ PITA AUTONOMO
000000004CARLOS POLO DEL BARROAUTONOMO
000000003CARLOS PEREZ FANO AUTONOMO
La fórmula sería:
OUTREC FIELDS=(10,10,C’,’,39,10)
La salida quedará del siguiente modo:
----+----1----+----2-
JAVIER ,ASALARIADO
ANTONIO ,AUTONOMO
YOLANDA ,AUTONOMO
JOSE ,AUTONOMO
CARLOS ,AUTONOMO
CARLOS ,AUTONOMO
Situación 2. Sobre el fichero inicial supongamos que queremos poner primero los Apellidos y luego el Nombre.
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000006ANTONIO VILLA SUSO AUTONOMO
000000005YOLANDA LOPEZ ALONSO AUTONOMO
000000001JOSE LOPEZ PITA AUTONOMO
000000004CARLOS POLO DEL BARROAUTONOMO
000000003CARLOS PEREZ FANO AUTONOMO
La fórmula sería:
OUTREC FIELDS=(1,9,20,19,10,10,39,34)
La salida quedará del siguiente modo:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002MARTINEZ CARRETEROJAVIER ASALARIADO
000000006VILLA SUSO ANTONIO AUTONOMO
000000005LOPEZ ALONSO YOLANDA AUTONOMO
000000001LOPEZ PITA JOSE AUTONOMO
000000004POLO DEL BARROCARLOS AUTONOMO
000000003PEREZ FANO CARLOS AUTONOMO
Situación 3. Supongamos que entre el número de cliente y el nombre queramos meter 10 espacios en blanco:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000006ANTONIO VILLA SUSO AUTONOMO
000000005YOLANDA LOPEZ ALONSO AUTONOMO
000000001JOSE LOPEZ PITA AUTONOMO
000000004CARLOS POLO DEL BARROAUTONOMO
000000003CARLOS PEREZ FANO AUTONOMO
La fórmula sería:
OUTREC FIELDS=(1,9,C' ',10,53)
Otra opción:
OUTREC FIELDS=(1,9,10X,10,53)
Y otra:
OUTREC FIELDS=(1,9,10C' ',10,53)
La salida quedará del siguiente modo:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002 JAVIER MARTINEZ CARRETEROASALARIADO
000000006 ANTONIO VILLA SUSO AUTONOMO
000000005 YOLANDA LOPEZ ALONSO AUTONOMO
000000001 JOSE LOPEZ PITA AUTONOMO
000000004 CARLOS POLO DEL BARROAUTONOMO
000000003 CARLOS PEREZ FANO AUTONOMO
OUTREC – CONVERSIÓN DE DATOS
El outrec nos permite cambiar el formato de los campos. Se realiza del siguiente modo:
OUTREC FIELDS=(inicio_campo1,
fin_campo1,
tipo_dato_inicial,
TO=tipo_dato_de_destino,
LENGTH=longitud_final_del_campo_convertido,
…)
Los tipos de formato son los siguientes:
CH --> Alfanumérico
ZD --> Numérico normal
BI --> Hexadecimal (campos COMP)
PD --> Empaquetado con o sin signo(campos COMP-3)
Para saber la longitud del LENGTH, se debe seguir la norma siguiente:
- Campos COMP --> Dividimos la longitud entre 2 y nos quedamos con la parte entera:
S9(9) COMP --> LENGTH=4
9(9) COMP --> LENGTH=4
S9(8) COMP --> LENGTH=4
9(8) COMP --> LENGTH=4
- Campos COMP-3 --> Dividimos la longitud + 1 entre 2, si el resultado da decimales se redondea al mayor:
S9(9) COMP-3 --> LENGTH=5
9(9) COMP-3 --> LENGTH=5
S9(8) COMP-3 --> LENGTH=5
9(8) COMP-3 --> LENGTH=5
- Si el campo tiene decimales, ya sea COMP o COMP-3, se suman primero los enteros + los decimales, y a partir de ahí se aplica la fórmula anterior:
S9(9)V99 COMP --> LENGTH=5
9(9)V99 COMP --> LENGTH=5
S9(9)V99 COMP-3 --> LENGTH=6
9(9)V99 COMP-3 --> LENGTH=6
Ejemplos prácticos suponiendo que el campo comience en la primera posición:
- Convertir 9(8) a S9(9) COMP-3 y viceversa:
OUTREC FIELDS=(1,8,ZD,TO=PD,LENGTH=5)
OUTREC FIELDS=(1,5,PD,TO=ZD,LENGTH=8)
- Convertir 9(8) COMP a 9(8) y viceversa:
OUTREC FIELDS=(1,4,BI,TO=ZD,LENGTH=8)
OUTREC FIELDS=(1,8,ZD,TO=BI,LENGTH=4)
Cosas a tener en cuenta:
- La longitud del fichero de salida puede no ser la misma de entrada, porque si convertimos tipos de datos, por ejemplo, un numérico normal a un empaquetado la longitud se reduce al comprimir el campo.
- Se pueden realizar varias conversiones dentro de un mismo OUTREC.
- No se puede convertir un campo alfanumérico(que tenga letras) a un campo numérico.
OUTREC CHANGE – Cambiar datos
Una utilidad curiosa del outrec es la de sustituir datos del fichero por otros.
Por ejemplo, en el ejemplo anterior hemos incluido un campo con 10 espacios, imaginemos que nos hemos confundido, y lo que queríamos hacer era crear un campo con 10 ceros en vez de espacios. El outrec sería del siguiente modo:
Fichero de entrada:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002 JAVIER MARTINEZ CARRETEROASALARIADO
000000006 ANTONIO VILLA SUSO AUTONOMO
000000005 YOLANDA LOPEZ ALONSO AUTONOMO
000000001 JOSE LOPEZ PITA AUTONOMO
000000004 CARLOS POLO DEL BARROAUTONOMO
000000003 CARLOS PEREZ FANO AUTONOMO
OUTREC FIELDS=(1,9,10,10,CHANGE=(10,C' ',
C’0000000000’),NOMATCH=(10,10))
Otra forma:
OUTREC FIELDS=(1,9,10,10,CHANGE=(10,X'40404040404040404040',
X'00000000000000000000'),NOMATCH=(10,10))
Fichero de salida:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
0000000020000000000JAVIER MARTINEZ CARRETEROASALARIADO
0000000060000000000ANTONIO VILLA SUSO AUTONOMO
0000000050000000000YOLANDA LOPEZ ALONSO AUTONOMO
0000000010000000000JOSE LOPEZ PITA AUTONOMO
0000000040000000000CARLOS POLO DEL BARROAUTONOMO
0000000030000000000CARLOS PEREZ FANO AUTONOMO
OUTREC – Máscaras de edición
Las máscaras de edición son una utilidad muy potente del outrec que nos permite manipular el formado de cualquier campo del fichero. Dado que es bastante amplio, reservamos esta parte para otro artículo exclusivo para ello.
//SORT001 EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//SORTIN DD DSN=nombre.fichero.entrada1,DISP=SHR
// DD DSN=nombre.fichero.entrada2(opcional),DISP=SHR
//SORTOUT DD DSN=nombre.fichero.salida1,
// DISP=(,CATLG,DELETE),SPACE=CYL,500,100))
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
…
…
PGM=SORT --> Indica el programa a utilizar, en es
te caso el SORT.
PARM=('DYNALLOC=(SYSALLDA,32)') --> Cantidad de memoria que se da a la ejecución del paso. Si se queda corto, aumentarla en valores de 8,12,32,64,128, 256 (como las memorias RAM)
SORTIN --> Ficheros de entrada
SORTOUT --> Ficheros de salida
SYSIN --> Indica el tipo de sort a realizar, las opciones disponibles son muchas y muy variadas, pudiendo utilizarse varias juntas en un mismo paso. Algunas de ellas son SORT, SUM, OMIT, INCLUDE, INREC, OUTREC, OUTFIL, OPTION … .
En este documento se explica en detalle algunas de estas funciones:
OUTREC
OUTREC FIELDS. --> Toma los registros del fichero de entrada y los guarda formateados en el fichero de salida:
//SORT001 EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//SORTIN DD DSN=nombre.fichero.entrada1,DISP=SHR
// DD DSN=nombre.fichero.entrada2,DISP=SHR
//SORTOUT DD DSN=nombre.fichero.salida1,
// DISP=(,CATLG,DELETE),SPACE=CYL,500,100))
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=COPY
OUTREC FIELDS=(I,L,D(opcional))
I – Inicio. Posición donde empieza el campo.
L – Longitud máxima del campo.
D – Dato a incluir (opcional).
¡OJO! En este ejemplo hemos utilizado el SORT FIELDS=COPY, para indicar que no queremos ordenar el fichero, sino sólo copiarlo, pero podría indicarse cualquier tipo de ordenación. Podéis ver el uso del SORT en el artículo Sort vol.1: SORT, INCLUDE.
Hay diferentes formas de utilizar el OUTREC, voy a intentar señalar unas cuantas:
OUTREC – FORMATEO DE FICHEROS
Situación 1. Tenemos un fichero de entrada con los siguientes datos: Número de cliente, Nombre, Apellido1, Apellido2 y Situación Laboral(AUTONOMO ó ASALARIADO).
Supongamos que queremos obtener un fichero que contenga sólo el Nombre seguido de una coma, y a continuación la Situación Laboral:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000006ANTONIO VILLA SUSO AUTONOMO
000000005YOLANDA LOPEZ ALONSO AUTONOMO
000000001JOSE LOPEZ PITA AUTONOMO
000000004CARLOS POLO DEL BARROAUTONOMO
000000003CARLOS PEREZ FANO AUTONOMO
La fórmula sería:
OUTREC FIELDS=(10,10,C’,’,39,10)
La salida quedará del siguiente modo:
----+----1----+----2-
JAVIER ,ASALARIADO
ANTONIO ,AUTONOMO
YOLANDA ,AUTONOMO
JOSE ,AUTONOMO
CARLOS ,AUTONOMO
CARLOS ,AUTONOMO
Situación 2. Sobre el fichero inicial supongamos que queremos poner primero los Apellidos y luego el Nombre.
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000006ANTONIO VILLA SUSO AUTONOMO
000000005YOLANDA LOPEZ ALONSO AUTONOMO
000000001JOSE LOPEZ PITA AUTONOMO
000000004CARLOS POLO DEL BARROAUTONOMO
000000003CARLOS PEREZ FANO AUTONOMO
La fórmula sería:
OUTREC FIELDS=(1,9,20,19,10,10,39,34)
La salida quedará del siguiente modo:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002MARTINEZ CARRETEROJAVIER ASALARIADO
000000006VILLA SUSO ANTONIO AUTONOMO
000000005LOPEZ ALONSO YOLANDA AUTONOMO
000000001LOPEZ PITA JOSE AUTONOMO
000000004POLO DEL BARROCARLOS AUTONOMO
000000003PEREZ FANO CARLOS AUTONOMO
Situación 3. Supongamos que entre el número de cliente y el nombre queramos meter 10 espacios en blanco:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000006ANTONIO VILLA SUSO AUTONOMO
000000005YOLANDA LOPEZ ALONSO AUTONOMO
000000001JOSE LOPEZ PITA AUTONOMO
000000004CARLOS POLO DEL BARROAUTONOMO
000000003CARLOS PEREZ FANO AUTONOMO
La fórmula sería:
OUTREC FIELDS=(1,9,C' ',10,53)
Otra opción:
OUTREC FIELDS=(1,9,10X,10,53)
Y otra:
OUTREC FIELDS=(1,9,10C' ',10,53)
La salida quedará del siguiente modo:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002 JAVIER MARTINEZ CARRETEROASALARIADO
000000006 ANTONIO VILLA SUSO AUTONOMO
000000005 YOLANDA LOPEZ ALONSO AUTONOMO
000000001 JOSE LOPEZ PITA AUTONOMO
000000004 CARLOS POLO DEL BARROAUTONOMO
000000003 CARLOS PEREZ FANO AUTONOMO
OUTREC – CONVERSIÓN DE DATOS
El outrec nos permite cambiar el formato de los campos. Se realiza del siguiente modo:
OUTREC FIELDS=(inicio_campo1,
fin_campo1,
tipo_dato_inicial,
TO=tipo_dato_de_destino,
LENGTH=longitud_final_del_campo_convertido,
…)
Los tipos de formato son los siguientes:
CH --> Alfanumérico
ZD --> Numérico normal
BI --> Hexadecimal (campos COMP)
PD --> Empaquetado con o sin signo(campos COMP-3)
Para saber la longitud del LENGTH, se debe seguir la norma siguiente:
- Campos COMP --> Dividimos la longitud entre 2 y nos quedamos con la parte entera:
S9(9) COMP --> LENGTH=4
9(9) COMP --> LENGTH=4
S9(8) COMP --> LENGTH=4
9(8) COMP --> LENGTH=4
- Campos COMP-3 --> Dividimos la longitud + 1 entre 2, si el resultado da decimales se redondea al mayor:
S9(9) COMP-3 --> LENGTH=5
9(9) COMP-3 --> LENGTH=5
S9(8) COMP-3 --> LENGTH=5
9(8) COMP-3 --> LENGTH=5
- Si el campo tiene decimales, ya sea COMP o COMP-3, se suman primero los enteros + los decimales, y a partir de ahí se aplica la fórmula anterior:
S9(9)V99 COMP --> LENGTH=5
9(9)V99 COMP --> LENGTH=5
S9(9)V99 COMP-3 --> LENGTH=6
9(9)V99 COMP-3 --> LENGTH=6
Ejemplos prácticos suponiendo que el campo comience en la primera posición:
- Convertir 9(8) a S9(9) COMP-3 y viceversa:
OUTREC FIELDS=(1,8,ZD,TO=PD,LENGTH=5)
OUTREC FIELDS=(1,5,PD,TO=ZD,LENGTH=8)
- Convertir 9(8) COMP a 9(8) y viceversa:
OUTREC FIELDS=(1,4,BI,TO=ZD,LENGTH=8)
OUTREC FIELDS=(1,8,ZD,TO=BI,LENGTH=4)
Cosas a tener en cuenta:
- La longitud del fichero de salida puede no ser la misma de entrada, porque si convertimos tipos de datos, por ejemplo, un numérico normal a un empaquetado la longitud se reduce al comprimir el campo.
- Se pueden realizar varias conversiones dentro de un mismo OUTREC.
- No se puede convertir un campo alfanumérico(que tenga letras) a un campo numérico.
OUTREC CHANGE – Cambiar datos
Una utilidad curiosa del outrec es la de sustituir datos del fichero por otros.
Por ejemplo, en el ejemplo anterior hemos incluido un campo con 10 espacios, imaginemos que nos hemos confundido, y lo que queríamos hacer era crear un campo con 10 ceros en vez de espacios. El outrec sería del siguiente modo:
Fichero de entrada:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002 JAVIER MARTINEZ CARRETEROASALARIADO
000000006 ANTONIO VILLA SUSO AUTONOMO
000000005 YOLANDA LOPEZ ALONSO AUTONOMO
000000001 JOSE LOPEZ PITA AUTONOMO
000000004 CARLOS POLO DEL BARROAUTONOMO
000000003 CARLOS PEREZ FANO AUTONOMO
OUTREC FIELDS=(1,9,10,10,CHANGE=(10,C' ',
C’0000000000’),NOMATCH=(10,10))
Otra forma:
OUTREC FIELDS=(1,9,10,10,CHANGE=(10,X'40404040404040404040',
X'00000000000000000000'),NOMATCH=(10,10))
Fichero de salida:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
0000000020000000000JAVIER MARTINEZ CARRETEROASALARIADO
0000000060000000000ANTONIO VILLA SUSO AUTONOMO
0000000050000000000YOLANDA LOPEZ ALONSO AUTONOMO
0000000010000000000JOSE LOPEZ PITA AUTONOMO
0000000040000000000CARLOS POLO DEL BARROAUTONOMO
0000000030000000000CARLOS PEREZ FANO AUTONOMO
OUTREC – Máscaras de edición
Las máscaras de edición son una utilidad muy potente del outrec que nos permite manipular el formado de cualquier campo del fichero. Dado que es bastante amplio, reservamos esta parte para otro artículo exclusivo para ello.
Gracias por la aportación, me sirvió mucho!!
ResponderBorrarSaludos
excelente pagina
ResponderBorrar