lunes, 23 de noviembre de 2020

SORT vol.4: SKIPREC, STOPAFT.

ACTUALIZADO: añadido ejemplo de OPTION SKIPREC para saltarnos registros a la hora de ordenar.

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:

OPTION SKIPREC

Sirve para saltar registros a la hora de escribir/ordenar un fichero de salida. Se salta tantos registros del fichero de entrada como se indiquen y a partir de ahí escribe en la salida/ordena.

Ejemplo de copy:
//SORT001  EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//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
 OPTION SKIPREC=número_de_registros_a_saltar

Por ejemplo, tenemos un fichero de entrada con 100 registros, si indicamos "OPTION SKIPREC=20", en el fichero de salida escribirá los registros comprendidos entre 21 y 100 ambos inclusive.

Ejemplo de sort:
//SORT001  EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)') 
//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=(1,10,C,A) 
 OPTION SKIPREC=número_de_registros_a_saltar

Por ejemplo, cuando tenemos un fichero que lleva una cabecera en el primer registro (el primer registro tiene un formato distinto al resto del fichero), podemos saltarnos ese primer registro en la ordenación indicando "OPTION SKIPREC=1".
Los registros saltados son eliminados y se ordenarán los registros del 2 en adelante.

NOTA: si queremos guardarnos todos los registros podemos usar OUTFIL con STARTREC y ENDREC.


OPTION STOPAFT

Sirve para dejar de escribir en salida una vez llegado al número de registros indicado.

//SORT001  EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//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
 OPTION STOPAFT=número_de_registro_que_para

Por ejemplo, tenemos un fichero de entrada con 100 registros, si indicamos "OPTION STOPAFT=30", nos escribirá en salida los registros comprendidos entre 1 y 30, ambos inclusive.

OPTION SKIPREC/STOPAFT

Se pueden combinar ambas utilidades del siguiente modo:

OPTION SKIPREC=número_de_registros_a_saltar,
       STOPAFT=número_de_registro_que_para

Por ejemplo, tenemos un fichero de 100 registros, y queremos grabar en salida los comprendidos entre el 30 y 40 ambos inclusive. El método sería el siguiente:

OPTION SKIPREC=29,STOPAFT=11

9 comentarios:

Anónimo dijo...

Los ejemplos no están bien puestos, si los escribo así como ponen no van, lo que hice fue modificar la SYSIN:

//SYSIN DD *
SORT FIELDS=COPY
OPTION STOPAFT=100

Alvarito dijo...

Gracias Anónimo, se me fué la pinza.

Jessica Castillo dijo...

eSTO QUE DICES :
Por ejemplo, tenemos un fichero de 100 registros, y queremos grabar en salida los comprendidos entre el 30 y 40 ambos inclusive. El método sería el siguiente:

OPTION SKIPREC=29,STOPAFT=40
LO QUE NOS TRAERA ES DE LA POSICION 30, 40 REGISTROS EN ADELANTE ES DECIR HASTA LA POSICION 70 , EL STOPAFT TRAE EL NUMERO DE REGISTROS QUE TIENES

Jessica Castillo dijo...

UPSS...EL STOPAFT TRAE EL NUMERO DE REGISTROS QUE QUIERES

Raul Garcia dijo...

Gracias por la Info.

Jorge Martin dijo...

Claro, en ese caso pues, si tenemos un fichero de 100 registros, y queremos grabar en salida los comprendidos entre el 30 y 40 ambos inclusive. El método sería el siguiente:

OPTION SKIPREC=29,STOPAFT=10
Lo que nos empezará a escribir a partir del registro 30 (SKIPREC=29) y con el STOPAFT=10 le decimos que nos escriba los 10 primeros registros y luego pare de escribir.

Así tendremos un output de 10 registros, desde el 30 al 40.

Gracias por la info Jessica ;-)

Tallian dijo...

Corregido! Más vale tarde que nunca.. xd

Unknown dijo...

No es por malmeter, pero si queremos que grabe del 30 al 40 ambos inclusive tiene que escribir 11 registros, no 10.
OPTION SKIPREC=29,STOPAFT=11

Tallian dijo...

Correctísimo compañero! jaja
Ahora mismo lo cambio! y gracias!