Acciones de código
Tabular Editor 3.18.0 incorpora una nueva función llamada Acciones de código. Esta función está habilitada de forma predeterminada, pero se puede deshabilitar en el cuadro de diálogo Herramientas > Preferencias, en Editores de texto > Editor de DAX > Acciones de código.
Acciones de código es una función de productividad que ofrece de forma discreta sugerencias para mejorar su código DAX. Puede aplicar las sugerencias con un solo clic. Acciones de código también proporciona un acceso sencillo a operaciones habituales de refactorización de código.
Las acciones de código se dividen en tres categorías:
- Mejoras: Estas son sugerencias recomendadas para mejorar su código DAX en lo relativo a:
- Seguir las mejores prácticas
- Evitar errores habituales y antipatrones
- Evitar características de DAX obsoletas o en desuso
- Escribir código DAX mejor y más eficiente
- Legibilidad: Estas son sugerencias para hacer que su código DAX sea más legible mediante...
- Simplificar expresiones complejas cuando sea posible
- Eliminar código redundante o innecesario
- Aplicar un formato uniforme y convenciones de nomenclatura coherentes
- Reescrituras: Son sugerencias para refactorizar tu código DAX. No son necesariamente mejoras, pero a menudo resultan útiles para refactorizaciones de código de mayor alcance. Los ejemplos son:
- Convertir el “azúcar sintáctico” de DAX en código más extenso, pero más explícito
- Cambiar el nombre de todas las apariciones de una variable o de una columna de extensión
- Formatear código
Cómo usar las acciones de código
Se han agregado un nuevo comando y los botones correspondientes en la barra de herramientas y en el menú, Mostrar acciones de código, con el atajo de teclado predeterminado Ctrl+.. Este comando mostrará las Acciones de código aplicables en la posición actual del cursor:

También puede encontrar las acciones de código aplicables a través del submenú Refactor del menú contextual al hacer clic con el botón derecho:

Por último, se muestra un icono de bombilla o de destornillador en el margen izquierdo del editor cuando el cursor se coloca sobre un segmento de código con acciones aplicables. Al hacer clic en el icono también se abrirá el menú de Acciones de código:

Cuando sitúe el cursor del ratón sobre una acción en el menú de Acciones de Código, se mostrará una información sobre herramientas con detalles adicionales sobre la acción. Haga clic en el enlace "Más información" para ver el artículo de la base de conocimientos (KB) correspondiente a la acción.
]
Indicadores de Acciones de código
Las Acciones de Código Mejoras y Legibilidad también se indicarán visualmente en el editor de código. Esto le permite determinar rápidamente qué partes de su código pueden mejorarse o hacerse más legibles.
- Las Mejoras se muestran con puntos naranjas debajo de los primeros caracteres del segmento de código (a menos que ese segmento ya muestre un subrayado ondulado naranja de advertencia). Aparecerá un icono de bombilla en el margen izquierdo cuando el cursor se mueva sobre el segmento de código.
- Las acciones de Legibilidad se muestran con puntos verde turquesa debajo de los primeros caracteres del segmento de código. Cuando el cursor se mueve sobre el segmento de código, aparecerá un icono de destornillador en el margen izquierdo.
- Las reescrituras no se indican visualmente en el propio código; sin embargo, el icono de destornillador aparecerá en el margen izquierdo cuando el cursor se coloque sobre un segmento de código con reescrituras aplicables.
Aplicar a todas las ocurrencias
Algunas acciones de código se pueden aplicar a todas las ocurrencias dentro de la expresión DAX, el script DAX o la consulta DAX actuales, en lugar de solo al segmento de código bajo el cursor. Cuando sea así, la acción de código se mostrará en el menú de acciones de código con " (Todas las ocurrencias)" añadido al final de la descripción de la acción. Al hacer clic en la acción, el cambio se aplicará a todas las ocurrencias del documento.
En la captura de pantalla siguiente, por ejemplo, la acción Prefijar la variable con '_' se puede aplicar a todas las ocurrencias (es decir, todas las variables) del documento, no solo a la variable totalSales bajo el cursor:

