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:
Un claro ejemplo y muy util! Gracias por compartirlo con los principiantes!!
A mandar ^^
De nada y recuerda que "ayudar a la causa" es gratis cough cough!!!
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?
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!