lunes, 17 de enero de 2011

SORT vol.5: SUM.

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:

SUM

SUM FIELDS.
Suma los valores del campo especificado. Sólo pueden sumarse campos ZD(numéricos), PD(comprimidos) o BI(hexadecimales). El resultado de la suma se guarda en un registro:

//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=(I,L,T,O)
   SUM FIELDS=(I,L,T)
/*

I – Inicio. Posición donde empieza el campo.
L – Longitud máxima del campo.
T – Tipo de dato del campo que se quiere sumar:
    CH - Alfanumérico o numérico normal(sin COMP)
    ZD - Numérico normal(sin COMP)
    BI - Hexadecimal (campos COMP)
    PD - Empaquetado con o sin signo(campos COMP-3)
O – Orden. A-Ascendente, D- Descendente


Ejemplo:

Ordenar el siguiente fichero por código de empresa y acumular el saldo para cada una de ellas:

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

Fórmula:
SORT FIELDS=(1,9,CH,A)
 SUM FIELDS=(36,8,ZD)


Resultado:
----+----1----+----2----+----3----+----4----+
000000001EMPRESA LANAS MARUJA      00220000
000000002EMPRESA CAFETERIA NOVELTY 00310000
000000004EMPRESA ASESORIA ASOCIA   00260000

Lo que hace el SUM FIELDS es sacar un registro por cada campo distinto que haya en las posiciones indicadas en el SORT. En esos registros acumulará la cantidad que vaya en las posiciones indicadas por el SUM FIELDS.


Otra utilidad del SUM es la de eliminar duplicados.

Para eliminar registros que tengan un campo en concreto duplicado, indicaremos en la parte del SORT el campo que traerá los duplicados:
SORT FIELDS=(I,L,T,O)
 SUM FIELDS=NONE


Ejemplo:

Eliminar los registros con código de empresa duplicado del siguiente fichero:
----+----1----+----2----+----3----+----4----+
000000002EMPRESA CAFETERIA NOVELTY 00111111
000000001EMPRESA LANAS MARUJA      00222222
000000002EMPRESA CAFETERIA NOVELTY 00333333
000000004EMPRESA ASESORIA ASOCIA   00444444
000000002EMPRESA CAFETERIA NOVELTY 00555555
000000004EMPRESA ASESORIA ASOCIA   00666666

Fórmula:
SORT FIELDS=(1,9,CH,A)
SUM FIELDS=NONE


Resultado:
----+----1----+----2----+----3----+----4----+
000000001EMPRESA LANAS MARUJA      00222222
000000002EMPRESA CAFETERIA NOVELTY 00111111
000000004EMPRESA ASESORIA ASOCIA   00444444

En la salida mostrará el primer registro (por el orden indicado) de cada código de empresa.

En el SORT FIELDS podemos utilizar cualquiera de los campos del fichero. Por ejemplo, podríamos indicar que ordenase por nombre de la empresa:

----+----1----+----2----+----3----+----4----+
000000001EMPRESA CAFETERIA NOVELTY 00111111
000000003EMPRESA LANAS MARUJA      00222222
000000003EMPRESA CAFETERIA NOVELTY 00333333
000000004EMPRESA ASESORIA ASOCIA   00444444
000000004EMPRESA CAFETERIA NOVELTY 00555555
000000006EMPRESA ASESORIA ASOCIA   00666666

Fórmula:
SORT FIELDS=(10,26,CH,A)
SUM FIELDS=NONE


Resultado:
----+----1----+----2----+----3----+----4----+
000000004EMPRESA ASESORIA ASOCIA   00444444
000000001EMPRESA CAFETERIA NOVELTY 00111111
000000003EMPRESA LANAS MARUJA      00222222


El resultado es que se han eliminado los registros con nombre de empresa duplicado.

11 comentarios:

Isa dijo...

Muy bien explicado, gracias!

Riaza dijo...

Decir que este utilidad del sort se utiliza constantemente. Por ejemplo cuando vamos a cargar una tabla de db2 con un fichero SYSREC con varios miles de registros. Si se ha "colado" alguno duplicado, la load te fallará por duplicate key. Lo que hay que hacer es pasarle a ese fichero de entrada un sort con SUM FIELDS=NONE para eliminar ese duplicado y luego poder cargar la tabla correctamente. Gracias por la explicación.

Anónimo dijo...

Muy útil gracias!

Federico Lacoma dijo...

Buenas tardes.

¿Alguna forma de guardar en fichero los registros eliminados por ser duplicados?

Gracias.

Tallian dijo...

Hola Federico.
Puedes ver una forma de hacerlo en el artículo
"Sort vol.5.1: SUM. Averiguar registros duplicados"

http://www.consultoriocobol.com/2011/05/sort-vol51-sum-averiguar-registros.html

Saludos!

Natali Johana dijo...

Este comentario ha sido eliminado por el autor.

cobolera dijo...

Hola,

¿¿alguna forma de eliminar todos los registros duplicados??

Gracias

Tallian dijo...

Hola cobolera.
Si le indicas SORT FIELDS=COPY, te eliminará los registros duplicados.
Un saludo!

Unknown dijo...

Si es necesario resguardar los registros duplicados que se descartan hay otra forma de hacerlo.
Se debe agregar una DD
//SORTXSUM DD DSN=... y ahí quedan todos los registros duplicados

Tallian dijo...

Muchas gracias por la información!

Unknown dijo...

Buenos dias, el sum field de 3 campoS zd de 8 posiciones agrego una posicion mas . El arhivo de 51 posiciones pasó a ser de 54. Sabes por qué? gracias