viernes, 31 de agosto de 2012

Qualify, Join y Asociatividad

No es ninguna novedad que aterrizar al "mundo de la asociatividad" después de años de bases de datos relacionales puede ser complicado, en particular, cuando tenemos varias tablas con campos de nombres muy genéricos, como son: "DESCRIPCIÓN", "IMPORTE", "CANTIDAD", etc. 
Si bien lo usual es renombrar estos campos "conflictivos", es bastante tedioso hacerlo cuando la cantidad de campos es considerable. La solución rápida y conocida para este tipo de casos es aplicar la función QUALIFY, si aún no la utilizaron activa entre JOINs les adelanto que puede ser algo engorroso.

Para el caso particular con el que voy a trabajar, tengo 2 pares de tablas iguales (ZC y JER), donde cada par de tablas corresponde a una estructura de balance diferente (ACON y AJUS). Cada una de estas 4 tablas las tengo en 4 .QVDs distintos generados en la primer etapa de STG, que se relacionan a través de la tabla de hechos (GLT0). 

Usando QUALIFY  y UNQUALIFY sin complicarse demasiado el modelo nos quedaría:

El código para AJUS:

EL MODELO:


Ahora bien, dejando a un lado las razones técnicas o ideológicas que me motivaron, mi intención es que los campos con igual nombre se diferencien solo por el tipo de estructura de balance y no por el nombre de la tabla, lo que me permitiría trabajar con los campos con mas "homogeneidad" por así decirlo.
Si intentara etiquetar a dos tablas con el mismo nombre, digamos "AUX", teniendo el QUALIFY activo, los nombres de los campos de la primer tabla quedarían AUX.nombreCampomientras que en la segunda tabla quedarían AUX-1.nombreCampo. Pero renombrar una tabla después de cargarla no modifica los nombres de los campos de la misma, de modo que con pocas modificaciones de codigo puedo llegar a mi objetivo.


El código para AJUS:

EL MODELO:

Perfecto! Antes de seguir quiero comentar muy por encima algo sobre los modelos de datos asociativos. Como sabrán, QlikView levanta todo a memoria y una vez allí lo trabaja con un modelo asociativo del que, al momento, no hay detalles técnicos publicados por cuestiones de patente. Algunas cosas que si se saben sobre la asociatividad de QV y son de suma importancia son:
  • Las tablas con los mismos nombres de campos se concatenan automáticamente
  • Tablas que comparten nombres de algunos campos se ASOCIAN automáticamente.  La asociación de la que hablo tiene la misma finalidad que un join, pero con el modelo de datos asociativo. Sobre esto QlikTech indica:
En muchos casos tales joins darán como resultado tablas muy grandes. Una de las principales características de QlikView es la posibilidad de hacer asociaciones entre tablas en lugar de unirlas (join), lo cual reduce el uso de memoria, incrementa la velocidad de proceso y ofrece gran flexibilidad. Los joins explícitos deben ser evitados en los scripts QlikView. La funcionalidad keep fue designada para reducir el número de casos donde necesita usar joins explícitos. 
Teniendo en cuenta esto, no haría falta modificar nada mas en nuestro modelo. 
Sin embargo, ahora me gustaría generar nuevos .QVDs con los nuevos nombres de campos y filtrando un poco. Sabiendo que la relación que tengo entre los campos ERGSL y CUENTA es de uno a uno voy procurar un solo QVD por estructura de balance quedando uno para ACON y otro para AJUS en lugar de 2 para cada uno.

El código para AJUS:

EL MODELO:



Adjunto un Paper en ingles sobre Modelo de Dato Asociativo: Associative Model Data

No hay comentarios:

Publicar un comentario