Cargar variables desde excel en Qlikview

Si trabajáis con documentos de Qlikview con decenas de variables llegaréis a la conclusión de que la forma más óptima de su mantenimiento es utilizar un excel (por cierto, aprovecho para reivindicar a Qliktech que den una vuelta al diseño del panel de variables, bastante arcaico para la gestión…). La forma de cargar variables desde un excel a Qlikview es muy sencilla, sólo necesitamos dos cosas:

  • Fichero excel con una tabla en la que indiquemos nombre de la variable y valor
  • Modificar el script de carga del documento Qlikview

 

Excel con variables Qlikview

Como ejemplo práctico, imaginad que necesitáis utilizar la misma paleta de colores en todos los documentos Qlikview de la compañía. Lo más ágil es almacenarlos en variables, y un paso más allá, mantenerlo desde un fichero excel de forma que si en un futuro decidimos cambiar algún color, tendremos centralizado el cambio. La hoja excel deberá tener una tabla con al menos dos columnas, una para el nombre y otra para el valor o expresión (podemos añadir cuantas columnas querramos para complementar, luego no las cargaremos). En nuestro caso práctico, la columna A será el nombre de cada variable y la B la expresión que define los colores (utilizamos la función RGB de Qlikview). La columna C la usamos internamente, no se carga.

Cargar variables desde excel en Qlikview

 

Carga en script

El segundo paso será cargar las variables automáticamente en el script de Qlikview. Como la idea es dejar el mantenimiento de las variables únicamente en el excel, prepararemos un algoritmo que recorra todas las filas con contenido, así si en un futuro añadimos un nuevo color, no tendremos que modificar el script en n documentos.

Con un simple loop de tipo for recorremos las filas con contenido de nuestro excel y almacenamos el contenido de la columna B “Expression” en una variable con el nombre indicado en la columna a “Variable”. Os marco en rojo los parámetros que debéis modificar para personalizar el script en vuestro sistema.

 

/******* LIBRO DE ESTILOS COLORES *******/
Variables:
LOAD Variable,
Expression
FROM
[MiServidor\Libro Estilos\LIBRO_ESTILOS_QV.xlsx]
(ooxml, embedded labels, table is Hoja1);
Let vNumberOfRows = NoOfRows(‘Variables‘);
For vI = 0 to (vNumberOfRows – 1)
Let vVariable_Name = Peek(‘Variable’,vI,’Expression‘);
Let [$(vVariable_Name)] = Peek(‘Expression’,vI,’Expression‘);
Next
/*****************************************/

Tras recargar el documento, vemos que las variables se han grabado correctamente:

Cargar variables desde excel en Qlikview

Sin Comentarios

Jefe o líder: la batalla interminable entre poder y liderazgo

Sin Comentarios

Optimización módulos Qlikview

Días atrás comentamos cómo optimizar un servidor de Qlikview para mejorar el rendimiento y consumo de memoria RAM. En esta ocasión, os mostramos recomendaciones para un correcto desarrollo del script y diseño de interfaces de usuario.

Optimización qlikview

