Preguntas y respuestas sobre JOINKEYS

1 – ¿Hay que ordenar previamente los ficheros?

No, ya que JOINKEYS los ordena automáticamente.

De todas formas, si sabemos que los ficheros ya están ordenados podemos usar el operador SORTED para reducir el tiempo de ejecución del paso. Con este operador se evita la ordenación, aunque JOINKEYS comprueba que los ficheros estén realmente ordenados y termina con el siguiente error si detecta que no lo están:

ICE424A ddname (Fn) KEY IS OUT OF SEQUENCE

Se puede utilizar el operador NOSEQCK para evitar esta comprobación y reducir aún más el tiempo de ejecución; pero si los registros no están ordenados, los resultados serán imprevisibles, ya que no estaremos haciendo realmente un cruce.

Veamos un ejemplo de sentencias de control para cada una de las opciones.

Ordenación automática:
JOINKEYS FILE=F1,FIELDS=(1,3,A)
JOINKEYS FILE=F2,FIELDS=(12,3,A)

Sin ordenación automática, con test de ordenación:
JOINKEYS FILE=F1,FIELDS=(1,3,A),SORTED
JOINKEYS FILE=F2,FIELDS=(12,3,A),SORTED

Sin ordenación automática, sin test de ordenación:
JOINKEYS FILE=F1,FIELDS=(1,3,A),SORTED,NOSEQCK
JOINKEYS FILE=F2,FIELDS=(12,3,A),SORTED,NOSEQCK

2 – ¿Es obligatorio incluir la sentencia JOIN UNPAIRED?

No, solo es necesaria si queremos que el fichero resultado del cruce contenga también los registros que no cruzan del fichero 1, del 2 o de ambos. Si solo necesitamos los registros que cruzan, podemos usar la forma sencilla de JOINKEYS, como en el siguiente ejemplo:


//CRUCE EXEC PGM=SORT                                    
//SYSOUT DD SYSOUT=*                                         
//SORTJNF1 DD DSN=FICH.ENTRADA1,DISP=SHR           
//SORTJNF2 DD DSN=FICH.ENTRADA2.,DISP=SHR           
//SORTOUT DD DSN=FICH.SALIDA.SMSSTD, 
//           DISP=(,CATLG,DELETE),SPACE=(TRK,(1,1),RLSE),
//           DCB=(RECFM=FB,LRECL=65,BLKSIZE=0)
//SYSIN DD *                                                 
  JOINKEYS FILE=F1,FIELDS=(1,3,A)                             
  JOINKEYS FILE=F2,FIELDS=(10,3,A)                            
  REFORMAT FIELDS=(F1:1,10,F2:13,7)                            
  SORT FIELDS=COPY     

3 – Con la instrucción FIELDS se especifican las posiciones de los campos de cruce y el tipo de ordenación (ascendente o descendente), pero no el formato. ¿Qué ocurre si el formato de los campos no es igual en los dos ficheros?

Los campos de cruce se tratan como binarios. Si las dos claves de cruce tienen formatos con valores binarios diferentes, habrá que convertir una las claves para poder cruzar correctamente. Esta conversión la podemos hacer con un SORT previo, o mejor mediante las fichas JNF1CNTL y JNF2CNTL del propio JOINKEYS.

En el siguiente ejemplo podemos ver el tipo de conversión de claves más común: de numérico empaquetado a numérico normal. Tenemos los siguientes ficheros:

Fichero 1: clave en las posiciones 9 a 13 (ZD – numérico no empaquetado).

Vista normal
=COLS> ----+----1----+----2----+----3----+         
000001 2018120333333PERICO PALOTES                 
000002 2018111222222JUAN PALOMEQUE                 
000003 2018060311111BENEDICTO BARAHONA             

Vista hexadecimal (se activa con el comando HEX y se desactiva con HEX OFF)
=COLS>  ----+----1----+----2----+----3----+         
 000001 2018120333333PERICO PALOTES                 
        FFFFFFFFFFFFFDCDCCD4DCDDECE44444444         
        20181203333337599360713635200000000         
 ---------------------------------------------------
 000002 2018111222222JUAN PALOMEQUE                 
        FFFFFFFFFFFFFDECD4DCDDDCDEC44444444         
        20181112222221415071364584500000000         
 ---------------------------------------------------
 000003 2018060311111BENEDICTO BARAHONA             
        FFFFFFFFFFFFFCCDCCCCED4CCDCCDDC4444         
        20180603111112555493360219186510000         
 ---------------------------------------------------

Fichero 2: clave en las posiciones 9 a 11 (PD – numérico empaquetado)


Vista normal (la clave no es visualizable al ser un empaquetado)
=COLS> ----+----1----+----2----+----3---          
000001 C1234567   C/ LIMÓN, 21                    
000002 C1234567   AVDA. EL TORITO, 56             
000003 C1234567   PLAZA DE ESPAÑA, 1              

Vista hexadecimal
=COLS>  ----+----1----+----2----+----3---          
 000001 C1234567   C/ LIMÓN, 21                    
        CFFFFFFF111C64DCDED64FF4444444444          
        3123456711C310394E5B0210000000000          
 --------------------------------------------------
 000002 C1234567   AVDA. EL TORITO, 56             
        CFFFFFFF222CECC44CD4EDDCED64FF444          
        3123456722C1541B0530369936B056000          
 --------------------------------------------------
 000003 C1234567   PLAZA DE ESPAÑA, 1              
        CFFFFFFF333DDCEC4CC4CEDC7C64F4444          
        3123456733C7319104505271B1B010000          
 --------------------------------------------------

Paso de JOINKEYS en el que indicamos que se debe convertir la clave del fichero 2 mediante un INREC en la ficha JNF2CNTL. Los dos ficheros entrarán en el proceso de cruce con el mismo formato de clave. Hay que tener en cuenta que la longitud del fichero 2 convertido puede cambiar En este ejemplo aumenta dos bytes, por lo que los campos del fichero están desplazados dos posiciones en el REFORMAT si tomamos como referencia las posiciones del fichero de entrada original.


//CRUCE  EXEC PGM=SORT                                    
 //SYSOUT DD SYSOUT=*                                      
 //SORTJNF1 DD DSN=USUARIO.ENTRADA1.SMSMES,DISP=SHR        
 //SORTJNF2 DD DSN=USUARIO.ENTRADA2.SMSMES,DISP=SHR        
 //SORTOUT  DD DSN=USUARIO.SALIDA1.SMSMES,                 
 //            DISP=(,CATLG,DELETE),SPACE=(TRK,(1,1),RLSE),
 //            DCB=(RECFM=FB,LRECL=49,BLKSIZE=0)           
 //JNF2CNTL  DD *                                          
   INREC FIELDS=(1,8,9,3,PD,TO=ZD,LENGTH=5,12,22)          
 //SYSIN DD *                                              
   JOINKEYS FILE=F1,FIELDS=(9,5,A)                         
   JOINKEYS FILE=F2,FIELDS=(9,5,A)                         
   REFORMAT FIELDS=(F1:9,27,F2:14,21)                      
   OPTION COPY                                             

Deja un comentario