Bienvenidos al tercer blog de una serie dedicada a compartir cinco ejercicios centrados en la creación de menús diseñados para la selección de elementos dentro de una jerarquía. Nuestra meta es que estos menús no solo cumplan la función de selección, sino que también actúen como filtros, integrando un diseño atractivo (UI) y una interacción amigable (UX).

En esta ocasión nos enfocaremos en la creación de un filtro de selección múltiple para una jerarquía de tres niveles: Todo, Categorías y Sub-Categorías. El filtro permitirá a los usuarios el elegir o eliminar uno o múltiples valores a nivel de Sub-Categoría, o a nivel categorías e incluso realizar selecciones a nivel total.

A diferencia del ejercicio anterior, en el que trabajamos con una jerarquía de dos niveles, ahora, al abordar una jerarquía de tres niveles, se requiere ampliar el manejo del modo de inclusión/exclusión a dos niveles de la jerarquía. Esta condición debe aplicarse y analizarse en cada uno de los niveles de los nodos padres de la jerarquía: ‘All’ y ‘Categoría’.

Para determinar si una Sub-Categoría está seleccionada, es necesario evaluar tanto el modo de inclusión/exclusión de cada uno de sus nodos padres hasta llegar al nodo raíz como verificar si la Sub-Categoría está listada en el parámetro dedicado para este propósito.

Ahora, adentrémonos entre bastidores para comprender cómo opera esta combinación de factores.

Como se puede observar, la clave radica en comprender qué sucede cuando una o más condiciones no se cumplen. Por ejemplo, si una de las tres condiciones no se cumple, el resultado es que la Sub-Categoría no se encuentra seleccionada. En cambio, si dos de las tres condiciones no se cumplen, podemos considerar que las condiciones se neutralizan entre sí, algo similar a multiplicar -1 por -1, dando como resultado que la Sub-Categoría se considere seleccionada.

Adicionalmente, en este ejercicio, emplearemos una técnica que nos brinda la capacidad de densificar datos mediante el uso de un modelo de datos relacional. En este modelo, conectaremos los datos de Superstore a una tabla Scaffold que incluirá los valores cero, uno y dos, correspondientes a los tres niveles de la jerarquía en la que nos centraremos.

¡Prepárense para explorar este nuevo ejemplo de jerarquías, diseño de filtros y de densificación de datos! ¡Comencemos!

PASO 1. DEFINIR EL MODELO DE DATOS REQUERIDO PARA APLICAR LA TÉCNICA DE DENSIFICACIÓN DE DATOS.

Utilizaremos un modelo relacional que establecerá una conexión entre la fuente de datos proporcionada por Tableau, conocida como ‘Superstore’ y una tabla de soporte diseñada de manera específica para apoyar el proceso de Scaffold. En esta tabla se encuentra un único dato denominado ‘Level’. Cada valor de este campo representará un nivel de la jerarquía, siendo 0) Total, 1) Categoría y 2) Sub-Categoría.

La vinculación entre ambas tablas se establecerá a través de la creación de un nuevo cálculo, asignando el valor ‘TRUE’ en los cálculos de ambas tablas, lo que garantizará una asociación a nivel de registro entre ellas.

PASO 2. DEFINIR PARÁMETROS.

Además del parámetro destinado a almacenar las opciones del menú, denominado ‘P.Check’, introduciremos un segundo parámetro llamado ‘P.Mode’. Este nuevo parámetro tiene como objetivo simular internamente si las opciones almacenadas en el primer parámetro deben ser consideradas ‘Incluir Valores’ o ‘Excluir Valores’ al momento de decidir si dichos valores se encuentran o no seleccionados.

PARAMETERTYPEALLOWABLE VALUESCURRENT VALUE
P.ModeStringAll»All=TRUE»
P.CheckStringAll 

PASO 3. DEFINIR LOS CAMPOS PARA LA JERARQUÍA Y EL MENÚ.

Modificar la clasificación del campo ‘Level’ para que sea reconocido como una dimensión y luego proceder a generar los campos que representen la jerarquía de cada nodo en el árbol.

HierarchyCASE [Level]
WHEN 0 THEN ‘All’
WHEN 1 THEN ‘All’ + ‘ | ‘ + [Category]
WHEN 2 THEN ‘All’ + ‘ | ‘ + [Category] + ‘ | ‘ + [Sub-Category]
END

Ahora, avanzaremos hacia la definición del campo que se utilizará como filtro en las gráficas asociadas al menú de filtrado. Esta fórmula evaluará las tres condiciones mencionadas al inicio del post: 1) Modo para ‘All’, 2) Modo para ‘Categoría’ y si 3) La ‘Sub-Categoría’ se encuentra enlistada.

Is Selected?IIF(STARTSWITH([P.Mode], ‘»All=TRUE»’), 1, -1) *
IIF(CONTAINS([P.Mode], ‘»’ + [Category] + ‘=FALSE»’), -1, 1) *
IIF(CONTAINS([P.Check], ‘»’ + [Sub-Category] + ‘»’), 1, -1) = 1

Posteriormente, abordaremos la definición de los campos visibles del menú. El campo de ‘Menu’ contendrá la etiqueta, el campo ‘Indent’ nos permitirá como su nombre lo indica dar un espaciado a la izquierda dependiendo del nivel del nodo y por último, el campo ‘Shape’ nos permitirá visualizar si la opción se encuentra seleccionada total o parcialmente o no se encuentra seleccionada.