Buenas prácticas en desarrollo de módulos en Qlikview

  • Eliminar claves sintéticas del modelo de datos
  • Eliminar loops del modelo de datos
  • Utilizar QVDs cuando sea posible y con el parámetro OPTIMIZED
  • Utilizar campos numéricos para cruzar tablas
    Mediante tablas maestras o lookup en el modelo
  • “Autonumber” para reemplazar claves concatenadas (claves combinando campos para romper tablas sintéticas).
    Esta función genera una clave numérica única por cada valor diferente de un campo. En el caso de claves concatenadas, asigna a cada par un número determinado. Se utiliza pasando como parámetro los campos concatenados, por ejemplo: autonumeric(COD_CAMPO_1 + COD_CAMPO_2)
  • Eliminar la hora de los campos de fecha
    Formateando desde el script estos campos como DATE en lugar de DATETIME. Desde SQL con la sentencia CAST(XXXX as DATE) y en Qlikview DATE(XXX) o FLOOR(XXX). Si es necesaria la hora, se puede mostrar en otro campo.
  • Eliminar campos y tablas lookup no utilizados del modelo de datos
  • Usar flags numéricos cuando sea posible
    Primar el uso de booleanos (1 o 0) en lugar de “S”/”N” o “SI”/”NO”
  • Evitar usar SELECT * en queries
    En su lugar, recuperar sólo los campos de BD que vayamos a leer en el script.
  • Utilizar variables para expresiones recurrentes
  • Reducir expresiones con “count distinct”
    Una alternativa es reemplazarla por un SUM() de un flag configurado a nivel de script.
  • Reducir uso de IF anidados
    Los IF anidados suponen un uso intensivo de memoria y CPU. Intentar trasladar esta lógica a nivel de script o reducir las evaluaciones.
  • Evitar IF en expresiones de Gráficos o tablas
    Es importante evitar utilizar los IF en los títulos de tablas, CONDITIONS para mostrar un objeto y textbox.
  • Reducir comparativa entre campos de tipo texto
    Utilizando siempre que sea posible tablas lookup o bien fabricar una clave numérica con la función autonumeric.
  • Eliminar o reducir uso de MACROS
  • Reducir uso de Show Frequency (Presentation)
    Se utiliza normalmente en los MultiBox y ListBox.
  • Reducir el número de objetos de cada hoja
    Eliminar objetos redundantes u ocultos. Administrar correctamente el uso de charts, textbox, etc.
  • Minimizar uso de Set Analysis en tablas grandes
  • Reducir uso de tablas pivotantes en aplicaciones grandes
  • Evitar funciones al vuelo como “inmonth”, etc
  • Utilizar cargas de datos binarias de periodos históricos o datos no sensibles a cambio
  • Reducir número de CHART abiertos en cada hoja
    En su lugar, mostrarlos minimizados si es posible.
  • Calculate Condition para limitar datos en tablas y charts
  • Utilizar variables o set analysys en lugar de cálculos complejos en las expresiones

 

Recomendaciones: expresiones

Count ( Distinct ‘FieldName’)

Reemplazar el count() por un sum() y el cualificador “distinct” por el valor número 1 para cada ocurrencia distinta del campo.

Load
Alfa,
if (peek(‘Alfa’)=Alfa,0,1) as Flag1,
Num
resident table_1
order by Alfa Asc;

En este caso, la función PEEK compara cada valor del campo “Alfa” con el valor leído anteriormente. Si los valores son iguales, se asigna un 0, si son diferentes, se asigna un 1. El número de valores distintos será sum(Flag1). Es importante que la tabla esté ordenada por el campo Alfa.

Otra alternativa es una query sencilla con los distintos valores:

Load
Distinct Alfa,
Alfa as AlfaDist
resident table_1;

 

If ( Condition(Text),…..)

Mapear los campos de tipo texto a números. Por ejemplo, utilizando la función Autonumber. La expresión de esta forma sería: If (Alfa= ‘ABC’, ‘ABC’, left (Alfa, 2)).

Load
*,
Alfa = ‘ABC’, 1, 0) as Flag
resident table_1 ;

La expresión cambiaría a  If ( Flag = 1,’ABC’, left (Alfa, 2))

 

Sum ( If (Condition, ‘FieldName’…))

En este caso la agregación se hace en tiempo de ejecución y repercute en el consumo de memoria. Si es posible, es preferible hacer el cálculo a nivel de SCRIPT.

 

