Hemos visto en otros artículos como hacer un MERGE en un JCL. En este artículo veremos como hacerlo en un programa cobol.
¿Utilidad? Depende. Lo cierto es que pudiendo hacerlo por JCL, no veo la razón de hacerlo en un programa. Pero quién sabe! Tal vez alguno de los lectores pueda darnos una idea de su uso práctico : D
MERGE:
La sentencia MERGE en cobol sirve para unir dos ficheros teniendo en cuenta la clave por la que están ordenados. Es decir, no podemos hacer un MERGE de ficheros desordenados.
Lo que hará será "colocar" las claves que coincidan, juntas en el fichero de salida.
Para el ejemplo, utilizaremos:
2 ficheros de entrada con los datos a unir.
1 fichero temporal donde se realizará el MERGE.
Los datos de los ficheros de entrada para nuestro ejemplo serán:
FICHERO1:
A
B
C
FICHERO2:
B
C
E
Programa:
IDENTIFICATION DIVISION.
PROGRAM-ID.PRGMERGE.
*
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
*Definición de ficheros
SELECT TABLA-MERGE ASSIGN TO DISK 'SORTWORK'.
SELECT TABLA-FICH1 ASSIGN TO FICHERO1.
SELECT TABLA-FICH2 ASSIGN TO FICHERO2.
*
DATA DIVISION.
FILE SECTION.
*Ficheros físicos
FD TABLA-FICH1
DATA RECORD IS FICHERO1.
01 FICHERO1.
05 FILLER PICTURE X.
FD TABLA-FICH2
DATA RECORD IS FICHERO2.
01 FICHERO2.
05 FILLER PICTURE X.
* Ficheros temporales
SD TABLA-MERGE
DATA RECORD IS ELEMENTO-MERGE.
01 ELEMENTO-MERGE.
05 MERGE-CLAVE1 PIC X.
*
WORKING-STORAGE SECTION.
* Variable donde guardaremos el resultado del MERGE
01 VARIABLES.
05 WA-REGISTRO.
10 WA-AUX-CLAVE1 PIC X.
* Switches para el bucle
01 SWITCHES.
05 SW-FIN-TABLA-MERGE PIC X(1).
88 SI-FIN-TABLA-MERGE VALUE 'S'.
88 NO-FIN-TABLA-MERGE VALUE 'N'.
* Registro para los datos después del MERGE
01 WR-ELEMENTO-MERGE.
05 WR-MERGE-CLAVE1 PIC X.
*
PROCEDURE DIVISION.
*
PERFORM 1000-INICIO
PERFORM 2000-PROCESO
PERFORM 9000-FINAL
.
*
1000-INICIO.
*
INITIALIZE VARIABLES
.
*
2000-PROCESO.
* Sentencia MERGE
* Juntamos FICHERO1 y FICHERO2 en TABLA-MERGE por clave
* MERGE-CLAVE1
MERGE TABLA-MERGE ASCENDING KEY MERGE-CLAVE1
USING FICHERO1 FICHERO2
OUTPUT PROCEDURE 2100-PROCESO-SALIDA
* En la OUTPUT PROCEDURE usaremos la información ya unida
IF SORT-RETURN NOT = ZEROS
DISPLAY 'ERROR EN EL MERGE:' SORT-RETURN
END-IF
.
*
2100-PROCESO-SALIDA.
* Movemos del fichero temporal al registro de salida con la
* sentencia RETURN
* Displayamos la información desde una variable definida
* en el programa
SET NO-FIN-TABLA-UNION TO TRUE
*
PERFORM UNTIL SI-FIN-TABLA-UNION
RETURN TABLA-MERGE INTO WR-ELEMENTO-MERGE
AT END
SET SI-FIN-TABLA-MERGE TO TRUE
NOT AT END
MOVE WR-MERGE-CLAVE1 TO WA-AUX-CLAVE1
DISPLAY 'REGISTRO->' WA-REGISTRO
END-RETURN
END-PERFORM
.
*
9000-FINAL.
*
STOP RUN
.
*
RESULTADO:
REGISTRO->A
REGISTRO->B
REGISTRO->B
REGISTRO->C
REGISTRO->C
REGISTRO->E
Nota: aunque no veais nigún párrafo de "abrir fichero", "leer fichero", etc., no significa que se nos haya ido la olla, es que no es necesario!
Mostrando entradas con la etiqueta MERGE. Mostrar todas las entradas
Mostrando entradas con la etiqueta MERGE. Mostrar todas las entradas
lunes, 7 de febrero de 2011
viernes, 21 de enero de 2011
MERGE: unión de ficheros.
Agrupa varios ficheros por el/los campo/s indicado/s.
IMPORTANTE: para utilizar la sentencia MERGE, los ficheros de entrada deben haber sido previamente ordenados.
¡OJO!: Ahora el SORTIN cambia por SORTIN01, SORTIN02, etc.
//SORT001 EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//SORTIN01 DD DSN=nombre.fichero.entrada1,DISP=SHR
//SORTIN02 DD DSN=nombre.fichero.entrada2,DISP=SHR
//SORTINnn DD DSN=nombre.fichero.entradann,DISP=SHR
//SORTOUT DD DSN=nombre.fichero.salida1,
// DISP=(,CATLG,DELETE),SPACE=(CYL,(500,100))
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
MERGE FIELDS=(I,L,T,O)
I – Inicio. Posición donde empieza el campo.
L – Longitud máxima del campo.
T – Tipo de dato del campo que se quiere sumar:
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:
Unir los siguientes ficheros por código de empleado:
Fichero 1:
----+----1----+----2----+----3----+----4----+----5
000000001JOSE LOPEZ PITA AUTONOMO
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000003CARLOS PEREZ FANO AUTONOMO
000000004CARLOS POLO DEL BARROAUTONOMO
000000005YOLANDA LOPEZ ALONSO AUTONOMO
000000006ANTONIO VILLA SUSO AUTONOMO
000000007FULANITO VILLA SUSO AUTONOMO
Fichero 2:
----+----1----+----2----+----3----+----4----+----5
000000001JOSE LOPEZ PITA AUTONOMO
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000003CARLOS PEREZ FANO AUTONOMO
000000008CARLOS POLO DEL BARROAUTONOMO
000000009YOLANDA LOPEZ ALONSO AUTONOMO
000000010ANTONIO VILLA SUSO AUTONOMO
Fórmula:
MERGE FIELDS=(1,9,CH,A)
Resultado:
----+----1----+----2----+----3----+----4----+----5
000000001JOSE LOPEZ PITA AUTONOMO
000000001JOSE LOPEZ PITA AUTONOMO
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000003CARLOS PEREZ FANO AUTONOMO
000000003CARLOS PEREZ FANO AUTONOMO
000000004CARLOS POLO DEL BARROAUTONOMO
000000005YOLANDA LOPEZ ALONSO AUTONOMO
000000006ANTONIO VILLA SUSO AUTONOMO
000000007FULANITO VILLA SUSO AUTONOMO
000000008CARLOS POLO DEL BARROAUTONOMO
000000009YOLANDA LOPEZ ALONSO AUTONOMO
000000010ANTONIO VILLA SUSO AUTONOMO
Al igual que con el SORT, el MERGE puede usarse con la opción COPY:
MERGE FIELDS=COPY
En este caso la estructura del JCL será la misma que la del SORT:
//SORT001 EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//SORTIN DD DSN=nombre.fichero.entrada1,DISP=SHR
// DD DSN=nombre.fichero.entrada2,DISP=SHR
// DD DSN=nombre.fichero.entradann,DISP=SHR
//SORTOUT DD DSN=nombre.fichero.salida1,
// DISP=(,CATLG,DELETE),SPACE=(CYL,(500,100))
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
MERGE FIELDS=COPY
/*
Ejemplo:
Fichero 1:
----+----1----+----2----+----3----+----4----+----5
000000001JOSE LOPEZ PITA AUTONOMO
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000003CARLOS PEREZ FANO AUTONOMO
000000004CARLOS POLO DEL BARROAUTONOMO
000000005YOLANDA LOPEZ ALONSO AUTONOMO
000000006ANTONIO VILLA SUSO AUTONOMO
000000007FULANITO VILLA SUSO AUTONOMO
Fichero 2:
----+----1----+----2----+----3----+----4----+----5
000000001JOSE LOPEZ PITA AUTONOMO
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000003CARLOS PEREZ FANO AUTONOMO
000000008CARLOS POLO DEL BARROAUTONOMO
000000009YOLANDA LOPEZ ALONSO AUTONOMO
000000010ANTONIO VILLA SUSO AUTONOMO
Fórmula:
MERGE FIELDS=COPY
Resultado:
----+----1----+----2----+----3----+----4----+----5
000000001JOSE LOPEZ PITA AUTONOMO
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000003CARLOS PEREZ FANO AUTONOMO
000000004CARLOS POLO DEL BARROAUTONOMO
000000005YOLANDA LOPEZ ALONSO AUTONOMO
000000006ANTONIO VILLA SUSO AUTONOMO
000000007FULANITO VILLA SUSO AUTONOMO
000000001JOSE LOPEZ PITA AUTONOMO
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000003CARLOS PEREZ FANO AUTONOMO
000000008CARLOS POLO DEL BARROAUTONOMO
000000009YOLANDA LOPEZ ALONSO AUTONOMO
000000010ANTONIO VILLA SUSO AUTONOMO
IMPORTANTE: para utilizar la sentencia MERGE, los ficheros de entrada deben haber sido previamente ordenados.
¡OJO!: Ahora el SORTIN cambia por SORTIN01, SORTIN02, etc.
//SORT001 EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//SORTIN01 DD DSN=nombre.fichero.entrada1,DISP=SHR
//SORTIN02 DD DSN=nombre.fichero.entrada2,DISP=SHR
//SORTINnn DD DSN=nombre.fichero.entradann,DISP=SHR
//SORTOUT DD DSN=nombre.fichero.salida1,
// DISP=(,CATLG,DELETE),SPACE=(CYL,(500,100))
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
MERGE FIELDS=(I,L,T,O)
I – Inicio. Posición donde empieza el campo.
L – Longitud máxima del campo.
T – Tipo de dato del campo que se quiere sumar:
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:
Unir los siguientes ficheros por código de empleado:
Fichero 1:
----+----1----+----2----+----3----+----4----+----5
000000001JOSE LOPEZ PITA AUTONOMO
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000003CARLOS PEREZ FANO AUTONOMO
000000004CARLOS POLO DEL BARROAUTONOMO
000000005YOLANDA LOPEZ ALONSO AUTONOMO
000000006ANTONIO VILLA SUSO AUTONOMO
000000007FULANITO VILLA SUSO AUTONOMO
Fichero 2:
----+----1----+----2----+----3----+----4----+----5
000000001JOSE LOPEZ PITA AUTONOMO
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000003CARLOS PEREZ FANO AUTONOMO
000000008CARLOS POLO DEL BARROAUTONOMO
000000009YOLANDA LOPEZ ALONSO AUTONOMO
000000010ANTONIO VILLA SUSO AUTONOMO
Fórmula:
MERGE FIELDS=(1,9,CH,A)
Resultado:
----+----1----+----2----+----3----+----4----+----5
000000001JOSE LOPEZ PITA AUTONOMO
000000001JOSE LOPEZ PITA AUTONOMO
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000003CARLOS PEREZ FANO AUTONOMO
000000003CARLOS PEREZ FANO AUTONOMO
000000004CARLOS POLO DEL BARROAUTONOMO
000000005YOLANDA LOPEZ ALONSO AUTONOMO
000000006ANTONIO VILLA SUSO AUTONOMO
000000007FULANITO VILLA SUSO AUTONOMO
000000008CARLOS POLO DEL BARROAUTONOMO
000000009YOLANDA LOPEZ ALONSO AUTONOMO
000000010ANTONIO VILLA SUSO AUTONOMO
Al igual que con el SORT, el MERGE puede usarse con la opción COPY:
MERGE FIELDS=COPY
En este caso la estructura del JCL será la misma que la del SORT:
//SORT001 EXEC PGM=SORT,PARM=('DYNALLOC=(SYSALLDA,32)')
//SORTIN DD DSN=nombre.fichero.entrada1,DISP=SHR
// DD DSN=nombre.fichero.entrada2,DISP=SHR
// DD DSN=nombre.fichero.entradann,DISP=SHR
//SORTOUT DD DSN=nombre.fichero.salida1,
// DISP=(,CATLG,DELETE),SPACE=(CYL,(500,100))
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
MERGE FIELDS=COPY
/*
Ejemplo:
Fichero 1:
----+----1----+----2----+----3----+----4----+----5
000000001JOSE LOPEZ PITA AUTONOMO
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000003CARLOS PEREZ FANO AUTONOMO
000000004CARLOS POLO DEL BARROAUTONOMO
000000005YOLANDA LOPEZ ALONSO AUTONOMO
000000006ANTONIO VILLA SUSO AUTONOMO
000000007FULANITO VILLA SUSO AUTONOMO
Fichero 2:
----+----1----+----2----+----3----+----4----+----5
000000001JOSE LOPEZ PITA AUTONOMO
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000003CARLOS PEREZ FANO AUTONOMO
000000008CARLOS POLO DEL BARROAUTONOMO
000000009YOLANDA LOPEZ ALONSO AUTONOMO
000000010ANTONIO VILLA SUSO AUTONOMO
Fórmula:
MERGE FIELDS=COPY
Resultado:
----+----1----+----2----+----3----+----4----+----5
000000001JOSE LOPEZ PITA AUTONOMO
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000003CARLOS PEREZ FANO AUTONOMO
000000004CARLOS POLO DEL BARROAUTONOMO
000000005YOLANDA LOPEZ ALONSO AUTONOMO
000000006ANTONIO VILLA SUSO AUTONOMO
000000007FULANITO VILLA SUSO AUTONOMO
000000001JOSE LOPEZ PITA AUTONOMO
000000002JAVIER MARTINEZ CARRETEROASALARIADO
000000003CARLOS PEREZ FANO AUTONOMO
000000008CARLOS POLO DEL BARROAUTONOMO
000000009YOLANDA LOPEZ ALONSO AUTONOMO
000000010ANTONIO VILLA SUSO AUTONOMO
Suscribirse a:
Comentarios (Atom)