Creación de medidas DAX de forma automatizada con Tabular Editor

May 3 / Diego García Perandrés
A la hora de elaborar un reporte con Microsoft Power BI, prácticamente todos nos hemos encontrado con la situación de tener que crear infinidad de medidas sobre las cuales tenemos que realizar cálculos de inteligencia temporal, lo que nos puede llevar a perder una gran cantidad de tiempo en nuestro día a día y es un proceso tedioso, aburrido y poco efectivo.

Pero gracias a tabular editor y al ‘Advance Scripting’ podemos simplificar estos procesos hasta tal punto de realizar los cálculos sobre la columna o medida con tan solo pulsar un botón las medidas serán generadas automáticamente y listas para ser usadas en nuestro reporte.

Para ello, necesitamos un modelo de Power BI y tener descargada la herramienta de Tabular Editor

Una vez lo tenemos descargado, abrimos nuestro modelo en Power BI y nos vamos en el ribbon a ‘External Tools’ y una vez aquí seleccionamos Tabular Editor, para conectarnos directamente a los datos de nuestro modelo.
Write your awesome label here.
Una vez abierto con nuestro modelo cargado, tenemos una vista de las relaciones, de las tablas, de los roles etc. Y a la derecha, tenemos dos opciones, el ‘Expression Editor’ o el ‘Advance Scripting’ siendo este último el que usaremos para automatizar la creación de medidas.
Write your awesome label here.
En el “Advanced Scripting” podemos o bien generar medidas a partir de columnas o crear medidas sobre otras recientemente creadas (como, por ejemplo, la inteligencia temporal):

Es el momento de ser un experto de Power BI y Microsoft Power Platform!

Creación de medidas a partir de una columna

En el editor de texto introduciremos el siguiente Código y lo modificaremos en función de la medida que queramos crear. En el caso puesto como ejemplo queremos contar los diferentes clientes de nuestro modelo.

// Crea una medida a partir de una columna y oculta esa columna

foreach(var c in Selected.Columns)
{
    var newMeasure = c.Table.AddMeasure(
        "Total" + c.Name,                    // Nombre de la medida
        "distinctCount(" + c.DaxObjectFullName + ")",    // Expresión en DAX
        c.DisplayFolder                       // Dónde se guardará la medida
    );
    
    //Seleccionamos el formato de la medida:
    newMeasure.FormatString = "0.00";
 
    // Documentamos la medida:
    newMeasure.Description = "This measure is the sum of column " + c.DaxObjectFullName;
 
   // Escondemos la columna:
    c.IsHidden = true;
  }
Una vez tenemos nuestro Código editado en el editor Avanzado, clicamos en el icono más, escribimos el nombre de nuestra función creada y le decimos sobre qué tipo de contexto se va a aplicar, en este caso sería una columna, le damos a ok y la guardamos:
Write your awesome label here.
Para crear la medida, pinchamos la columna y le damos al botón play y se nos creará la medida automáticamente. De modo que con solo clicar en la columna que queramos contar y pulsar el botón ejecutar se nos creará la medida. Como podemos ver en la siguiente captura de pantalla, se nos ha ocultado la columna “Cliente” y se nos ha creado la medida “TotalCliente”.
Write your awesome label here.

Creación de medidas a partir de una columna

Con el Código siguiente tenemos la posibilidad de crear cuatro medidas a partir de una previamente creada (al ser inteligencia temporal lo que queremos calcular es muy importante tener definida la dimensión fecha y sustituir el 'dDate'[Date]" por nuestra columna de dimensión fecha, si la tienes en Español podría ser: 'dFecha'[Fecha]";).
var dateColumn = "'dDate'[Date]";
//Crea las siguientes medidas de inteligencia temporal por medida seleccionada:
foreach(var m in Selected.Measures) {
    // Year-to-date:
    m.Table.AddMeasure(
        m.Name + " YTD",                                       // Nombre
        "TOTALYTD(" + m.DaxObjectName + ", " + dateColumn + ")",     // Expresión de DAX
        m.DisplayFolder                                        // dónde se guardará
    );
   // Previous month:
    m.Table.AddMeasure(
    m.Name + " PM",                                       // Nombre
        "CALCULATE(" + m.DaxObjectName + ", dateadd(" + dateColumn + " ,-1,MONTH))", // Expresión de DAX
        m.DisplayFolder                                        // Display Folder
    );   
    // Month-over-Month
    m.Table.AddMeasure(
    m.Name + " MoM",                                       // Nombre
        m.DaxObjectName + " - [" + m.Name + " PM]",           // Expresión de DAX
        m.DisplayFolder                                        // dónde se guardará
    );
   // Month-over-Month %:
    m.Table.AddMeasure(
    m.Name + " MoM%",                                           // Nombre
    "DIVIDE(" + m.DaxObjectName + ", [" + m.Name + " MoM])",   // Expresión de DAX
        m.DisplayFolder                                             // dónde se guardará
 
    ).FormatString = "0.0 %"// Seleccionamos el formato de porcentaje
    // Month-to-date:
    m.Table.AddMeasure(
        m.Name + " MTD",                                       // Nombre
        "TOTALMTD(" + m.DaxObjectName + ", " + dateColumn + ")",    // Expresión de DAX
        m.DisplayFolder                                        // dónde se guardará
 
    );
}
Al guardar este proceso podemos invocar la función en cualquier momento que queramos pudiendo ser cualquier otro reporte con otro modelo de datos, simplemente seleccionamos que su contexto es sobre una medida y guardamos.
Write your awesome label here.
Para ejecutarlo, seleccionamos la medida dentro de la table en la que se encuentre y clicamos ejecutar y automáticamente se nos crearán las medidas que hemos definido en el Código en relación a las Ventas Importe en nuestro caso:
Write your awesome label here.
Este proceso se puede realizar tantas veces como queramos sobre las diferentes medidas que tengamos en el modelo.

También se pueden ejecutar con el segundo botón, haciendo clic en la medida y en “Custom actions” tendremos los Script que habremos guardado anteriormente.
Write your awesome label here.
Una vez lo tengamos todo listo pulsamos el botón de guardar y aplicar y nos aparecerán directamente en nuestro PBIX listas para ser usadas.
Write your awesome label here.
Este es solo un ejemplo de las muchas utilidades que tiene Tabular Editor y como su uso nos puede ayudar a ahorrar mucho tiempo y ser más eficientes y eficaces a la hora de crear nuestros reportes.

Autor del artículo:

Diego García Perandrés
Desarrollador BI en Input for You. 
Máster en Business Intelligence Aplicada por EIG.
Máster Gestión y Tecnologías  de procesos de negocio.

Conoce todos los fundamentos de Power BI para convertirte en un experto.