If ( Condition1, Sum(‘FieldName’),

La lógica de IF anidados es conceptualmente sencilla, pero normalmente es complicado administrarla. Una gran cantidad de IF anidados supone un uso intensivo de CPU y memoria. Es recomendable revisar los IF anidados para intentar reducir el número de anidaciones. Otra opción es cuando sea posible, sustituir los IF por variables, por ejemplo Quantity*Price donde Price es una variable.

 

Sort text

QV automáticamente evalúa si un campo debe tratarse como número, texto o “general”. Los campos evaluados como texto se ordenan como text, que es la forma más lenta. Esto puede reemplazarse manualmente desde el script.

 

Dynamic captions and text objects

Se pueden utilizar expresiones en prácticamente cualquier objeto que permita introducir texto. Una expresión se evalúa en función de su entorno, por ejemplo, si están definidas en un gráficos o tablas (pivotantes o straight) sólo se calculan cuando estos objetos están activos (no cuando están minimizados). Por otro lado, si tenemos expresiones en el título de un objeto, en el show o calculation condition se evalúan cada vez que se hace una selección.

 

Macro triggers ( “on change” )

Cuidado con lanzar macros en cascada o de forma recursiva generando bucles.

 

Checklist de optimización módulos Qlikview

En uno pdf de documentación oficial de Qlikview se distribuye una hoja excel muy útil para el equipo de desarrollo a modo de checklist de los elementos que hay que revisar para garantizar una buena optimización de un módulo. Podéis descargar la versión traducida al castellano desde aquí.

Checklist optimización módulo qlikview

 

Sin Comentarios

9 estrategias para que tus reuniones sean muy eficaces

9 estrategias para que tus reuniones sean muy eficaces
Infografía ofrecida por Wrike – Gestor Proyectos Online

Sin Comentarios

Crea una web dinámica sin programar

Hasta ahora, si querías una página web y no sabías programar, podías utilizar gestores de contenido como Wix que ofrecen una plantilla, multitud de funcionalidades extra y un gestor muy amigable para introducir y personalizar el contenido. Sin embargo, si el proyecto es un poco más ambicioso, este tipo de herramientas se quedaba a medio camino. ¿Te gustaría publicar tu colección completa de videojuegos o de un grupo de música? ¿gestionar listados de usuarios o clientes? ¿ofrecer a los usuarios que se registren en tu boletín de noticias? Para este tipo de funcionalidades web es imprescindible utilizar bases de datos, pero el conocimiento técnico va un poco más allá del HTML y CSS. Necesitarás conocer herramientas de gestión de base de datos para construir un modelo relacional de tablas en MySQL o PostgreSQL (por mencionar algunas). Cómo acceder a la información almacenada mediante queries e incluso interactuar con ésta mediante scripts DML para modificar, crear o borrar datos. Como veis, ya no sólo tendríamos que enfrentarnos a pintar el contenido en una web, si no a cómo administrar la información. Por suerte para muchos, Wix ha lanzado recientemente una mejora sustancial de su entorno de desarrollo que simplifica y facilita enormemente esta tarea: WIX Code. Sin tener conocimientos de programación avanzados y de base de datos, ahora sabrás cómo hacer una página web dinámica fácilmente.

Crea una web dinámica sin programar

Para explicar cómo funciona esta herramienta, vamos a centrarnos en un ejemplo práctico que precisamente fue la primera página que tuve que diseñar hace años para un vecino: quería publicar en una web toda su colección de cassettes, discos y vinilos LP / 7” del cantante Raphael (estamos hablando de más de 400 discos en varios idiomas). Mi vecino quería que cada disco tuviera su portada, datos del mismo (año de publicación, idioma, etc) así como todas las canciones que lo componían. Por aquel entonces, sin conocimientos de acceso a base de datos, tuve que picar a mano una a una todas las páginas. Tarea monstruosa, especialmente cuando había que hacer algún cambio que afectaba a todas las páginas.

¿Cuál hubiera sido la forma ideal de hacerlo? Guardar toda la información de los discos y las canciones en una base de datos. Diseñando una única página de contenido dinámico, se pintarían los datos de cada disco en función de los parámetros recibidos. Pero sin conocimientos avanzados de programación, esto es imposible. Si por aquel entonces hubiera existido Wix Code, lo podría haber hecho en menos de la mitad de tiempo y con un mantenimiento posterior ínfimo.

Lo que ofrece esta nueva herramienta es un entorno de trabajo en el que gestionaremos la información de forma amigable a través de una interfaz similar a una hoja de cálculo tipo Excel, aunque por detrás y de forma transparente al usuario, se almacena en una tabla de base de datos. Dentro del entorno de Wix Code, podremos crear Colecciones (lo que serían tablas en una BBDD convencional). Una colección es una hoja de cálculo en la que las columnas especifican el tipo de información y las filas serían cada elemento. En nuestro caso práctico, crearíamos una colección donde las columnas podrían ser Nombre, Año de publicación, Tipo, Idioma y Canciones. En las filas introduciríamos los datos de cada disco. Respecto a las Colecciones, comentar que podemos configurarlas para que además del propio administrador, cualquier usuario pueda interactuar con los datos (modificando, borrando o creando nuestros registros).

Una vez tenemos los datos almacenados en nuestra colección, los utilizaremos para poblar una página de contenido dinámico. A través del asistente, crearemos este tipo de página  y la asignaremos la colección de discos.  En este punto, debemos especificar un valor único que identifique de forma unívoca cada disco para generar su propia dirección URL. Para ello podríamos utilizar el título, o para ser más eficientes, en el proceso de creación de la colección crearíamos un campo numérico incremental que usaremos como “identificador” (1, 2, 3…). Dentro de la página de contenido dinámico, diseñaremos una plantilla para pintar el contenido de cada disco (imagen, título, canciones, etc).

Crea una web dinámica sin programar

Pero Wix Code no sólo ofrece esto. Imaginaros otro caso práctico con el que me topé hace muchos años cuando administraba un foro. Queríamos organizar un boletín de noticias semanal con información relevante para los usuarios, pero por ley de protección de datos sólo podíamos enviar la comunicación a los que hubieran concedido explícitamente su permiso. Para ello diseñamos un formulario en el que los usuarios introducían su e-mail y nos llegaba un correo con la solicitud. Manualmente lo introducíamos en un fichero Excel y cuando había que enviar la comunicación, copiábamos los correos electrónicos de la lista. ¿Principal problema? Que sólo había un Excel, ubicado en mi ordenador. Si otro administrador quería utilizar la lista, tenía que enviársela actualizada. Al igual que en el caso anterior, si hubiera tenido conocimientos más avanzados de programación, en lugar de mandar por correo electrónico la solicitud, hubiera guardado los e-mails de los usuarios en una base de datos que explotaría en el momento de enviar las comunicaciones. Con Wix Code podemos hacer esto sin tocar nada de código. Crearemos una colección para almacenar la información (por ejemplo, nombre y e-mail del usuario) que vincularemos con un form diseñado en el entorno de desarrollo de Wix. De esta forma, podremos mantener nuestro boletín de una forma mucho más eficiente. Un paso más allá, sería aprovechar la propia tecnología de Wix Code para generar una sección de backend desde donde podremos gestionar los datos de la colección. A través de una pantalla podríamos añadir, borrar o modificar datos.

Otra de las posibilidades que ofrece la herramienta son las interacciones con el usuario mediante acciones javascript (cuando se pulse un botón que se pinte un tooltip, por ejemplo). En realidad, utiliza el framework jQuery, que facilita enormemente el uso de javascript, como el acceso DOM a los elementos web. Es cierto que para estas opciones es necesario tener ligeros conocimientos de programación, pero el entorno de desarrollo de Wix Code está preparado para ofrecer dinámicamente una serie de opciones utilizando una práctica habitual en IDEs de desarrollo: pulsando CTRL+espacio aparecerá una ventanita con los métodos o acciones disponibles para el objeto con el que estemos trabajando.

Como veis, por suerte ahora tenemos a nuestra disposición herramientas que facilitan el acceso al diseño de páginas web complejas y elaboradas sin necesidad de tener conocimientos específicos de programación.

 

 

Sin Comentarios

Herramientas para analizar y monitorear servidor de Qlikview

Últimamente estamos haciendo foco en mejorar el rendimiento de los módulos de Qlikview, ya que alguno de ellos con más 180 millones de registros está bloqueando el servidor de forma intermitente (una máquina con 128 GB de RAM y 8 cores). Hace unas semanas publicamos recomendaciones y buenas prácticas tanto en la configuración del servidor como en el desarrollo de los informes en Qlikview. En esta ocasión, os proponemos tres herramientas gratuitas y distribuidas por Qlikview o su comunidad para analizar qué módulos son los que debemos optimizar y concretamente en qué puntos actuar.

 

Descargar herramientas optimización Qlikview
Qlikview Governance Descargar Qlikview Governance
Qlikview Optimizer Descargar Qlikview Optimizer
Qlikview Document Analyzer Descargar Qlikview Document Analyzer

Qlikview Governance [descargar]

Herramienta oficial que se nutre de los logs del servidor para analizar el consumo de los recursos de la máquina, licencias y estadísticas de módulos. La primera vez que se ejecuta el Governance es necesario configurar la ruta donde se ubican los módulos y los correspondientes logs (recordad que es necesario que en Document Settings tengamos habilitado generar logs de cada módulo). Con este módulo principalmente podemos explotar la información relacionada con:

  • Uso de RAM y memoria virtual del servidor. Permite analizar los responsables (módulos y usuarios) de dicho consumo, así como ubicar temporalmente los picos y horas valle.
  • Licencias, usuarios concurrentes y sesiones de usuario. Especialmente indicado en la gestión de una cartera de licencias limitada.
  • Nivel de complejidad de módulos, en esta pantalla se analizar un ranking de los módulos más complejos en relación al nº de registros, peso, usuarios que acceden (sesiones), cantidad de objetos, expresiones, cíclicos, etc.

Es una herramienta fundamental e imprescindible en el día a día. Nosotros la recargamos diariamente como tarea del Publisher.

Qlikview Governance download

Qlik Optimizer [descargar]

Este módulo nos va a ofrecer de un vistazo qué elementos de un informe o módulo Qlikview son los que más memoria RAM consumen. Nos permite seleccionar el tipo o subtipo de elemento a analizar y además, se pueden hacer comparaciones entre varios módulos. Para poder trabajar con esta herramienta es necesario generar un fichero .mem de los módulos que vamos a analizar. Para ello, abrimos cada módulo, pulsamos en Settings > Document Properties > General y hacemos clic en el botón Memory Statistics…Aparecerá una ventana modal para seleccionar la ubicación donde depositar el fichero .mem. Al arrancar por primera vez Qlik Optimizer seleccionaremos esta ubicación y recargamos datos.

Qlik optimizer descarga

Algunas consultas que podemos analizar con esta herramienta:

  • Descubrir la tabla del modelo de datos más pesada haciendo drill down sobre el gráfico de tarta seleccionando database > table > records.
  • Buscar los objetos que más tiempo de cálculo necesitan. Para ello nos centramos en la tarta de la derecha.
  • Analizar granularidad de los datos (nº de valores distintos de un mismo campo). Utilizando el filtro de subtype filtramos por “Symbols” para identificar estos campos. Normalmente son claves, métricas (indicadores) o fechas. En este último caso podemos encontrar campos datetime de los que sólo nos interesa la fecha, no la hora, por lo que podríamos reducir su granularidad convirtiéndolos a formato date.

Qlikview Document Analizer [descargar]

Al abrir la herramienta debemos configurar qué módulo vamos a analizar. Especificamos la ruta donde se encuentre y pulsamos el botón EXTRACT METADATA. Una vez generada, aparecerá un popup y podremos pulsar en el botón RELOAD. Con esta herramienta podremos:

  • Identificar los campos que se cargan en el modelo y no se utilizan. Podremos generar una sentencia DROP FIELD con todos ellos para añadir al final del script. Hay que revisar bien estos campos, porque suele haber falsos positivos (por ejemplo, si algún campo se utiliza en una expresión personalizada, a veces se detecta como no utilizada).
  • Analizar las expresiones que utilizan Count() (recordad que es recomendable evitar los count distinct, en su lugar, lo ideal es utilizar un flag con 1 y 0); otras que utilicen IF anidados y ver su complejidad (intentar reducirlos al máximo posible); uso de SET Analysis, etc.
  • Recomendaciones para optimizar el módulo: normalmente son para configurar como autonumber las claves que usamos para romper tablas sintéticas o convertir a formato numérico las dimensiones cuyos valores son números.

Qlikview Document Analyzer

Sin Comentarios