Saltar al contenido principal

Bien, a estas alturas probablemente comprenderá que creo que Tabular Editor es bastante bueno. Me gusta todo y aprendo más cada día. Daniel Otykier ha hecho un gran trabajo con este maravilloso software, y cuanto más lo uso, más me encanta. Sin embargo, una cosa que Tabular Editor no tiene es mucha documentación. Definitivamente hay algo en el Wiki y algunos más en la documentación de Microsoft, pero los no programadores mortales como yo simplemente tendremos que resolver el resto nosotros mismos, al menos por ahora. Pero como dice el refrán, «la necesidad es la madre de la invención». Sin problema, hay poca innovación, por eso me encanta cuando encuentro un problema que necesita ser resuelto.

Entonces se presentó un problema

Hoy estaba trabajando con un cliente. Tiene un modelo DAX de Power BI complejo con literalmente cientos de medidas. En pocas palabras, decidimos que iba a editar de forma masiva muchas medidas para cambiar la forma en que estaban escritas. El mismo cambio en todas las medidas que tienen el mismo ‘problema’. Quiero recrear un problema similar (no el mismo problema) usando Adventure Works y compartir con ustedes la solución que se me ocurrió para resolver tal problema usando Tabular Editor.

Definición de un problema análogo

Imagine que tiene las siguientes medidas en el modelo de datos de Adventure Works.

Total Chain Sales = CALCULATE(SUM(Sales[ExtendedAmount]),Products[SubCategory]="Chains") 
Total Brake Sales = CALCULATE(SUM(Sales[ExtendedAmount]),Products[SubCategory]="Brakes") 
Total Cap Sales = CALCULATE(SUM(Sales[ExtendedAmount]),Products[SubCategory]="Caps")

Hay 37 subcategorías en Adventure Works, así que supongamos que tiene 37 medidas que se ven así.

Así que ahora imagine que quiere mejorar la legibilidad de sus medidas. Entonces en lugar de esto

CALCULATE(SUM(Sales[ExtendedAmount]),Products[SubCategory]="Chains")

Quieres tener esto

CALCULATE([Total Sales],Products[SubCategory]="Chains")

Dónde

Total Sales = SUM(Sales[ExtendedAmount])

Ahora tiene 37 medidas para editar si desea continuar con el cambio.

Tenga en cuenta que no importa si cree que es una buena idea o una mala idea tener estas medidas, ni si cree que es una buena o una mala idea hacer los cambios. Todo lo que estoy haciendo aquí es crear un caso de uso para demostrar un problema que se puede solucionar con scripts en Tabular Editor. Si tiene un problema similar, esto es para usted.

Script del editor tabular

Estaba bastante seguro de que Tabular Editor podía hacer esto, pero sin ninguna referencia de idioma, realmente solo tenía una corazonada para continuar. Como antes, miré Wiki y encontró una línea de código de la siguiente manera:

string.Join

Pensé que era interesante y me pregunté si existía algo así como una cuerda. Reemplazar. Lo probé usando el depurador Output () y, para mi sorpresa, funcionó. Así que aquí está el guión que terminé escribiendo.

/*Warning!  Take a backup copy first.  
This script will operate over every measure in the model. It is 
essential that your FromString and ToString are set to change only the
specific usage of the string that you need to change across the entire model.*/

var FromString = "CALCULATE(SUM(Sales[ExtendedAmount])";
var ToString = "CALCULATE([Total Sales]";

foreach (var m in Model.AllMeasures)
    {
        m.Expression = m.Expression.Replace(FromString,ToString);
        /* Cycle over all measures in model and replaces the 
           FromString with the ToString */
    }

Tenga en cuenta que Reemplazar (desde, hasta) distingue entre mayúsculas y minúsculas, por lo que debe usar las mayúsculas correctamente y, posiblemente, repetir para diferentes mayúsculas dentro de las fórmulas.

Cambiar texto en todos los nombres de medidas

Daniil de XXLBI.com sugirió otro caso de uso para mí. Digamos que tiene 50 medidas, todas con nombres como:

  • Ventas totales
  • Ventas totales LY
  • Ventas totales hasta la fecha
  • etc

Ahora supongamos que alguien decidió que sería mejor utilizar el término «ingresos» que «ventas». Con una pequeña modificación, mi script también puede resolver ese problema. En lugar de realizar el reemplazo de texto en la expresión de medida, debería reemplazar en el nombre de la medida, como se muestra a continuación.

var FromString = "Total Sales";
var ToString = "Total Revenue";

foreach (var m in Model.AllMeasures)
    {
        m.Name = m.Name.Replace(FromString,ToString);
        /* Cycle over all measures in model and replaces the 
           FromString with the ToString in the measure names*/
    }

Probé este script y me complace informar que también corrigió los cambios realizados en todas las medidas dependientes. Entonces, cualquier medida que haga referencia [Total Sales] dentro de la fórmula de la medida también se actualizó y se volvió a apuntar a [Total Revenue].

¿Puede pensar en algún problema que este script pueda resolver?

Me encantaría saber de ti si puedes pensar en un problema que pueda resolverse con este script. Mi corazonada es que hay algunos por ahí, pero me encantaría saber desde las trincheras si esto puede resolver algún problema del mundo real. Publique sus comentarios a continuación.

Todos mis scripts estarán en la wiki

He decidido compartir todos estos fragmentos de código en la wiki junto con los otros creados por Daniel, por lo que los encontrará en el al final de la lista aquí.