Lista de acciones de código
La tabla siguiente enumera todas las acciones de código disponibles actualmente. Puede activar o desactivar las acciones de código en el cuadro de diálogo Herramientas > Preferencias, en Editores de texto > Editor de DAX > Acciones de código (una actualización futura le permitirá activar o desactivar cada acción para una experiencia más personalizada). Algunas acciones de código también tienen opciones de configuración adicionales, como qué prefijo usar para los nombres de las variables.
Mejoras
Las acciones de código siguientes aparecerán con puntos naranjas debajo de los dos primeros caracteres del código aplicable y un icono de bombilla en el margen izquierdo cuando el cursor se coloque en el segmento de código:
| ID | Nombre | Descripción |
|---|---|---|
| DI001 | Eliminar variable no usada | Se deben eliminar las variables a las que no se hace referencia en ninguna parte. Ejemplo:VAR a = 1 VAR b = 2 RETURN a -> VAR a = 1 RETURN a |
| DI002 | Eliminar todas las variables no usadas | Se deben eliminar las variables que no se estén usando (directa o indirectamente a través de otras variables) en la parte RETURN de un bloque de variables. Ejemplo:VAR a = 1 VAR b = a RETURN 123 -> 123 |
| DI003 | Eliminar nombre de tabla | Las referencias a medidas no deben incluir el nombre de la tabla, ya que este es innecesario al referirse a medidas. Además, esta práctica hace que las referencias a medidas se distingan más fácilmente de las referencias a columnas. Ejemplo:Sales[Total Sales] -> [Total Sales] |
| DI004 | Añadir nombre de tabla | Las referencias a columnas deben incluir el nombre de la tabla para evitar ambigüedades y distinguir más fácilmente las referencias a columnas de las referencias a medidas. Ejemplo:SUM([SalesAmount]) -> SUM(Sales[SalesAmount]) |
| DI005 | Reescribir el filtro de tabla como predicado escalar | Un antipatrón común en DAX es filtrar una tabla dentro de un argumento de filtro de CALCULATE cuando basta con filtrar una o varias columnas de esa tabla. Ejemplo:CALCULATE([Total Sales], FILTER(Products, Products[Color] = "Red")) -> CALCULATE([Total Sales], KEEPFILTERS(Products[Color] = "Red"))Esta acción de código admite varias variaciones de la expresión original. |
| DI006 | Dividir el filtro de varias columnas en varios filtros | Al filtrar una tabla por varias columnas combinadas con AND (o el operador equivalente &&), a menudo se puede obtener un mejor rendimiento especificando varios filtros, uno por cada columna. Ejemplo:CALCULATE(..., Products[Color] = "Red" && Products[Size] = "Large") -> CALCULATE(..., Products[Color] = "Red", Products[Size] = "Large") |
| DI007 | Simplificar la instrucción SWITCH | Una sentencia SWITCH que especifica TRUE() para el argumento <Expression>, y en la que todos los argumentos <Value> son comparaciones simples de la misma variable/medida, se puede simplificar. Ejemplo:SWITCH(TRUE(), a = 1, ..., a = 2, ...) -> SWITCH(a, 1, ..., 2, ...) |
| DI008 | Eliminar CALCULATE innecesario | Debe eliminarse una función CALCULATE que no sea necesaria porque no modifica el contexto de filtro o porque, de todos modos, se produciría una transición de contexto implícita. Ejemplos:CALCULATE([Total Sales]) -> [Total Sales]AVERAGEX(Product, CALCULATE([Total Sales])) -> AVERAGEX(Product, [Total Sales])También se aplica cuando el primer argumento de CALCULATE / CALCULATETABLE es una variable de DAX, p. ej.:VAR x = [Total Sales] RETURN CALCULATE(x, Product[Color] = "Red") ->VAR x = [Total Sales] RETURN x |
| DI009 | Evita la sintaxis abreviada de CALCULATE | Ejemplo:[Total Sales](Products[Color] = "Red") -> CALCULATE([Total Sales], Products[Color] = "Red") |
| DI010 | Usa MIN/MAX en lugar de IF | Cuando una expresión condicional se usa para devolver el mínimo o el máximo de dos valores, es más eficiente y conciso usar las funciones MIN o MAX. Ejemplo:IF(a > b, a, b) -> MAX(a, b) |
| DI011 | Usa ISEMPTY en lugar de COUNTROWS | Al comprobar si una tabla está vacía, es más eficiente usar la función ISEMPTY que contar las filas de la tabla. Ejemplos:COUNTROWS(Products) = 0 -> ISEMPTY(Products) |
| DI012 | Usa DIVIDE en lugar del operador de división | Cuando uses una expresión arbitraria en el denominador de una división, usa DIVIDE en lugar del operador de división para evitar errores de división por cero. Ejemplo:x / y -> DIVIDE(x, y) |
| DI013 | Usa el operador de división en lugar de DIVIDE | Cuando el segundo argumento de DIVIDE es una constante distinta de cero, es más eficiente usar el operador de división. Ejemplo:DIVIDE(x, 2) -> x / 2 |
| DI014 | Sustituye IFERROR por DIVIDE | Usa la función DIVIDE en lugar de IFERROR para devolver un resultado alternativo cuando el denominador de una división es cero. Ejemplo:IFERROR(x / y, 0) -> DIVIDE(x, y, 0) |
| DI015 | Sustituye IF por DIVIDE | Use la función DIVIDE en lugar de IF para comprobar más fácilmente si el denominador es cero o está en blanco. Ejemplo:IF(y <> 0, x / y) -> DIVIDE(x, y) |
Legibilidad
Las acciones de código siguientes aparecerán con puntos verde azulado debajo de los dos primeros caracteres del código correspondiente y con un icono de destornillador en el margen izquierdo cuando el cursor se sitúe sobre uno de los segmentos de código
| ID | Nombre | Descripción | ||||||
|---|---|---|---|---|---|---|---|---|
| DR001 | Convertir a predicado escalar | Un filtro de columna puede escribirse de forma más concisa como un predicado escalar sin usar explícitamente la función FILTER. Ejemplos:FILTER(ALL(Products[Color]), Products[Color] = "Red") -> Products[Color] = "Red"FILTER(VALUES(Products[Color]), Products[Color] = "Red") -> KEEPFILTERS(Products[Color] = "Red") |
||||||
| DR002 | Usar una función de agregación en lugar de una función iteradora | Use una función de agregación en lugar de una función iteradora, cuando sea posible, para simplificar el código. Ejemplo:SUMX(Products, Products[SalesAmount]) -> SUM(Products[SalesAmount]) |
||||||
| DR003 | Usar VALUES en lugar de SUMMARIZE | Cuando SUMMARIZE especifica solo una columna y esa columna pertenece a la tabla indicada en el primer argumento, el código puede escribirse de forma más concisa mediante VALUES. Ejemplo:SUMMARIZE(Products, Products[Color]) -> VALUES(Products[Color]) |
||||||
| DR004 | Añadir prefijo a la variable | Las variables deben seguir una convención de nomenclatura coherente. Se recomienda usar un prefijo, como un guion bajo. Puede configurar qué prefijo usar para que coincida con el estilo que prefiera. Ejemplo:VAR totalSales = SUM(Sales[SalesAmount]) -> VAR _totalSales = SUM(Sales[SalesAmount]) |
||||||
| DR005 | Añadir prefijo a las columnas temporales | Se recomienda usar un prefijo uniforme para las columnas temporales para distinguirlas más fácilmente de las columnas base o las medidas. Puede configurar qué prefijo usar para que se ajuste a su estilo preferido. Ejemplo:ADDCOLUMNS(Product, "SalesByProd", [Sales]) -> ADDCOLUMNS(Product, "@SalesByProd", [Sales]) |
||||||
| DR006 | Mover la agregación constante a una variable | Cuando se usa una función de agregación dentro de un iterador o un predicado escalar, la agregación produce el mismo resultado para cada fila de la iteración. Por tanto, la agregación se podría mover a una variable de DAX fuera de la iteración. Ejemplo:CALCULATE(..., 'Date'[Date] = MAX('Date'[Date])) ->VAR _maxDate = MAX('Date'[Date]) RETURN CALCULATE(..., 'Date'[Date] = _maxDate) |
||||||
| DR007 | Simplificar un bloque de 1 variable | Un bloque de variables con una sola variable puede simplificarse moviendo la expresión directamente a la parte RETURN del bloque. Esto supone que la variable solo se referencia una vez y sin modificadores de contexto. Ejemplo:VAR _result = [Sales] * 1.25 RETURN _result -> [Sales] * 1.25 |
||||||
| DR008 | Simplificar un bloque de varias variables | Un bloque de variables con varias variables en el que cada una sea una referencia simple a una medida y solo se use una vez en la sección RETURN, sin modificadores de contexto, debe simplificarse. Ejemplo:VAR _sales = [Sales] VAR _cost = [Cost] RETURN _sales - _cost -> [Sales] - [Cost] |
||||||
| DR009 | Reescribir usando DISTINCTCOUNT | En lugar de usar COUNTROWS(DISTINCT(T[c]) para contar el número de valores distintos de una columna, usa la función DISTINCTCOUNT. |
||||||
| DR010 | Reescribir usando COALESCE | En lugar de usar IF para devolver el primer valor no en blanco de una lista de expresiones, usa la función COALESCE. Ejemplo:IF(ISBLANK([Sales]), [Sales2], [Sales]) -> COALESCE([Sales], [Sales2]) |
||||||
| DR011 | Reescribir con ISBLANK | En lugar de comparar una expresión con BLANK(), usa la función ISBLANK. Ejemplo:IF([Sales] = BLANK(), [Budget], [Sales]) -> IF(ISBLANK([Sales], [Budget], [Sales]) |
||||||
| DR012 | Eliminar BLANK innecesario | Algunas funciones de DAX, como IF y SWITCH, ya devuelven BLANK() cuando la condición es falsa, así que no hace falta especificar BLANK() explícitamente. Ejemplo:IF(a > b, a, BLANK()) -> IF(a > b, a) |
||||||
| DR013 | Simplificar la lógica negada | Cuando se niega una expresión lógica, suele ser más legible reescribirla usando el operador negado. Ejemplo:NOT(a = b) -> a <> b |
||||||
| DR014 | Simplificar con IN | Reescribe los predicados compuestos (comparaciones de igualdad de la misma expresión combinadas con OR o [` |
](https://dax.guide/op/or/)) con el operador [IN](https://dax.guide/IN). Ejemplo:<br>a = 1 |
a = 2 | a = 100->a IN { 1, 2, 100 }` |
Reescrituras
Las siguientes acciones de código aparecerán con un icono de destornillador en el margen izquierdo cuando el cursor se coloque sobre los segmentos de código.
| ID | Nombre | Descripción |
|---|---|---|
| RW001 | Reescribir TOTALxTD con CALCULATE | Funciones como TOTALMTD, TOTALQTD y TOTALYTD pueden reescribirse con la función CALCULATE, que es más expresiva y ofrece mayor flexibilidad. Ejemplo:TOTALYTD([Total Sales], 'Date'[Date]) -> CALCULATE([Total Sales], DATESYTD('Date'[Date])) |
| RW002 | Reescribir con FILTER | Un predicado escalar en un argumento de filtro de CALCULATE puede reescribirse con FILTER. Esto es útil, por ejemplo, cuando necesitas añadir una lógica de filtrado más compleja. Ejemplo:CALCULATE(..., Products[Color] = "Red") -> CALCULATE(..., FILTER(ALL(Products[Color]), Products[Color] = "Red")) |
| RW003 | Invertir IF | Para mejorar la legibilidad, a veces resulta útil invertir las instrucciones IF. Ejemplo:IF(a < b, "B is greater", "A is greater") -> IF(a > b, "A is greater", "B is greater") |
Personalización de acciones de código
Puedes personalizar el comportamiento de las acciones de código a través del cuadro de diálogo Herramientas > Preferencias, en Editores de texto > Editor de DAX > Acciones de código. Aquí puedes activar o desactivar la función y configurar opciones adicionales para algunas acciones de código, como el prefijo que se usará para los nombres de variables y las columnas de extensión.
Tenemos previsto añadir más opciones de configuración a esta pantalla en versiones futuras, como una opción para activar o desactivar acciones de código individuales. ¡Manténgase al tanto!
