Table of Contents

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:

  1. 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
  2. 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
  3. 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:

Menú para invocar una Acción de código

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:

Submenú Refactorizar de Acciones de código

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:

Margen 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.

Información sobre herramientas de Acción de código]

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:

Acción de código: todas las ocurrencias

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!

Preferencias de acciones de código