MenuCASE [Level]
WHEN 0 THEN ‘All’
WHEN 1 THEN [Category]
WHEN 2 THEN [Sub-Category]
END
Indent0.03 + ([Level] * 0.07)
// Aggregation = Minimum
ShapeIIF([Level] = 2, IIF([Is Selected?], ‘Checked’, ‘Unchecked’),

IIF({FIXED [Hierarchy] : MIN([Is Selected?])} = {FIXED [Hierarchy] : MAX([Is Selected?])},

IIF({FIXED [Hierarchy] : MAX([Is Selected?])}, ‘Checked’, ‘Unchecked’),  ‘Partial’))

Posteriormente, avanzaremos hacia la definición de los campos necesarios para actualizar ambos parámetros.

Check?IIF([Level] = 2, [Is Selected?], {FIXED [Hierarchy] : MIN([Is Selected?])})
Substring P.CheckIIF(FIND([P.Check], ‘|’ + [Category] + ‘»’) = 0, ”,
MID([P.Check], FIND([P.Check], ‘|’ + [Category] + ‘»’)))
Next P.CheckCASE [Level]

WHEN 0 THEN ”

WHEN 1 THEN REPLACE([P.Check], LEFT([Substring P.Check], FIND([Substring P.Check], CHAR(13))), ”)

WHEN 2 THEN
IIF(CONTAINS([P.Check], ‘|’ + [Category] + ‘»’),    
IIF(CONTAINS([P.Check], ‘»’ + [Sub-Category] + ‘»’),        
REPLACE([P.Check], ‘»’ + [Sub-Category] + ‘»’, ‘»’),        
REPLACE([P.Check],             
LEFT([Substring P.Check], FIND([Substring P.Check], CHAR(13)) – 1),              LEFT([Substring P.Check], FIND([Substring P.Check], CHAR(13)) – 1) + [Sub-Category] + ‘»’)),    
[P.Check] + ‘|’ + [Category] + ‘»’ + [Sub-Category] + ‘»’ + CHAR(13))

END
Next P.ModeCASE [Level]

WHEN 0 THEN IIF([Check?], ‘»All=TRUE»’, ‘»All=FALSE»’)

WHEN 1 THEN
IIF(STARTSWITH([P.Mode], ‘»All=TRUE»’),    
IIF([Check?], REPLACE([P.Mode], ‘»’ + [Category] + ‘=FALSE»’, ‘»’ ),        
[P.Mode] + IIF(FIND([P.Mode], ‘»’ + [Category] + ‘=FALSE»’) = 0, [Category] + ‘=FALSE»’, ”)),    
IIF(NOT [Check?], REPLACE([P.Mode], ‘»’ + [Category] + ‘=FALSE»’, ‘»’ ),         IIF(CONTAINS([P.Mode], [Category] + ‘=FALSE»’), [P.Mode], [P.Mode] + [Category] + ‘=FALSE»’)))

WHEN 2 THEN [P.Mode]

END

PASO 4. DEFINIR LOS CAMPOS PARA CANCELAR EL RESALTADO AL MOMENTO DE SELECCIONAR UNA DE LAS OPCIONES.

HLTRUE
UHLFALSE

PASO 5. CONSTRUIR EL GRAFICO DEL MENÚ.

Crear un sheet con el nombre ‘Ex3’.

Mover los campos de ‘Hierarchy’ y ‘Menu’ al estante de renglones. Ocultar el ‘Header’ para ambos campos.

Mover el campo ‘Indent’ previamente definido con agregación de ‘Minimum’. Editar el eje en un rango de 0 y 1 y ocultarlo. Ocultar las líneas y los gridlines.

Definir tipo de gráfico de ‘Shape’. Mover el campo ‘Menu’ al estante de ‘Label’ y el campo de ‘Shape’ al estante del mismo nombre. Seleccionar las shapes deseadas.

Adicionalmente incluir los campos de ‘Next.P.Mode’, ‘Next.P.Check’ y ‘HL’ al estante de ‘Detail’.

PASO 6. DEFINIR ACCIONES DE PARÁMETRO PARA ACTUALIZAR PARÁMETROS.

PARAMETER ACTIONSOURCETARGET PARAMETERFIELD OR VALUEAGGREGATION
P.CheckEx3P.CheckNext P.CheckNone
P.ModeEx3P.ModeNext P.ModeNone

PASO 7. DEFINIR ACCIÓN PARA EVITAR EL RESALTADO.

Emplearemos una acción de filtro para evitar el resaltado al seleccionar una de las ‘marks’.

¡Listo! Link aquí y aquí

En este tercer episodio de nuestra serie enfocada en mejorar la experiencia del usuario en la gestión de jerarquías y filtros, trabajamos con la construcción de un filtro de selección múltiple en una jerarquía de tres niveles. Espero que encuentren útiles las técnicas compartidas.

En los siguientes y últimos dos episodios de esta serie, continuaremos explorando con técnicas para la gestión de jerarquías y filtros. Si tienen interés en aprender cómo construir un filtrado de selección múltiple de tres niveles, agregando la opción de expandir o colapsar los niveles superiores de la jerarquía, no se pierdan el cuarto capítulo de la serie.

Cualquier pregunta o comentario sobre el ejercicio abordado en este capítulo será más que bienvenido. No duden en ponerse en contacto.

¡Hasta el próximo capítulo!