miércoles, 9 de mayo de 2012

JCL Avanzado II. Operaciones aritméticas con OUTREC.

Este es un ejemplo de como podemos operar con la información de un fichero usando la opción OUTREC del programa SORT.

//SORT001 EXEC PGM=SORT
//SORTIN DD DSN=nombre.fichero.entrada1,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,Ti,O,D,TO=Tf,LENGTH=L)

I  – Inicio. Posición donde empieza el campo.
L  – Longitud máxima del campo.
Ti - Tipo de dato inicial:
     CH - Alfanumérico
     ZD - Numérico
     BI - Hexadecimal (campos COMP)
     PD - Empaquetado con o sin signo(campos COMP-3)
O  - Operador:
     ADD - Suma
     SUB - Resta
     MUL - Multiplicación
     DIV - División
D  – Dato de la operación
Tf - Tipo de dato final
L  - Longitud del campo convertido


La razón por la que incluimos el tipo de dato inicial y final es que, si no lo hacemos, perderemos el formato del campo.
En lugar de indicar SORT FIELDS=COPY podríamos indicar cualquier tipo de ordenación.


Ejemplo 1: Añadir uno al saldo del fichero de empresas.

----+----1----+----2----+----3----+----4----+
000000002EMPRESA CAFETERIA NOVELTY 00110000
000000001EMPRESA LANAS MARUJA      00220000
000000004EMPRESA ASESORIA ASOCIA   00100000

Fórmula:
SORT FIELDS=COPY
 OUTREC FIELDS=(1,35,36,8,ZD,ADD,+1,TO=ZD,LENGTH=8)


Resultado 1:

----+----1----+----2----+----3----+----4----+
000000002EMPRESA CAFETERIA NOVELTY 00110001
000000001EMPRESA LANAS MARUJA      00220001
000000004EMPRESA ASESORIA ASOCIA   00100001


Como podéis ver en el último campo todas las cantidades se ven incrementadas en 1.

Si quisiésemos cambiar el formato hay que tener en cuenta que la longitud del fichero de salida cambiaría.

Ejemplo 2:Añadir 5 al saldo del fichero de empresas y convertirlo a COMP-3.

----+----1----+----2----+----3----+----4----+
000000002EMPRESA CAFETERIA NOVELTY 00110000
000000001EMPRESA LANAS MARUJA      00220000
000000004EMPRESA ASESORIA ASOCIA   00100000

Fórmula:
SORT FIELDS=COPY
 OUTREC FIELDS=(1,35,36,8,ZD,ADD,+5,TO=PD,LENGTH=5)


Resultado 2:

----+----1----+----2----+----3----+----4----+
000000002EMPRESA CAFETERIA NOVELTY
FFFFFFFFFCDDDCEC4CCCCECDCC4DDECDEE40010544444
000000002547952103165359910565533800100C00000
---------------------------------------------
000000001EMPRESA LANAS MARUJA
FFFFFFFFFCDDDCEC4DCDCE4DCDEDC4444440020544444
000000001547952103151204194110000000200C00000
---------------------------------------------
000000004EMPRESA ASESORIA ASOCIA
FFFFFFFFFCDDDCEC4CECEDDCC4CEDCCC4440000544444
000000004547952101252699101263910000100C00000


La operación se aplica al campo inmediatamente anterior indicado en el OUTREC. En ambos ejemplos veis que por un lado hemos indicado que queremos sacar en salida la información de la posición 1 ocupando 35, y después de la 36 ocupando 8, para la cual se aplica la operación "sumar 1".

Podéis probar con todas las operaciones : )

Aportes de los lectores:
Se pueden sumar dos campos del mismo archivo asi:
OUTREC FIELDS=((01,10,ZD),ADD,(11,10,ZD),TO=ZD,LENGTH=10)

Convertir un campo 9(3)v9(6) comp-3 a un 99v999 comp-3:
OUTREC FIELDS=(57,5,PD,DIV,+1000,TO=PD,LENGTH=3) 

10 comentarios:

ADILSON dijo...
Este comentario ha sido eliminado por el autor.
ADILSON dijo...
Este comentario ha sido eliminado por el autor.
ADILSON dijo...

Hola; puedo reemplazar la 'D'(D – Dato de la operación), por posiciones del mismo fichero:
ejemplo:

----+----1----+----2----+----3----+----4----+
000000002EMPRESA CAFETERIA NOVELTY 00110000
000000001EMPRESA LANAS MARUJA 00220000
000000004EMPRESA ASESORIA ASOCIA 00100000

SORT FIELDS=COPY
OUTREC FIELDS=(1,35,36,8,ZD,ADD,+(9,1),TO=ZD,LENGTH=8)

... se puede hacer esto, o hay otra forma de hacer este caso en particular

Anónimo dijo...

Una consulta que me esta rompiendo el coco es...
como hago para editar un campo numérico con signo ejemplo WSV-A PIC S9(12) a un campo numerico sin signo ejemplo WSV-B PIC 9(12).

Anónimo dijo...

SE PUEDE CONVERTIR UN CH EN ZD O PD CON DECIMALES??

Anónimo dijo...

¿Cómo puedo convertir un ZD de 9 (Ej. 000000365) en CH de 3 (Ej. 365)? El dato inicial solo tiene lleno los 3 últimos dígitos

Eduardo Zampedri dijo...

Buenas.
¿Cómo puedo realizar lo siguiente?
Sumar dos valores, uno existente en el archivo 'A' y otro en el 'B' cuando el apareo que haya realizado me de que las claves son iguales.

Gonzalo García Yangüela ن dijo...

Gracias, me ha sido muy útil para convertir un campo 9(3)v9(6) comp-3 a un 99v999 comp-3:

OUTREC FIELDS=(57,5,PD,DIV,+1000,TO=PD,LENGTH=3)

Jairo Robles dijo...

Se pueden sumar dos campos del mismo archivo asi:
OUTREC FIELDS=((01,10,ZD),ADD,(11,10,ZD),TO=ZD,LENGTH=10)

Tallian dijo...

Gracias por la aportación chicos! Lo añadimos.