Mostrando entradas con la etiqueta OVERLAY. Mostrar todas las entradas
Mostrando entradas con la etiqueta OVERLAY. Mostrar todas las entradas

lunes, 8 de agosto de 2016

JFY: alinear campos en JCL

Una opción que podemos utilizar tanto con OUTREC como con INREC es la de "justificar" a izquierda o derecha con JFY.

Os dejo a continuación un ejemplo de OUTREC para fichero de longitud fija FB y de longitud variable VB.

FICHERO DE ENTRADA:

+----1----+----2----+----3----+----4----+----5-
***************************** Top of Data *****

2015-01-01DATOS VARIABLES     T 20
FFFF6FF6FFCCEDE4ECDCCCDCE44444E4FF4444444444444 20150010014136205199123520000030200000000000000 -----------------------------------------------

2015-01-01DATOS VARIABLES LARGO   40 FFFF6FF6FFCCEDE4ECDCCCDCE4DCDCD444FF44444444444 20150010014136205199123520319760004000000000000 -----------------------------------------------
2015-01-01DATOS VARIABLES MAS L        45              
FFFF6FF6FFCCEDE4ECDCCCDCE4DCE4D44444444FF444444 20150010014136205199123520412030000000045000000 -----------------------------------------------

2015-01-01DATOS VARIABLES LARGO              51
FFFF6FF6FFCCEDE4ECDCCCDCE4DCDCD44444444444444FF
20150010014136205199123520319760000000000000051
-----------------------------------------------
 


Si os fijáis, de la posición 36 a la 51 tenemos un campo con diferente número de espacios a la izquierda del dato que nos interesa.

Para un fichero VB:
//PASO040 EXEC PGM=SORT
//SYSOUT  DD SYSOUT=*
//SORTIN  DD DSN=fichero_de_entradaVB,DISP=SHR
//SORTOUT DD DSN=fichero_de_salidaVB,
//           DISP=(,CATLG),
//           SPACE=(CYL,(150,75),RLSE)
//SYSIN DD *
     SORT FIELDS=COPY
     OUTREC OVERLAY=(40:40,16,JFY=(SHIFT=LEFT))


Le estamos indicando que en la posición 40 (36+4 porque es un VB) escriba el campo que está en la posición 40 ocupando 16, pero alineándolo a la izquierda. Y que deje el resto del registro igual (podéis ver más detalle en Sort vol.2.3: OUTREC. Ficheros VB).

El resultado:

+----1----+----2----+----3----+----4----+----5-
************************* Top of Data *********
2015-01-01DATOS VARIABLES     T20             
FFFF6FF6FFCCEDE4ECDCCCDCE44444EFF44444444444444
20150010014136205199123520000032000000000000000
-----------------------------------------------
2015-01-01DATOS VARIABLES LARGO40             
FFFF6FF6FFCCEDE4ECDCCCDCE4DCDCDFF44444444444444
20150010014136205199123520319764000000000000000
-----------------------------------------------
2015-01-01DATOS VARIABLES MAS L45             
FFFF6FF6FFCCEDE4ECDCCCDCE4DCE4DFF44444444444444
20150010014136205199123520412034500000000000000
-----------------------------------------------
2015-01-01DATOS VARIABLES LARGO51             
FFFF6FF6FFCCEDE4ECDCCCDCE4DCDCDFF44444444444444
20150010014136205199123520319765100000000000000


Para un fichero de longitud fija:
//PASO040 EXEC PGM=SORT
//SYSOUT  DD SYSOUT=*
//SORTIN  DD DSN=fichero_de_entradaFB,DISP=SHR
//SORTOUT DD DSN=fichero_de_salidaFB,
//           DISP=(,CATLG),
//           SPACE=(CYL,(150,75),RLSE)
//SYSIN DD *
     OPTION COPY                                   
     OUTREC FIELDS=(1:1,35,36:36,16,JFY=(SHIFT=LEFT))


Obteniendo el mismo resultado.
Si quisiésemos alinear a la derecha escribríamos SHIFT=RIGHT.

miércoles, 22 de junio de 2016

Sort vol.2.3: OUTREC. Ficheros VB

Para aquellos que trabajéis con ficheros de longitud variable VB os traigo un ejemplo de como hacer un OUTREC.

Hay que tener en cuenta que en los ficheros de longitud variable las 4 primeras posiciones contienen la longitud de cada registro.
Así como a la hora de contar posiciones para posicionarnos en un campo empezamos por la 5, al hacer el outrec la información de las 4 primeras posiciones también hay que llevársela al fichero de salida.

