viernes, 7 de enero de 2011

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 este 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,
               longitud_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.

Otras opciones del OUTREC:
Ver Sort vol.2.1.: OUTREC. IFTHEN

33 comentarios:

Anónimo dijo...

Muy bien explicado
Felicidades

pepegan dijo...

Agradecemos tu comentario. Nuestro objetivo es ayudar a la comunidad .. compartiendo nuestro conocimiento.

Anónimo dijo...

Mil gracias!!! Me acabas de sacar de un apuro!!!
Silvia

mauricio dijo...

De verdad muy util, apenas estoy haciendo mis pinitos con los jobs y esto me viene muy bien, gracias por el interes en ayudar, sigan asi, se aprecia mucho :)

Anónimo dijo...

Excelente, me sirvio muchisimo

Anónimo dijo...

En primer lugar quiero dar mi enhorabuena al autor de este articulo ya que es realmente muy util y que esta explicado estupendamente.

En segundo lugar me gustaría dejar una pregunta, a ver si alguien puede resolvermela.

Muchas gracias de antemano y un saludo.

Necesitaba crear un fichero de salida que cumpla lo siguiente:

1) El fichero de salida ha de tener el mismo número de registros y el mismo tamaño que el fichero de entrada.

2) Si en la posicion (1,2) del registro de entrada (donde 1 es la posicion inicial y 2 el tamaño del campo) tiene un '88', entonces en la posicion (6,2) del registro de salida debe ponerse un '99', como se muestra en el siguiente miniejemplo:

Entrada --> Salida
-------------------------
8834567890 --> 1234599890
1234567890 --> 1234567890


Es decir lo que necesitaba es emplear lo siguiente, pero sobre cada registro, ya que creo que esto me devolveria unicamente la primera fila del ejemplo anterior.

INCLUDE COND=(1,2,CH,EQ,C'88')
OUTREC FIELDS=(6,2,C’99’)

Anónimo dijo...

soy el que dejó el comentario anterior, alguien me puede confirmar si esto me sirve?


//SYSIN DD *
SORT FIELDS=COPY
OUTREC IFTHEN=(WHEN=(1,2,CH,EQ,C'88'),
OVERLAY=(6,2,C'99'))

Tallian dijo...

Hola Anónimo (a ver si dejamos un nombre para distinguir a tanto anónimo...),
no hay nada mejor que probar para salir de dudas, y en este caso el OVERLAY no es correcto. Tendrías que poner (usando tu ejemplo):

OVERLAY=(1,5,C'99',8,3))

Porque en el overlay le indicas lo que escribirá en cada una de las posiciones del fichero, es decir, le estoy diciendo que de la posición 1 y ocupando 5 me coja lo que había en la entrada, luego que escriba el '99', y luego que escriba de la posición 8 y ocupando 3 lo mismo que en la entrada.
Espero que te sirva!

Talli.

Raul dijo...

Muchas gracias por la información, muy clara y por sobretodo muy util!

Tallian dijo...

Gracias Raul : )

Anónimo dijo...

Por fin un manual de jcls bien explicado!Gracias!!!

Anónimo dijo...

Buenas, en primer lugar, enhorabuena por la página, es muy útil y no es fácil encontrar conocimientos tan valiosos de este tema.
Mi duda es: se puede convertir de BI a CH con OUTREC? si es así, yo no lo he conseguido.
Os dejo el código y el error:

OUTREC FIELDS=(21,5,BI,TO=CH,LENGTH=9)
......................................$
OPERAND DEFINER ERROR

Por si no sale bien, el $ está bajo el CH.
Gracias y un saludo.

hlozano dijo...

respecto a OUTREC FIELDS, PREGUNTO, QUE PASA CON LA LONGITUD DEL REGISTRO, SI NECESITO CAMBIAR UN CAMPO EMPACADO COMP. O COMP-3. Y ADEMAS, DESEO INSERTAR UN PIPE ENTRE LOS CAMPOS.
SON DOS ACCIONES O LO PUEDO RESOLVER EN UNA MISMA ACCION...?

Tallian dijo...

Para pasar de BI a CH, suponiendo que mi campo COMP está en la posición 1 y es un S9(4) COMP (mide 2 posiciones):
OUTREC FIELDS=(1,2,BI,EDIT=(TTTT),resto de posiciones)
Con esto pasaría a 4 posiciones.

Un saludo.

Jose Romero Vizcaya dijo...

Tengo un pequeño problema para regresar un campo numerico negativo a binario, les cuento:

