domingo, 18 de noviembre de 2018

► Crear tablas vacías


En algunas ocasiones es necesario crear una tabla vacía, sólo con la definición de los campos, para que un proceso posterior introduzca los registros.
El caso más común, aunque no el único, es que un proceso que se va a ejecutar n-veces introduzca datos en cada ciclo. Si cada ciclo introduce datos sólo en una tabla, entonces basta con nombrar la tabla en cada iteración y el CONCATENATE implícito de Qlik irá introduciendo los datos correctamente.
Ejemplo:

 FOR each File in filelist(urlQVD)     
 Nombre_Tabla:
       LOAD * From [$(File)] (qvd);
 NEXT File

En cambio, si hay más de una tabla, entonces no podemos hacerlo así porque intentaría concatenar los datos en la última tabla cargada. La única forma sería nombrando la tabla en el CONCATENATE, pero al no existir previamente, obtendríamos un error. El siguiente ejemplo no funcionaría:

  FOR each File in filelist(urlQVD)      
     Concatenate(Nombre_Tabla1);
         LOAD * From [$(File)] (qvd);
     Concatenate(Nombre_Tabla2);
         LOAD * From [$(File)] (qvd);
  NEXT File

En este caso hay que crear previamente una tabla vacía y lo podemos hacer de 4 formas:

1.- Insertando una línea en blanco inventada:

Nombre_Tabla:
    LOAD
    ‘ ‘ AS campo1,
    ‘ ‘ AS campo2,
    ‘ ‘ AS campo3
    AUTOGENERATE(0);

Mucho ojo porque si ponemos AUTOGENERATE(1) creará una tabla con una fila en blanco que quizá luego nos de problemas. Con AUTOGENERATE(0) crea sólo la estructura de las tablas, sin ninguna fila.


2.- Con un Inline

Nombre_Tabla:
    LOAD * INLINE [campo1, campo2, campo3];

3.- Con una sentencia SQL que no devuelva ninguna línea. 
     (Observese la condición imposible WHERE 2=1)

Nombre_Tabla:
    LOAD *;
    SQL SELECT `campo1`,
               `campo2`
    FROM nombre_tabla
    WHERE 2=1
    ;

El problema de hacerlo de cualquiera de estas tres formas forma es que se debe conocer de antemano los nombres de todos los campos que se van a cargar posteriormente. Si por algún motivo, pasado un tiempo,  se decide añadir algún campo más en el LOAD que carga los datos, estamos obligados a ir a esta declaración y añadir el campo exactamente igual. Cualquier error en el nombre (mayúsculas por minúsculas... etc) provocará que el campo este vacío en el modelo de datos, lo que nos dará un montón de quebraderos de cabeza intentando descubrir por qué está vacío.

Existe una cuarta opción que soluciona esto:

4.- Creando  una tabla con una sola columna vacía que después se borrará
       
            NOCONCATENATE
Nombre_Tabla:
    LOAD ‘‘ AS dummy
    AUTOGENERATE(0);
      .
      <mi script>.
      .
DROP FIELD dummy;

NOCONCATENATE es obligatorio porque si se crean varias tablas seguidas con este sistema, las concatenaría todas en una sola.
Esto crea una tabla con una sola columna, que no nos sirve para nada, y sin ninguna fila¨.
Cuando después se añadan los datos verdaderos, cada fila añadida tendrá al principio esta columna "dummy" vacía.
Al final del script no olvidar borrar esta columna, porque si no se crearán un montón de tablas de síntesis.
Si alguna tabla creada por este método no se ha rellenado, cuando se borre el campo "dummy" se borrará también la tabla.

Nota: Recordar borrar el campo antes de exportar la tabla!!!
   

No hay comentarios:

Publicar un comentario