Por otro lado, en un fichero VB habrá registros que no lleguen a ocupar la longitud máxima, por lo que si no indicamos qué hacer, el SORT dará error al no saber cómo rellenar o ignorar esas posiciones.

En el manual de DFSORT de IBM nos indican como solucionar los casos en que tenemos registros con diferentes longitudes (es decir, no todos los registros del fichero tienen la longitud máxima):
"If a variable-length record was too short to contain all INREC, OUTREC, or OUTFIL fields, use an INREC or OUTREC statement with operands OVERLAY or IFTHEN as appropriate, or an OUTFIL statement with operands OVERLAY, IFTHEN, or BUILD and VLFILL=C 'x' or VLFILL=X 'yy' as appropriate, to prevent DFSORT from terminating"

En nuestro ejemplo vamos a usar un OUTREC con OVERLAY.

FICHERO DE ENTRADA, LONGITUD MÁXIMA 55 (4+51):

----+----1----+----2----+----3----+----4----+----5-
***************************** Top of Data *********

2015-01-01DATOS VARIABLES   
FFFF6FF6FFCCEDE4ECDCCCDCE44444444444444444444444444
201500100141362051991235200000000000000000000000000
---------------------------------------------------

2015-01-01DATOS VARIABLES LARGO   40 FFFF6FF6FFCCEDE4ECDCCCDCE4DCDCD444FF444444444444444
201500100141362051991235203197600040000000000000000
---------------------------------------------------

2015-01-01DATOS VARIABLES MAS LARGO    45              
FFFF6FF6FFCCEDE4ECDCCCDCE4DCE4DCDCD4444FF4444444444
201500100141362051991235204120319760000450000000000
---------------------------------------------------

2015-01-01DATOS VARIABLES LARGO MAXIMO           51
FFFF6FF6FFCCEDE4ECDCCCDCE4DCDCD4DCECDD44444444444FF
201500100141362051991235203197604179460000000000051
---------------------------------------------------
 
 


Supongamos que queremos cambiar todas las fechas a 9999-12-31, manteniendo idéntico el resto del fichero.
En un OUTREC de un fichero FB pondríamos:

//PASO040 EXEC PGM=SORT
//SYSOUT  DD SYSOUT=*
//SORTIN  DD DSN=fichero_de_entradaFB,DISP=SHR
//SORTOUT DD DSN=fichero_de_salidaFB,
//           DISP=(,CATLG),
//           SPACE=(CYL,(150,75),RLSE)
//SYSIN DD *
     SORT FIELDS=COPY
     OUTREC FIELDS=(C'9999-12-31',11,41) 



Si intentásemos usarlo para ficheros VB:
//PASO040 EXEC PGM=SORT
//SYSOUT  DD SYSOUT=*
//SORTIN  DD DSN=fichero_de_entradaVB,DISP=SHR
//SORTOUT DD DSN=fichero_de_salidaVB,
//           DISP=(,CATLG),
//           SPACE=(CYL,(150,75),RLSE)
//SYSIN DD *
     SORT FIELDS=COPY
    
OUTREC FIELDS=(C'9999-12-31',15,41)

Obtendremos un error SORT01 - ABEND=S000 U0251:







Pues nos hemos dejado por el camino las posiciones que llevan la información de la longitud.

Si sobre el mismo outrec añadimos las 4 primeras posiciones:
//PASO040 EXEC PGM=SORT
//SYSOUT  DD SYSOUT=*
//SORTIN  DD DSN=fichero_de_entradaVB,DISP=SHR
//SORTOUT DD DSN=fichero_de_salidaVB,
//           DISP=(,CATLG),
//           SPACE=(CYL,(150,75),RLSE)
//SYSIN DD *
     SORT FIELDS=COPY
    
OUTREC FIELDS=(1,4,C'9999-12-31',15,41)

Obtendremos el error SORT01 - ABEND=S000 U0218:





Que nos dice que hay registros con longitud menor al máximo del fichero.


La solución para un OUTREC de un fichero VB sería:

//PASO040 EXEC PGM=SORT
//SYSOUT  DD SYSOUT=*
//SORTIN  DD DSN=fichero_de_entradaVB,DISP=SHR
//SORTOUT DD DSN=fichero_de_salidaVB,
//           DISP=(,CATLG),
//           SPACE=(CYL,(150,75),RLSE)
//SYSIN DD *
     SORT FIELDS=COPY
     OUTREC OVERLAY=(5:C'9999-12-31')


