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.
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