Mostrando entradas con la etiqueta inline. Mostrar todas las entradas
Mostrando entradas con la etiqueta inline. Mostrar todas las entradas

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!!!
   

► Problemas con la sintaxis de INLINE


El problema más habitual es cargar datos que contienen caracteres reservados como $ ó []
Para el caso de los corchetes, podemos sustituir los corchetes de la sintaxis de Inline por dobles comillas “ (observar que los campos de las expresiones que se cargan en Formula usan corchetes)

LOAD NumExpresion,
    
DUAL(Nombre, NumExpresion) as Nombre,
    
Formula;
LOAD * Inline "
NumExpresion,  Nombre, Formula
1, Coste Total   , Sum([Coste Total])
2, Importe Venta , Sum([Importe Venta])
3, Expediciones  , Sum(Expediciones)
4, Cobrado       , Sum(Cobrado)
"
;


Otro problema muy común es cuando los valores a cargar tienen una coma. En este caso, el funcionamiento por defecto de INLINE piensa que se trata de un separador de campos y lo trata como tal. La solución viene utilizando la opción DELIMITER.

En este ejemplo cargamos datos de usuarios: Su Id y su nombre completo en formato "apellidos, nombre"
Si no usamos la opción DELIMITER interpretaría la coma del nombre como delimitador de campos y daría un resultado incorrecto. Por eso establecemos que el delimitador entre campos es '|'.


                  LOAD Inline [
            id   | nombre
            1015 | Martinez Mayoral, José Manuel
            2113 | Callejón López, María
         ] (delimiter is '|');

► Cambiar el orden predeterminado en un gráfico


Cuando queremos mostrar algo ordenado, pero queremos controlar nosotros en qué orden tienen que aparecer los valores, podemos hacerlo de 3 formas:

1.- A partir de una tabla INLINE que no desaparecerá del modelo de datos.

Map_Orden:
LOAD * Inline [
Ciudad,     Orden
París,      1
Madrid,     2
Londres,    3
Tokyo,      4
Roma,       5
Moscú,      6
]
;
 

Después pondremos como expresión de ordenación en Propiedades del grafico à Pestaña Ordenar (sort) à Ordenar Por à Expresion(expression) y ahí colocar el nombre del campo ‘Orden’ de la tabla Inline.

2.- Combinando una tabla de mapeo y DUAL. Esta tabla no formará parte del modelo de datos.
Map_Orden:
Mapping LOAD * Inline [
Ciudad,     orden
París,      1
Madrid,     2
Londres,    3
Tokyo,      4
Roma,       5
Moscú,      6
]
;
 
Datos:
LOAD
........... //Lista de campos
DUAL
(Ciudad, ApplyMap('Map_Orden', Ciudad)) as Ciudad,
........... //Lista de campos
FROM  ........... //Tabla, fichero… etc.

Después pondremos como expresión de ordenación en Propiedades del grafico à  Pestaña Ordenar (sort) à Ordenar Por à Valor numérico


3.-  Escribir directamente los valores en el orden deseado usando la función WildMatch() en Propiedades del grafico à  Pestaña Ordenar (sort) à Ordenar Por à Expresion(expression)

Wildmatch(Ciudad,’Paris',’Madrid’,’Londres’,’Tokyo’,’Roma’,’Moscú’)