De esta forma indicamos el cambio que queremos hacer y que el resto de posiciones de cada registro se copien tal cual estén en el fichero de entarda.

OJO! En el fichero de salida no se está indicando la longitud porque es la misma que la del fichero de entrada. Si en un outrec el fichero de salida tiene diferente longitud que el fichero de entrada, hay que indicarlo en el DCB:
DCB=(RECFM=VB,LRECL=55,BLKSIZE=0)

Y de regalo os dejo como pasar de FB a VB y viceversa:

//**********************************************
//*         FICHERO FB A VB
//* LA SALIDA MEDIRÁ 4 POSICIONES MÁS
//**********************************************
//SORT01   EXEC PGM=SORT                      
//SORTIN   DD DSN=fichero_de_entradaFB,DISP=SHR
//VBOUT    DD DSN=fichero_de_salidaVB,       
//            DISP=(,CATLG,DELETE),           
//            SPACE=(CYL,(200,50),RLSE)       
//SYSOUT   DD SYSOUT=*                        
//SYSIN    DD *                               
    OPTION COPY                               
    OUTFIL FNAMES=VBOUT,FTOV                  
/* 

//***********************************************
//*         FICHERO VB A FB
//* INDICAMOS LAS POSICIONES A COPIAR
//* PODEMOS COPIAR LAS POSICIONES QUE LLEVAN LA
//* INFORMACION DE LA LONGITUD DEL REGISTRO, O NO
//*********************************************** 
//SORT01   EXEC PGM=SORT                      
//SORTIN   DD DSN=fichero_de_entradaVB,DISP=SHR
//FBOUT    DD DSN=fichero_de_salidaFB,       
//            DISP=(,CATLG,DELETE),           
//            SPACE=(CYL,(200,50),RLSE)       
//SYSOUT   DD SYSOUT=*                        
//SYSIN    DD *                               
    OPTION COPY                               
    OUTFIL FNAMES=FBOUT,VTOF,OUTREC(5,51)
/*

lunes, 23 de mayo de 2011

Sort vol.2.1: OUTREC. IFTHEN

Ampliando un poco las funciones del OUTREC os voy a explicar como incluir condiciones. Es muy sencillo y puede evitar tener que crear programas en un momento dado.

Pongamos el caso de que tenemos el siguiente fichero con los datos de unos clientes:

----+----1----+----2----+----3----+----4----+----5----+----
***************************** Top of Data *****************
000000001JOSE      LOPEZ     PITA     AUTONOMO        47001
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO      47001
000000003CARLOS    PEREZ     FANO     AUTONOMO        47001
000000004CARLOS    POLO      DEL BARROAUTONOMO        47001
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO        47001
000000006ANTONIO   VILLA     SUSO     AUTONOMO        47001
000000007FULANITO  VILLA     SUSO     AUTONOMO        47001


Un buen día nos dicen que quieren añadir al final de cada registro un indicador que nos marque lo siquiente:

Si es un AUTONOMO añadir el indicador 'A'
Si es un ASALARIADO añadir el indicador 'S'

Utlizaremos el siguiente paso de jcl donde aplicamos la condición:

//OUTREC   EXEC SORTD
//SYSOUT   DD SYSOUT=*
//SORTIN   DD DSN=Nombre_Fichero_De_Entrada,DISP=SHR
//SORTOUT  DD DSN=Nombre_Fichero_De_Salida,
//            DISP=(,CATLG),
//            SPACE=(CYL,(100,100),RLSE)
//SYSIN    DD *
 SORT FIELDS=COPY
 OUTREC IFTHEN=(WHEN=(39,11,CH,EQ,C'AUTONOMO   '),
          OVERLAY=(1,59,C'A')),
        IFTHEN=(WHEN=NONE,
          OVERLAY=(1,59,C'S'))


El resultado obtenido será el siguiente:

----+----1----+----2----+----3----+----4----+----5----+----6
***************************** Top of Data ******************
000000001JOSE      LOPEZ     PITA     AUTONOMO        47001A
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO      47001S
000000003CARLOS    PEREZ     FANO     AUTONOMO        47001A
000000004CARLOS    POLO      DEL BARROAUTONOMO        47001A
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO        47001A
000000006ANTONIO   VILLA     SUSO     AUTONOMO        47001A
000000007FULANITO  VILLA     SUSO     AUTONOMO        47001A


Vemos como a los AUTONOMOS les marca con una A y a los ASALARIADOS con una S.

Notas:
- Para añadir más condiciones se deben añadir más IFTHEN al OUTREC.
- Esto es válido también para el INREC.