Product Craft Bible
Report Builder & Filtros Avanzados
Inicio Datos y Tablas Report Builder & Filtros Avanzados
Datos y Tablas

Report Builder & Filtros Avanzados

8 reglas Pencil & Paper "Enterprise Filtering UX" · Justia US20050004911 (Filter/Flow para evitar paréntesis anidados)NN/g "Ecommerce Search UX" (etiquetas en lenguaje del usuario) · Pencil & Paper "Enterprise Filtering UX"Baymard Institute "How to Design Applied Filters", baymard.com/blog/how-to-design-applied-filters (28% no muestra filtros aplicados)Pencil & Paper "Enterprise Filtering UX" (live / per-filter / batch) · Lollypop Design "Filter UX" 2025
79

Report Builder & Filtros Avanzados

8 reglas
680

Haz visible la lógica booleana: AND/OR como control y grupos delimitados

En un query builder con condiciones combinadas, la lógica booleana debe verse, no inferirse. El operador AND/OR entre condiciones es un control seleccionable explícito, y los grupos anidados se delimitan con un borde lateral coloreado e indentación para que el orden de evaluación quede claro. La ambigüedad entre "cumplir todas las condiciones" y "cumplir cualquiera" es causa directa de reportes con resultados inesperados: los operadores booleanos confunden a usuarios no técnicos porque el uso coloquial de "y"/"o" difiere de su semántica lógica. Una lista plana de condiciones sin operador visible obliga a adivinar qué hace el sistema por defecto.

Pencil & Paper "Enterprise Filtering UX" · Justia US20050004911 (Filter/Flow para evitar paréntesis anidados)
Preferir
Mostrar registros que cumplan TODAS las condiciones
Estado es Activo
YO
Grupo · cualquiera de estas
Región es Norte
YO
Región es Centro
Evitar
Estado: Activo
Región: Norte
Región: Centro
¿AND o OR? Imposible saber qué aplica
681

Construye cada condición en lenguaje natural, no en jerga de programación

Cada condición del constructor debe leerse como una oración: [Campo] [operador] [valor], "Fecha es después de 2025-01-01", "Monto está entre 100 y 500". Los operadores usan palabras del dominio del usuario ("es", "contiene", "está entre", "es mayor que") en lugar de símbolos de programación (=, >, !=) y campos de texto libre crudos. La legibilidad de la condición construida predice directamente la confianza del usuario en el resultado: si tiene que traducir mentalmente status == "A" antes de confiar en el reporte, ya perdiste. Las etiquetas de campo también deben ser claras ("Estado del pedido", no "status").

NN/g "Ecommerce Search UX" (etiquetas en lenguaje del usuario) · Pencil & Paper "Enterprise Filtering UX"
Preferir
Campo Estado del pedido
Operador es exactamente
Valor Activo
"Estado del pedido es exactamente Activo", comprensible sin saber SQL.
Evitar
status == "A"
¿Qué es "A"? ¿== o ===? Requiere traducir
682

Muestra los filtros aplicados como chips removibles con "Limpiar todo"

Toda condición activa debe aparecer como un chip removible (con icono X) en una zona permanente sobre los resultados, fuera del panel de filtros. Cuando hay más de un filtro activo, un botón "Limpiar todo" siempre acompaña los chips. Ocultar el estado del filtro dentro de un panel cerrado obliga al usuario a reabrirlo solo para auditar qué tiene activo, y eleva el costo de corregir un filtro equivocado. Según Baymard, el 28% de los sitios no muestran un resumen de los filtros aplicados, dejando al usuario sin forma rápida de verificar qué condiciones están actuando.

Baymard Institute "How to Design Applied Filters", baymard.com/blog/how-to-design-applied-filters (28% no muestra filtros aplicados)
Preferir
Estado: Activo Fecha > 2025 Región: Norte Limpiar todo
312 registros coinciden
Acme CorpNorte
Brío LogísticaNorte
Cumbre RetailNorte
Evitar
Filtros 3
¿Cuáles 3? Hay que abrir el panel para saber
683

Filtra al instante en datasets chicos; usa botón "Aplicar" en consultas pesadas

Aplicar filtros al instante o bajo demanda no es estética: es rendimiento y costo. Para datasets pequeños o queries rápidas (~<200ms), la aplicación instantánea reduce fricción y valida cada selección en tiempo real. Para datasets grandes o queries con JOINs costosos, un botón "Aplicar" evita llamadas API redundantes, estados intermedios vacíos y bloqueos de la UI mientras el usuario sigue eligiendo. El error es disparar una query por cada checkbox sobre millones de filas, congelando la interfaz entre clics. La elección depende de la capacidad de fetch del sistema y la complejidad de la consulta, no de una preferencia visual.

Pencil & Paper "Enterprise Filtering UX" (live / per-filter / batch) · Lollypop Design "Filter UX" 2025
Preferir
Instantáneo
480 registros · <200ms
Activos
312 resultados (al instante)
Bajo demanda
2.4M registros · JOIN
Activos
3 cambios pendientes
Aplicar filtros
Evitar
2.4M filas · query por cada checkbox
Ejecutando… UI bloqueada 2.8s
Cada clic dispara la query completa. Imposible armar el filtro sin congelar la pantalla.
684

