miércoles, 2 de febrero de 2011

Prefix En Cobol AS400

En cobol nos hemos visto con la necesidad de trabajar con 2 archivos con la misma estructura. Y por tal, tienen los mismos formatos de registro y nombre de campos iguales. Que hacemos para diferenciar a que archivo pertenece cada campo?
Solución 1.- Para poder diferenciar que campo pertenece a cada archivo podemos declarar la estructura de cada registro internamente (dentro del programa) y así salimos del apuro.

        FILE SECTION.                                                 
        FD  ARCHIVO1
            LABEL RECORDS ARE STANDARD.                               
        01  REG-ARCH1.                                            
            05  A-CAMPO1        PIC 9(3).                
            05  A-CAMPO2        PIC X(15).               
            05  A-CAMPO3        PIC 9(10)V99.
       

Solución 2.- Pero si declaramos los registros externamente (COPY DDS-ALL-FORMATS OF …) se tendría que identificar cada campo a que registro pertenece, puesto que el compilador arrojaría error, ya que no sabría a que archivo pertenece.
Por ejemplo:
                MOVE CAMPO3                                TO          CAMPO3
*    41  IDMSJ: LNC1463  GRAVEDAD: 30  NUMSEC:  005400                              
         Mensaje . . . . :   'CAMPO3' no es exclusivo dentro de este contexto.      

Tendríamos que hacer lo siguiente:
MOVE CAMPO3 OF REG-ARCH1 TO CAMPO3 OF REG-ARCH2          
Pero resultaría laborioso realizar esto por cada campo del archivo.

Solución 3.-  Podemos declarar un COPYBOOK  e incluirlo dentro del programa para cada archivo pero diferenciándolo por una letra o numero haciendo uso de la clausula REPLACING. Y el compilador generará automáticamente los registros para cada archivo.
Este es el fuente Copybook, el cual contiene un caracter o caracteres que deberan ser reemplazados en el programa principal. Los cuales se encuentran entre el signo “:”
Nombre de fuente: CopyArch
Tipo fuente: TXT
*************** Principio de datos ************************
      * DESCRIPCION DEL REGISTRO DEL ARCHIVO              
        01  :X:-REG.                                      
           05  :X:-CAMPO1        PIC 9(3).                
           05  :X:-CAMPO2        PIC X(15).               
           05  :X:-CAMPO3        PIC 9(10)V99.            
****************** Fin de datos ***************************

Nota: La descripción del registro dentro del fuente copybook deberá respetar las posiciones las Área A y área B.
La declaración del copybook dentro del programa principal se ubicará en la FILE SECTION de la DATA DIVISION de la siguiente manera:
......-A+++B++++++++++++++++++++++++++++++++++++++++++++++++++++
        DATA DIVISION.                                          
        FILE SECTION.                                           
        FD ARCHIVO1.                                            
            COPY COPYBOOK IN QCBLSRC REPLACING ==:X:== BY ==A==.
        FD ARCHIVO2.                                            
            COPY COPYBOOK IN QCBLSRC REPLACING ==:X:== BY ==B==.
       *                                                        
        WORKING-STORAGE SECTION.                                 
        01 FILE-STATUS.                                         
           03  FS-ARCH1          PIC XX.                        
           03  FS-ARCH2          PIC XX.                        

En nuestro ejemplo el carácter X será reemplazado por el carácter A en cada uno de los campos de la estructura del fuente copybook declarado para el registro del archivo ARCHIVO1. Y para el registro del archivo ARCHIVO2 el carácter X será reemplazado por el carácter B.
Si vemos la compilación del fuente o realizamos un DEBUG con vista de depuración (*LIST) podremos ver como el compilador reemplaza el carácter A en la posición de X.
15     002400 DATA DIVISION.                                                                       
16     002500 FILE SECTION.                                                                       
17     002600 FD ARCHIVO1.                                                                        
       002700     COPY COPYBOOK IN QCBLSRC REPLACING ==:X:== BY ==A==.                            
      +000200* DESCRIPCION DEL REGISTRO DEL ARCHIVO                                        COPYBOOK
18    +000500  01 A-REG.                                                                   COPYBOOK
19    +000600     05 A-CAMPO1        PIC 9(3).                                             COPYBOOK
20    +000700     05 A-CAMPO2        PIC X(15).                                            COPYBOOK
21    +000800     05 A-CAMPO3        PIC 9(10)V99.                                         COPYBOOK
22     003100 FD ARCHIVO2.                                                                        
       003200     COPY COPYBOOK IN QCBLSRC REPLACING ==:X:== BY ==B==.                            
      +000200* DESCRIPCION DEL REGISTRO DEL ARCHIVO                                        COPYBOOK
