domingo, 2 de noviembre de 2008

Aplicaciones prácticas Qlikview: ¿Cómo hacer que el usuario compare 2 volúmenes de datos a su libre albedrío?


Hola. Con esta entrada voy a comenzar a explicar una serie de aplicaciones prácticas utilizando QlikView 8.5 que podéis aplicar en vuestras aplicaciones. Algunas de estas están extraídas de los mismos ejemplos que se pueden descargar de la web de QlikView (http://www.qliktech.com/) como la que voy a publicar a continuación.



El ejemplo consiste en utilizar funcionalidad nueva para permitir que, en una gráfica (por ejemplo), el usuario pueda comparar 2 conjuntos de valores diferentes para un campo determinado.


En el ejemplo tenemos ventas por productos y queremos que el usuario pueda comparar todas las ventas de una serie de productos, con otra suma de otros productos. Estos dos conjuntos, como cosa interesante, los crea el usuario en tiempo de ejecución.



En este ejemplo vamos a tocar los siguientes aspectos:


  • Set Análysis: Este ejemplo se resuelve de una forma más "rentable" utilizando esta nueva funcionalidad de lógica de conjuntos.



  • Editor de módulo: para definir los conjuntos, utilizaremos 2 pequeñas funciones de código para rellenar los valores de 2 variables definidas en el documento.



  • Variables de documento: utilizaremos 2 variables para almacenar las selecciones del usuario para el "GRUPO 1" y para "GRUPO 2".



  • Editor de script de carga: utilizaremos la sentencia LOAD InLine para realizar una carga de datos internos al documento, es decir, cargamos "a piñón" unos datos de venta para unas categorías que también se cargará con la sentencia InLine. Podríamos haberlo hecho con una excel o una tabla de SQL.

Os recomiendo que practiquéis con un documento nuevo y lo hagáis desde cero. Para ello cargaremos unos datos ficticios de venta en el script utilizando la sentencia "InLine".


Menú "Archivo" > "Nuevo"


Creamos las 2 variables que , más tarde, utilizaremos llamadas "Seleccion 1" y "Seleccion 2" y no definiremos ninguna regla de entrada y las dejaremos tal cual.


Menú "Configuraciones" > "Propiedades del documento" > "Variables" > "Nueva"


"Ctrl + Alt + D"


Abrimos el editor de script ("ctrl + E") y creamos 3 tablas: "CATEGORIAS", "ARTICULOS" y "VENTAS" utilizando las siguientes sentencias:


CATEGORIAS:


Load * inline[IdCategoria, Categoria


1,Bebidas


2,Snacks


3,Sopas


4,Postres


5,Golosinas];



ARTICULOS:


Load * inline


[IdArticulo, Nombre, IdCategoria


1,Zumo Naranja,1


2,Zumo Tomate,1


3,Coca-cola,1


4,Tea,1


5,Cacahuetes,2


6,Pipas,2


7,Gusanitos,2


8,Sopa de verduras,3


9,Sopa de fideos,3


10,Profiteroles,3


11,Tarta de arándanos,4


12,Tarta de queso,4


13,Chicles menta,5


14,Chicles fresa,5];




VENTAS:


Load * inline


[fecha,IdArticulo,Importe


01-01-2008,1,200.5


01-01-2008,3,150


01-01-2008,2,75


01-01-2008,5,10


01-01-2008,6,15


01-01-2008,9,250


01-01-2008,10,100


01-01-2008,11,90


01-01-2008,12,140.5


01-01-2008,14,25


02-01-2008,1,100


02-01-2008,3,45


02-01-2008,4,30


02-01-2008,6,4


02-01-2008,7,25


02-01-2008,10,100


02-01-2008,12,175


02-01-2008,13,5


03-02-2008,2,40.55


03-02-2008,3,50


03-02-2008,4,75


03-02-2008,8,34


03-02-2008,10,75


03-02-2008,11,74


03-02-2008,13,3];




Guardamos el documento en la carpeta que queramos, y ejecutamos el script.



Una vez finalizada la recarga del script, ahora vamos a crear un gráfico para comprobar que podemos sacar las ventas por categoría. Creamos un nuevo objeto de tipo "gráfico" y seleccionamos el tipo "gráfico de barras", seleccionamos la dimensión "Categoría" y como expresión "Sum(Importe)". El resultado se debería parecer a lo siguiente

A continuación, vamos a añadir a nuestra hoja un cuadro de lista para que el usuario pueda seleccionar los valores para el campo "Categoría" y hacer los grupos.

Añadimos 2 botones llamados respectivamente "Seleccionar Grupo 1" y "seleccionar Grupo 2".



Accedemos al editor de módulo (Ctrl + M) y creamos 2 rutinas



Sub Seleccion1
End Sub



Sub Seleccion2
End Sub



y las asociamos respectivamente a los botones anteriormente creados.



El código de las 2 rutinas es el siguiente:





Sub Seleccion1


set mySelections = ActiveDocument.fields("Categoria").GetSelectedValues
dim SelectedItems if mySelections.Count <> 0 then


for i = 0 to mySelections.Count - 1
SelectedItems = SelectedItems + """" + mySelections.Item(i).text +
"""" + "," next SelectedItems = left(SelectedItems,
len(SelectedItems) - 1)


