Formato de Texto con DAX
Power BI es una gran herramienta para la visualización de los datos. Dispone de muchas y diversas visualizaciones que se adaptan prácticamente a cualquier necesidad y, periódicamente, va introduciendo mejoras para implementar nuevas características muchas veces requeridas por la inmensa comunidad de usuarios.
No obstante, en ocasiones nos encontramos con alguna característica necesaria para nuestros diseños que no ha sido todavía implementada para la cual no hay aparentemente solución a corto plazo. Es en esos momentos en donde la creatividad y el conocimiento de la herramienta y de DAX pueden ayudarnos a sortear estos obstáculos.
Hoy os presento un caso particular en donde un cliente necesitaba un formato específico para parte del texto de una tabla. Entre las opciones de formato que nos ofrece Power BI para esta visualización no tenemos la de establecer un formato específico a parte del texto de ciertas casillas. Tampoco existe un DAX para dar formato. Entonces… ¿se puede realizar? ¡Ahora lo veremos!
Entender la necesidad
Primero, vamos a ver la necesidad. El cliente necesita que realicemos una visualización donde poder ver la planificación semanal de su plantilla de profesores. Necesita obtener algo así:
Como se puede observar, tenemos 2 temas que, de entrada, no parecen factibles de realizar en Power BI:
- La casilla tiene parte del texto en negrita y parte del texto normal
- La casilla distribuye el texto en 2 líneas separadas (horario arriba, materia debajo)
Si rebuscamos entre las posibilidades de formateo del visual, obviamente no encontraremos nada por el estilo.
La primera posible solución que me vino a la cabeza fue insertar códigos HTML como <b>, <i>, <p>, <br /> en el texto de la casilla pero no funcionó ya que Power BI no los interpreta como código sino como texto.
Después intenté también utilizar códigos de caracteres especiales de lenguaje web dentro del texto como o à pero tampoco funcionaba. Fue en este momento en donde me acordé de una función de DAX capaz de traerme prácticamente cualquier caracter Unicode lo que, virtualmente, me abriría la puerta a una solución: UNICHAR()
¿Qué es Unicode?
Unicode es un estándar de codificación de caracteres universal que define cada carácter o símbolo de casi cualquier alfabeto mediante un identificador numérico único. Por lo tanto, el caracter «A» en Unicode sería «41». Unicode recoge además un código específico para todos los Emojis, símbolos estadísticos, símbolos matemáticos… y es justo aquí donde llega a nuestro rescate.
Entre los símbolos codificados existen unas series matemáticas que simulan las letras y números en negrita o cursiva en los estilos serif y sans serif… ¡y eso es todo lo que necesitamos!
¿En qué consiste la solución?
Lo que vamos a hacer es sustituir cada caracter «normal» que deseemos por su equivalente Unicode Negrita, que es el formato que necesita el cliente. Para ello utilizaremos la función SUBSTITUTE() y UNICHAR() juntas. Es decir, vamos a realizar un formato de texto con DAX.
Pero algo que será fundamental es sabar qué carácteres queremos sustituir y su equivalente Unicode. Para ello, existen páginas como https://yaytext.com/es/ que permiten introducir un texto y ver las posibles variantes del mismo:
En este caso, el estilo que me interesa es el «Negrita (serif)». Para saber qué código Unicode corresponde a cada letra, copiaremos cada letra del resultado y lo pegaremos en un buscador de códigos Unicode como https://unicodelookup.com/, donde el código que nos interesa es el «Dec» (de decimal):
Implementación práctica
Ahora es el momento de entender la solución propuesta para realizar el formato de texto con DAX. La siguiente es la tabla de los datos que tenemos originalmente:
Existen muchas formas de abordar la solución pero, en mi caso, como únicamente necesito sustituir los números del 0 al 9 he optado por crear una columna y utilizar un simple código que, de forma iterativa, busca uno a uno los diferentes caracteres que queremos sustituir y los va cambiando por sus equivalentes en negrita mediante código Unicode:
Nuestra tabla ahora queda así:
Obviamente, si necesitáramos modificar muchos más caracteres, el enfoque sería otro para simplificar el código en la medida de lo posible.
Ahora que ya tenemos el horario en negrita, queremos tener en un solo campo tanto el horario en negrita como la materia, en este caso sin negrita y en una línea distinta. Para ello creamos una nueva columna donde uniremos ambas columnas y utilizaremos entre ellas el caracter UNICHAR(10), que genera un salto de línea:
Vemos que en el resultado nos aparece todo en la misma línea pero, una vez llevemos este campo a la tabla o matriz mostrará la información tal y como la necesitamos.
Conclusión
Como indicaba anteriormente, UNICHAR() no sólo puede utilizarse para insertar caracteres especiales, también Emojis entre otros. Es decir, podríamos utilizar listados como los que encontramos aquí para obtener el código de banderas de cualquier país, flechas, señalética, caras… las posibilidades son casi infinitas y permiten dar un toque original muy visual a cualquier diseño sin necesidad de preparar y cargar cada una de las imágenes. Si se utiliza este recurso, es importante recordar que los códigos que utilizamos en UNICHAR() deben ser decimales, así que en caso de códigos Hexadecimales es necesario realizar su conversión.
UNICHAR() y un poco de imaginación sin duda pueden abrir las puertas a soluciones de diseño más avanzadas y completas para nuestros desarrollos. ¿Qué uso se te ocurre a ti?