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

Sentencia MERGE en un programa COBOL

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!

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