set v = ActiveDocument.GetVariable("Seleccion 1")


v.SetContent SelectedItems,true


Else


set v = ActiveDocument.GetVariable("Seleccion 2")


v.SetContent "",true


End
if ActiveDocument.fields("Categoria").Clear


End Sub




Sub Seleccion2


set mySelections = ActiveDocument.fields("Categoria").GetSelectedValues
dim SelectedItems if mySelections.Count <> 0 then


for i = 0 to mySelections.Count - 1


SelectedItems = SelectedItems + """" + mySelections.Item(i).text + """" + ","


next


SelectedItems = left(SelectedItems, len(SelectedItems) - 1)


set v = ActiveDocument.GetVariable("Seleccion 2")


v.SetContent SelectedItems,true


Else


set v = ActiveDocument.GetVariable("Seleccion 2")


v.SetContent "",true


End


if ActiveDocument.fields("Categoria").Clear


End Sub



Una vez que ya tenemos el código y hemos asociado las rutinas a los botones ya estamos preparados para crear un gráfico que represente la suma de las 2 selecciones.



Creamos un gráfico sin dimensiones y le añadimos 2 expresiones




  1. Sum({$<[Categoria]={$(Seleccion 1)}>} Importe)



  2. Sum({$<[Categoria]={$(Seleccion 2)}>} Importe)


El truco está en que utilizando "Set Analysis" somos capaces de definir una selección fija independiente de las del documento, solo que como novedad, no tiene por qué ser una selección fija sino depender de una variable ("seleccion 1") que lo hace dinámico al usuario. Qlikview sustituirá antes de evaluar la expresión ( a esto se le llama expansión de una variable) $(variable) por algo como {"Postres","Bebidas", ...}.



El gráfico quedaría más o menos de la siguiente manera...


Ahora ya podéis comprobar el resultado para lo que debéis seleccionar varias categorías y entonces pincháis en el botón 1, volvéis a seleccionar otras categorías y pincháis en el botón 2 y váis viendo cómo cambia la última gráfica.


Además, podéis comprobar que aunque el usuario haga otras selecciones, la gráfica no cambia.


Para terminar vamos a agregar una línea de referencia en el gráfico que represente la media de las ventas, para esto editamos las propiedades del gráfico, en la pestaña "presentación", creamos una línea de referencia con la expresión
AVG({1} Importe).


Saludos.

1 comentario:

Anónimo dijo...

Para que este ejemplo funcione, el código debe estar indentado de otra forma:

Sub Seleccion1

set mySelections = ActiveDocument.fields("Categoria").GetSelectedValues

dim SelectedItems

if mySelections.Count <> 0 then

for i = 0 to mySelections.Count - 1
SelectedItems = SelectedItems + """" + mySelections.Item(i).text + """" + ","
next

SelectedItems = left(SelectedItems, len(SelectedItems) - 1)

set v = ActiveDocument.GetVariable("Seleccion 1")

v.SetContent SelectedItems,true

Else

set v = ActiveDocument.GetVariable("Seleccion 2")

v.SetContent "",true

End if

ActiveDocument.fields("Categoria").Clear

End Sub



Sub Seleccion2

set mySelections = ActiveDocument.fields("Categoria").GetSelectedValues
dim SelectedItems

if mySelections.Count <> 0 then

for i = 0 to mySelections.Count - 1

SelectedItems = SelectedItems + """" + mySelections.Item(i).text + """" + ","

next

SelectedItems = left(SelectedItems, len(SelectedItems) - 1)

set v = ActiveDocument.GetVariable("Seleccion 2")

v.SetContent SelectedItems,true

Else

set v = ActiveDocument.GetVariable("Seleccion 2")

v.SetContent "",true

End if

ActiveDocument.fields("Categoria").Clear

End Sub