23    +000500  01 B-REG.                                                                   COPYBOOK
24    +000600     05 B-CAMPO1        PIC 9(3).                                             COPYBOOK
25    +000700     05 B-CAMPO2        PIC X(15).                                            COPYBOOK
26    +000800     05 B-CAMPO3        PIC 9(10)V99.                                         COPYBOOK
       003700*                                                                                    


Solución 4.- Hay otra manera más apropiada y sencilla de hacer esto. Asi como en RPG ILE existe la palabra clave PREFIX, el COBOL ILE también la posee. Aquí les va un ejemplo de cómo aplicarlo al ejemplo anterior.
......-A+++B++++++++++++++++++++++++++++++++++++++++++++++++++
       DATA DIVISION.                                         
       FILE SECTION.                                         
       FD ARCHIVO1                                           
             LABEL RECORDS ARE STANDARD                      
             DATA RECORD IS REGFILE1.                         
       01 REG-ARCH1.                                         
           COPY DDS-ALL-FORMATS OF ARCHIVO1 PREFIX BY 'A-'.  
       FD ARCHIVO2                                           
             LABEL RECORDS ARE STANDARD                      
             DATA RECORD IS REGFILE2.                        
       01 REG-ARCH2.                                         
           COPY DDS-ALL-FORMATS OF ARCHIVO2 PREFIX BY 'B-'.  

En nuestro ejemplo el prefijo “A-“  se antepondrá en cada uno de los campos de la estructura del  registro para el archivo ARCHIVO1. Y para el registro del archivo ARCHIVO2 el prefijo “B-“.
Si vemos la compilación del fuente o realizamos un DEBUG con vista de depuración (*LIST) podremos ver como el compilador antepone el carácter “A-“ y “B-“ respectivamente en cada campo de los registros de cada archivo.

15     002400 DATA DIVISION.                                                                        
16     002500 FILE SECTION.                                                                          
17     002600 FD ARCHIVO1                                                                           
       002700       LABEL RECORDS ARE STANDARD                                                      
       002800       DATA RECORD IS REGFILE1.                                                        
18     002900 01 REG-ARCH1.                                                                          
       003000     COPY DDS-ALL-FORMATS OF ARCHIVO1 PREFIX BY 'A-'.                                  
19    +000001       05  ARCHIVO1-RECORD PIC X(25).                                         <-ALL-FMTS
      +000002*    I-O FORMAT:REGFILE1   FROM FILE ARCHIVO1   OF LIBRARY MILIBRERIA         <-ALL-FMTS
      +000003*                                                                             <-ALL-FMTS
20    +000004       05  REGFILE1      REDEFINES ARCHIVO1-RECORD.                           <-ALL-FMTS
21    +000005           06 A-CAMPO1              PIC S9(3).                                <-ALL-FMTS
22    +000006           06 A-CAMPO2              PIC X(15).                                <-ALL-FMTS
23    +000007           06 A-CAMPO3              PIC S9(10)V9(2)   COMP-3.                 <-ALL-FMTS
24     003100 FD ARCHIVO2                                                                           
       003200       LABEL RECORDS ARE STANDARD                                                       
       003300       DATA RECORD IS REGFILE2.                                                        
25     003400 01 REG-ARCH2.                                                                         
       003500     COPY DDS-ALL-FORMATS OF ARCHIVO2 PREFIX BY 'B-'.                                  
26    +000001       05  ARCHIVO2-RECORD PIC X(30).                                         <-ALL-FMTS
      +000002*    I-O FORMAT:REGFILE1   FROM FILE ARCHIVO2   OF LIBRARY MILIBRERIA         <-ALL-FMTS
      +000003*                                                                             <-ALL-FMTS
27    +000004       05  REGFILE1      REDEFINES ARCHIVO2-RECORD.                           <-ALL-FMTS
28    +000005           06 B-CAMPO1              PIC S9(3).                                <-ALL-FMTS
29    +000006           06 B-CAMPO2              PIC X(15).                                <-ALL-FMTS
30    +000007           06 B-CAMPO3              PIC S9(10)V9(2).                          <-ALL-FMTS
       003700*                                                                                      


Una vez realizadas esas declaraciones podremos trabajar los campos dentro del programa de la siguiente manera.
                MOVE A-CAMPO1           TO          B-CAMPO1

No hay comentarios:

Publicar un comentario