FICHERO DE ENTRADA
Supongamos que tenemos este fichero, en el que tenemos los siguientes campos sin formatear:
- una fecha (posiciones del 5 al 10)
- una hora (del 20 al 25)
- importe 1 comprimido (del 26 al 31)
- importe 2 (del 32 al 35)
- importe 3 (del 36 al 45)
- importe 4 (del 46 al final)
----+----1----+----2----+----3----+----4----+----5----+
***************************** Top of Data *************
0001100811MARIA 143010 011100001111110000111111
FFFFFFFFFFDCDCC4444FFFFFF000001FFFFFFFFFFFFFFFFFFFFFFFF
000110081141991000014301000000C011100001111110000111111
-------------------------------------------------------
0002230411VICTOR 153523 022200002222220000222222
FFFFFFFFFFECCEDD444FFFFFF000002FFFFFFFFFFFFFFFFFFFFFFFF
000223041159336900015352300000C022200002222220000222222
-------------------------------------------------------
0003150811MARIANO 164022 033300003333330000333333
FFFFFFFFFFDCDCCDD44FFFFFF000003FFFFFFFFFFFFFFFFFFFFFFFF
000315081141991560016402200000C033300003333330000333333
-------------------------------------------------------
0004251211LUCIA 174515 <044400004444440000444444
FFFFFFFFFFDECCC4444FFFFFF000004FFFFFFFFFFFFFFFFFFFFFFFF
000425121134391000017451500000C044400004444440000444444
Con este ejemplo vamos a aprender a dar el formato que queramos a cada uno de estos campos. Para ello utilizaremos un OUTREC, en donde vamos a tener este fichero de entrada y otro de salida donde saldrán los campos formateados. En este OUTREC vamos a aplicar las MASCARAS. Las máscaras simplemente son herramientas que nos van a permitir modificar el formato de los campos seleccionados con el OUTREC:
//PASO040 EXEC SORTD,OUT=*
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=fichero_de_entrada,DISP=SHR
//SORTOUT DD DSN=fichero_de_salida,
// DISP=(,CATLG),
// SPACE=(CYL,(150,75),RLSE)
//SYSIN DD *
SORT FIELDS=COPY
OUTREC FIELDS=(01,04,
05,06,ZD,M9,LENGTH=8,
11,09,
20,06,ZD,M8,LENGTH=8,
26,06,PD,
32,04,ZD,M18,LENGTH=4,
36,10,ZD,M4,LENGTH=11,
46,10,ZD,M26,LENGTH=11)
En el fichero_de_salida obtendremos como RESULTADO:
----+----1----+----2----+----3----+----4----+----5----+----6----+--
***************************** Top of Data *************************
000110/08/11MARIA 14:30:10 11.11 +1,111.11+0000111111
000223/04/11VICTOR 15:35:23 22.22 +2,222.22+0000222222
000315/08/11MARIANO 16:40:22 33.33 +3,333.33+0000333333
000425/12/11LUCIA 17:45:15 44.44 +4,444.44+0000444444
Por ejemplo, en el primer caso (01,04), simplemente hemos seleccionado el campo pero no hemos aplicado ninguna máscara.
Sin embargo, en el segundo (05,06,ZD,M9,LENGTH=8), hemos seleccionado el campo 'fecha' que ocupa 6 posiciones(DDMMAA) y la hemos aplicado el código de máscara M9 que lo que hace es meter una '/' entre medias formateando el campo a DD/MM/AA.
Para el campo 'hora' hemos hecho lo mismo pero aplicando el código M8, que convierte un formato HHMMSS en HH:MM:SS.
Para los importes también hemos aplicado otros códigos, por ejemplo el M4 que pone a una cantidad un signo(+ o -), una coma para separar los miles y un punto para separar los decimales.
Existe una tabla donde están reflajados los códigos de conversión de las máscaras. Os dejo la que tengo para descargar, si encontráis más códigos de conversión por favor indicarlos.
Lista de códigos de conversión de las máscaras
Tengo entendido que puedes formar tus propias máscaras a partir de estos valores, y así no utilizar los códigos de conversión. De ese modo es más libre y cada uno puede formatear según le interese. Cuando sepa como se hace lo indico, estoy en ello...
MÁS UTILIDADES DE LAS MÁSCARAS.
El ejemplo anterior nos permite dar un formato más leíble a nuestros ficheros, pero además si tu host lo permite, podemos exportar este fichero fuera del host, y visualizarlo en una hoja de cálculo. Para ello, podemos preparar el fichero para abrirlo por ejemplo con el Excel. Solo tenemos que poner un ';' entre cada campo del siguiente modo:
//PASO040 EXEC SORTD,OUT=*
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=LAET.LAEHISTA.CCOBOL,DISP=SHR
//SORTOUT DD DSN=LAET.MASCARA.SALIDA,
// DISP=(,CATLG),
// SPACE=(CYL,(150,75),RLSE)
//SYSIN DD *
SORT FIELDS=COPY
OUTREC FIELDS=(01,04,C';',
05,06,ZD,M9,LENGTH=8,C';',
11,09,C';',
20,06,ZD,M8,LENGTH=8,C';',
26,06,PD,C';',
32,04,ZD,M18,LENGTH=4,C';',
36,10,ZD,M4,LENGTH=11,C';',
46,10,ZD,M26,LENGTH=11)
RESULTADO:
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----
***************************** Top of Data ********************************
0001;10/08/11;MARIA ;14:30:10; 1;1.11; +1,111.11;+0000111111
0002;23/04/11;VICTOR ;15:35:23; 2;2.22; +2,222.22;+0000222222
0003;15/08/11;MARIANO ;16:40:22; 3;3.33; +3,333.33;+0000333333
0004;25/12/11;LUCIA ;17:45:15; 4;4.44; +4,444.44;+0000444444
Ahora solo hay que exportar el fichero host a un archivo excel poniendo al archivo la extensión .CSV (por ejemplo: "ejemplo_mascaras.csv").
De este modo el excel utiliza los ';' para separar los campos en celdas y que cada campo quede organizado en su correspondiente columna. Si has seguido el ejemplo te ha de quedar de este modo:
8 comentarios:
Hola, cómo puedo generar un archivo de salida de longitud variable, poniendo dos ;; seguidos si el campo no está informado? Para ahorrar espacio en la transmisión del archivo
Muy interesante y bien comentado. Gracias.
Muy interesante y bien comentado. Gracias.
Tendrás un ejemplo para generar un reporte? Con el OUTFIL
Hola.
Estoy buscando algo más para el cambio de formato en un sort. No sé si a partir de aquí podrías ayudarme.
Tengo una descarga de una tabla que tengo que sustituir por un sort de un fichero que contiene una copia previa de esa tabla.
En la descarga original, dos campos cuyo formato es DECIMAL(9,6) se guardan como 99,999 indicando DECIMAL(nombre_campo,5,3).
En el fichero del que yo tengo que partir, el dato está guardado empaquetado:
00000
0000C
Y tengo que poder guardarlo como
000
00C
recortando el primer dígito de la parte entera y los tres últimos de la parte decimal. Y además guardar el signo.
¿Alguna idea?
Gracias.
Me autocontesto, lo he conseguido con una operación aritmética en el outrec:
OUTREC FIELDS=(57,5,PD,DIV,+1000,TO=PD,LENGTH=3)
Muy bueno Gonzalo!
Buen día.
Existe alguna forma de restarle una cantidad de segundos a un campo que contiene fecha y hora (AAMMDDHHMMSS) ?
O restar dos campos que contienen lo mismo (Fecha y Hora)??