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.
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
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:
//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)
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)
/*
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.
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.
Suscribirse a:
Entradas (Atom)
