SORT vol.1: SORT,
INCLUDE.
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,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:
SORT
SORT FIELDS --> Ordena los registros a partir del fichero de entrada y los guarda ordenados en el fichero de salida:
xºxº
I – Inicio. Posición donde empieza el campo por el que se quiere ordenar
L – Longitud máxima del campo por el que se quiere ordenar
T – Tipo de dato del campo que se quiere ordenar:
CH --> Alfanumérico o 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 Número y Nombre de cliente en orden ascendente:
//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 *
…
…
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:
SORT
SORT FIELDS --> Ordena los registros a partir del fichero de entrada y los guarda ordenados en el fichero de salida:
xºxº
I – Inicio. Posición donde empieza el campo por el que se quiere ordenar
L – Longitud máxima del campo por el que se quiere ordenar
T – Tipo de dato del campo que se quiere ordenar:
CH --> Alfanumérico o 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 Número y Nombre de cliente en orden ascendente:
----+----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
Fórmula:
SORT FIELDS=(1,9,CH,A,10,10,CH,A)
Resultado:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000001JOSE LOPEZ PITA AUTONOMO
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000003CARLOS PEREZ FANO AUTONOMO
000000004CARLOS POLO DEL BARROAUTONOMO
000000005YOLANDA LOPEZ ALONSO AUTONOMO
000000006ANTONIO VILLA SUSO AUTONOMO
Otra opción que tiene el SORT es la siguiente:
SORT FIELDS=COPY
Con ella no indicamos ningún tipo de orden, por lo cual, el fichero de entrada se grabará en salida con el mismo orden.
INCLUDE
Filtra los registros deseados por la condición que se indique:
//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
INCLUDE COND=(I,L,T,C,V)
I – Inicio. Posición donde empieza el campo por el que se quiere filtrar
L – Longitud máxima del campo por el que se quiere filtrar
T – Tipo de dato del campo que se quiere filtrar:
CH - Carácter o numérico normal(sin COMP)
BI - Hexadecimal (campos COMP)
C – Condición de la igualdad que se quiere realizar:
EQ – Igual
NE - Distinto
GE – Mayor o igual
GT - Mayor
LE – Menor o igual
LT - Menor
V – Valor del dato por el que se quiere filtrar
X’001A‘ – Indica un valor hexadecimal o empaquetado
C’AL12’ – Indica un valor alfanumérico
Ejemplos:
Ejemplo 1. Vamos a realizar un paso de SORT que realice un filtrado del fichero indicado, para quedarse con los clientes que cumplan lo siguiente: Sean AUTONOMOS y su número de teléfono sea un móvil (comience por 6):
Copy:
01 ENTRADA1.
05 ENTRADA1-NUMCLI PIC 9(9).
05 ENTRADA1-NOMBRE PIC X(10).
05 ENTRADA1-APELLID1 PIC X(10).
05 ENTRADA1-APELLID2 PIC X(10).
05 ENTRADA1-TIPO PIC X(11).
05 ENTRADA1-CATEGORIA PIC 9(9) COMP-3.
05 ENTRADA1-TLFNO PIC 9(9).
05 FILLER PIC X(9) VALUE SPACES.
Fichero entrada:
=COLS>
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002JAVIER MARTINEZ CARRETEROASALARIADO 983275586
FFFFFFFFFDCECCD4444DCDECDCE44CCDDCECDDCECDCDCCCD400001FFFFFFFFF444444444
00000000211595900004193955900319953596121319914600000C983275586000000000
------------------------------------------------------------------------
000000006ANTONIO VILLA SUSO AUTONOMO 918514535
FFFFFFFFFCDEDDCD444ECDDC44444EEED44444CEEDDDDD44400003FFFFFFFFF444444444
00000000615365960005933100000242600000143656460000000C918514535000000000
------------------------------------------------------------------------
000000005YOLANDA LOPEZ ALONSO AUTONOMO 988453548
FFFFFFFFFEDDCDCC444DDDCE44444CDDDED444CEEDDDDD44400001FFFFFFFFF444444444
00000000586315410003675900000136526000143656460000000C988453548000000000
------------------------------------------------------------------------
000000001JOSE LOPEZ PITA AUTONOMO 676757687
FFFFFFFFFDDEC444444DDDCE44444DCEC44444CEEDDDDD44400001FFFFFFFFF444444444
00000000116250000003675900000793100000143656460000000C676757687000000000
------------------------------------------------------------------------
000000004CARLOS POLO DEL BARROAUTONOMO 666415887
FFFFFFFFFCCDDDE4444DDDD444444CCD4CCDDDCEEDDDDD44400003FFFFFFFFF444444444
00000000431936200007636000000453021996143656460000000C666415887000000000
------------------------------------------------------------------------
000000003CARLOS PEREZ FANO AUTONOMO 986115484
FFFFFFFFFCCDDDE4444DCDCE44444CCDD44444CEEDDDDD44400001FFFFFFFFF444444444
00000000331936200007595900000615600000143656460000000C986115484000000000
------------------------------------------------------------------------
Fórmula:
INCLUDE COND=(39,8,CH,EQ,C'AUTONOMO',AND,55,1,CH,EQ,C'6')
Fichero salida:
=COLS> ----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000001JOSE LOPEZ PITA AUTONOMO 676757687
FFFFFFFFFDDEC444444DDDCE44444DCEC44444CEEDDDDD44400001FFFFFFFFF444444444
00000000116250000003675900000793100000143656460000000C676757687000000000
-------------------------------------------------------------------------
000000004CARLOS POLO DEL BARROAUTONOMO 666415887
FFFFFFFFFCCDDDE4444DDDD444444CCD4CCDDDCEEDDDDD44400003FFFFFFFFF444444444
00000000431936200007636000000453021996143656460000000C666415887000000000
-------------------------------------------------------------------------
Ejemplo 2. Vamos a realizar un paso de SORT similar al anterior, que realice un filtrado del fichero indicado, para quedarse con los clientes que cumplan lo siguiente: Sean AUTONOMOS y su número de teléfono sea un móvil (comience por 6). Pero en este caso el número de teléfono vendrá empaquetado(COMP-3):
Copy:
01 ENTRADA1.
05 ENTRADA1-NUMCLI PIC 9(9).
05 ENTRADA1-NOMBRE PIC X(10).
05 ENTRADA1-APELLID1 PIC X(10).
05 ENTRADA1-APELLID2 PIC X(10).
05 ENTRADA1-TIPO PIC X(11).
05 ENTRADA1-CATEGORIA PIC 9(9) COMP-3.
05 ENTRADA1-TLFNO PIC 9(9) COMP-3.
05 FILLER PIC X(13) VALUE SPACES.
Fichero entrada:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000002JAVIER MARTINEZ CARRETEROASALARIADO q Íì%
FFFFFFFFFDCECCD4444DCDECDCE44CCDDCECDDCECDCDCCCD400001937564444444444444
00000000211595900004193955900319953596121319914600000C8258C0000000000000
-----------------------------------------------------------------------
000000006ANTONIO VILLA SUSO AUTONOMO q Î %
FFFFFFFFFCDEDDCD444ECDDC44444EEED44444CEEDDDDD44400003937164444444444444
00000000615365960005933100000242600000143656460000000C8265C0000000000000
-----------------------------------------------------------------------
000000005YOLANDA LOPEZ ALONSO AUTONOMO o ÍÌ
FFFFFFFFFEDDCDCC444DDDCE44444CDDDED444CEEDDDDD44400001937724444444444444
00000000586315410003675900000136526000143656460000000C6858C0000000000000
-----------------------------------------------------------------------
000000001JOSE LOPEZ PITA AUTONOMO #jéì%
FFFFFFFFFDDEC444444DDDCE44444DCEC44444CEEDDDDD44400001695564444444444444
00000000116250000003675900000793100000143656460000000C9118C0000000000000
-----------------------------------------------------------------------
000000004CARLOS POLO DEL BARROAUTONOMO ÅÂÌì%
FFFFFFFFFCCDDDE4444DDDD444444CCD4CCDDDCEEDDDDD44400003667564444444444444
00000000431936200007636000000453021996143656460000000C7288C0000000000000
-----------------------------------------------------------------------
000000003CARLOS PEREZ FANO AUTONOMO m nç%
FFFFFFFFFCCDDDE4444DCDCE44444CCDD44444CEEDDDDD44400001939464444444444444
00000000331936200007595900000615600000143656460000000C4558C0000000000000
-----------------------------------------------------------------------
Fórmula:
INCLUDE COND=(39,8,CH,EQ,C'AUTONOMO',AND,
(55,5,BI,GE,X'600000000C',AND,55,5,BI,LT,X'700000000C'))
Resultado:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7--
000000001JOSE LOPEZ PITA AUTONOMO #jéì%
FFFFFFFFFDDEC444444DDDCE44444DCEC44444CEEDDDDD44400001695564444444444444
00000000116250000003675900000793100000143656460000000C9118C0000000000000
------------------------------------------------------------------------
000000004CARLOS POLO DEL BARROAUTONOMO ÅÂÌì%
FFFFFFFFFCCDDDE4444DDDD444444CCD4CCDDDCEEDDDDD44400003667564444444444444
00000000431936200007636000000453021996143656460000000C7288C0000000000000
------------------------------------------------------------------------
Oye, no como te llamas ni cuanto tiempo llevas con esto del Cobol pero tengo que agradecerte de verdad por parte mía y un compañero de trabajo la explicación y ejemplos del INCLUDE. Nos ha solucionado un problema en el llevábamos unas horas sin sacar nada en claro. Sigue completando este blog si puedes fiera!!
ResponderBorrarEste blog no se toca desde hace años y es una pena!!! tanta información buena que tienen y esas ganas por enseñar, mucho mas que COBOL no consigo mucha información en internet.
BorrarHola. Por favor sugerencias. Necesito con una sentencia de jcl filtrar en un archivo de salida los registros que en un archivo de entrada cumplan la condición que los caracteres en las posiciones 3 a la 5 sean iguales a los caracteres en las posiciones 14 a 17. Pero el include solo permite comparar posiciones vs. constantes. Gracias por su ayuda
ResponderBorrarCorrijo... Hola. Por favor sugerencias. Necesito con una sentencia de jcl filtrar en un archivo de salida los registros que en un archivo de entrada cumplan la condición que los caracteres en las posiciones 3 a la 5 sean iguales a los caracteres en las posiciones 14 a 16. Pero el include solo permite comparar posiciones vs. constantes. Gracias por su ayuda
ResponderBorrar