En muchas ocasiones nos habéis preguntado como unir dos ficheros con JCL de la siguiente forma:
Fichero 1 Fichero 2
aaaaa xxxxx
bbbbb yyyyy
ccccc zzzzz
Unión de los dos ficheros
aaaaaxxxxx
bbbbbyyyyy
ccccczzzzz
Una solución para aquellos que dispongáis de Easytrieve sería usar un paso sencillo como este:
//CONSULL JOB (EASY),'easy',CLASS=A,MSGCLASS=X,
// MSGLEVEL=(1,1),REGION=0M,COND=(4,LT)
//JOBLIB DD DSN=LIB.EJECUCION.EJEM,DISP=SHR
//****************************************************
//* OBTIENE REGISTRO DE CONTRIOL DE TRANSMISION *
//****************************************************
//EASY0001 EXEC PGM=EZTPA00
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//EZTVFM DD UNIT=SYSDA,SPACE=(CYL,(40,10))
//ENTRADA1 DD DSN=FICHERO.ENTRADA.NUMERO1,DISP=SHR
//ENTRADA2 DD DSN=FICHERO.ENTRADA.NUMERO2,DISP=SHR
//SALIDA DD DSN=FICHERO.SALIDA.EASY,
// DISP=(,CATLG,DELETE),
// SPACE=(CYL,(150,50),RLSE),
// DCB=(RECFM=FB,LRECL=200,BLKSIZE=0)
//SYSIN DD *
FILE ENTRADA1
ENTRADA1-TS 1 100 A
*
FILE ENTRADA2
ENTRADA2-TS 1 100 A
*
FILE SALIDA
SALIDA-TS1 1 100 A
SALIDA-TS2 101 200 A
*
JOB INPUT NULL
GET ENTRADA1
GET ENTRADA2
DO WHILE (NOT EOF ENTRADA1)
SALIDA-TS1 = ENTRADA1-TS
SALIDA-TS2 = ENTRADA2-TS
PUT SALIDA
GET ENTRADA1
GET ENTRADA2
END-DO
STOP
En este JOB podéis ver que el programa que se ejecuta es el EZTPA00. Este programa es el compilador de easytrieve.
Será en la sysin donde incluiremos el código easytrieve propiamente dicho:
En primer lugar declaramos los ficheros de entrada ENTRADA1 y ENTRADA2 de longitud 100 en ambos casos. Definimos también el fichero de salida SALIDA como la suma de los 2, en total 200 posiciones de longitud.
En segundo lugar escribimos el código del programa:
Leer fichero: con la instrucción GET.
Escribir en el fichero de salida: con la instrucción PUT.
Lo hacemos dentro de un bucle donde vamos informando el área de salida, escribimos y leemos el siguiente registro de ambos ficheros.
Y listo! Nuestro paso de JCL nos ha ahorrado un programa cobol : )
Se os ocurren otras formas de hacerlo? Esperamos sugerencias!
Mostrando entradas con la etiqueta union. Mostrar todas las entradas
Mostrando entradas con la etiqueta union. Mostrar todas las entradas
viernes, 24 de abril de 2015
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!
¿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!
Suscribirse a:
Entradas (Atom)