Ofrece vistas guardadas (saved views) para combinaciones frecuentes

En reportes de uso repetitivo los usuarios recrean las mismas combinaciones de filtros sesión tras sesión. El patrón de saved views permite nombrar, guardar, recuperar, marcar como predeterminada y compartir una configuración completa de filtros. Esto reduce carga cognitiva, elimina trabajo redundante y convierte el report builder en una herramienta de colaboración. El patrón formal (AWS Cloudscape) incluye seleccionar la vista, acciones (guardar nueva, actualizar la actual, eliminar, fijar default), indicador de cambios sin guardar y distinción entre vistas personales y compartidas con el equipo. Sin esto, el usuario reconstruye "Activo Y Fecha > 2025 Y Región Norte" cada vez que abre el reporte.

AWS Cloudscape "Saved Filter Sets", cloudscape.design/patterns/general/filter-patterns/saved-filter-sets · Pencil & Paper "Enterprise Filtering UX"
Preferir
Vistas Guardar vista actual
Activos del mes Personal · 3 filtros
Default
Pipeline Norte Equipo · 5 filtros
Riesgo > 80 Equipo · 2 filtros
Evitar
Estado: Activo  Y  Fecha > 2025  Y  Región: Norte
Sin guardado: rearmar los 3 filtros en cada sesión
685

En cero resultados, di qué filtro lo causó y ofrece una salida

Un estado de cero resultados sin contexto es un callejón sin salida. El sistema debe identificar la condición más restrictiva, cuantificar cuánto se recupera al relajarla ("Quitar el filtro de Fecha mostraría 312 registros") y ofrecer un botón directo para hacerlo, además de un enlace a "Limpiar todos los filtros". No basta con "No se encontraron resultados": el usuario necesita saber que fue demasiado específico y cómo corregirlo sin empezar de cero. Baymard observa que cerca de la mitad de los sitios no dan formas efectivas de recuperarse de una búsqueda sin resultados, y que los usuarios suelen intentar 3-5 iteraciones antes de abandonar.

Baymard Institute "No Results Page", baymard.com/blog/no-results-page (~50% sin recuperación efectiva; 3-5 iteraciones)
Preferir
Sin resultados con estos filtros
El filtro Fecha: 2030–2031 no tiene datos. Quitarlo mostraría 312 registros.
Quitar filtro de Fecha Limpiar todos
Evitar
Sin resultados
No dice qué filtro falló ni cómo corregirlo. El usuario empieza de cero o abandona.
686

Abre el reporte con filtros sugeridos y defaults sensatos, descartables

Un report builder vacío genera parálisis; uno que vuelca 50.000 filas sin filtrar genera ruido. Al abrir un reporte nuevo, pre-carga filtros sugeridos según el contexto del usuario (periodo actual, estado activo, su propia entidad) para mostrar un estado útil desde el primer render. Los filtros sugeridos deben ser descartables individualmente, cada uno con su X, no impuestos. Una vista predeterminada marcada como default que se aplica al entrar a la página logra exactamente esto. Limita además el número de filtros visibles a los atributos más relevantes para que el usuario navegue sin saturarse.

AWS Cloudscape "Saved Filter Sets" (default aplica al entrar) · NN/g "Ecommerce Search UX" (limitar a atributos relevantes)
Preferir
Reporte de ventas Sugeridos
Periodo: Mes actual Estado: Activo
248 registros relevantes desde el primer render
Evitar
Reporte de ventas · 50.000 filas
#000001 ·, ·, ·,
#000002 ·, ·, ·,
#000003 ·, ·, ·,
#000004 ·, ·, ·,
Sin filtros activos. Hay que construir todo desde cero antes de analizar nada.
687

Hazlo accesible: labels, role=group por condición y conteo en live region

Un query builder complejo es uno de los patrones más exigentes en accesibilidad. Cada control de una condición (selector de campo, de operador, campo de valor) necesita un label explícito; cada condición se envuelve en role="group" con aria-label ("Condición 1"); y al actualizar los resultados, una región role="status" aria-live="polite" aria-atomic="true" anuncia el conteo nuevo ("248 registros encontrados") como una unidad, sin robar el foco. Toda la interacción debe ser operable por teclado siguiendo el patrón APG de combobox: el foco permanece en el campo mientras se navegan opciones con aria-activedescendant, Escape cierra el popup y Enter acepta. Tres selects sin label ni grupo dejan al usuario de lector de pantalla sin saber si el filtro funcionó.

WCAG 2.2 SC 4.1.3 Status Messages (AA) · WAI-ARIA APG Combobox Pattern, w3.org/WAI/ARIA/apg/patterns/combobox · Orange a11y (aria-atomic en conteos)
Preferir
role=group · Condición 1
Seleccionar campo Estado
Seleccionar operador es
Valor del filtro Activo
248 registros encontrados aria-live=polite
Evitar
, , ,
Sin label ni grupo; el conteo cambia sin anunciarse