Power BI y la sensibilidad a mayúsculas y minúsculas

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:

Power BI sensibilidad 1

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:

Mientras que una instancia de Analysis Services Tabular, el cual es básicamente el mismo motor que encontramos en Power BI, puede ser tanto sensible o insensible a mayúsculas, esta opción no está disponible en Power BI.

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:

Power BI sensibilidad 2

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:

Power BI sensibilidad 3

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:

Power BI sensibilidad 4

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.

Power BI y la sensibilidad a mayúsculas y minúsculas
Scroll hacia arriba