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

martes, 29 de diciembre de 2020

Visionado condicional del valor de una dimensión

Tenemos datos de apartamentos turísticos y las valoraciones que de ellos hacen los usuarios. Estas valoraciones están agrupadas por categorías. 
Una vez cargados los datos en el modelo, mediante el script añadimos un valor ficticio que contiene las puntuaciones máximas que pueden obtener en cada categoría. Esta puntuación máxima la tratamos como si fuera un apartamento más, o sea, será un valor más de la tabla de apartamentos.

 Lo que queremos es que en un gráfico de tabla pivotante aparezca y desaparezca este valor ficticio a voluntad del usuario. (columna azul de la siguiente tabla) 

 

Obviamente, si tenemos un cuadro de lista con los apartamentos, basta con que el usuario seleccione los que quiera ver y seleccionando el valor “Puntuación Máxima” verá o no la columna azul.


Esta es la solución perfecta cuando el listado de apartamentos tiene pocos elementos, pero como en este caso la lista puede llegar a ser muy larga, no queremos que el usuario tenga que marcar o desmarcar en el cuadro de lista porque por error puede eliminar el resto de selecciones.

Por tanto hemos ideado el siguiente mecanismo:

1º - Creamos una variable que controlará la visualización de los 2 iconos que crearemos a continuación:

LET vL.Punt_Max_SN = 1;

2.-  Creamos un cuadro de texto con esta imagen de fondo y estas propiedades:


 Donde la expresión es:

='("' & Concat(DISTINCT Apartamentos, '"|"') & '"|" Puntuación Máxima")'

 

3.-  Creamos otro cuadro de texto con esta imagen de fondo y estas propiedades:


Donde la expresión es:

='("' & Concat(DISTINCT {<Apartamentos -= {' Puntuación Máxima'}>} Apartamentos, '"|"') & '")'

 

Esta expresión lo que hace es deseleccionar el valor “Puntuación Máxima” del campo Apartamentos.

Y por último, en la pestaña de diseño:


Los iconos aparecerán y desaparecerán de pantalla según el valor de la variable vL.Punt_Max_SN. Ambos estarán ubicados justo en la misma posición para simular el efecto de que efectivamente se trata de un switch.

La acción “seleccionar en campo” permite introducir valores en la caja “Buscar cadena de texto”:

  •          Si el campo es numérico, basta con escribir el nº.
  •          Si el campo es alfanumérico:  Se puede introducir el valor tal cual o entre comillas simples. Funciona igual de las dos formas y da igual que el valor tenga espacios en blanco. Ej: Aires de Casla.

Cuando se trata de una multiselección, el formato que se debe escribir en la caja “Buscar cadena de texto” debe ser:

  •          Si es el campo es numérico: (valor1|valor2|valorn)
  •          Si el campo es alfanumérico:  (“valor1”|”valor2”|”valorn”)

Debe observarse que los valores van entre paréntesis y separados por el carácter ‘|’. Además en el caso de valores alfanuméricos, cada uno de ellos se escribe entre comillas dobles ‘ “ ‘ .

 Por tanto, la expresión del switch gris:

 ='("' & Concat(DISTINCT Apartamentos, '"|"') & '"|" Puntuación Máxima")'

 Lo que hace es añadir el valor “ Puntuación Máxima” a las selecciones realizadas en el campo apartamentos, mientras que la expresión del switch verde lo quita:

 ='("' & Concat(DISTINCT {<Apartamentos -= {' Puntuación Máxima'}>} Apartamentos, '"|"') & '")'

 


 

 

 

 






domingo, 18 de noviembre de 2018

► Cómo evitar IF anidados


Cuando tenemos que aplicar expresiones distintas en función del valor que tome una dimensión, podemos hacerlo de varias formas.

Ej: If (dimension =1, expr1,
        If (dimension=2, exp2,
            If (dimension=3, exp3,
                If (dimension=x, exprx))))

      1Usando la función PICK(). Esto sólo lo haremos cuando los valores de la dimensión sean números naturales.

            Pick(dimensión, expr1, expr2, expr3……exprx)

Una forma rápida de crear esta función pick es hacerlo dinámicamente usando CONCAT() en lugar de escribir una función larguísima que contenga todas las expresiones. Así mejoramos el mantenimiento y la legibilidad.
Para hacerlo, hay que meter todas las expresiones en un campo en una isla de datos. El origen puede ser un inline, una Excel o un fichero de texto. Lo único que hay que tener en cuenta es que deben estar ordenadas según el valor de la dimensión y el orden que ocuparán en la función PICK().
Ejemplo: Imaginemos que tenemos una dimensión “Dim_x” con los valores 1, 2 y 3 y que según el valor que tome se aplique una expresión u otra: Para el valor 1 hará la suma del campo1, para el valor 2 hará la media y para el valor 3 obtendrá la moda.
Tenemos este inline:

ISLA_DATOS:
LOAD * INLINE [
Orden,    Expresion
1,        SUM(campo1)
2,        AVG(campo1)
3,        MODE(campo1)
];

En las expresiones de gráficos u objetos sustituiremos los if anidados por esta única expresión:

PICK(Dim_x, $(=CONCAT(Expresion, ’,’ ,Orden)))

Observad que los argumentos de CONCAT son las columnas del INLINE
 

    2)   Con expansión del signo $. De esta forma los valores de la dimensión no tienen por qué ser numéricos.
A diferencia del ejemplo 1 en el que las diferentes expresiones se introducían en un campo de una isla de datos cuyo origen era un inline, un Excel o cualquier otra fuente, aquí crearemos una variable por cada expresión.
El nombre de cada variable debe tener un formato muy concreto: una raíz común + cada valor posible de la dimensión:

Ejemplo 1: Suponiendo que tenemos una dimensión “Dim_x” con los valores 1, 2 y 3
Creamos las variables:

       SET Var_1 = SUM(campo1);
      SET Var_2 = AVG(campo1);
      SET Var_3 = MODE(campo1);

Ejemplo 2: Suponiendo que la dimensión “Dim_x” tenga los valores Madrid, Málaga y Bilbao

Creamos las variables

SET Var_Madrid = SUM(campo1);
          SET Var_Málaga = SUM(Campo1*0,05);
          SET Var_Bilbao =  SUM(campo1*0,02);

En los objetos sustituimos los if anidados por esta expresión:

                             =$(='Var_'&ONLY(Dim_x))


3)  Usando la función ALT().
Esta opción es la menos recomendable porque se ejecuta casi igual que los IF anidados, pero al menos facilita la lectura y comprensión de la expresión. 
Se debe usar sólo cuando no se puedan evitar los IF anidados, como por ejemplo en el Script.
Sólo funciona cuando los valores devueltos son números. No funciona si devuelve cadenas de caracteres.
Usando el ejemplo 2, lo podemos transformar por:


 ALT(
      IF(Dim_x=’Madrid’, SUM(campo1)),
      IF(Dim_x=’Málaga’, SUM(Campo1*0,05)),       
      IF(Dim_x=’Bilbao’, SUM(campo1*0,02)),
      0
    );