martes, 2 de noviembre de 2010

Cruce n-n: la cosa se complica.

En un programa de cruce n-n, las claves de ambos ficheros pueden venir repetidas n veces.
Puede ocurrir que, a pesar de que la clave esté repetida, sólo nos interese comprobar que coinciden 1 vez, que sería el caso más sencillo.
Si por el contrario necesitamos recuperar todos los registros con la misma clave de los 2 ficheros, la cosa se complicaría un poco más.

Vamos a empezar por el caso fácil: Cruce n-n simple.



En el INICIO del programa, leeremos el primer registro de cada fichero e informaremos los campos CLAVE1 y CLAVE2:
CLAVE1 = 1; CLAVE2 = 1.
Repetiremos el proceso hasta llegar al final de alguno de los 2 ficheros.

a) CLAVE1 = CLAVE2:
Hacemos el tratamiento de datos
Leemos del fichero 1 hasta que cambie CLAVE1:

PERFORM UNTIL CLAVE1 <> CLAVE1-ANTERIOR(que valía 1)
Leemos el siguiente registro del fichero 1 e informamos CLAVE1 con el siguiente valor.
Cuando lleguemos a CLAVE1 = 2 saldremos del bucle
END-PERFORM

CLAVE1 = 2

Leemos del fichero 2 hasta que cambie CLAVE2:

PERFORM UNTIL CLAVE2 <> CLAVE2-ANTERIOR(que valía 1)
Leemos el siguiente registro del fichero 1 e informamos CLAVE1 con el siguiente valor.
Cuando lleguemos a CLAVE2 = 3 saldremos del bucle
END-PERFORM

CLAVE2 = 3

b) CLAVE1 < CLAVE2:
Esto significa que la CLAVE1 no existe en el fichero 2. Leemos el siguiente registro del fichero 1.

c) CLAVE1 > CLAVE2:
Esto significa que la CLAVE2 no existe en el fichero 1.
Leemos el siguiente registro del fichero 2.

En este caso lo único que hacemos es saltarnos los registros repetidos pues sólo vamos a tratar 1 vez cada CLAVE.

Vamos con el caso difícil: Cruce n-n complejo.



En el INICIO del programa:
Leeremos el primer registro del fichero 1 y del fichero 2.
Guardo todos los registros del fichero 2 que tengan la misma clave en una tabla interna.
CLAVE1 = 1; CLAVE2-tabla interna = 1.

Repetiremos el proceso hasta llegar al final de alguno de los 2 ficheros:

a) CLAVE1 = CLAVE2-tabla interna(1):
Comparamos cada registro del fichero 1, con todos los registros del fichero 2 guardados en la tabla interna:



PERFORM UNTIL CLAVE1 <> CLAVE1-ANTERIOR(que valía 1)
PERFORM UNTIL clave de la tabla interna vacía o superamos el máximo de ocurrencias
Hacemos el tratamiento de los datos
Añadimos 1 al índice
END-PERFORM

Inicializamos el índice de la tabla a 1
Leemos siguiente registro del fichero 1:cuando lleguemos a CLAVE1 = 2 saldremos del bucle
END-PERFORM

CLAVE1 = 2
Guardo los siguientes registros del fichero 2 que tengan la misma clave en la tabla interna:
CLAVE2-tabla interna = 3

b) CLAVE1 < CLAVE2-tabla interna:
Esto significa que la CLAVE1 no existe en el fichero 2. Leemos el siguiente registro del fichero 1: CLAVE1 = 5. CLAVE2-tabla interna sigue valiendo 3.

c) CLAVE1 > CLAVE2-tabla interna:
Esto significa que la CLAVE2 no existe en el fichero 1.
Guardo los siguientes registros del fichero 2 que tengan la misma clave en la tabla interna:
CLAVE2-tabla interna = 3

Una forma de guardar los registros en la tabla interna sería:
PERFORM UNTIL CLAVE2 <> CLAVE2-ANTERIOR
Muevo los campos a la tabla interna
Leo el siguiente registro del fichero 2
END-PERFORM

Y queda listo nuestro programa de cruce n-n. Toma ya!

A petición popular, os dejo un ejemplo completo, con su JCL, y con la información de los ficheros de entrada y de salida:
Programa de cruce n-n.
JCL de ejecución.
Ficheros de entrada y salida.

14 comentarios:

Anónimo dijo...

Hola!
Me podrías escribir un ejemplo completo codificado del caso complicado?

Tallian dijo...

Sin problema. En cuanto lo termine actualizo con el link para descargar el código : )

Anónimo dijo...

Ok! muchas gracias!!!

Tallian dijo...

Ahí lo tienes, esto.. anónimo?? ^^ Podéis poner un nombre que anónimo queda raro jiji.
Espero que te sirva : )

Anónimo dijo...

GRACIAS TIOS ME HAN AYUDADO MUCHO VIVA LA MADRE PATRIA

yoe dijo...

Este comentario ha sido eliminado por el autor.

yoe dijo...

muchas gracias me ha servido un monton... el codigo tiene algunos detalles, como que le falta definir el INDICE2, y donde dice WT-CLAVE2-TABLA(WI-INDICE) deberia ser WT-CLAVE-FICHERO2(WI-INDICE), pero nada son solo detalles.
excelente su pagina ;)

Tallian dijo...

Muchas gracias yoe. Cuando lo tengamos actualizado pongo un coment.
: )

Liliana dijo...

Tendras un ejemplo de match de 3 archivos. Te lo agradeceria mucho

Tallian dijo...

Tienes un ejemplo sencillo aquí
http://www.consultoriocobol.com/2011/06/cruce-de-3-ficheros-cruce-1-1-1.html

cristia vicedo dijo...

mediante JCL y con el ejemplo que has pasado de los ficheros, se podria obtener el siguiente resultado?:
111111111AAAAAAAAAAAXXXXXXXXXXX
222222222BBBBBBBBBBBYYYYYYYYYYY
222222222CCCCCCCCCCCZZZZZZZZZZZ
222222222DDDDDDDDDDDWWWWWWWWWWW

Tallian dijo...

Hola cristia. Por JCL puedes hacerlo con icetool splice o con joinkeys.

Unknown dijo...

hola, estoy tratando de hacer un cruce n a n, pero en este caso escribir en salida solo los registros que no estén en fichero 2, fichero 1 pueden tener varias veces repetida la clave1 y claveB pero solo se debe escribir el que solo exista en fichero 1, si se repiten, solo el excedente de fichero 1. será posible tener un ejemplo del módulo principal?

Tallian dijo...

Hola. Si solo necesitas los registros cuya clave esté en el fichero 1 y no en el 2, con el proceso principal te sirve, y escribirás en salida en el caso de que clave1 < clave2.