De inicio realice una conversion de un campo binario negativo a editado signado de la siguiente manera:
OUTREC FIELDS=(01,04,FI,EDIT=(SIIIIIIIIT),
SIGNS=(,-))

Resultado: ' -12455'

Ahora que quiero regresar la información a Binario, solo me respeta el valor en numeros positivos. Para los numeros negativos no me respeta ni el valor, ni el signo.

Lo intente hacer de la siguiente manera:
OUTREC FIELDS=(01,10,ZD,TO=FI,LENGTH=04)

Si alguien me puede apoyar con algunas ideas, estaria muy agradecido. Saludos a toda la comunidad.

Jose Romero Vizcaya dijo...

Este comentario ha sido eliminado por el autor.

Jose Romero Vizcaya dijo...

Ya encontre la solución, por si algun dia quieren regresar un numerico negativo a Binario:

OUTREC FIELDS=(01,10,FS,TO=FI,LENGTH=04)

sebastian gutierrez dijo...

PROBLEMA CON ESTA SINTAX:
SORT FIELDS=(1,6,ZD,A)
OUTREC FIELDS=(1,6,ZD,TO=PD,LENGTH=4)
OUTREC FIELDS=(1,4,7,10,17,8)
RESULTADO:
........................
...%....................
........................
........................
NO COMPRENDO PORQUE ME MUESTAR EL CAMPO COMP-3 MAS DOS MAS DE ESA FORMA.

DEIBBIE DIDIER CRUZ ROJAS dijo...

Tengo el link de ésta web en favoritos en la oficina , es genial !! me ha salvado la vida muchas veces :D Gracias

Tallian dijo...

Gracias a ti Deibbie! Nos alegramos de que os sea útil : )

Betoven dijo...

Hola amigos:
¿Como puedo copiar una cantidad de registros limitada de una archivo a otro, con un sort?...gracias por la respuesta. Alberto

Tallian dijo...

Hola Betoven.
Para seleccionar un número de registros puedes utilizar el SKIPREC/STOPAFT:
http://www.consultoriocobol.com/2011/01/sort-vol4-skiprec-stopaft.html

dralbor68 dijo...

Hola, como transformo un ZD a un PD unsigned ? Si es positivo me queda una C al final, si es negativo una D, pero necesito una F de unsigned. Gracias y saludos. Daniel.

Tatiana Pereira dijo...

Super util

Unknown dijo...

Este comentario ha sido eliminado por el autor.

Noe RJ dijo...

Hola que tal buen día quisiera pasar un dato PD a un ZD sin que este me deje el campo con ceros antes del numero solo quisiera recuperar unicamente el numero agradeceria mucho su ayuda.

David Mendoza Perez dijo...

Como puedo hacer la condición de un campo empacado donde le de la instrucción de que sea mayor a cero? Es un importe saludos!

Tallian dijo...

Hola David.
Te recomiendo que leas el artículo:
http://www.consultoriocobol.com/2010/12/sort-vol1-sort-include.html
Donde se explican todas las condiciones.
Saludos!

esther M G dijo...

Hola. Querría concatenar varios registros de un fichero en un único registro. ¿Es posible con un OUTREC? Es decir:
Entrada:
Reg 1 aaaa
Reg 2 bbb
Reg 3 ccccccc
Salida
Reg aaaabbbccccccc

Muchas gracias por vuestra ayuda.

Tallian dijo...

Hola Esther.
Tenemos un ejemplo de como hacerlo con easy-trieve. Con outrec lo desconozco.
http://www.consultoriocobol.com/2015/04/union-de-ficheros-lo-ancho-con.html

Eder Payo dijo...

Hola, tengo una duda, estoy intentando cambiar registros dentro de un fichero, por ejemplo unas fechas de 25.07.2018 a 31.12.9999 o 13.02.1995 a 31.12.9999

para ello estoy poniendo:
OUTREC FIELDS=(1,10,CHANGE=(10,C'',C'31.12.9999'))

Mi problema es que no se que fecha de entrada me va a venir, cada registro tendrá una diferente, por lo que no puedo especificarle que datos me debe cambiar por el 31.12.9999

como se podría realizar esta operación?

un saludo y siento las molestias.

Tallian dijo...

Hola Eder! Si la fecha está en unas posiciones fijas (por ejemplo 1, 10) y se trata de cambiar todas, solo tienes que poner:
OUTREC FIELDS=('31.12.9999',11,posicionfinal)
Es decir, no hace falta usar el change :-)

Eder Payo dijo...

Okey, muchas gracias.