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!

5 comentarios:

Anónimo dijo...

Un claro ejemplo y muy util! Gracias por compartirlo con los principiantes!!

Tallian dijo...

A mandar ^^

pepegan dijo...

De nada y recuerda que "ayudar a la causa" es gratis cough cough!!!

AngeL dijo...

ahora que pasa si tus ficheros traen diferente numero de registros? es decir:
Fichero 1
01
02
05
08
02
06
fichero 2
03
04
06
09
07
10
2
4
6
8
y en el de salida
quieres sacar:
Salida
01
02
03
04
05
06
07
08
09
10
se que eso es sencillo con un sort en el jcl pero en un programa Cobol como seria?

Tallian dijo...

Hola Angel.
El número de registros es indiferente. El problema para usar el MERGE es que los ficheros tienen que llegar ordenados. Sino, tendrás que utilizar un pgm con SORT para cada uno de los ficheros y luego un pgm con el MERGE.

http://www.consultoriocobol.com/2011/02/sentencia-sort-en-un-programa-cobol.html

Un saludo!