Uno de los aspectos más confusos de Power BI es su sensibilidad a mayúsculas y minúsculas. Mientras que el motor de Power Query es sensible a mayúsculas, el principal motor de Power BI (lo cual abarca conjuntos de datos, relaciones, DAX, etc.) no es sensible a mayúsculas.
En este post nos vamos a concentrar en lo que significa y cómo funciona la insensibilidad de mayúsculas en conjuntos de datos. Además de como se comporta DAX para aprender una forma de trabajar sobre ese problema.
Sensibilidad en los caracteres.
Empecemos con un ejemplo simple. Digamos que tenemos una fuente de datos que contiene datos que se ven de esta forma:
Así es como los datos se ven en Power Query Editor, lo cual es (como ya dijimos) sensible a mayúsculas. Esto significa que ve «A» y «a» como caracteres diferentes, por lo cual vemos seis caracteres distintos en cada fila de la tabla. Estos pueden ser datos de cualquier fuente, y para hacer esto más fácil he usado el siguiente query M que genere esta tabla:
let
Source =
#table(
type table
[MyTextColumn = text],
{
{"A"},
{"a"},
{"B"},
{"b"},
{"C"},
{"c"}
})
in
Source
Cuando estos datos son cargados en un conjunto de datos de Power BI veremos lo siguiente en el panel Data de la ventana principal de Power BI:
Ya que el motor principal de Power BI es insensible a mayúsculas (lo que significa que «a» y «A» son considerados el mismo carácter) cuando estos datos son cargados, solo ve tres caracteres distintos y no podemos estar seguros de si tendremos el carácter en mayúscula o minúscula almacenado dos veces. Esta es la forma en que trabaja:
Si bien hay escenarios en los cuales esta opción es válida y hasta necesaria por lo general la sensibilidad a mayúsculas causa muchos problemas que no lo hacen una opción viable.
Y otra cosa es que los cálculos DAX también son insensibles a mayúsculas. Si intentamos usar la siguiente expresión DAX para crear una tabla calculada obtendremos lo siguiente:
Demo Table =
DATATABLE(
"MyTextColumn",
STRING,
{
{"A"},
{"a"}
}
)
En cuanto a los DAX en Power BI
Las medidas DAX se comportan de una manera similar. Dada la siguiente tabla:
Si usamos la siguiente medida en una tabla visual:
Demo Measure =
IF(
SELECTEDVALUE('Demo Table 2'[MyIntColumn])=1,
"A",
"a"
)
Nos encontraremos con esto:
La única forma en la que podemos trabajar alrededor de esta insensibilidad a mayúsculas es haciendo valores de texto distintos que de otra forma se verían iguales para el motor de Power BI. Una forma de hacer esto es agregando caracteres extra a nuestro texto.
Aunque podríamos pensar que añadir espacios extra sería la solución (como podríamos hacer en el primer query M que mostramos), al hacerlo con cada minúscula para que se vea así:
let
Source =
#table(
type table
[MyTextColumn = text],
{
{"A"},
{"a "},
{"B"},
{"b "},
{"c "},
{"C"}
})
in
Source
Una posible solución.
Tendremos que esto no funciona ya que otro comportamiento poco conocido del motor de Power BI es que todos los espacios al frente y al final son cortados cuando el texto es cargado. Una mejor opción que realmente funciona es usando el carácter Unicode Espacio de ancho cero y la función M Character.FromNumber en su lugar:
let Source = #table( type table [MyTextColumn = text], { {"A"}, {"a" & Character.FromNumber(8203)}, {"B"}, {"b" & Character.FromNumber(8203)}, {"c" & Character.FromNumber(8203)}, {"C"} }) in Source
Lo bueno de este carácter es que aun cuando está ahí, es invisible y no ocupa espacio. Cuando cargamos este último query M en Power BI veremos la siguiente tabla:
Para finalizar, veamos un ejemplo más avanzado sobre cómo usar este carácter. Digamos que tenemos la siguiente fuente de datos regresada por un query M llamado FuenteDatos:
Cuando esta tabla es cargada en Power BI, tendremos la sensibilidad como sigue:
Pero el siguiente query M toma esta tabla y por cada fila va a través del texto en la columna OriginalText y añade un espacio de ancho cero luego de cada carácter en minúscula:
let Source = FuenteDatos, ToList = Table.AddColumn( Source, "Chars", each Text.ToList([OriginalText]) ), LowerCaseChars = {"a".."z"}, AddInvisibleChars = Table.AddColumn( ToList, "AddInvisibleChars", each List.Transform( [Chars], each if List.Contains(LowerCaseChars, _) then _ & Character.FromNumber(8203) else _ ) ), RecombineList = Table.AddColumn( AddInvisibleChars, "OutputText", each Text.Combine([AddInvisibleChars]), type text ), RemovedOtherColumns = Table.SelectColumns( RecombineList, {"OutputText"} ) in RemovedOtherColumns
Cuando cargamos la salida de este query en Power BI, dado que los espacios de ancho cero tras cada carácter en minúscula hacen que Power BI vea cada pedazo de texto como distinto, se ve como si las mayúsculas se conservaran cuando no es el caso.
Cualquier duda nos leemos abajo.