From 48f097d889dca6f9bc19cea51ff55683fa7f7916 Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 11:17:40 +0200 Subject: [PATCH 01/31] New translations script-create-and-replace-m-parameter.md (Spanish) --- .../Advanced/script-create-and-replace-M-parameter.md | 1 + 1 file changed, 1 insertion(+) diff --git a/localizedContent/es/content/features/CSharpScripts/Advanced/script-create-and-replace-M-parameter.md b/localizedContent/es/content/features/CSharpScripts/Advanced/script-create-and-replace-M-parameter.md index 0646dcd7..3a7c426d 100644 --- a/localizedContent/es/content/features/CSharpScripts/Advanced/script-create-and-replace-M-parameter.md +++ b/localizedContent/es/content/features/CSharpScripts/Advanced/script-create-and-replace-M-parameter.md @@ -200,4 +200,5 @@ Luego buscará el valor predeterminado en todas las particiones M y lo reemplaza
Data Security Create Role
Figura 2: Cuadro de diálogo de confirmación que muestra que se ha creado el parámetro y que la subcadena de valor correspondiente se ha reemplazado en todas las expresiones de las particiones M. Para parámetros de otros tipos, ajusta el código C# según corresponda.
+ Para parámetros de otros tipos, ajusta el código C# según corresponda.
\ No newline at end of file From e5abe30f1d5cdc53ca28e80078822debcfc82bc6 Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 11:18:29 +0200 Subject: [PATCH 02/31] New translations command-line-options.md (Spanish) --- localizedContent/es/content/features/Command-line-Options.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/localizedContent/es/content/features/Command-line-Options.md b/localizedContent/es/content/features/Command-line-Options.md index c24f82c4..41384149 100644 --- a/localizedContent/es/content/features/Command-line-Options.md +++ b/localizedContent/es/content/features/Command-line-Options.md @@ -316,9 +316,9 @@ La línea de comandos proporciona varios detalles, en función de los parámetro | Error | -ANALYZE | No se encontró el archivo de reglas: ... | | | Error | -ANALYZE | Archivo de reglas no válido: ... | El archivo de reglas de BPA especificado está dañado o no contiene un JSON válido. | | Información | -ANALYZE | ... viola la regla ... | Resultados del Best Practice Analyzer para reglas con un nivel de gravedad de 1 o inferior. | -| Advertencia | -ANALYZE | ... ¡La implementación falló! | Resultados del Best Practice Analyzer para reglas con un nivel de gravedad de 2. | +| Advertencia | -ANALYZE | ... viola la regla ... | Resultados del Best Practice Analyzer para reglas con un nivel de gravedad de 2. | | Error | -ANALYZE | ... viola la regla ... | Resultados del Best Practice Analyzer para reglas con un nivel de gravedad de 3 o superior. | -| Error | -DEPLOY | viola la regla ... ... | Motivo del fallo devuelto directamente por la instancia de Analysis Service (por ejemplo: base de datos no encontrada, no se permite sobrescribir la base de datos, etc.) | +| Error | -DEPLOY | ¡La implementación falló! ... | Motivo del fallo devuelto directamente por la instancia de Analysis Service (por ejemplo: base de datos no encontrada, no se permite sobrescribir la base de datos, etc.) | | Información | -DEPLOY | Objeto sin procesar: ... | Objetos que están en el estado "NoData" o "CalculationNeeded" tras una implementación correcta. Utilice el modificador -W para tratarlos como Nivel=Advertencia. | | Advertencia | -DEPLOY | El objeto no está en estado "Ready": ... | Objetos que se encuentran en estado "DependencyError", "EvaluationError" o "SemanticError" después de un despliegue correcto. Si usa la opción -W, también incluye los objetos en estado "NoData" o "CalculationNeeded". | | Advertencia | -DEPLOY | Error en X:... | Objetos que contienen DAX no válido después de un despliegue correcto (medidas, columnas calculadas, tablas calculadas, roles). Use la opción -E para tratarlos como Level=Error. | From 2ff56495462e7bf51613b298b26cb852ff3c0185 Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 11:18:45 +0200 Subject: [PATCH 03/31] New translations code-actions.md (Spanish) --- localizedContent/es/content/features/code-actions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/localizedContent/es/content/features/code-actions.md b/localizedContent/es/content/features/code-actions.md index f2fb1a65..28ca8257 100644 --- a/localizedContent/es/content/features/code-actions.md +++ b/localizedContent/es/content/features/code-actions.md @@ -122,7 +122,7 @@ Las acciones de código siguientes aparecerán con puntos verde azulado debajo d | DR011 | [Reescribir con ISBLANK](xref:DR011) | En lugar de comparar una expresión con [`BLANK()`](https://dax.guide/BLANK), usa la función [`ISBLANK`](https://dax.guide/ISBLANK). Ejemplo:
`IF([Sales] = BLANK(), [Budget], [Sales])` -> `IF(ISBLANK([Sales], [Budget], [Sales])` | | DR012 | [Eliminar BLANK innecesario](xref:DR012) | Algunas funciones de DAX, como [`IF`](https://dax.guide/IF) y [`SWITCH`](https://dax.guide/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](xref:DR013) | 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](xref:DR014) | Reescribe los predicados compuestos (comparaciones de igualdad de la misma expresión combinadas usando [`OR`](https://dax.guide/OR) o [`\|\|`](https://dax.guide/op/or/)) con el operador [`IN`](https://dax.guide/IN). Ejemplo:
`a = 1 \|\| a = 2 \|\| a = 100` -> `a IN { 1, 2, 100 }` | +| DR014 | [Simplificar con IN](xref:DR014) | Reescribe los predicados compuestos (comparaciones de igualdad de la misma expresión combinadas usando [`OR`](https://dax.guide/OR) o [`\\|\\|`](https://dax.guide/op/or/)) con el operador [`IN`](https://dax.guide/IN). Ejemplo:
`a = 1 \\|\\| a = 2 \\|\\| a = 100` -> `a IN { 1, 2, 100 }` | ### Reescrituras From 7513e49e53f16d236c196445f3316fb2c39f2ba7 Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 11:19:46 +0200 Subject: [PATCH 04/31] New translations getting-started-te2.md (Spanish) --- .../es/content/getting-started/Getting-Started-te2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/localizedContent/es/content/getting-started/Getting-Started-te2.md b/localizedContent/es/content/getting-started/Getting-Started-te2.md index a854ca3d..8cb6d59d 100644 --- a/localizedContent/es/content/getting-started/Getting-Started-te2.md +++ b/localizedContent/es/content/getting-started/Getting-Started-te2.md @@ -97,7 +97,7 @@ De forma predeterminada, las particiones, los Data source y los roles no se sobr Puedes encontrar más información sobre las opciones de la línea de comandos [aquí](../features/Command-line-Options.md). > [!NOTE] -> Como TabularEditor.exe es una aplicación de Windows Forms, al ejecutarla desde la línea de comandos se hará en un subproceso distinto, devolviendo el control al proceso que la invocó de inmediato. Esto puede causar problemas al ejecutar despliegues como parte de un trabajo por lotes en el que necesitas esperar a que el despliegue se complete con éxito antes de continuar con el trabajo. Si tienes estos problemas, usa `start /wait` para que TabularEditor termine su trabajo antes de devolver el control al proceso que lo invocó: +> Como TabularEditor.exe es una aplicación de Windows Forms, al ejecutarla desde la línea de comandos se hará en un subproceso distinto, devolviendo el control al proceso que la invocó de inmediato. Si tienes estos problemas, usa `start /wait` para que TabularEditor termine su trabajo antes de devolver el control al proceso que lo invocó: Esto puede causar problemas al ejecutar despliegues como parte de un trabajo por lotes en el que necesitas esperar a que el despliegue se complete con éxito antes de continuar con el trabajo. > > `start /wait TabularEditor.exe c:\Projects\Model.bim -deploy localhost AdventureWorks` From e4a5a46eb9cff95408d4f9fa35d5a6adc3ed920c Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 11:20:13 +0200 Subject: [PATCH 05/31] New translations importing-tables-data-modeling.md (Spanish) --- .../content/getting-started/importing-tables-data-modeling.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/localizedContent/es/content/getting-started/importing-tables-data-modeling.md b/localizedContent/es/content/getting-started/importing-tables-data-modeling.md index eac23d3a..5782049e 100644 --- a/localizedContent/es/content/getting-started/importing-tables-data-modeling.md +++ b/localizedContent/es/content/getting-started/importing-tables-data-modeling.md @@ -31,7 +31,7 @@ Este artículo describe cómo usar el [Asistente de importación de tablas](#tab # Trabajar con diagramas -En Tabular Editor 3, los **diagramas** son documentos que puedes usar para visualizar y editar las relaciones entre las tablas del modelo. Puedes crear tantos diagramas como quieras para visualizar áreas concretas de tu modelo. Consulta para obtener más información. Un diagrama se puede guardar como un archivo independiente. +En Tabular Editor 3, los **diagramas** son documentos que puedes usar para visualizar y editar las relaciones entre las tablas del modelo. Puedes crear tantos diagramas como quieras para visualizar áreas concretas de tu modelo. Un diagrama se puede guardar como un archivo independiente. Consulta para obtener más información. > [!NOTE] > Recomendamos crear varios diagramas pequeños en lugar de unos pocos diagramas grandes. Cuando un diagrama contiene más de unas 20 tablas, enseguida se vuelve abrumador y difícil de entender. From b6413eccadf01233e1819a4aa9daa4c29d89bfc3 Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 11:20:22 +0200 Subject: [PATCH 06/31] New translations migrate-from-te2.md (Spanish) --- localizedContent/es/content/getting-started/migrate-from-te2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/localizedContent/es/content/getting-started/migrate-from-te2.md b/localizedContent/es/content/getting-started/migrate-from-te2.md index fc2915f7..f4b2b414 100644 --- a/localizedContent/es/content/getting-started/migrate-from-te2.md +++ b/localizedContent/es/content/getting-started/migrate-from-te2.md @@ -83,7 +83,7 @@ Para más información, consulta . ### Nuevo editor de DAX y capacidades semánticas -Tabular Editor 3 incorpora su propio motor de análisis sintáctico de DAX (también conocido como el "analizador semántico"), lo que significa que la herramienta ahora entiende la semántica de cualquier código DAX de tu modelo. Por supuesto, el editor es altamente configurable, lo que te permite ajustarlo para que se adapte a tu estilo de programación de DAX. Este motor también se usa para impulsar nuestro editor de DAX (nombre en clave "Daxscilla"), y para habilitar funciones como el resaltado de sintaxis, el formato automático, el autocompletado de código, los calltips, la refactorización y mucho más. +Tabular Editor 3 incorpora su propio motor de análisis sintáctico de DAX (también conocido como el "analizador semántico"), lo que significa que la herramienta ahora entiende la semántica de cualquier código DAX de tu modelo. Este motor también se usa para impulsar nuestro editor de DAX (nombre en clave "Daxscilla"), y para habilitar funciones como el resaltado de sintaxis, el formato automático, el autocompletado de código, los calltips, la refactorización y mucho más. Por supuesto, el editor es altamente configurable, lo que te permite ajustarlo para que se adapte a tu estilo de programación de DAX. Para obtener más información sobre el nuevo editor de DAX, consulta . From 05eadb2fbd51e9c0d83985640481494bf2a3528e Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 11:21:37 +0200 Subject: [PATCH 07/31] New translations undo-redo.md (Spanish) --- localizedContent/es/content/how-tos/undo-redo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/localizedContent/es/content/how-tos/undo-redo.md b/localizedContent/es/content/how-tos/undo-redo.md index c74bf705..8526c2b3 100644 --- a/localizedContent/es/content/how-tos/undo-redo.md +++ b/localizedContent/es/content/how-tos/undo-redo.md @@ -13,4 +13,4 @@ applies_to: Cualquier cambio que hagas en Tabular Editor se puede deshacer con CTRL+Z y, a continuación, rehacer con CTRL+Y. No hay límite en el número de operaciones que se pueden deshacer, pero la pila se restablece cuando abres un archivo Model.bim o cargas un modelo desde una base de datos. -Si cometes un error, puedes usar la función Deshacer para restaurar el objeto eliminado, lo que también restaurará cualquier traducción, perspectiva o relación eliminada. Al eliminar objetos del modelo, todas las traducciones, perspectivas y relaciones que hagan referencia a los objetos eliminados también se eliminan automáticamente (mientras que Visual Studio normalmente muestra un mensaje de error indicando que el objeto no se puede eliminar). Ten en cuenta que, aunque Tabular Editor puede detectar [dependencias de fórmulas DAX](xref:formula-fix-up-dependencies), Tabular Editor no te avisará si eliminas una medida o una columna que se usa en la expresión DAX de otra medida o columna calculada. \ No newline at end of file +Al eliminar objetos del modelo, todas las traducciones, perspectivas y relaciones que hagan referencia a los objetos eliminados también se eliminan automáticamente (mientras que Visual Studio normalmente muestra un mensaje de error indicando que el objeto no se puede eliminar). Si cometes un error, puedes usar la función Deshacer para restaurar el objeto eliminado, lo que también restaurará cualquier traducción, perspectiva o relación eliminada. Ten en cuenta que, aunque Tabular Editor puede detectar [dependencias de fórmulas DAX](xref:formula-fix-up-dependencies), Tabular Editor no te avisará si eliminas una medida o una columna que se usa en la expresión DAX de otra medida o columna calculada. \ No newline at end of file From 685d1b52770988f2740f3c927457ed66bdf9c9df Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 11:23:15 +0200 Subject: [PATCH 08/31] New translations preferences.md (Spanish) --- localizedContent/es/content/references/preferences.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/localizedContent/es/content/references/preferences.md b/localizedContent/es/content/references/preferences.md index a888953b..1ed85722 100644 --- a/localizedContent/es/content/references/preferences.md +++ b/localizedContent/es/content/references/preferences.md @@ -176,7 +176,7 @@ Crea una copia de seguridad del modelo al guardar cambios localmente. Esto te of ##### _Ubicación para guardar la copia de seguridad_ -Especifica la carpeta donde se almacenan las copias de seguridad creadas al guardar. De forma predeterminada, no se crean copias de seguridad a menos que se especifique una ubicación. +Especifica la carpeta donde se almacenan las copias de seguridad de los despliegues. De forma predeterminada, no se crean copias de seguridad a menos que se especifique una ubicación. ##### _Copia de seguridad al implementar_ (habilitado) @@ -184,7 +184,7 @@ Crea una copia de seguridad del modelo de destino antes de implementar los cambi ##### _Ubicación de copia de seguridad_ -Especifica la carpeta donde se almacenan las copias de seguridad de los despliegues. De forma predeterminada, no se crean copias de seguridad a menos que se especifique una ubicación. +De forma predeterminada, no se crean copias de seguridad a menos que se especifique una ubicación. Especifica la carpeta donde se almacenan las copias de seguridad creadas al guardar. ## Tabular Editor > Valores predeterminados @@ -714,7 +714,7 @@ Define prefijos aceptables para nombres de variables (p. ej., `_`, `__`, `var_`, Define prefijos aceptables para nombres de columnas temporales (p. ej., `@`, `_`, `x`, `x_`). Las acciones de código sugerirán añadir estos prefijos a los nombres de columnas temporales que no sigan la convención. -## Editor SQL / Editor M / Editor de C\# +## Editor SQL / Editor M / Editor de C\\# ![Marcador de posición: captura de pantalla de las páginas de preferencias de los editores SQL/M/C#] From 1be73a58d40a2f8cef2004680349585cc74775c8 Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 11:26:07 +0200 Subject: [PATCH 09/31] New translations security-privacy.md (Spanish) --- localizedContent/es/content/security/security-privacy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/localizedContent/es/content/security/security-privacy.md b/localizedContent/es/content/security/security-privacy.md index 792f6d55..02462c0e 100644 --- a/localizedContent/es/content/security/security-privacy.md +++ b/localizedContent/es/content/security/security-privacy.md @@ -86,7 +86,7 @@ Tabular Editor puede realizar solicitudes a recursos en línea (URL web) solo en - **Activación de licencia\*.** Cuando Tabular Editor 3 se inicia por primera vez y, posteriormente, a intervalos periódicos, la herramienta puede realizar una solicitud a nuestro servicio de licencias. Esta solicitud contiene información cifrada sobre la clave de licencia introducida por el usuario, la dirección de correo electrónico del usuario (si se proporciona), el nombre del equipo local y un hash codificado unidireccional que identifica la instalación actual. No se transmite ningún otro dato en esta solicitud. El propósito de esta solicitud es activar y validar la clave de licencia utilizada por la instalación, aplicar las limitaciones de la versión de prueba y permitir que el usuario gestione sus instalaciones de Tabular Editor 3 a través de nuestro servicio de licencias. - **Comprobaciones de actualización\*.** Cada vez que se inicia Tabular Editor 3, puede realizar una solicitud a nuestro servicio de aplicaciones para determinar si hay disponible una versión más reciente de Tabular Editor 3. Esta solicitud no contiene ningún dato. -- **Telemetría de uso\*.** De forma predeterminada, Tabular Editor 3 recopila y transmite datos de uso anónimos a medida que los usuarios interactúan con la herramienta. Estos datos incluyen información sobre los objetos de la interfaz de usuario con los que interactúa un usuario y el momento de cada interacción. También contiene información de alto nivel sobre el Data model tabular que se está editando con la herramienta. Esta información solo se refiere a propiedades de alto nivel como el nivel de compatibilidad y el modo, el número de tablas, el tipo de servidor (Analysis Services vs. Power BI vs. Power BI Desktop), etc. **No se recopilan datos personales identificables de esta manera**, ni recopilamos información sobre los nombres de los objetos o las expresiones DAX en el propio Tabular Object Model. Un usuario puede optar por no enviarnos datos de telemetría en cualquier momento. +- **Telemetría de uso\*.** De forma predeterminada, Tabular Editor 3 recopila y transmite datos de uso anónimos a medida que los usuarios interactúan con la herramienta. Estos datos incluyen información sobre los objetos de la interfaz de usuario con los que interactúa un usuario y el momento de cada interacción. También contiene información de alto nivel sobre el Data model tabular que se está editando con la herramienta. Un usuario puede optar por no enviarnos datos de telemetría en cualquier momento. Esta información solo se refiere a propiedades de alto nivel como el nivel de compatibilidad y el modo, el número de tablas, el tipo de servidor (Analysis Services vs. Power BI vs. Power BI Desktop), etc. **No se recopilan datos personales identificables de esta manera**, ni recopilamos información sobre los nombres de los objetos o las expresiones DAX en el propio Tabular Object Model. - **Reports de error\*.** Cuando se produce un error inesperado, transmitimos la traza de la pila y los mensajes de error (anonimizados), junto con una descripción opcional proporcionada por el usuario. Si un usuario decide no enviar datos de telemetría, tampoco se enviarán los Reports de error. - **Uso del formateador de DAX.** (Solo Tabular Editor 2.x) Se puede dar formato a una expresión DAX haciendo clic en un botón en Tabular Editor. En este caso, la expresión DAX (y nada más) se envía al servicio web www.daxformatter.com. La primera vez que un usuario hace clic en este botón, se muestra un mensaje de advertencia explícito para que confirme su intención. Tabular Editor 3 no realiza solicitudes web al dar formato al código DAX. - **Optimizador de DAX**. Si un usuario tiene una [cuenta de Tabular Tools](https://tabulartools.com) con una suscripción a [Optimizador de DAX](https://daxoptimizer.com), podrá explorar su Workspace del Optimizador de DAX, ver incidencias y sugerencias, y cargar nuevos archivos VPAX directamente desde Tabular Editor 3. Los archivos VPAX contienen metadatos y estadísticas del modelo, pero no _datos_ reales del modelo. La función de integración del Optimizador de DAX en Tabular Editor 3 realiza varias solicitudes a uno o varios de los endpoints indicados a continuación (en función del tipo de autenticación y de la región especificados al crear la cuenta de Tabular Tools).
From 234ce3026493509e24e48c2b043e31556916c16e Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 11:29:40 +0200 Subject: [PATCH 10/31] New translations best-practice-analyzer.md (Chinese Simplified) --- .../features/Best-Practice-Analyzer.md | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/localizedContent/zh/content/features/Best-Practice-Analyzer.md b/localizedContent/zh/content/features/Best-Practice-Analyzer.md index a923768f..42deda32 100644 --- a/localizedContent/zh/content/features/Best-Practice-Analyzer.md +++ b/localizedContent/zh/content/features/Best-Practice-Analyzer.md @@ -23,60 +23,60 @@ applies_to: ![图片](https://user-images.githubusercontent.com/8976200/53631987-baee5880-3c0b-11e9-9d66-e906cccce2be.png) -每当模型发生更改时,Best Practice Analyzer 都会在后台扫描你的模型以查找问题。 你可以在“文件 > 偏好设置”中禁用此功能。 +每当模型发生更改时,Best Practice Analyzer 都会在后台扫描你的模型以查找问题。 你可以在“文件 > 偏好设置”中禁用此功能。 你可以在“文件 > 偏好设置”中禁用此功能。 单击该链接(或按 F10)会打开全新改进后的 Best Practice Analyzer 界面: ![图片](https://user-images.githubusercontent.com/8976200/53631947-9eeab700-3c0b-11e9-9217-5739d4de2f88.png) -如果你在早期版本中用过 Best Practice Analyzer,首先会注意到它的界面已被彻底重新设计,占用的屏幕空间更少。 这样一来,你可以将该窗口停靠在屏幕的一侧,同时将主窗口放在另一侧,从而同时使用两者。 +如果你在早期版本中用过 Best Practice Analyzer,首先会注意到它的界面已被彻底重新设计,占用的屏幕空间更少。 这样一来,你可以将该窗口停靠在屏幕的一侧,同时将主窗口放在另一侧,从而同时使用两者。 这样一来,你可以将该窗口停靠在屏幕的一侧,同时将主窗口放在另一侧,从而同时使用两者。 -Best Practice Analyzer 窗口会持续列出适用于你的模型的所有**有效规则**,以及违反各项规则的对象。 在列表中的任意位置右键单击,或使用窗口顶部工具栏上的按钮,即可执行以下操作: +Best Practice Analyzer 窗口会持续列出适用于你的模型的所有**有效规则**,以及违反各项规则的对象。 在列表中的任意位置右键单击,或使用窗口顶部工具栏上的按钮,即可执行以下操作: 在列表中的任意位置右键单击,或使用窗口顶部工具栏上的按钮,即可执行以下操作: - **管理规则...**:这会打开“管理规则”界面,下面会详细介绍。 也可以通过主界面的“工具 > 管理 BPA 规则...”菜单打开此界面。 - **转到对象...**:选择此选项,或在列表中双击某个对象,都会在主界面中定位到该对象。 -- **忽略项/多项**:在列表中选择一个或多个对象并使用此选项后,系统会为所选对象添加一条注释,指示 Best Practice Analyzer 后续忽略这些对象。 如果你误忽略了某个对象,可以切换窗口顶部的“显示已忽略”按钮。 这样你就可以取消忽略之前已被忽略的对象。 -- **忽略规则**:如果你已在列表中选择了一条或多条规则,此选项会在模型级别添加一条注释,用于指示应始终忽略所选规则。 同样,通过切换“显示已忽略项”按钮,你也可以取消对规则的忽略。 +- **忽略项/多项**:在列表中选择一个或多个对象并使用此选项后,系统会为所选对象添加一条注释,指示 Best Practice Analyzer 后续忽略这些对象。 如果你误忽略了某个对象,可以切换窗口顶部的“显示已忽略”按钮。 这样你就可以取消忽略之前已被忽略的对象。 如果你误忽略了某个对象,可以切换窗口顶部的“显示已忽略”按钮。 这样你就可以取消忽略之前已被忽略的对象。 +- **忽略规则**:如果你已在列表中选择了一条或多条规则,此选项会在模型级别添加一条注释,用于指示应始终忽略所选规则。 同样,通过切换“显示已忽略项”按钮,你也可以取消对规则的忽略。 同样,通过切换“显示已忽略项”按钮,你也可以取消对规则的忽略。 - **生成修复脚本**:对于可轻松修复的规则(即只需在对象上设置单个属性即可解决问题),将启用此选项。 点击后,会将一段 C# Script 复制到你的剪贴板。 随后,你可以将该脚本粘贴到 Tabular Editor 的 [Advanced Scripting](../how-tos/Advanced-Scripting.md) 区域,在执行以应用修复之前先进行检查。 - **应用修复**:如上所述,此选项同样适用于可轻松修复的规则。 脚本不会被复制到剪贴板,而是会立即执行。 ## 管理最佳实践规则 -如果你需要添加、删除或修改应用于模型的规则,这里也提供了一个全新的 UI 来完成这些操作。 你可以通过点击 Best Practice Analyzer 窗口左上角的按钮打开它,也可以在主窗口中使用“Tools > Manage BPA Rules...”菜单项。 +如果你需要添加、删除或修改应用于模型的规则,这里也提供了一个全新的 UI 来完成这些操作。 如果你需要添加、删除或修改应用于模型的规则,这里也提供了一个全新的 UI 来完成这些操作。 你可以通过点击 Best Practice Analyzer 窗口左上角的按钮打开它,也可以在主窗口中使用“Tools > Manage BPA Rules...”菜单项。 ![图片](https://user-images.githubusercontent.com/8976200/53632990-2f29fb80-3c0e-11e9-82fe-ee9c921662c7.png) -该界面包含两个列表:上方列表显示当前已加载的**规则集**。 在此列表中选择某个规则集后,下方列表会显示该规则集中定义的所有规则。 默认会显示三个规则集: +该界面包含两个列表:上方列表显示当前已加载的**规则集**。 在此列表中选择某个规则集后,下方列表会显示该规则集中定义的所有规则。 默认会显示三个规则集: 在此列表中选择某个规则集后,下方列表会显示该规则集中定义的所有规则。 默认会显示三个规则集: -- **当前模型中的规则**:顾名思义,这是在当前模型内定义的规则集。 这些规则定义作为注释存储在 Model 对象上。 -- **本地用户规则**:这些规则存储在 `%AppData%\..\Local\TabularEditor3\BPARules.json` 文件(Tabular Editor 3)或 `%AppData%\..\Local\TabularEditor\BPARules.json` 文件(Tabular Editor 2)中。 这些规则将应用于当前登录的 Windows 用户在 Tabular Editor 中加载的所有模型。 -- **本地计算机上的规则**:这些规则存储在 `%ProgramData%\TabularEditor\BPARules.json` 中。 这些规则将应用于当前计算机上在 Tabular Editor 中加载的所有模型。 +- **当前模型中的规则**:顾名思义,这是在当前模型内定义的规则集。 **当前模型中的规则**:顾名思义,这是在当前模型内定义的规则集。 这些规则定义作为注释存储在 Model 对象上。 +- **本地用户规则**:这些规则存储在 `%AppData%\..\Local\TabularEditor3\BPARules.json` 文件(Tabular Editor 3)或 `%AppData%\..\Local\TabularEditor\BPARules.json` 文件(Tabular Editor 2)中。 这些规则将应用于当前登录的 Windows 用户在 Tabular Editor 中加载的所有模型。 这些规则将应用于当前登录的 Windows 用户在 Tabular Editor 中加载的所有模型。 +- **本地计算机上的规则**:这些规则存储在 `%ProgramData%\TabularEditor\BPARules.json` 中。 这些规则将应用于当前计算机上在 Tabular Editor 中加载的所有模型。 这些规则将应用于当前计算机上在 Tabular Editor 中加载的所有模型。 -如果多个规则集中都包含同一条规则(按 ID),则优先级从上到下。也就是说,模型内定义的规则优先于本地计算机上定义的同 ID 规则。 这样你就可以覆盖现有规则,例如将模型特定的约定考虑在内。 +如果多个规则集中都包含同一条规则(按 ID),则优先级从上到下。也就是说,模型内定义的规则优先于本地计算机上定义的同 ID 规则。 这样你就可以覆盖现有规则,例如将模型特定的约定考虑在内。 这样你就可以覆盖现有规则,例如将模型特定的约定考虑在内。 -在列表顶部,你会看到一个名为 **(Effective rules)** 的特殊集合。 选择此集合后,你将看到实际应用于当前已加载模型的规则列表,并会按前文所述遵循相同 ID 规则的优先级。 下方列表会指明每条规则所属的规则集。 此外,如果在优先级更高的集合中存在 ID 相同的规则,你会注意到该规则的名称会显示为删除线: +在列表顶部,你会看到一个名为 **(Effective rules)** 的特殊集合。 在列表顶部,你会看到一个名为 **(Effective rules)** 的特殊集合。 选择此集合后,你将看到实际应用于当前已加载模型的规则列表,并会按前文所述遵循相同 ID 规则的优先级。 下方列表会指明每条规则所属的规则集。 此外,如果在优先级更高的集合中存在 ID 相同的规则,你会注意到该规则的名称会显示为删除线: 下方列表会指明每条规则所属的规则集。 此外,如果在优先级更高的集合中存在 ID 相同的规则,你会注意到该规则的名称会显示为删除线: ![image](https://user-images.githubusercontent.com/8976200/53633831-74e7c380-3c10-11e9-925e-1419987f5a17.png) ### 添加更多规则集 -Tabular Editor 2.8.1 的一项新功能是,可以在模型中包含来自其他来源的规则。 例如,如果你的某个规则文件位于网络共享上,现在可以将该文件作为规则集包含到当前模型中。 如果你对该文件所在位置具有写入权限,还可以添加/修改/删除该文件中的规则。 以这种方式添加的规则集,其优先级高于模型内定义的规则。 如果你添加了多个此类规则集,可以通过上移和下移来控制它们之间的优先级。 +Tabular Editor 2.8.1 的一项新功能是,可以在模型中包含来自其他来源的规则。 例如,如果你的某个规则文件位于网络共享上,现在可以将该文件作为规则集包含到当前模型中。 如果你对该文件所在位置具有写入权限,还可以添加/修改/删除该文件中的规则。 以这种方式添加的规则集,其优先级高于模型内定义的规则。 如果你添加了多个此类规则集,可以通过上移和下移来控制它们之间的优先级。 例如,如果你的某个规则文件位于网络共享上,现在可以将该文件作为规则集包含到当前模型中。 如果你对该文件所在位置具有写入权限,还可以添加/修改/删除该文件中的规则。 以这种方式添加的规则集,其优先级高于模型内定义的规则。 如果你添加了多个此类规则集,可以通过上移和下移来控制它们之间的优先级。 -点击“添加...”按钮,将新规则集添加到模型中。 这会提供以下选项: +点击“添加...”按钮,将新规则集添加到模型中。 这会提供以下选项: 这会提供以下选项: ![image](https://user-images.githubusercontent.com/8976200/53634211-7cf43300-3c11-11e9-8fed-7df113264a6f.png) - **创建新规则文件**:这会在指定位置创建一个新的空 .json 文件,之后你可以向其中添加规则。 选择文件时,注意有一个使用相对文件路径的选项。 如果你希望将规则文件存储在与当前模型相同的 repository 中,这会很有用。 但要注意,相对规则文件引用仅在模型从磁盘加载时才有效(因为从 Analysis Services 实例加载模型时不存在工作目录)。 -- **包含本地规则文件**:如果你已经有一个包含规则的 .json 文件,并想把它包含到模型中,就用这个选项。 同样,你也可以使用相对文件路径;如果该文件位于靠近模型元数据的位置,这会更方便。 如果该文件位于网络共享上(或者更一般地说,位于与当前已加载模型元数据所在位置不同的驱动器上),则只能使用绝对路径来包含它。 -- **从 URL 包含规则文件**:此选项允许你指定一个 HTTP/HTTPS URL,该 URL 应返回有效的规则定义(JSON)。 如果你想包含来自在线来源的规则,这会很有用,例如来自 [BestPracticeRules GitHub 站点](https://github.com/microsoft/Analysis-Services/tree/master/BestPracticeRules) 的 [标准 BPA 规则](https://raw.githubusercontent.com/microsoft/Analysis-Services/master/BestPracticeRules/BPARules.json)。 注意,从在线来源添加的规则集将是只读的。 +- **包含本地规则文件**:如果你已经有一个包含规则的 .json 文件,并想把它包含到模型中,就用这个选项。 同样,你也可以使用相对文件路径;如果该文件位于靠近模型元数据的位置,这会更方便。 如果该文件位于网络共享上(或者更一般地说,位于与当前已加载模型元数据所在位置不同的驱动器上),则只能使用绝对路径来包含它。 同样,你也可以使用相对文件路径;如果该文件位于靠近模型元数据的位置,这会更方便。 如果该文件位于网络共享上(或者更一般地说,位于与当前已加载模型元数据所在位置不同的驱动器上),则只能使用绝对路径来包含它。 +- **从 URL 包含规则文件**:此选项允许你指定一个 HTTP/HTTPS URL,该 URL 应返回有效的规则定义(JSON)。 **从 URL 包含规则文件**:此选项允许你指定一个 HTTP/HTTPS URL,该 URL 应返回有效的规则定义(JSON)。 如果你想包含来自在线来源的规则,这会很有用,例如来自 [BestPracticeRules GitHub 站点](https://github.com/microsoft/Analysis-Services/tree/master/BestPracticeRules) 的 [标准 BPA 规则](https://raw.githubusercontent.com/microsoft/Analysis-Services/master/BestPracticeRules/BPARules.json)。 注意,从在线来源添加的规则集将是只读的。 注意,从在线来源添加的规则集将是只读的。 ### 修改规则集中的规则 -屏幕下半部分允许你在当前选中的规则集中添加、编辑、克隆和删除规则,前提是你对该规则集的存储位置具有写入权限。 此外,“移动到...”按钮允许你将所选规则移动或复制到另一个规则集,从而更轻松地管理多个规则集。 +屏幕下半部分允许你在当前选中的规则集中添加、编辑、克隆和删除规则,前提是你对该规则集的存储位置具有写入权限。 此外,“移动到...”按钮允许你将所选规则移动或复制到另一个规则集,从而更轻松地管理多个规则集。 此外,“移动到...”按钮允许你将所选规则移动或复制到另一个规则集,从而更轻松地管理多个规则集。 ### 规则说明占位符 -相比之前版本有一个小改进:现在你可以在最佳实践规则的说明中使用以下占位符值。 这将提供更多可自定义的说明,并在“最佳实践”界面中以工具提示的形式显示: +相比之前版本有一个小改进:现在你可以在最佳实践规则的说明中使用以下占位符值。 这将提供更多可自定义的说明,并在“最佳实践”界面中以工具提示的形式显示: 这将提供更多可自定义的说明,并在“最佳实践”界面中以工具提示的形式显示: - `%object%` 返回当前对象的完全限定 DAX 引用(如适用) - `%objectname%` 仅返回当前对象的名称 From 8a22997ff7070a9db517913cd7c011382c674a54 Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 11:29:43 +0200 Subject: [PATCH 11/31] New translations script-add-databricks-metadata-descriptions.md (Chinese Simplified) --- .../Advanced/script-add-databricks-metadata-descriptions.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/localizedContent/zh/content/features/CSharpScripts/Advanced/script-add-databricks-metadata-descriptions.md b/localizedContent/zh/content/features/CSharpScripts/Advanced/script-add-databricks-metadata-descriptions.md index 39403a05..918e3fec 100644 --- a/localizedContent/zh/content/features/CSharpScripts/Advanced/script-add-databricks-metadata-descriptions.md +++ b/localizedContent/zh/content/features/CSharpScripts/Advanced/script-add-databricks-metadata-descriptions.md @@ -15,11 +15,12 @@ applies_to: ## 脚本用途 -这个脚本是 Tabular Editor x Databricks 系列的一部分。 在 Unity Catalog 中,可以为表和列添加描述性注释。 此脚本可复用这些信息,自动补全语义模型中的表和列说明。

+这个脚本是 Tabular Editor x Databricks 系列的一部分。 在 Unity Catalog 中,可以为表和列添加描述性注释。 此脚本可复用这些信息,自动补全语义模型中的表和列说明。

在 Unity Catalog 中,可以为表和列添加描述性注释。 此脚本可复用这些信息,自动补全语义模型中的表和列说明。

> [!NOTE] > 这个脚本需要先安装 Simba Spark ODBC Driver(可从 https://www.databricks.com/spark/odbc-drivers-download 下载) > 每次运行脚本时,都会提示你输入 Databricks 个人访问令牌。 这是用于向 Databricks 进行身份验证所必需的。 +> 这个脚本使用 Unity Catalog 中的 information_schema 表来检索关系信息,因此你可能需要和你的 Databricks 管理员再确认一下,确保你有权限查询这些表。

这是用于向 Databricks 进行身份验证所必需的。 > 这个脚本使用 Unity Catalog 中的 information_schema 表来检索关系信息,因此你可能需要和你的 Databricks 管理员再确认一下,确保你有权限查询这些表。

## 脚本 From 2995fa5327863fb56ce85e5d7eccca455b33254d Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 11:30:40 +0200 Subject: [PATCH 12/31] New translations direct-lake-sql-model.md (Chinese Simplified) --- .../Semantic-Model/direct-lake-sql-model.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/localizedContent/zh/content/features/Semantic-Model/direct-lake-sql-model.md b/localizedContent/zh/content/features/Semantic-Model/direct-lake-sql-model.md index 9ba53447..603ef1a5 100644 --- a/localizedContent/zh/content/features/Semantic-Model/direct-lake-sql-model.md +++ b/localizedContent/zh/content/features/Semantic-Model/direct-lake-sql-model.md @@ -22,12 +22,13 @@ applies_to: SQL 语义模型上的 Direct Lake 可通过 SQL 端点直接连接到存储在 [Fabric 中的 OneLake](https://learn.microsoft.com/en-us/fabric/onelake/onelake-overview) 中的数据源。 > [!IMPORTANT] -> 自 [Tabular Editor 3.22.0](../../references/release-notes/3_22_0.md) 起,Tabular Editor 3 支持 OneLake 上的 Direct Lake,在大多数场景下推荐使用。 更多信息请参阅我们的 [Direct Lake 指南](xref:direct-lake-guidance)。 +> 自 [Tabular Editor 3.22.0](../../references/release-notes/3_22_0.md) 起,Tabular Editor 3 支持 OneLake 上的 Direct Lake,在大多数场景下推荐使用。 更多信息请参阅我们的 [Direct Lake 指南](xref:direct-lake-guidance)。 更多信息请参阅我们的 [Direct Lake 指南](xref:direct-lake-guidance)。 +Tabular Editor 3 可以创建并连接此类模型。 如需教程,请参阅我们的博客文章:[Direct Lake 语义模型:如何在 Tabular Editor 中使用](https://blog.tabulareditor.com/2023/09/26/fabric-direct-lake-with-tabular-editor-part-2-creation/)。 Tabular Editor 3 可以创建并连接此类模型。 如需教程,请参阅我们的博客文章:[Direct Lake 语义模型:如何在 Tabular Editor 中使用](https://blog.tabulareditor.com/2023/09/26/fabric-direct-lake-with-tabular-editor-part-2-creation/)。 Tabular Editor 3 可以使用 Lakehouse 和 Datawarehouse 的 SQL 端点创建 Direct Lake 语义模型。 -Tabular Editor 2 可以连接到 Direct Lake 语义模型,但不提供用于创建新表或 Direct Lake 语义模型的内置功能。 这需要手动完成,或使用 C# Script 来实现。 +Tabular Editor 2 可以连接到 Direct Lake 语义模型,但不提供用于创建新表或 Direct Lake 语义模型的内置功能。 这需要手动完成,或使用 C# Script 来实现。 这需要手动完成,或使用 C# Script 来实现。
Direct Lake 的限制
@@ -44,26 +45,28 @@ Tabular Editor 2 可以连接到 Direct Lake 语义模型,但不提供用于 > [!NOTE] > SQL 上的 Direct Lake 模型目前使用的排序规则与常规 Power BI 导入语义模型不同。 这可能会导致在查询模型或在 DAX 代码中引用对象名称时得到不同的结果。 +> 更多信息,请参阅 Kurt Buhler 的这篇博客文章:[Power BI 中区分大小写的模型:影响与注意事项](https://data-goblins.com/power-bi/case-specific) 这可能会导致在查询模型或在 DAX 代码中引用对象名称时得到不同的结果。 > 更多信息,请参阅 Kurt Buhler 的这篇博客文章:[Power BI 中区分大小写的模型:影响与注意事项](https://data-goblins.com/power-bi/case-specific) > [!IMPORTANT] +> 从 [Tabular Editor 3.22.0](../../references/release-notes/3_22_0.md) 开始,“新建模型”对话框中已移除 Direct Lake 复选框。 [!IMPORTANT] > 从 [Tabular Editor 3.22.0](../../references/release-notes/3_22_0.md) 开始,“新建模型”对话框中已移除 Direct Lake 复选框。 如果在 SQL 上使用 Direct Lake,则必须[手动将模型的排序规则设置为与 Fabric Warehouse 的排序规则一致](xref:direct-lake-guidance#collation)。 ## 为新模型和表导入设定框架 -Tabular Editor 3(3.15.0 或更高版本)会在首次部署时自动对模型执行框架化(刷新)。 这样可以确保 Direct Lake 模式已启用——否则模型会自动回退到 DirectQuery。 +Tabular Editor 3(3.15.0 或更高版本)会在首次部署时自动对模型执行框架化(刷新)。 Tabular Editor 3(3.15.0 或更高版本)会在首次部署时自动对模型执行框架化(刷新)。 这样可以确保 Direct Lake 模式已启用——否则模型会自动回退到 DirectQuery。 -此外,在导入新表后,Tabular Editor 3(3.15.0 或更高版本)会在下一次保存时对模型执行框架化(刷新)。 该首选项位于 **Tools > Preferences > Model Deployment > Data Refresh** 下。 +此外,在导入新表后,Tabular Editor 3(3.15.0 或更高版本)会在下一次保存时对模型执行框架化(刷新)。 该首选项位于 **Tools > Preferences > Model Deployment > Data Refresh** 下。 该首选项位于 **Tools > Preferences > Model Deployment > Data Refresh** 下。 ## 识别 Direct Lake 模型 -Tabular Editor 顶部标题栏会显示该 Tabular Editor 实例当前打开的模型类型。 此外,TOM Explorer 会显示每张表的类型和模式(Import、DirectQuery、Dual 或 Direct Lake)。 如果模型混用了多种表模式,标题栏将显示“混合”。 目前,Direct Lake on SQL 模型无法包含处于 Import、DirectQuery 或 Dual 模式的表。 +Tabular Editor 顶部标题栏会显示该 Tabular Editor 实例当前打开的模型类型。 此外,TOM Explorer 会显示每张表的类型和模式(Import、DirectQuery、Dual 或 Direct Lake)。 如果模型混用了多种表模式,标题栏将显示“混合”。 目前,Direct Lake on SQL 模型无法包含处于 Import、DirectQuery 或 Dual 模式的表。 此外,TOM Explorer 会显示每张表的类型和模式(Import、DirectQuery、Dual 或 Direct Lake)。 如果模型混用了多种表模式,标题栏将显示“混合”。 目前,Direct Lake on SQL 模型无法包含处于 Import、DirectQuery 或 Dual 模式的表。 ## 将 Direct Lake 模型转换为导入模式 -下面的 C# 脚本可将一个现有模型转换为“导入模式”。 如果你的模型对数据延迟的要求不需要使用 Direct Lake,或者你想避开 Direct Lake 模型的限制,但已经在 Fabric 中开始构建该模型,那么这会很有用。 +下面的 C# 脚本可将一个现有模型转换为“导入模式”。 下面的 C# 脚本可将一个现有模型转换为“导入模式”。 如果你的模型对数据延迟的要求不需要使用 Direct Lake,或者你想避开 Direct Lake 模型的限制,但已经在 Fabric 中开始构建该模型,那么这会很有用。 -当 Tabular Editor 通过 XMLA endpoint 连接到语义模型时,即可运行该脚本。 不过,Microsoft 不支持直接将更改保存回 Power BI/Fabric Workspace。 为规避这一限制,建议使用“Model > Deploy...”选项。 这样就可以将新转换的模型作为 Workspace 中的一个新实体进行部署。 +当 Tabular Editor 通过 XMLA endpoint 连接到语义模型时,即可运行该脚本。 不过,Microsoft 不支持直接将更改保存回 Power BI/Fabric Workspace。 为规避这一限制,建议使用“Model > Deploy...”选项。 这样就可以将新转换的模型作为 Workspace 中的一个新实体进行部署。 不过,Microsoft 不支持直接将更改保存回 Power BI/Fabric Workspace。 为规避这一限制,建议使用“Model > Deploy...”选项。 这样就可以将新转换的模型作为 Workspace 中的一个新实体进行部署。 > [!NOTE] > 部署新转换的导入模式模型后,你需要指定用于访问 Lakehouse 的凭据,才能将数据刷新到模型中。 From e985c73680680eac5491db73b681aadb64fe56a6 Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 11:30:47 +0200 Subject: [PATCH 13/31] New translations useful-script-snippets.md (Chinese Simplified) --- .../features/Useful-script-snippets.md | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/localizedContent/zh/content/features/Useful-script-snippets.md b/localizedContent/zh/content/features/Useful-script-snippets.md index cfbbb952..897f0fba 100644 --- a/localizedContent/zh/content/features/Useful-script-snippets.md +++ b/localizedContent/zh/content/features/Useful-script-snippets.md @@ -18,7 +18,7 @@ applies_to: # 实用脚本片段 -这里汇总了一些简短的脚本片段,帮助你快速上手 Tabular Editor 的 [高级脚本功能](/Advanced-Scripting)。 其中很多脚本都适合保存为 [自定义操作](/Custom-Actions),这样你就可以通过上下文菜单轻松复用它们。' +这里汇总了一些简短的脚本片段,帮助你快速上手 Tabular Editor 的 [高级脚本功能](/Advanced-Scripting)。 其中很多脚本都适合保存为 [自定义操作](/Custom-Actions),这样你就可以通过上下文菜单轻松复用它们。' 其中很多脚本都适合保存为 [自定义操作](/Custom-Actions),这样你就可以通过上下文菜单轻松复用它们。' 另外,也别忘了看看我们的脚本库 @csharp-script-library,里面有更多贴近实际场景的示例,展示了你可以如何利用 Tabular Editor 的脚本功能。 @@ -47,13 +47,13 @@ foreach(var c in Selected.Columns) } ``` -这个片段使用 `.AddMeasure(, , )` 函数,在表中创建一个新的度量值。 我们使用 `DaxObjectFullName` 属性来获取列的完全限定名称,以便在 DAX 表达式中使用:`'TableName'[ColumnName]`。 +这个片段使用 `
.AddMeasure(, , )` 函数,在表中创建一个新的度量值。 我们使用 `DaxObjectFullName` 属性来获取列的完全限定名称,以便在 DAX 表达式中使用:`'TableName'[ColumnName]`。 我们使用 `DaxObjectFullName` 属性来获取列的完全限定名称,以便在 DAX 表达式中使用:`'TableName'[ColumnName]`。 *** ## 生成时间智能度量值 -首先,为各个时间智能聚合分别创建自定义操作。 例如: +首先,为各个时间智能聚合分别创建自定义操作。 例如: 例如: ```csharp // 为每个选中的度量值创建一个 TOTALYTD 度量值。 @@ -66,7 +66,7 @@ foreach(var m in Selected.Measures) { } ``` -这里我们使用 `DaxObjectName` 属性来生成用于 DAX 表达式的不带限定符的引用,因为这是一个度量值:`[MeasureName]`。 将其保存为一个适用于度量值的时间智能自定义操作,命名为 "Time Intelligence\Create YTD measure"。 为 MTD、LY 以及其他你需要的类型创建类似的操作。 然后,新建一个操作,并填入下面的脚本: +这里我们使用 `DaxObjectName` 属性来生成用于 DAX 表达式的不带限定符的引用,因为这是一个度量值:`[MeasureName]`。 将其保存为一个适用于度量值的时间智能自定义操作,命名为 "Time Intelligence\Create YTD measure"。 为 MTD、LY 以及其他你需要的类型创建类似的操作。 然后,新建一个操作,并填入下面的脚本: 将其保存为一个适用于度量值的时间智能自定义操作,命名为 "Time Intelligence\Create YTD measure"。 为 MTD、LY 以及其他你需要的类型创建类似的操作。 然后,新建一个操作,并填入下面的脚本: ```csharp // 调用所有时间智能自定义操作: @@ -154,7 +154,7 @@ foreach(var m in Selected.Measures) { ## 设置默认翻译 -有时,为所有(可见)对象应用默认翻译会很有用。 在这种情况下,默认翻译其实就是对象的原始名称/描述/显示文件夹。 这样做的一个好处是:以 JSON 格式导出翻译时会包含所有翻译对象,例如可用于 [SSAS Tabular Translator](https://www.sqlbi.com/tools/ssas-tabular-translator/)。 +有时,为所有(可见)对象应用默认翻译会很有用。 在这种情况下,默认翻译其实就是对象的原始名称/描述/显示文件夹。 有时,为所有(可见)对象应用默认翻译会很有用。 在这种情况下,默认翻译其实就是对象的原始名称/描述/显示文件夹。 这样做的一个好处是:以 JSON 格式导出翻译时会包含所有翻译对象,例如可用于 [SSAS Tabular Translator](https://www.sqlbi.com/tools/ssas-tabular-translator/)。 以下脚本会遍历模型中的所有区域设置;对于每个可见对象,若尚无翻译,则会为其赋予默认值: @@ -208,7 +208,7 @@ void ApplyDefaultTranslation(ITranslatableObject obj, Culture culture) ## 处理透视 -度量值、列、层级结构和表都提供 `InPerspective` 属性。该属性会为模型中的每个透视保存一个 True/False 值,用来指示给定对象是否属于该透视。 比如: +度量值、列、层级结构和表都提供 `InPerspective` 属性。该属性会为模型中的每个透视保存一个 True/False 值,用来指示给定对象是否属于该透视。 比如: 比如: ```csharp foreach(var measure in Selected.Measures) @@ -242,7 +242,7 @@ foreach(var measure in Selected.Measures) } ``` -这种技巧也可用于通过代码生成新对象。 例如,如果我们希望确保自动生成的时间智能度量值只在与其基础度量值相同的透视中可见,可以在上一节的脚本基础上扩展如下: +这种技巧也可用于通过代码生成新对象。 这种技巧也可用于通过代码生成新对象。 例如,如果我们希望确保自动生成的时间智能度量值只在与其基础度量值相同的透视中可见,可以在上一节的脚本基础上扩展如下: ```csharp // 为每个选中的度量值创建一个 TOTALYTD 度量值。 @@ -260,11 +260,11 @@ foreach(var m in Selected.Measures) { ## 生成分区 -如果你需要对某个表进行自定义分区,C# Script 可以帮助你快速生成大量分区。 基本思路是:为表添加一个注释,其中包含一个 SQL 或 M 查询,作为每个分区的模板。 然后脚本会根据需要替换筛选参数。 例如,使用 SQL 分区时,你可以添加一个名为 `PartitionTemplateSQL` 的注释,并将其值设置为 `SELECT * FROM fact_ResellerSales WHERE CalendarID BETWEEN {0} AND {1}`。 在生成最终分区时,我们的脚本会替换 `{0}` 和 `{1}` 占位符。 在此例中,`CalendarID` 是整数;但一般来说,你需要确保最终得到的字符串是有效的 SQL(或 M)查询。 +如果你需要对某个表进行自定义分区,C# Script 可以帮助你快速生成大量分区。 基本思路是:为表添加一个注释,其中包含一个 SQL 或 M 查询,作为每个分区的模板。 然后脚本会根据需要替换筛选参数。 例如,使用 SQL 分区时,你可以添加一个名为 `PartitionTemplateSQL` 的注释,并将其值设置为 `SELECT * FROM fact_ResellerSales WHERE CalendarID BETWEEN {0} AND {1}`。 在生成最终分区时,我们的脚本会替换 `{0}` 和 `{1}` 占位符。 在此例中,`CalendarID` 是整数;但一般来说,你需要确保最终得到的字符串是有效的 SQL(或 M)查询。 基本思路是:为表添加一个注释,其中包含一个 SQL 或 M 查询,作为每个分区的模板。 然后脚本会根据需要替换筛选参数。 例如,使用 SQL 分区时,你可以添加一个名为 `PartitionTemplateSQL` 的注释,并将其值设置为 `SELECT * FROM fact_ResellerSales WHERE CalendarID BETWEEN {0} AND {1}`。 在生成最终分区时,我们的脚本会替换 `{0}` 和 `{1}` 占位符。 在此例中,`CalendarID` 是整数;但一般来说,你需要确保最终得到的字符串是有效的 SQL(或 M)查询。 ![](https://user-images.githubusercontent.com/8976200/70135273-07c6fa00-168a-11ea-84f6-90f0b3498ed8.png) -这里的示例会按月生成分区。 选择一个带有 `PartitionTemplateSQL` 注释的表,然后运行该脚本。 +这里的示例会按月生成分区。 这里的示例会按月生成分区。 选择一个带有 `PartitionTemplateSQL` 注释的表,然后运行该脚本。 ```csharp var firstPartition = new DateTime(2018,1,1); // 第一个分区日期 @@ -308,9 +308,9 @@ SaveFile("Exported Properties 1.tsv", tsv); 在 Excel 中打开后,生成的 .TSV 文件如下所示: ![image](https://user-images.githubusercontent.com/8976200/36632472-e8e96ef6-197e-11e8-8285-6816b09ad036.png) -第一列(Object)中的内容是对该对象的引用。 如果更改了该列内容,后续导入这些属性时可能无法正常进行。 如果你想修改对象名称,只需更改第二列(Name)中的值。 +第一列(Object)中的内容是对该对象的引用。 如果更改了该列内容,后续导入这些属性时可能无法正常进行。 如果你想修改对象名称,只需更改第二列(Name)中的值。 如果更改了该列内容,后续导入这些属性时可能无法正常进行。 如果你想修改对象名称,只需更改第二列(Name)中的值。 -默认情况下,文件会保存到 TabularEditor.exe 所在的同一文件夹中。 默认情况下,仅导出以下属性(如适用,具体取决于所导出对象的类型): +默认情况下,文件会保存到 TabularEditor.exe 所在的同一文件夹中。 默认情况下,仅导出以下属性(如适用,具体取决于所导出对象的类型): 默认情况下,仅导出以下属性(如适用,具体取决于所导出对象的类型): - 名称 - 描述 @@ -327,7 +327,7 @@ var tsv = ExportProperties(Selected.Table.Measures, "Name,DetailRowsExpression") SaveFile("Exported Properties 2.tsv", tsv); ``` -可用的属性名称可在 [TOM API 文档](https://msdn.microsoft.com/en-us/library/microsoft.analysisservices.tabular.aspx) 中找到。 这些名称大多与 Tabular Editor 属性网格中显示的名称一致,只是采用 CamelCase 并去掉了空格(少数情况例外,例如,“Hidden” 属性在 TOM API 中称为 `IsHidden`)。 +可用的属性名称可在 [TOM API 文档](https://msdn.microsoft.com/en-us/library/microsoft.analysisservices.tabular.aspx) 中找到。 这些名称大多与 Tabular Editor 属性网格中显示的名称一致,只是采用 CamelCase 并去掉了空格(少数情况例外,例如,“Hidden” 属性在 TOM API 中称为 `IsHidden`)。 这些名称大多与 Tabular Editor 属性网格中显示的名称一致,只是采用 CamelCase 并去掉了空格(少数情况例外,例如,“Hidden” 属性在 TOM API 中称为 `IsHidden`)。 要导入属性,请使用以下代码片段: @@ -363,7 +363,7 @@ var tsv = ExportProperties(Model.AllMeasures, "Name,InPerspective[Inventory]"); SaveFile(@"c:\Project\MeasurePerspectiveInventory.tsv", tsv); ``` -同理,翻译、注释等也是如此。 例如,如果你想查看应用于表、列、层次结构、级别和度量值的所有丹麦语翻译: +同理,翻译、注释等也是如此。 同理,翻译、注释等也是如此。 例如,如果你想查看应用于表、列、层次结构、级别和度量值的所有丹麦语翻译: ```csharp // 构造对象列表: @@ -382,7 +382,7 @@ SaveFile(@"c:\Project\ObjectTranslations.tsv", tsv); ## 生成文档 -如果你想为模型的全部或部分内容生成文档,也可以使用上面展示的 `ExportProperties` 方法。 下面的代码片段会从 Tabular 模型中所有可见的度量值或列提取一组属性,并将其保存为 TSV 文件: +如果你想为模型的全部或部分内容生成文档,也可以使用上面展示的 `ExportProperties` 方法。 如果你想为模型的全部或部分内容生成文档,也可以使用上面展示的 `ExportProperties` 方法。 下面的代码片段会从 Tabular 模型中所有可见的度量值或列提取一组属性,并将其保存为 TSV 文件: ```csharp // 构造所有可见列和度量值的列表: @@ -403,9 +403,9 @@ SaveFile("documentation.tsv", tsv); ## 从文件生成度量值 -如果你想批量编辑模型中_现有_对象的属性,上述导出/导入属性的方法会很有用。 如果你想导入一个尚不存在的度量值列表,该怎么办? +如果你想批量编辑模型中_现有_对象的属性,上述导出/导入属性的方法会很有用。 如果你想导入一个尚不存在的度量值列表,该怎么办? 如果你想导入一个尚不存在的度量值列表,该怎么办? -假设你有一个 TSV(制表符分隔值)文件,其中包含要导入到现有 Tabular 模型中的度量值名称、说明和 DAX 表达式。 你可以使用下面的脚本读取该文件,将其拆分为行和列,并生成这些度量值。 该脚本还会为每个度量值分配一个特殊注释,这样它就能删除之前使用同一脚本创建的度量值。 +假设你有一个 TSV(制表符分隔值)文件,其中包含要导入到现有 Tabular 模型中的度量值名称、说明和 DAX 表达式。 你可以使用下面的脚本读取该文件,将其拆分为行和列,并生成这些度量值。 该脚本还会为每个度量值分配一个特殊注释,这样它就能删除之前使用同一脚本创建的度量值。 你可以使用下面的脚本读取该文件,将其拆分为行和列,并生成这些度量值。 该脚本还会为每个度量值分配一个特殊注释,这样它就能删除之前使用同一脚本创建的度量值。 ```csharp var targetTable = Model.Tables["Program"]; // 用于存放这些度量值的表的名称 @@ -459,7 +459,7 @@ start /wait TabularEditor.exe "localhost" "AdventureWorks" -S "c:\Projects\Autog ## 根据分区源元数据创建数据列 > [!NOTE] -> 下文所述的 `RefreshDataColumns()` 方法仅在 **Tabular Editor 2** 中可用。 在 Tabular Editor 3 中,请改用 **Import Table...** 功能。 +> 下文所述的 `RefreshDataColumns()` 方法仅在 **Tabular Editor 2** 中可用。 在 Tabular Editor 3 中,请改用 **Import Table...** 功能。 在 Tabular Editor 3 中,请改用 **Import Table...** 功能。 如果某个表使用基于 OLE DB Provider数据源的查询分区,我们可以通过执行以下代码片段来自动刷新该表的列元数据: @@ -504,7 +504,7 @@ foreach(var m in Selected.Measures) ## 生成表的源列列表 -下面的脚本会为当前选定的表输出一份格式良好的源列清单。 如果你想将使用 `SELECT *` 的分区查询替换为显式列清单,这会很有用。 +下面的脚本会为当前选定的表输出一份格式良好的源列清单。 如果你想将使用 `SELECT *` 的分区查询替换为显式列清单,这会很有用。 如果你想将使用 `SELECT *` 的分区查询替换为显式列清单,这会很有用。 ```csharp string.Join(",\r\n", @@ -520,7 +520,7 @@ string.Join(",\r\n", 如果你的团队一直采用一套固定的命名约定,你很快就会发现脚本的威力会更大。 -在一个或多个事实表上执行以下脚本后,脚本会根据列名自动创建与所有相关维度表的关系。 脚本会查找事实表中名称符合 `xxxyyyKey` 模式的列,其中 xxx 是用于角色扮演维度的可选限定符,yyy 是维度表名称。 在维度表中必须有一列名为 `yyyKey`,且其数据类型必须与事实表上的对应列相同。 例如,名为“ProductKey”的列会与 Product 表中的“ProductKey”列建立关系。 你也可以指定其他列名后缀来替换“Key”。 +在一个或多个事实表上执行以下脚本后,脚本会根据列名自动创建与所有相关维度表的关系。 在一个或多个事实表上执行以下脚本后,脚本会根据列名自动创建与所有相关维度表的关系。 脚本会查找事实表中名称符合 `xxxyyyKey` 模式的列,其中 xxx 是用于角色扮演维度的可选限定符,yyy 是维度表名称。 在维度表中必须有一列名为 `yyyKey`,且其数据类型必须与事实表上的对应列相同。 例如,名为“ProductKey”的列会与 Product 表中的“ProductKey”列建立关系。 你也可以指定其他列名后缀来替换“Key”。 在维度表中必须有一列名为 `yyyKey`,且其数据类型必须与事实表上的对应列相同。 例如,名为“ProductKey”的列会与 Product 表中的“ProductKey”列建立关系。 你也可以指定其他列名后缀来替换“Key”。 如果事实表与维度表之间已经存在关系,脚本会将新关系创建为非活动状态。 @@ -596,7 +596,7 @@ Selected.Table.AddMeasure("DumpFilters", dax); ## 将 CamelCase 转换为 Proper Case -在关系数据库中,列和表的一种常见命名方式是 CamelCase。 也就是说,名称中不含任何空格,且每个单词都以大写字母开头。 在 Tabular 模型中,未隐藏的表和列会对业务用户可见,因此通常更适合使用更“易读”的命名方式。 以下脚本会将 CamelCased 名称转换为 Proper Case。 连续的大写字母会原样保留(作为首字母缩写)。 例如,该脚本会将以下内容转换为: +在关系数据库中,列和表的一种常见命名方式是 CamelCase。 也就是说,名称中不含任何空格,且每个单词都以大写字母开头。 在 Tabular 模型中,未隐藏的表和列会对业务用户可见,因此通常更适合使用更“易读”的命名方式。 以下脚本会将 CamelCased 名称转换为 Proper Case。 连续的大写字母会原样保留(作为首字母缩写)。 例如,该脚本会将以下内容转换为: 也就是说,名称中不含任何空格,且每个单词都以大写字母开头。 在 Tabular 模型中,未隐藏的表和列会对业务用户可见,因此通常更适合使用更“易读”的命名方式。 以下脚本会将 CamelCased 名称转换为 Proper Case。 连续的大写字母会原样保留(作为首字母缩写)。 例如,该脚本会将以下内容转换为: - `CustomerWorkZipcode` 转换为 `Customer Work Zipcode` - `CustomerAccountID` 转换为 `Customer Account ID` @@ -640,7 +640,7 @@ foreach(var obj in Selected.OfType()) { 假设你有一个大型且复杂的模型,并希望了解哪些度量值可能会受到底层数据变更的影响。 -下面的脚本会遍历模型中的所有度量值,并针对每个度量值输出其依赖的表列表——包括直接依赖和间接依赖。 该列表会输出为制表符分隔文件。 +下面的脚本会遍历模型中的所有度量值,并针对每个度量值输出其依赖的表列表——包括直接依赖和间接依赖。 该列表会输出为制表符分隔文件。 该列表会输出为制表符分隔文件。 ```csharp string tsv = "度量值\tDependsOnTable"; // TSV 文件表头行 @@ -677,7 +677,7 @@ tsv.Output(); foreach(var col in Selected.Columns) col.AddAlternateOf(); ``` -接下来逐列处理,将它们映射到基础列,并相应设置汇总方式(Sum/Min/Max/GroupBy)。 或者,如果你想自动化此流程,并且聚合表中的列与基础表中的列名称完全相同,可以使用下面的脚本,它会为你自动映射这些列: +接下来逐列处理,将它们映射到基础列,并相应设置汇总方式(Sum/Min/Max/GroupBy)。 接下来逐列处理,将它们映射到基础列,并相应设置汇总方式(Sum/Min/Max/GroupBy)。 或者,如果你想自动化此流程,并且聚合表中的列与基础表中的列名称完全相同,可以使用下面的脚本,它会为你自动映射这些列: ```csharp // 在树中选择两张表(Ctrl+单击)。默认聚合表是列数最少的那张。 @@ -697,7 +697,7 @@ foreach(var col in aggTable.Columns) } ``` -运行脚本后,你应该会看到聚合表上的所有列都已设置了 `AlternateOf` 属性(见下方截图)。 请注意:要让聚合生效,基础表分区必须使用 DirectQuery。 +运行脚本后,你应该会看到聚合表上的所有列都已设置了 `AlternateOf` 属性(见下方截图)。 请注意:要让聚合生效,基础表分区必须使用 DirectQuery。 请注意:要让聚合生效,基础表分区必须使用 DirectQuery。 ![image](https://user-images.githubusercontent.com/8976200/85851134-6ed70800-b7ae-11ea-82eb-37fcaa2ca9c4.png) @@ -709,18 +709,18 @@ foreach(var col in aggTable.Columns) 以下方法可用: -| 方法 | 描述 | -| ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `void ExecuteCommand(string tmslOrXmla, bool isXmla = false)` | 这个方法会将指定的 TMSL 或 XMLA 脚本传递给已连接的 Analysis Services 实例。 当你想要刷新 AS 实例中某个表的数据时,这会很有用。 注意,如果你用这个方法更改模型元数据,本地模型元数据将与 AS 实例上的元数据不同步,并且下次尝试保存模型元数据时,你可能会收到版本冲突警告。 如果要发送 XMLA 脚本,请将 `isXmla` 参数设为 `true`。 | -| `IDataReader ExecuteReader(string dax)` | 在已连接的 AS 数据库上执行指定的 DAX _查询_,并返回得到的 [AmoDataReader](https://docs.microsoft.com/en-us/dotnet/api/microsoft.analysisservices.amodatareader?view=analysisservices-dotnet) 对象。 DAX 查询由一个或多个 [`EVALUATE`](https://dax.guide/EVALUATE) 语句组成。 注意,你不能同时打开多个数据读取器。 如果你忘记显式关闭或释放读取器,Tabular Editor 会自动关闭它们。 | -| `Dataset ExecuteDax(string dax)` | 对已连接的 AS 数据库执行指定的 DAX _查询_,并返回一个 [Dataset](https://docs.microsoft.com/en-us/dotnet/api/system.data.dataset?view=netframework-4.6) 对象,其中包含查询返回的数据。 DAX 查询由一个或多个 [`EVALUATE`](https://dax.guide/EVALUATE) 语句组成。 返回的 Dataset 对象中,每个 `EVALUATE` 语句都会对应一个 DataTable。 不建议返回超大的数据表,因为这可能会导致内存不足或其他稳定性问题。 | -| `object EvaluateDax(string dax)` | 对已连接的 AS 数据库执行指定的 DAX _表达式_,并返回一个表示执行结果的对象。 如果 DAX 表达式是标量,则会返回相应类型的对象(string、long、decimal、double、DateTime)。 如果 DAX 表达式为表值,则会返回一个 [DataTable](https://docs.microsoft.com/en-us/dotnet/api/system.data.datatable?view=netframework-4.6)。 | +| 方法 | 描述 | +| ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `void ExecuteCommand(string tmslOrXmla, bool isXmla = false)` | 这个方法会将指定的 TMSL 或 XMLA 脚本传递给已连接的 Analysis Services 实例。 当你想要刷新 AS 实例中某个表的数据时,这会很有用。 注意,如果你用这个方法更改模型元数据,本地模型元数据将与 AS 实例上的元数据不同步,并且下次尝试保存模型元数据时,你可能会收到版本冲突警告。 如果要发送 XMLA 脚本,请将 `isXmla` 参数设为 `true`。 | +| `IDataReader ExecuteReader(string dax)` | 在已连接的 AS 数据库上执行指定的 DAX _查询_,并返回得到的 [AmoDataReader](https://docs.microsoft.com/en-us/dotnet/api/microsoft.analysisservices.amodatareader?view=analysisservices-dotnet) 对象。 DAX 查询由一个或多个 [`EVALUATE`](https://dax.guide/EVALUATE) 语句组成。 注意,你不能同时打开多个数据读取器。 如果你忘记显式关闭或释放读取器,Tabular Editor 会自动关闭它们。 DAX 查询由一个或多个 [`EVALUATE`](https://dax.guide/EVALUATE) 语句组成。 注意,你不能同时打开多个数据读取器。 如果你忘记显式关闭或释放读取器,Tabular Editor 会自动关闭它们。 | +| `Dataset ExecuteDax(string dax)` | 对已连接的 AS 数据库执行指定的 DAX _查询_,并返回一个 [Dataset](https://docs.microsoft.com/en-us/dotnet/api/system.data.dataset?view=netframework-4.6) 对象,其中包含查询返回的数据。 DAX 查询由一个或多个 [`EVALUATE`](https://dax.guide/EVALUATE) 语句组成。 返回的 Dataset 对象中,每个 `EVALUATE` 语句都会对应一个 DataTable。 不建议返回超大的数据表,因为这可能会导致内存不足或其他稳定性问题。 DAX 查询由一个或多个 [`EVALUATE`](https://dax.guide/EVALUATE) 语句组成。 返回的 Dataset 对象中,每个 `EVALUATE` 语句都会对应一个 DataTable。 不建议返回超大的数据表,因为这可能会导致内存不足或其他稳定性问题。 | +| `object EvaluateDax(string dax)` | 对已连接的 AS 数据库执行指定的 DAX _表达式_,并返回一个表示执行结果的对象。 如果 DAX 表达式是标量,则会返回相应类型的对象(string、long、decimal、double、DateTime)。 对已连接的 AS 数据库执行指定的 DAX _表达式_,并返回一个表示执行结果的对象。 如果 DAX 表达式是标量,则会返回相应类型的对象(string、long、decimal、double、DateTime)。 如果 DAX 表达式为表值,则会返回一个 [DataTable](https://docs.microsoft.com/en-us/dotnet/api/system.data.datatable?view=netframework-4.6)。 | 这些方法属于 `Model.Database` 对象,但也可以不加任何前缀直接执行。 Darren Gosbell 在 [此处](https://darren.gosbell.com/2020/08/the-best-way-to-generate-data-driven-measures-in-power-bi-using-tabular-editor/) 介绍了一个有趣的用例:如何使用 `ExecuteDax` 方法生成数据驱动的度量值。 -另一种做法是创建一个可复用的脚本,用于刷新某个表。 例如,要执行重新计算,可使用下面的代码: +另一种做法是创建一个可复用的脚本,用于刷新某个表。 例如,要执行重新计算,可使用下面的代码: 例如,要执行重新计算,可使用下面的代码: ```csharp var type = "calculate"; @@ -736,7 +736,7 @@ ExecuteCommand(tmsl); ### 清除 Analysis Services 引擎的缓存 -从 Tabular Editor 2.16.6 或 Tabular Editor 3.2.3 起,你可以使用以下语法向 Analysis Services 发送原始 XMLA 命令。 下面的示例展示了如何使用它来清除 AS 引擎缓存: +从 Tabular Editor 2.16.6 或 Tabular Editor 3.2.3 起,你可以使用以下语法向 Analysis Services 发送原始 XMLA 命令。 下面的示例展示了如何使用它来清除 AS 引擎缓存: 下面的示例展示了如何使用它来清除 AS 引擎缓存: ```csharp var clearCacheXmla = string.Format(@" @@ -786,7 +786,7 @@ EvaluateDax(dax).Output(); ![图片](https://user-images.githubusercontent.com/8976200/91638389-9b5a0b00-ea0f-11ea-819f-d3eee3ddfa71.png) -别忘了点击脚本编辑器正上方的“+”图标,将这些脚本保存为自定义操作。 这样,你就能拥有一套易于复用的 DAX 查询集合,可直接在 Tabular Editor 的上下文菜单中执行并可视化: +别忘了点击脚本编辑器正上方的“+”图标,将这些脚本保存为自定义操作。 别忘了点击脚本编辑器正上方的“+”图标,将这些脚本保存为自定义操作。 这样,你就能拥有一套易于复用的 DAX 查询集合,可直接在 Tabular Editor 的上下文菜单中执行并可视化: ![图片](https://user-images.githubusercontent.com/8976200/91638790-305e0380-ea12-11ea-9d84-313f4388496f.png) @@ -819,7 +819,7 @@ using(var fileWriter = new StreamWriter(file)) } ``` -如果你想到了这些方法的其他有趣用法,欢迎在[社区脚本 repository](https://github.com/TabularEditor/Scripts)中分享。 谢谢! +如果你想到了这些方法的其他有趣用法,欢迎在[社区脚本 repository](https://github.com/TabularEditor/Scripts)中分享。 谢谢! 谢谢! *** @@ -836,7 +836,7 @@ in dbo_DimProduct ``` -以下脚本会将双引号中第一次出现的值替换为服务器名称,并将双引号中第二次出现的值替换为数据库名称。 这两个替换值都从环境变量中读取: +以下脚本会将双引号中第一次出现的值替换为服务器名称,并将双引号中第二次出现的值替换为数据库名称。 这两个替换值都从环境变量中读取: 这两个替换值都从环境变量中读取: ```csharp // 这个脚本用于将所有 Power Query 分区中的服务器和数据库名称, From 3529f1d90ac108136c0962db93487423529a3f6c Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 11:30:52 +0200 Subject: [PATCH 14/31] New translations code-actions.md (Chinese Simplified) --- .../zh/content/features/code-actions.md | 102 +++++++++--------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/localizedContent/zh/content/features/code-actions.md b/localizedContent/zh/content/features/code-actions.md index 9e2f5a2b..d29e3708 100644 --- a/localizedContent/zh/content/features/code-actions.md +++ b/localizedContent/zh/content/features/code-actions.md @@ -20,9 +20,9 @@ applies_to: # 代码操作 -Tabular Editor 3.18.0 引入了一项名为 **代码操作** 的新功能。 此功能默认启用,但可在 **工具 > 偏好** 对话框中,于 **文本编辑器 > DAX编辑器 > 代码操作** 下将其禁用。 +Tabular Editor 3.18.0 引入了一项名为 **代码操作** 的新功能。 此功能默认启用,但可在 **工具 > 偏好** 对话框中,于 **文本编辑器 > DAX编辑器 > 代码操作** 下将其禁用。 此功能默认启用,但可在 **工具 > 偏好** 对话框中,于 **文本编辑器 > DAX编辑器 > 代码操作** 下将其禁用。 -代码操作是一项提升效率的功能,会在不打断你工作的情况下提供改进 DAX 代码的建议。 单击即可应用这些建议。 代码操作还可让你快速访问常用的代码重构操作。 +代码操作是一项提升效率的功能,会在不打断你工作的情况下提供改进 DAX 代码的建议。 单击即可应用这些建议。 代码操作还可让你快速访问常用的代码重构操作。 单击即可应用这些建议。 代码操作还可让你快速访问常用的代码重构操作。 代码操作分为三类: @@ -35,14 +35,14 @@ Tabular Editor 3.18.0 引入了一项名为 **代码操作** 的新功能。 此 - 在可能的情况下简化复杂表达式 - 删除冗余或不必要的代码 - 应用一致的格式和命名规范 -3. **重写**:这些是用于重构你的 DAX 代码的建议。 它们未必是改进,但在进行较大规模的代码重构时通常很有用。 例如: +3. **重写**:这些是用于重构你的 DAX 代码的建议。 它们未必是改进,但在进行较大规模的代码重构时通常很有用。 例如: 它们未必是改进,但在进行较大规模的代码重构时通常很有用。 例如: - 将 DAX “语法糖”改写为更冗长但更明确的显式代码 - 重命名变量或扩展列的所有实例 - 格式化代码 ## 如何使用代码操作 -新增了一个命令及其对应的工具栏/菜单按钮 **显示代码操作**,默认键盘快捷键为 `Ctrl+.`。 该命令会在当前光标位置显示适用的代码操作: +新增了一个命令及其对应的工具栏/菜单按钮 **显示代码操作**,默认键盘快捷键为 `Ctrl+.`。 该命令会在当前光标位置显示适用的代码操作: 该命令会在当前光标位置显示适用的代码操作: ![代码操作调用菜单](~/content/assets/images/features/code-action-invoke-menu.png) @@ -50,25 +50,25 @@ Tabular Editor 3.18.0 引入了一项名为 **代码操作** 的新功能。 此 ![代码操作重构子菜单](~/content/assets/images/features/code-action-refactor-submenu.png) -最后,当光标放在具有可用操作的代码分段上时,编辑器左侧边距会显示一个灯泡或螺丝刀图标。 点击该图标也会打开代码操作菜单: +最后,当光标放在具有可用操作的代码分段上时,编辑器左侧边距会显示一个灯泡或螺丝刀图标。 点击该图标也会打开代码操作菜单: 点击该图标也会打开代码操作菜单: ![代码操作边距](~/content/assets/images/features/code-action-margin.png) -当你将鼠标指针悬停在代码操作菜单中的某个操作上时,工具提示会显示该操作的更多信息。 点击“了解更多”链接,即可查看该操作对应的知识库 (KB) 文章。 +当你将鼠标指针悬停在代码操作菜单中的某个操作上时,工具提示会显示该操作的更多信息。 点击“了解更多”链接,即可查看该操作对应的知识库 (KB) 文章。 点击“了解更多”链接,即可查看该操作对应的知识库 (KB) 文章。 ![代码操作工具提示](~/content/assets/images/features/code-action-tooltip.png) ## 代码操作指示器 -**改进**和**可读性**类代码操作也会在代码编辑器中以可视化方式标记。 这能让你快速判断代码的哪些部分可以改进或提升可读性。 +**改进**和**可读性**类代码操作也会在代码编辑器中以可视化方式标记。 这能让你快速判断代码的哪些部分可以改进或提升可读性。 这能让你快速判断代码的哪些部分可以改进或提升可读性。 -- **改进** 会在代码分段开头的前几个字符下方显示橙色圆点(除非该代码分段已显示橙色的警告波浪线)。 当光标移动到代码分段上时,左侧边距会出现一个_灯泡_图标。 -- **可读性**操作会在代码分段开头的前几个字符下方显示青绿色圆点。 当光标移到代码分段上时,左侧边距会显示一个_螺丝刀_图标。 +- **改进** 会在代码分段开头的前几个字符下方显示橙色圆点(除非该代码分段已显示橙色的警告波浪线)。 当光标移动到代码分段上时,左侧边距会出现一个_灯泡_图标。 当光标移动到代码分段上时,左侧边距会出现一个_灯泡_图标。 +- **可读性**操作会在代码分段开头的前几个字符下方显示青绿色圆点。 当光标移到代码分段上时,左侧边距会显示一个_螺丝刀_图标。 当光标移到代码分段上时,左侧边距会显示一个_螺丝刀_图标。 - 代码本身不会在视觉上直接标示出 **重写**;不过,当光标放在包含可用重写的代码分段上时,左侧边距会显示 _螺丝刀_ 图标。 ## 应用到所有出现位置 -有些代码操作可以应用到当前 DAX 表达式、DAX 脚本或 DAX 查询中的所有出现位置,而不仅仅是光标所在的代码分段。 在这种情况下,代码操作会显示在“代码操作”菜单中,并在操作说明后追加 " (所有出现位置)"。 点击该操作会将更改应用到文档中的所有出现位置。 +有些代码操作可以应用到当前 DAX 表达式、DAX 脚本或 DAX 查询中的所有出现位置,而不仅仅是光标所在的代码分段。 在这种情况下,代码操作会显示在“代码操作”菜单中,并在操作说明后追加 " (所有出现位置)"。 点击该操作会将更改应用到文档中的所有出现位置。 在这种情况下,代码操作会显示在“代码操作”菜单中,并在操作说明后追加 " (所有出现位置)"。 点击该操作会将更改应用到文档中的所有出现位置。 例如在下面的截图中,**为变量添加 '_' 前缀** 操作可以应用到文档中的所有出现位置(即所有变量),而不只是光标下的 `totalSales` 变量: @@ -84,61 +84,61 @@ Tabular Editor 3.18.0 引入了一项名为 **代码操作** 的新功能。 此 当光标放在代码分段上时,下列代码操作会在适用代码的前两个字符下方显示橙色圆点,并在左侧边距显示一个灯泡图标: -| ID | 名称 | 说明 | -| ----- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| DI001 | [删除未使用的变量](xref:DI001) | 未在任何位置被引用的变量应当删除。 示例:
`VAR a = 1 VAR b = 2 RETURN a` -> `VAR a = 1 RETURN a` | -| DI002 | [删除所有未使用的变量](xref:DI002) | 在变量块的 `RETURN` 部分未被使用的变量(无论是直接使用,还是通过其他变量间接使用)都应删除。 示例:
`VAR a = 1 VAR b = a RETURN 123` -> `123` | -| DI003 | [移除表名](xref:DI003) | 度量值引用不应包含表名,因为引用度量值时无需表名。 此外,这种做法还能让度量值引用更容易与列引用区分开来。 示例:
`Sales[Total Sales]` -> `[Total Sales]` | -| DI004 | [添加表名](xref:DI004) | 列引用应包含表名,以避免歧义,并更容易将列引用与度量值引用区分开来。 示例:
`SUM([SalesAmount])` -> `SUM(Sales[SalesAmount])` | -| DI005 | [将表筛选重写为标量谓词](xref:DI005) | DAX 中一个常见的反模式是:在 [`CALCULATE`](https://dax.guide/CALCULATE) 的筛选参数中对一个表进行筛选,而实际上只需筛选该表中的一个或多个列即可。 示例:
`CALCULATE([Total Sales], FILTER(Products, Products[Color] = "Red"))` -> `CALCULATE([Total Sales], KEEPFILTERS(Products[Color] = "Red"))`
此代码操作支持原始表达式的多种变体。 | -| DI006 | [将多列筛选拆分为多个筛选](xref:DI006) | 当使用 `AND` (或等效的 `&&` 运算符) 将表在多个列上的筛选组合在一起时,通常可以通过为每一列分别指定一个筛选来获得更好的性能。 示例:
`CALCULATE(..., Products[Color] = "Red" && Products[Size] = "Large")` -> `CALCULATE(..., Products[Color] = "Red", Products[Size] = "Large")` | -| DI007 | [简化 SWITCH 语句](xref:DI007) | 当 [`SWITCH`](https://dax.guide/SWITCH) 语句将 **<Expression>** 参数指定为 `TRUE()`,且所有 **<Value>** 参数都是对同一变量/度量值的简单比较时,该语句可以被简化。 示例:
`SWITCH(TRUE(), a = 1, ..., a = 2, ...)` -> `SWITCH(a, 1, ..., 2, ...)` | -| DI008 | [移除多余的 CALCULATE](xref:DI008) | 应移除不必要的 [`CALCULATE`](https://dax.guide/CALCULATE) 函数:因为它不会修改筛选语境,或因为即使不写也会发生隐式语境转换。 示例:
`CALCULATE([Total Sales])` -> `[Total Sales]`
`AVERAGEX(Product, CALCULATE([Total Sales]))` -> `AVERAGEX(Product, [Total Sales])`

当 `CALCULATE` / `CALCULATETABLE` 的第一个参数是 DAX 变量时同样适用,例如:
`VAR x = [Total Sales] RETURN CALCULATE(x, Product[Color] = "Red")` ->
`VAR x = [Total Sales] RETURN x` | -| DI009 | [避免使用 CALCULATE 简写语法](xref:DI009) | 示例:
`[Total Sales](Products[Color] = "Red")` -> `CALCULATE([Total Sales], Products[Color] = "Red")` | -| DI010 | [用 MIN/MAX 替代 IF](xref:DI010) | 当条件表达式用于返回两个值中的最小值或最大值时,使用 [`MIN`](https://dax.guide/MIN) 或 [`MAX`](https://dax.guide/MAX) 函数会更高效、更简洁。 示例:
`IF(a > b, a, b)` -> `MAX(a, b)` | -| DI011 | [用 ISEMPTY 替代 COUNTROWS](xref:DI011) | 检查表是否为空时,使用 [`ISEMPTY`](https://dax.guide/ISEMPTY) 比统计表的行数更高效。 示例:
`COUNTROWS(Products) = 0` -> `ISEMPTY(Products)` | -| DI012 | [用 DIVIDE 替代除法运算符](xref:DI012) | 当除法的分母是任意表达式时,请使用 [`DIVIDE`](https://dax.guide/DIVIDE) 而不是除法运算符,以避免除以零的错误。 示例:
`x / y` -> `DIVIDE(x, y)` | -| DI013 | [使用除法运算符而不是 DIVIDE](xref:DI013) | 当 [`DIVIDE`](https://dax.guide/DIVIDE) 的第二个参数是非零常量时,使用除法运算符更高效。 示例:
`DIVIDE(x, 2)` -> `x / 2` | -| DI014 | [用 DIVIDE 替换 IFERROR](xref:DI014) | 当除法的分母为零时,请使用 [`DIVIDE`](https://dax.guide/DIVIDE) 函数替代 [`IFERROR`](https://dax.guide/IFERROR),从而返回替代结果。 示例:
`IFERROR(x / y, 0)` -> `DIVIDE(x, y, 0)` | -| DI015 | [用 DIVIDE 替换 IF](xref:DI015) | 使用 [`DIVIDE`](https://dax.guide/DIVIDE) 函数代替 [`IF`](https://dax.guide/IF),可以更方便地检查分母是否为零或空白。 示例:
`IF(y <> 0, x / y)` -> `DIVIDE(x, y)` | -| DI016 | 使用正确的 UDF 语法 | 为用户定义函数表达式使用正确的语法。 示例:
`(x, y) => x + y` | +| ID | 名称 | 说明 | +| ----- | ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DI001 | [删除未使用的变量](xref:DI001) | 未在任何位置被引用的变量应当删除。 示例:
`VAR a = 1 VAR b = 2 RETURN a` -> `VAR a = 1 RETURN a` 示例:
`VAR a = 1 VAR b = 2 RETURN a` -> `VAR a = 1 RETURN a` | +| DI002 | [删除所有未使用的变量](xref:DI002) | 在变量块的 `RETURN` 部分未被使用的变量(无论是直接使用,还是通过其他变量间接使用)都应删除。 示例:
`VAR a = 1 VAR b = a RETURN 123` -> `123` 示例:
`VAR a = 1 VAR b = a RETURN 123` -> `123` | +| DI003 | [移除表名](xref:DI003) | 度量值引用不应包含表名,因为引用度量值时无需表名。 此外,这种做法还能让度量值引用更容易与列引用区分开来。 示例:
`Sales[Total Sales]` -> `[Total Sales]` | +| DI004 | [添加表名](xref:DI004) | 列引用应包含表名,以避免歧义,并更容易将列引用与度量值引用区分开来。 示例:
`SUM([SalesAmount])` -> `SUM(Sales[SalesAmount])` 示例:
`SUM([SalesAmount])` -> `SUM(Sales[SalesAmount])` | +| DI005 | [将表筛选重写为标量谓词](xref:DI005) | DAX 中一个常见的反模式是:在 [`CALCULATE`](https://dax.guide/CALCULATE) 的筛选参数中对一个表进行筛选,而实际上只需筛选该表中的一个或多个列即可。 示例:
`CALCULATE([Total Sales], FILTER(Products, Products[Color] = "Red"))` -> `CALCULATE([Total Sales], KEEPFILTERS(Products[Color] = "Red"))`
此代码操作支持原始表达式的多种变体。 示例:
`CALCULATE([Total Sales], FILTER(Products, Products[Color] = "Red"))` -> `CALCULATE([Total Sales], KEEPFILTERS(Products[Color] = "Red"))`
此代码操作支持原始表达式的多种变体。 | +| DI006 | [将多列筛选拆分为多个筛选](xref:DI006) | 当使用 `AND` (或等效的 `&&` 运算符) 将表在多个列上的筛选组合在一起时,通常可以通过为每一列分别指定一个筛选来获得更好的性能。 示例:
`CALCULATE(..., Products[Color] = "Red" && Products[Size] = "Large")` -> `CALCULATE(..., Products[Color] = "Red", Products[Size] = "Large")` | +| DI007 | [简化 SWITCH 语句](xref:DI007) | 当 [`SWITCH`](https://dax.guide/SWITCH) 语句将 **<Expression>** 参数指定为 `TRUE()`,且所有 **<Value>** 参数都是对同一变量/度量值的简单比较时,该语句可以被简化。 示例:
`SWITCH(TRUE(), a = 1, ..., a = 2, ...)` -> `SWITCH(a, 1, ..., 2, ...)` 示例:
`SWITCH(TRUE(), a = 1, ..., a = 2, ...)` -> `SWITCH(a, 1, ..., 2, ...)` | +| DI008 | [移除多余的 CALCULATE](xref:DI008) | 应移除不必要的 [`CALCULATE`](https://dax.guide/CALCULATE) 函数:因为它不会修改筛选语境,或因为即使不写也会发生隐式语境转换。 应移除不必要的 [`CALCULATE`](https://dax.guide/CALCULATE) 函数:因为它不会修改筛选语境,或因为即使不写也会发生隐式语境转换。 示例:
`CALCULATE([Total Sales])` -> `[Total Sales]`
`AVERAGEX(Product, CALCULATE([Total Sales]))` -> `AVERAGEX(Product, [Total Sales])`

当 `CALCULATE` / `CALCULATETABLE` 的第一个参数是 DAX 变量时同样适用,例如:
`VAR x = [Total Sales] RETURN CALCULATE(x, Product[Color] = "Red")` ->
`VAR x = [Total Sales] RETURN x` | +| DI009 | [避免使用 CALCULATE 简写语法](xref:DI009) | 示例:
`[Total Sales](Products[Color] = "Red")` -> `CALCULATE([Total Sales], Products[Color] = "Red")` | +| DI010 | [用 MIN/MAX 替代 IF](xref:DI010) | 当条件表达式用于返回两个值中的最小值或最大值时,使用 [`MIN`](https://dax.guide/MIN) 或 [`MAX`](https://dax.guide/MAX) 函数会更高效、更简洁。 示例:
`IF(a > b, a, b)` -> `MAX(a, b)` 示例:
`IF(a > b, a, b)` -> `MAX(a, b)` | +| DI011 | [用 ISEMPTY 替代 COUNTROWS](xref:DI011) | 检查表是否为空时,使用 [`ISEMPTY`](https://dax.guide/ISEMPTY) 比统计表的行数更高效。 示例:
`COUNTROWS(Products) = 0` -> `ISEMPTY(Products)` 示例:
`COUNTROWS(Products) = 0` -> `ISEMPTY(Products)` | +| DI012 | [用 DIVIDE 替代除法运算符](xref:DI012) | 当除法的分母是任意表达式时,请使用 [`DIVIDE`](https://dax.guide/DIVIDE) 而不是除法运算符,以避免除以零的错误。 示例:
`x / y` -> `DIVIDE(x, y)` 示例:
`x / y` -> `DIVIDE(x, y)` | +| DI013 | [使用除法运算符而不是 DIVIDE](xref:DI013) | 当 [`DIVIDE`](https://dax.guide/DIVIDE) 的第二个参数是非零常量时,使用除法运算符更高效。 示例:
`DIVIDE(x, 2)` -> `x / 2` 示例:
`DIVIDE(x, 2)` -> `x / 2` | +| DI014 | [用 DIVIDE 替换 IFERROR](xref:DI014) | 当除法的分母为零时,请使用 [`DIVIDE`](https://dax.guide/DIVIDE) 函数替代 [`IFERROR`](https://dax.guide/IFERROR),从而返回替代结果。 示例:
`IFERROR(x / y, 0)` -> `DIVIDE(x, y, 0)` 示例:
`IFERROR(x / y, 0)` -> `DIVIDE(x, y, 0)` | +| DI015 | [用 DIVIDE 替换 IF](xref:DI015) | 使用 [`DIVIDE`](https://dax.guide/DIVIDE) 函数代替 [`IF`](https://dax.guide/IF),可以更方便地检查分母是否为零或空白。 示例:
`IF(y <> 0, x / y)` -> `DIVIDE(x, y)` 示例:
`IF(y <> 0, x / y)` -> `DIVIDE(x, y)` | +| DI016 | 使用正确的 UDF 语法 | 为用户定义函数表达式使用正确的语法。 示例:
`(x, y) => x + y` 示例:
`(x, y) => x + y` | ### 可读性 当光标置于代码分段上时,下面的代码操作会在适用代码的前两个字符下方显示青绿色圆点,并在左侧边距显示螺丝刀图标 -| ID | 名称 | 说明 | -| ----- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| DR001 | [转换为标量谓词](xref:DR001) | 列筛选器可以在不显式使用 [`FILTER`](https://dax.guide/FILTER) 函数的情况下,更简洁地写成标量谓词。 示例:
`FILTER(ALL(Products[Color]), Products[Color] = "Red")` -> `Products[Color] = "Red"`
`FILTER(VALUES(Products[Color]), Products[Color] = "Red")` -> `KEEPFILTERS(Products[Color] = "Red")` | -| DR002 | [使用聚合函数替代迭代器](xref:DR002) | 尽可能使用聚合函数而不是迭代器函数,以简化代码。 示例:
`SUMX(Products, Products[SalesAmount])` -> `SUM(Products[SalesAmount])` | -| DR003 | [使用 VALUES 替代 SUMMARIZE](xref:DR003) | 当 [`SUMMARIZE`](https://dax.guide/SUMMARIZE) 只指定一列,且该列属于第一个参数中指定的表时,可以使用 [`VALUES`](https://dax.guide/VALUES) 更简洁地编写代码。 示例:
`SUMMARIZE(Products, Products[Color])` -> `VALUES(Products[Color])` | -| DR004 | [变量前缀](xref:DR004) | 变量应使用一致的命名约定。 建议使用前缀,例如下划线。 可以配置要使用的前缀,以符合偏好的样式。 示例:
`VAR totalSales = SUM(Sales[SalesAmount])` -> `VAR _totalSales = SUM(Sales[SalesAmount])` | -| DR005 | [为临时列添加前缀](xref:DR005) | 建议为临时列使用一致的前缀,以便更容易将它们与基列或度量值区分开来。 你可以配置要使用的前缀,以符合你偏好的风格。 示例:
`ADDCOLUMNS(Product, "SalesByProd", [Sales])` -> `ADDCOLUMNS(Product, "@SalesByProd", [Sales])` | -| DR006 | [将常量聚合移至变量](xref:DR006) | 当在迭代器或标量谓词中使用聚合函数时,该聚合对迭代中的每一行都会返回相同的结果。 因此,可以将该聚合移到迭代之外的 DAX 变量中。 示例:
`CALCULATE(..., 'Date'[Date] = MAX('Date'[Date]))` ->
`VAR _maxDate = MAX('Date'[Date]) RETURN CALCULATE(..., 'Date'[Date] = _maxDate)` | -| DR007 | [简化 1 个变量代码块](xref:DR007) | 仅包含一个变量的变量块可通过将表达式直接移入块的 `RETURN` 部分来简化。 前提是该变量只被引用一次,且不带任何上下文修饰符。 示例:
`VAR _result = [Sales] * 1.25 RETURN _result` -> `[Sales] * 1.25` | -| DR008 | [简化多变量代码块](xref:DR008) | 对于包含多个变量的变量块,如果每个变量都是简单的度量值引用,并且仅在 `RETURN` 部分使用一次且没有任何上下文修饰符,则应进行简化。 示例:
`VAR _sales = [Sales] VAR _cost = [Cost] RETURN _sales - _cost` -> `[Sales] - [Cost]` | -| DR009 | [改用 DISTINCTCOUNT 重写](xref:DR009) | 不要使用 `COUNTROWS(DISTINCT(T[c])` 来统计某列中不同值的数量,改用 [`DISTINCTCOUNT`](https://dax.guide/DISTINCTCOUNT) 函数。 | -| DR010 | [改用 COALESCE 重写](xref:DR010) | 不要使用 `IF` 从一组表达式中返回第一个非空值,改用 [`COALESCE`](https://dax.guide/COALESCE) 函数。 示例:
`IF(ISBLANK([Sales]), [Sales2], [Sales])` -> `COALESCE([Sales], [Sales2])` | -| DR011 | [使用 ISBLANK 重写](xref:DR011) | 不要将表达式与 [`BLANK()`](https://dax.guide/BLANK) 进行比较,而应使用 [`ISBLANK`](https://dax.guide/ISBLANK) 函数。 示例:
`IF([Sales] = BLANK(), [Budget], [Sales])` -> `IF(ISBLANK([Sales], [Budget], [Sales])` | -| DR012 | [移除不必要的 BLANK](xref:DR012) | 某些 DAX 函数,例如 [`IF`](https://dax.guide/IF) 和 [`SWITCH`](https://dax.guide/SWITCH) 在条件为 false 时本就会返回 `BLANK()`,因此无需显式指定 `BLANK()`。 示例:
`IF(a > b, a, BLANK())` -> `IF(a > b, a)` | -| DR013 | [简化否定逻辑](xref:DR013) | 当对逻辑表达式取反时,使用相反的运算符重写表达式通常更易读。 示例:
`NOT(a = b)` -> `a <> b` | -| DR014 | [使用 IN 简化](xref:DR014) | 将复合谓词(对同一表达式进行相等比较,并通过 [`OR`](https://dax.guide/OR) 或 [`\|\|`](https://dax.guide/op/or/) 组合)改写为使用 [`IN`](https://dax.guide/IN) 运算符。 示例:
`a = 1 \|\| a = 2 \|\| a = 100` -> `a IN { 1, 2, 100 }` | +| ID | 名称 | 说明 | +| ----- | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DR001 | [转换为标量谓词](xref:DR001) | 列筛选器可以在不显式使用 [`FILTER`](https://dax.guide/FILTER) 函数的情况下,更简洁地写成标量谓词。 示例:
`FILTER(ALL(Products[Color]), Products[Color] = "Red")` -> `Products[Color] = "Red"`
`FILTER(VALUES(Products[Color]), Products[Color] = "Red")` -> `KEEPFILTERS(Products[Color] = "Red")` 示例:
`FILTER(ALL(Products[Color]), Products[Color] = "Red")` -> `Products[Color] = "Red"`
`FILTER(VALUES(Products[Color]), Products[Color] = "Red")` -> `KEEPFILTERS(Products[Color] = "Red")` | +| DR002 | [使用聚合函数替代迭代器](xref:DR002) | 尽可能使用聚合函数而不是迭代器函数,以简化代码。 示例:
`SUMX(Products, Products[SalesAmount])` -> `SUM(Products[SalesAmount])` | +| DR003 | [使用 VALUES 替代 SUMMARIZE](xref:DR003) | 当 [`SUMMARIZE`](https://dax.guide/SUMMARIZE) 只指定一列,且该列属于第一个参数中指定的表时,可以使用 [`VALUES`](https://dax.guide/VALUES) 更简洁地编写代码。 示例:
`SUMMARIZE(Products, Products[Color])` -> `VALUES(Products[Color])` 示例:
`SUMMARIZE(Products, Products[Color])` -> `VALUES(Products[Color])` | +| DR004 | [变量前缀](xref:DR004) | 变量应使用一致的命名约定。 建议使用前缀,例如下划线。 可以配置要使用的前缀,以符合偏好的样式。 示例:
`VAR totalSales = SUM(Sales[SalesAmount])` -> `VAR _totalSales = SUM(Sales[SalesAmount])` | +| DR005 | [为临时列添加前缀](xref:DR005) | 建议为临时列使用一致的前缀,以便更容易将它们与基列或度量值区分开来。 你可以配置要使用的前缀,以符合你偏好的风格。 示例:
`ADDCOLUMNS(Product, "SalesByProd", [Sales])` -> `ADDCOLUMNS(Product, "@SalesByProd", [Sales])` | +| DR006 | [将常量聚合移至变量](xref:DR006) | 当在迭代器或标量谓词中使用聚合函数时,该聚合对迭代中的每一行都会返回相同的结果。 因此,可以将该聚合移到迭代之外的 DAX 变量中。 示例:
`CALCULATE(..., 'Date'[Date] = MAX('Date'[Date]))` ->
`VAR _maxDate = MAX('Date'[Date]) RETURN CALCULATE(..., 'Date'[Date] = _maxDate)` | +| DR007 | [简化 1 个变量代码块](xref:DR007) | 仅包含一个变量的变量块可通过将表达式直接移入块的 `RETURN` 部分来简化。 前提是该变量只被引用一次,且不带任何上下文修饰符。 示例:
`VAR _result = [Sales] * 1.25 RETURN _result` -> `[Sales] * 1.25` 前提是该变量只被引用一次,且不带任何上下文修饰符。 示例:
`VAR _result = [Sales] * 1.25 RETURN _result` -> `[Sales] * 1.25` | +| DR008 | [简化多变量代码块](xref:DR008) | 对于包含多个变量的变量块,如果每个变量都是简单的度量值引用,并且仅在 `RETURN` 部分使用一次且没有任何上下文修饰符,则应进行简化。 示例:
`VAR _sales = [Sales] VAR _cost = [Cost] RETURN _sales - _cost` -> `[Sales] - [Cost]` 示例:
`VAR _sales = [Sales] VAR _cost = [Cost] RETURN _sales - _cost` -> `[Sales] - [Cost]` | +| DR009 | [改用 DISTINCTCOUNT 重写](xref:DR009) | 不要使用 `COUNTROWS(DISTINCT(T[c])` 来统计某列中不同值的数量,改用 [`DISTINCTCOUNT`](https://dax.guide/DISTINCTCOUNT) 函数。 | +| DR010 | [改用 COALESCE 重写](xref:DR010) | 不要使用 `IF` 从一组表达式中返回第一个非空值,改用 [`COALESCE`](https://dax.guide/COALESCE) 函数。 示例:
`IF(ISBLANK([Sales]), [Sales2], [Sales])` -> `COALESCE([Sales], [Sales2])` 示例:
`IF(ISBLANK([Sales]), [Sales2], [Sales])` -> `COALESCE([Sales], [Sales2])` | +| DR011 | [使用 ISBLANK 重写](xref:DR011) | 不要将表达式与 [`BLANK()`](https://dax.guide/BLANK) 进行比较,而应使用 [`ISBLANK`](https://dax.guide/ISBLANK) 函数。 示例:
`IF([Sales] = BLANK(), [Budget], [Sales])` -> `IF(ISBLANK([Sales], [Budget], [Sales])` 示例:
`IF([Sales] = BLANK(), [Budget], [Sales])` -> `IF(ISBLANK([Sales], [Budget], [Sales])` | +| DR012 | [移除不必要的 BLANK](xref:DR012) | 某些 DAX 函数,例如 [`IF`](https://dax.guide/IF) 和 [`SWITCH`](https://dax.guide/SWITCH) 在条件为 false 时本就会返回 `BLANK()`,因此无需显式指定 `BLANK()`。 示例:
`IF(a > b, a, BLANK())` -> `IF(a > b, a)` 示例:
`IF(a > b, a, BLANK())` -> `IF(a > b, a)` | +| DR013 | [简化否定逻辑](xref:DR013) | 当对逻辑表达式取反时,使用相反的运算符重写表达式通常更易读。 示例:
`NOT(a = b)` -> `a <> b` 示例:
`NOT(a = b)` -> `a <> b` | +| DR014 | [使用 IN 简化](xref:DR014) | 将复合谓词(对同一表达式进行相等比较,并通过 [`OR`](https://dax.guide/OR) 或 [`\\|\\|`](https://dax.guide/op/or/) 组合)改写为使用 [`IN`](https://dax.guide/IN) 运算符。 示例:
`a = 1 \\|\\| a = 2 \\|\\| a = 100` -> `a IN { 1, 2, 100 }` 示例:
`a = 1 \|\| a = 2 \|\| a = 100` -> `a IN { 1, 2, 100 }` | ### 重写 当光标放在代码分段上时,下面的“代码操作”会在左侧边距以螺丝刀图标显示。 -| ID | 名称 | 说明 | -| ----- | -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| RW001 | [使用 CALCULATE 改写 TOTALxTD](xref:RW001) | 诸如 [`TOTALMTD`](https://dax.guide/TOTALMTD)、[`TOTALQTD`](https://dax.guide/TOTALQTD) 和 [`TOTALYTD`](https://dax.guide/TOTALYTD) 之类的函数,都可以用更具表达力且更灵活的 [`CALCULATE`](https://dax.guide/CALCULATE) 函数来重写。 示例:
`TOTALYTD([Total Sales], 'Date'[Date])` -> `CALCULATE([Total Sales], DATESYTD('Date'[Date]))` | -| RW002 | [使用 FILTER 重写](xref:RW002) | 在 `CALCULATE` 的筛选器参数中,标量谓词可以用 `FILTER` 重写。 例如,当你需要添加更复杂的筛选逻辑时,这会很有用。 示例:
`CALCULATE(..., Products[Color] = "Red")` -> `CALCULATE(..., FILTER(ALL(Products[Color]), Products[Color] = "Red"))` | -| RW003 | [反转 IF](xref:RW003) | 为了提升可读性,有时把 `IF` 语句反过来写会更清晰。 示例:
`IF(a < b, "B is greater", "A is greater")` -> `IF(a > b, "A is greater", "B is greater")` | +| ID | 名称 | 说明 | +| ----- | -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| RW001 | [使用 CALCULATE 改写 TOTALxTD](xref:RW001) | 诸如 [`TOTALMTD`](https://dax.guide/TOTALMTD)、[`TOTALQTD`](https://dax.guide/TOTALQTD) 和 [`TOTALYTD`](https://dax.guide/TOTALYTD) 之类的函数,都可以用更具表达力且更灵活的 [`CALCULATE`](https://dax.guide/CALCULATE) 函数来重写。 诸如 [`TOTALMTD`](https://dax.guide/TOTALMTD)、[`TOTALQTD`](https://dax.guide/TOTALQTD) 和 [`TOTALYTD`](https://dax.guide/TOTALYTD) 之类的函数,都可以用更具表达力且更灵活的 [`CALCULATE`](https://dax.guide/CALCULATE) 函数来重写。 示例:
`TOTALYTD([Total Sales], 'Date'[Date])` -> `CALCULATE([Total Sales], DATESYTD('Date'[Date]))` | +| RW002 | [使用 FILTER 重写](xref:RW002) | 在 `CALCULATE` 的筛选器参数中,标量谓词可以用 `FILTER` 重写。 例如,当你需要添加更复杂的筛选逻辑时,这会很有用。 示例:
`CALCULATE(..., Products[Color] = "Red")` -> `CALCULATE(..., FILTER(ALL(Products[Color]), Products[Color] = "Red"))` 例如,当你需要添加更复杂的筛选逻辑时,这会很有用。 示例:
`CALCULATE(..., Products[Color] = "Red")` -> `CALCULATE(..., FILTER(ALL(Products[Color]), Products[Color] = "Red"))` | +| RW003 | [反转 IF](xref:RW003) | 为了提升可读性,有时把 `IF` 语句反过来写会更清晰。 为了提升可读性,有时把 `IF` 语句反过来写会更清晰。 示例:
`IF(a < b, "B is greater", "A is greater")` -> `IF(a > b, "A is greater", "B is greater")` | ## 自定义代码操作 -你可以通过 **工具 > 偏好** 对话框,在 **文本编辑器 > DAX编辑器 > 代码操作** 中自定义代码操作的行为。 在这里,你可以启用或禁用该功能,并为部分代码操作配置更多选项,例如用于变量名和扩展列的前缀。 +你可以通过 **工具 > 偏好** 对话框,在 **文本编辑器 > DAX编辑器 > 代码操作** 中自定义代码操作的行为。 在这里,你可以启用或禁用该功能,并为部分代码操作配置更多选项,例如用于变量名和扩展列的前缀。 在这里,你可以启用或禁用该功能,并为部分代码操作配置更多选项,例如用于变量名和扩展列的前缀。 -我们计划在后续版本中为此界面增加更多配置项,例如用于单独启用或禁用某个代码操作的选项。 敬请期待! +我们计划在后续版本中为此界面增加更多配置项,例如用于单独启用或禁用某个代码操作的选项。 敬请期待! 敬请期待! ![代码操作偏好](~/content/assets/images/code-actions-preferences.png) From 18b218b54d57f185a4b08362dc86b01d2e614c11 Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 11:31:48 +0200 Subject: [PATCH 15/31] New translations tom-explorer-view.md (Chinese Simplified) --- .../features/views/tom-explorer-view.md | 42 ++++++++++++------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/localizedContent/zh/content/features/views/tom-explorer-view.md b/localizedContent/zh/content/features/views/tom-explorer-view.md index 21dd54de..9f547afc 100644 --- a/localizedContent/zh/content/features/views/tom-explorer-view.md +++ b/localizedContent/zh/content/features/views/tom-explorer-view.md @@ -20,7 +20,7 @@ applies_to: # 在 Tabular Editor 3 中使用 TOM Explorer -TOM Explorer 是你与 Data model 对象交互的主窗口。 表、列、度量值、安全组等对象都以分层结构显示。 表格数据模型由所谓的 [Tabular Object Model (TOM)](https://docs.microsoft.com/en-us/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions) 来表示,而在 TOM Explorer 中显示的正是该 TOM 的元数据。 +TOM Explorer 是你与 Data model 对象交互的主窗口。 表、列、度量值、安全组等对象都以分层结构显示。 TOM Explorer 是你与 Data model 对象交互的主窗口。 表、列、度量值、安全组等对象都以分层结构显示。 表格数据模型由所谓的 [Tabular Object Model (TOM)](https://docs.microsoft.com/en-us/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions) 来表示,而在 TOM Explorer 中显示的正是该 TOM 的元数据。 TOM Explorer 由两个主要区域组成:第一部分是数据模型对象;第二部分是菜单栏,用于筛选并更改主窗口中显示的内容。 @@ -37,51 +37,52 @@ TOM Explorer 由两个主要区域组成:第一部分是数据模型对象; ### 右键菜单中的选项 - **更新表架构...**: - 检查外部数据源的结构变化,并据此更新表的架构。 当源端新增、重命名或删除列时,这会很有用。 + 检查外部数据源的结构变化,并据此更新表的架构。 当源端新增、重命名或删除列时,这会很有用。 当源端新增、重命名或删除列时,这会很有用。 - **编写 DAX 脚本**: - 为所选表及其对象生成 DAX 脚本。 将打开一个新的脚本编辑器窗口,便于你集中查看或编辑 DAX 定义。 + 为所选表及其对象生成 DAX 脚本。 将打开一个新的脚本编辑器窗口,便于你集中查看或编辑 DAX 定义。 将打开一个新的脚本编辑器窗口,便于你集中查看或编辑 DAX 定义。 - **预览数据**: - 打开数据预览窗格,显示加载到所选表中的数据样本。 可用于验证或调试。 仅在右键单击表时才会出现。 + 打开数据预览窗格,显示加载到所选表中的数据样本。 可用于验证或调试。 仅在右键单击表时才会出现。 可用于验证或调试。 仅在右键单击表时才会出现。 - **刷新**: 展开后会显示可对所选表执行的刷新操作列表。 仅当模型以独立模式或工作区模式连接到实时模型时才可用。 此选项仅适用于表和分区。 - **创建**: - 展开为子菜单,可在所选对象下新建度量值、列、层级结构、显示文件夹或计算项。 可用选项取决于所选对象的类型。 + 展开为子菜单,可在所选对象下新建度量值、列、层级结构、显示文件夹或计算项。 可用选项取决于所选对象的类型。 可用选项取决于所选对象的类型。 - **移至组**: - 可在 TOM Explorer 中将该表移入某个表格组,便于浏览模型。 此选项仅对表可用。 + 可在 TOM Explorer 中将该表移入某个表格组,便于浏览模型。 此选项仅对表可用。 此选项仅对表可用。 - **设为不可见** 将对象标记为在客户端工具中不显示。 该表仍是模型的一部分,但会对报表作者隐藏。 也可以使用快捷键 **Ctrl+I** 隐藏对象。 - **在透视中显示**: + 控制该表是否包含在一个或多个透视中。 **在透视中显示**: 控制该表是否包含在一个或多个透视中。 透视会限制最终用户在 Power BI 等工具中可见的内容。 -- **批量重命名**:选择多个对象时,你可以通过字符串替换或正则表达式批量重命名这些对象。 批量重命名的快捷键为 **F2**。 +- **批量重命名**:选择多个对象时,你可以通过字符串替换或正则表达式批量重命名这些对象。 批量重命名的快捷键为 **F2**。 批量重命名的快捷键为 **F2**。 - **批量重命名子对象...**: - 使用正则表达式或字符串替换规则,对表或显示文件夹下的所有子对象进行批量重命名。 也可通过快捷键 **Shift+F2** 访问。 + 使用正则表达式或字符串替换规则,对表或显示文件夹下的所有子对象进行批量重命名。 也可通过快捷键 **Shift+F2** 访问。 也可通过快捷键 **Shift+F2** 访问。 - **复制**: - 创建所选表的副本,包括其所有列、度量值和分区。 TOM Explorer 中的所有其他对象也都有此功能。 + 创建所选表的副本,包括其所有列、度量值和分区。 TOM Explorer 中的所有其他对象也都有此功能。 TOM Explorer 中的所有其他对象也都有此功能。 - **标记为日期表格...**: - 将该表标记为日期表格,以启用时间智能功能。 要求该表包含有效的日期列。 + 将该表标记为日期表格,以启用时间智能功能。 要求该表包含有效的日期列。 要求该表包含有效的日期列。 - **显示依赖项**: - 可视化所选表与其他模型对象之间的依赖关系。 也可使用快捷键 **Shift+F12** 访问。 + 可视化所选表与其他模型对象之间的依赖关系。 也可使用快捷键 **Shift+F12** 访问。 也可使用快捷键 **Shift+F12** 访问。 - **导出脚本**: 将所选对象导出为 TMSL 或 TMDL 脚本,以便用于部署或源代码管理。 - **宏菜单**: - 可将宏放入文件夹中,并对所选对象运行。 在上面的示例中,用户有一个名为“建模和分析”的文件夹,用于存放表对象的宏脚本。 + 可将宏放入文件夹中,并对所选对象运行。 在上面的示例中,用户有一个名为“建模和分析”的文件夹,用于存放表对象的宏脚本。 在上面的示例中,用户有一个名为“建模和分析”的文件夹,用于存放表对象的宏脚本。 - **剪切 / 复制 / 粘贴 / 删除** - 常规剪贴板操作。 可用于移动、复制或删除模型对象。 + 常规剪贴板操作。 可用于移动、复制或删除模型对象。 可用于移动、复制或删除模型对象。 - **属性** 打开所选对象的“属性”窗格。 快捷键:**Alt+Enter**。 用于查看和编辑元数据、表达式、格式和可见性设置。 @@ -90,52 +91,64 @@ TOM Explorer 由两个主要区域组成:第一部分是数据模型对象; TOM Explorer 允许切换显示有关数据模型对象的额外信息列。 可通过快捷键 **Ctrl+7** 实现。 这些额外信息在属性窗口中也能查看,但在这里可以快速查看对象类型、格式字符串、数据类型、表达式和说明。 +![TOM Explorer 显示/隐藏列](~/content/assets/images/user-interface/TOMExplorerInfoColumns.png) 可通过快捷键 **Ctrl+7** 实现。 +这些额外信息在属性窗口中也能查看,但在这里可以快速查看对象类型、格式字符串、数据类型、表达式和说明。 ![TOM Explorer 显示/隐藏列](~/content/assets/images/user-interface/TOMExplorerInfoColumns.png) ## TOM Explorer 工具栏 工具栏可让你显示或隐藏不同类型的对象,切换透视和语言,并在 Data model 中搜索特定对象。 ![TOM Explorer 工具条](~/content/assets/images/user-interface/TOMExplorerToolbar.png) +![TOM Explorer 工具条](~/content/assets/images/user-interface/TOMExplorerToolbar.png) 1. **显示/隐藏度量值** 切换表中度量值的可见性。 **快捷键:** **Ctrl+1** + **快捷键:** **Ctrl+1** 2. **显示/隐藏列** 切换表内列的可见性。 **快捷键:** **Ctrl+2** + **快捷键:** **Ctrl+2** 3. **显示/隐藏层级结构** 切换 TOM Explorer 中层级结构是否可见。 **快捷键:** **Ctrl+3** + **快捷键:** **Ctrl+3** 4. **显示/隐藏分区** 控制表是否显示分区。 **快捷键:** **Ctrl+4** + **快捷键:** **Ctrl+4** 5. **显示/隐藏日历** 控制日历是否可见。 **快捷键:** **Ctrl+8** + **快捷键:** **Ctrl+8** 6. **显示/隐藏显示文件夹** 启用或禁用表内按文件夹组织的显示方式。 **快捷键:** **Ctrl+5** + **快捷键:** **Ctrl+5** 7. **按命名空间对用户自定义函数分组** 启用后,DAX 用户自定义函数会按 [命名空间](xref:udfs#namespaces) 分层分组显示,而不是以扁平列表显示。 8. **显示/隐藏表格组** - 切换 TOM Explorer 树中表格组是否可见。 无需离开资源管理器,即可快速访问 **工具 > 偏好** 中的相同设置。 + 切换 TOM Explorer 树中表格组是否可见。 无需离开资源管理器,即可快速访问 **工具 > 偏好** 中的相同设置。 无需离开资源管理器,即可快速访问 **工具 > 偏好** 中的相同设置。 9. **显示/隐藏隐藏对象** 切换是否显示隐藏对象。 **快捷键:** **Ctrl+6** + **快捷键:** **Ctrl+6** 10. **显示/隐藏信息列** 显示或隐藏元数据列,例如数据类型或对象状态。 **快捷键:** **Ctrl+7** + **快捷键:** **Ctrl+7** 11. **透视选择器** + 下拉列表,用于选择特定透视。 **透视选择器** 下拉列表,用于选择特定透视。 TOM Explorer 中仅显示所选透视中的对象。 12. **语言选择器** @@ -145,4 +158,5 @@ TOM Explorer 允许切换显示有关数据模型对象的额外信息列。 可 将 TOM Explorer 树视图中的所有节点全部折叠。 14. **搜索栏** + 在 TOM Explorer 中提供实时筛选和导航。 **搜索栏** 在 TOM Explorer 中提供实时筛选和导航。 输入即可搜索所有可见的模型对象。 From c8537b475598f9bc9c58af555abf2480fd045e98 Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 11:41:32 +0200 Subject: [PATCH 16/31] New translations script-convert-dlol-to-import.md (Chinese Simplified) --- .../Advanced/script-convert-dlol-to-import.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/localizedContent/zh/content/features/CSharpScripts/Advanced/script-convert-dlol-to-import.md b/localizedContent/zh/content/features/CSharpScripts/Advanced/script-convert-dlol-to-import.md index afa71dd0..cf8cfc56 100644 --- a/localizedContent/zh/content/features/CSharpScripts/Advanced/script-convert-dlol-to-import.md +++ b/localizedContent/zh/content/features/CSharpScripts/Advanced/script-convert-dlol-to-import.md @@ -15,11 +15,11 @@ applies_to: ## 脚本用途 -此脚本用于将 OneLake 上的 Direct Lake(DL/OL)表转换为导入模式表。 如 [Direct Lake 指南文章](xref:direct-lake-guidance) 中所述,我们需要将此类表上的 [EntityPartition](https://learn.microsoft.com/en-us/dotnet/api/microsoft.analysisservices.tabular.entitypartitionsource?view=analysisservices-dotnet) 替换为导入模式下相应的常规 M 分区。 +此脚本用于将 OneLake 上的 Direct Lake(DL/OL)表转换为导入模式表。 此脚本用于将 OneLake 上的 Direct Lake(DL/OL)表转换为导入模式表。 如 [Direct Lake 指南文章](xref:direct-lake-guidance) 中所述,我们需要将此类表上的 [EntityPartition](https://learn.microsoft.com/en-us/dotnet/api/microsoft.analysisservices.tabular.entitypartitionsource?view=analysisservices-dotnet) 替换为导入模式下相应的常规 M 分区。 ## 前提条件 -你需要 **SQL Endpoint**,以及 Fabric **Warehouse** 或 **Lakehouse** 的 **名称**。 这两项都可以在 Fabric 门户中找到。 +你需要 **SQL Endpoint**,以及 Fabric **Warehouse** 或 **Lakehouse** 的 **名称**。 这两项都可以在 Fabric 门户中找到。 这两项都可以在 Fabric 门户中找到。 你还需要知道要连接的表/物化视图的 **Schema**。 对于 Lakehouse,默认值为 dbo。 @@ -274,11 +274,11 @@ Info("Conversion complete: Direct Lake → Import" + 接着,脚本会提示你输入 SQL analytics endpoint、Lakehouse 或 Warehouse 的名称,以及必填的 Schema 名称。 脚本会确保这三个字段都已填写后,才允许你继续。 -接下来,脚本会使用提供的连接详细信息创建或更新一个名为 `SQLEndpoint` 的共享表达式。 此表达式使用 `Sql.Database` 连接器访问 Lakehouse 或 Warehouse。 +接下来,脚本会使用提供的连接详细信息创建或更新一个名为 `SQLEndpoint` 的共享表达式。 此表达式使用 `Sql.Database` 连接器访问 Lakehouse 或 Warehouse。 此表达式使用 `Sql.Database` 连接器访问 Lakehouse 或 Warehouse。 -对于每个要转换的表,脚本都会创建一个新的导入模式 M 分区,该分区引用 `SQLEndpoint` 表达式,并使用指定的 Schema 和表名。 现有的 Direct Lake 分区会先被重命名,然后被删除,最终只保留新的导入分区。 +对于每个要转换的表,脚本都会创建一个新的导入模式 M 分区,该分区引用 `SQLEndpoint` 表达式,并使用指定的 Schema 和表名。 现有的 Direct Lake 分区会先被重命名,然后被删除,最终只保留新的导入分区。 现有的 Direct Lake 分区会先被重命名,然后被删除,最终只保留新的导入分区。 -最后,如果你选择转换模型中的所有 Direct Lake 表,脚本会检查是否存在名为 `DatabaseQuery` 的共享表达式;如果存在,就将其删除。 随后,模型的默认存储模式会设置为导入模式,并显示确认信息。 +最后,如果你选择转换模型中的所有 Direct Lake 表,脚本会检查是否存在名为 `DatabaseQuery` 的共享表达式;如果存在,就将其删除。 随后,模型的默认存储模式会设置为导入模式,并显示确认信息。 随后,模型的默认存储模式会设置为导入模式,并显示确认信息。 ## AI 使用声明 From be8be2d73d4fd284fe3503e2089284f3cfd64996 Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 15:00:15 +0200 Subject: [PATCH 17/31] New translations script-create-and-replace-m-parameter.md (Spanish) --- .../Advanced/script-create-and-replace-M-parameter.md | 1 - 1 file changed, 1 deletion(-) diff --git a/localizedContent/es/content/features/CSharpScripts/Advanced/script-create-and-replace-M-parameter.md b/localizedContent/es/content/features/CSharpScripts/Advanced/script-create-and-replace-M-parameter.md index 3a7c426d..0646dcd7 100644 --- a/localizedContent/es/content/features/CSharpScripts/Advanced/script-create-and-replace-M-parameter.md +++ b/localizedContent/es/content/features/CSharpScripts/Advanced/script-create-and-replace-M-parameter.md @@ -200,5 +200,4 @@ Luego buscará el valor predeterminado en todas las particiones M y lo reemplaza
Data Security Create Role
Figura 2: Cuadro de diálogo de confirmación que muestra que se ha creado el parámetro y que la subcadena de valor correspondiente se ha reemplazado en todas las expresiones de las particiones M. Para parámetros de otros tipos, ajusta el código C# según corresponda.
- Para parámetros de otros tipos, ajusta el código C# según corresponda.
\ No newline at end of file From 454576075b0c34386bd155be7740b64c27c3a467 Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 15:00:21 +0200 Subject: [PATCH 18/31] New translations code-actions.md (Spanish) --- localizedContent/es/content/features/code-actions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/localizedContent/es/content/features/code-actions.md b/localizedContent/es/content/features/code-actions.md index 28ca8257..0ecc3d1c 100644 --- a/localizedContent/es/content/features/code-actions.md +++ b/localizedContent/es/content/features/code-actions.md @@ -122,7 +122,7 @@ Las acciones de código siguientes aparecerán con puntos verde azulado debajo d | DR011 | [Reescribir con ISBLANK](xref:DR011) | En lugar de comparar una expresión con [`BLANK()`](https://dax.guide/BLANK), usa la función [`ISBLANK`](https://dax.guide/ISBLANK). Ejemplo:
`IF([Sales] = BLANK(), [Budget], [Sales])` -> `IF(ISBLANK([Sales], [Budget], [Sales])` | | DR012 | [Eliminar BLANK innecesario](xref:DR012) | Algunas funciones de DAX, como [`IF`](https://dax.guide/IF) y [`SWITCH`](https://dax.guide/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](xref:DR013) | 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](xref:DR014) | Reescribe los predicados compuestos (comparaciones de igualdad de la misma expresión combinadas usando [`OR`](https://dax.guide/OR) o [`\\|\\|`](https://dax.guide/op/or/)) con el operador [`IN`](https://dax.guide/IN). Ejemplo:
`a = 1 \\|\\| a = 2 \\|\\| a = 100` -> `a IN { 1, 2, 100 }` | +| DR014 | [Simplificar con IN](xref:DR014) | Reescribe los predicados compuestos (comparaciones de igualdad de la misma expresión combinadas usando [`OR`](https://dax.guide/OR) o [`\|\|`](https://dax.guide/op/or/)) con el operador [`IN`](https://dax.guide/IN). Ejemplo:
`a = 1 \\|\\| a = 2 \\|\\| a = 100` -> `a IN { 1, 2, 100 }` | ### Reescrituras From d824ebd33928ac318f15432618a1d747942ddd5a Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 15:00:24 +0200 Subject: [PATCH 19/31] New translations getting-started-te2.md (Spanish) --- .../es/content/getting-started/Getting-Started-te2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/localizedContent/es/content/getting-started/Getting-Started-te2.md b/localizedContent/es/content/getting-started/Getting-Started-te2.md index 8cb6d59d..a854ca3d 100644 --- a/localizedContent/es/content/getting-started/Getting-Started-te2.md +++ b/localizedContent/es/content/getting-started/Getting-Started-te2.md @@ -97,7 +97,7 @@ De forma predeterminada, las particiones, los Data source y los roles no se sobr Puedes encontrar más información sobre las opciones de la línea de comandos [aquí](../features/Command-line-Options.md). > [!NOTE] -> Como TabularEditor.exe es una aplicación de Windows Forms, al ejecutarla desde la línea de comandos se hará en un subproceso distinto, devolviendo el control al proceso que la invocó de inmediato. Si tienes estos problemas, usa `start /wait` para que TabularEditor termine su trabajo antes de devolver el control al proceso que lo invocó: Esto puede causar problemas al ejecutar despliegues como parte de un trabajo por lotes en el que necesitas esperar a que el despliegue se complete con éxito antes de continuar con el trabajo. +> Como TabularEditor.exe es una aplicación de Windows Forms, al ejecutarla desde la línea de comandos se hará en un subproceso distinto, devolviendo el control al proceso que la invocó de inmediato. Esto puede causar problemas al ejecutar despliegues como parte de un trabajo por lotes en el que necesitas esperar a que el despliegue se complete con éxito antes de continuar con el trabajo. Si tienes estos problemas, usa `start /wait` para que TabularEditor termine su trabajo antes de devolver el control al proceso que lo invocó: > > `start /wait TabularEditor.exe c:\Projects\Model.bim -deploy localhost AdventureWorks` From f466b6b6d9adf66d715e24d33b8c83add1e4b15e Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 15:00:35 +0200 Subject: [PATCH 20/31] New translations preferences.md (Spanish) --- localizedContent/es/content/references/preferences.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/localizedContent/es/content/references/preferences.md b/localizedContent/es/content/references/preferences.md index 1ed85722..018a4cf2 100644 --- a/localizedContent/es/content/references/preferences.md +++ b/localizedContent/es/content/references/preferences.md @@ -176,7 +176,7 @@ Crea una copia de seguridad del modelo al guardar cambios localmente. Esto te of ##### _Ubicación para guardar la copia de seguridad_ -Especifica la carpeta donde se almacenan las copias de seguridad de los despliegues. De forma predeterminada, no se crean copias de seguridad a menos que se especifique una ubicación. +Especifique la carpeta donde se guardan las copias de seguridad. De forma predeterminada, no se crean copias de seguridad a menos que se especifique una ubicación. ##### _Copia de seguridad al implementar_ (habilitado) @@ -184,7 +184,7 @@ Crea una copia de seguridad del modelo de destino antes de implementar los cambi ##### _Ubicación de copia de seguridad_ -De forma predeterminada, no se crean copias de seguridad a menos que se especifique una ubicación. Especifica la carpeta donde se almacenan las copias de seguridad creadas al guardar. +Especifica la carpeta donde se almacenan las copias de seguridad de los despliegues. Especifica la carpeta donde se almacenan las copias de seguridad creadas al guardar. ## Tabular Editor > Valores predeterminados From 63d4c88a0a481ee59358c02ecbc786e07f8c64b0 Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 15:00:38 +0200 Subject: [PATCH 21/31] New translations security-privacy.md (Spanish) --- localizedContent/es/content/security/security-privacy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/localizedContent/es/content/security/security-privacy.md b/localizedContent/es/content/security/security-privacy.md index 02462c0e..792f6d55 100644 --- a/localizedContent/es/content/security/security-privacy.md +++ b/localizedContent/es/content/security/security-privacy.md @@ -86,7 +86,7 @@ Tabular Editor puede realizar solicitudes a recursos en línea (URL web) solo en - **Activación de licencia\*.** Cuando Tabular Editor 3 se inicia por primera vez y, posteriormente, a intervalos periódicos, la herramienta puede realizar una solicitud a nuestro servicio de licencias. Esta solicitud contiene información cifrada sobre la clave de licencia introducida por el usuario, la dirección de correo electrónico del usuario (si se proporciona), el nombre del equipo local y un hash codificado unidireccional que identifica la instalación actual. No se transmite ningún otro dato en esta solicitud. El propósito de esta solicitud es activar y validar la clave de licencia utilizada por la instalación, aplicar las limitaciones de la versión de prueba y permitir que el usuario gestione sus instalaciones de Tabular Editor 3 a través de nuestro servicio de licencias. - **Comprobaciones de actualización\*.** Cada vez que se inicia Tabular Editor 3, puede realizar una solicitud a nuestro servicio de aplicaciones para determinar si hay disponible una versión más reciente de Tabular Editor 3. Esta solicitud no contiene ningún dato. -- **Telemetría de uso\*.** De forma predeterminada, Tabular Editor 3 recopila y transmite datos de uso anónimos a medida que los usuarios interactúan con la herramienta. Estos datos incluyen información sobre los objetos de la interfaz de usuario con los que interactúa un usuario y el momento de cada interacción. También contiene información de alto nivel sobre el Data model tabular que se está editando con la herramienta. Un usuario puede optar por no enviarnos datos de telemetría en cualquier momento. Esta información solo se refiere a propiedades de alto nivel como el nivel de compatibilidad y el modo, el número de tablas, el tipo de servidor (Analysis Services vs. Power BI vs. Power BI Desktop), etc. **No se recopilan datos personales identificables de esta manera**, ni recopilamos información sobre los nombres de los objetos o las expresiones DAX en el propio Tabular Object Model. +- **Telemetría de uso\*.** De forma predeterminada, Tabular Editor 3 recopila y transmite datos de uso anónimos a medida que los usuarios interactúan con la herramienta. Estos datos incluyen información sobre los objetos de la interfaz de usuario con los que interactúa un usuario y el momento de cada interacción. También contiene información de alto nivel sobre el Data model tabular que se está editando con la herramienta. Esta información solo se refiere a propiedades de alto nivel como el nivel de compatibilidad y el modo, el número de tablas, el tipo de servidor (Analysis Services vs. Power BI vs. Power BI Desktop), etc. **No se recopilan datos personales identificables de esta manera**, ni recopilamos información sobre los nombres de los objetos o las expresiones DAX en el propio Tabular Object Model. Un usuario puede optar por no enviarnos datos de telemetría en cualquier momento. - **Reports de error\*.** Cuando se produce un error inesperado, transmitimos la traza de la pila y los mensajes de error (anonimizados), junto con una descripción opcional proporcionada por el usuario. Si un usuario decide no enviar datos de telemetría, tampoco se enviarán los Reports de error. - **Uso del formateador de DAX.** (Solo Tabular Editor 2.x) Se puede dar formato a una expresión DAX haciendo clic en un botón en Tabular Editor. En este caso, la expresión DAX (y nada más) se envía al servicio web www.daxformatter.com. La primera vez que un usuario hace clic en este botón, se muestra un mensaje de advertencia explícito para que confirme su intención. Tabular Editor 3 no realiza solicitudes web al dar formato al código DAX. - **Optimizador de DAX**. Si un usuario tiene una [cuenta de Tabular Tools](https://tabulartools.com) con una suscripción a [Optimizador de DAX](https://daxoptimizer.com), podrá explorar su Workspace del Optimizador de DAX, ver incidencias y sugerencias, y cargar nuevos archivos VPAX directamente desde Tabular Editor 3. Los archivos VPAX contienen metadatos y estadísticas del modelo, pero no _datos_ reales del modelo. La función de integración del Optimizador de DAX en Tabular Editor 3 realiza varias solicitudes a uno o varios de los endpoints indicados a continuación (en función del tipo de autenticación y de la región especificados al crear la cuenta de Tabular Tools).
From bf3458e2527d8b16abd20a4397effa9ff3461b02 Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 15:00:41 +0200 Subject: [PATCH 22/31] New translations best-practice-analyzer.md (Chinese Simplified) --- .../features/Best-Practice-Analyzer.md | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/localizedContent/zh/content/features/Best-Practice-Analyzer.md b/localizedContent/zh/content/features/Best-Practice-Analyzer.md index 42deda32..a923768f 100644 --- a/localizedContent/zh/content/features/Best-Practice-Analyzer.md +++ b/localizedContent/zh/content/features/Best-Practice-Analyzer.md @@ -23,60 +23,60 @@ applies_to: ![图片](https://user-images.githubusercontent.com/8976200/53631987-baee5880-3c0b-11e9-9d66-e906cccce2be.png) -每当模型发生更改时,Best Practice Analyzer 都会在后台扫描你的模型以查找问题。 你可以在“文件 > 偏好设置”中禁用此功能。 你可以在“文件 > 偏好设置”中禁用此功能。 +每当模型发生更改时,Best Practice Analyzer 都会在后台扫描你的模型以查找问题。 你可以在“文件 > 偏好设置”中禁用此功能。 单击该链接(或按 F10)会打开全新改进后的 Best Practice Analyzer 界面: ![图片](https://user-images.githubusercontent.com/8976200/53631947-9eeab700-3c0b-11e9-9217-5739d4de2f88.png) -如果你在早期版本中用过 Best Practice Analyzer,首先会注意到它的界面已被彻底重新设计,占用的屏幕空间更少。 这样一来,你可以将该窗口停靠在屏幕的一侧,同时将主窗口放在另一侧,从而同时使用两者。 这样一来,你可以将该窗口停靠在屏幕的一侧,同时将主窗口放在另一侧,从而同时使用两者。 +如果你在早期版本中用过 Best Practice Analyzer,首先会注意到它的界面已被彻底重新设计,占用的屏幕空间更少。 这样一来,你可以将该窗口停靠在屏幕的一侧,同时将主窗口放在另一侧,从而同时使用两者。 -Best Practice Analyzer 窗口会持续列出适用于你的模型的所有**有效规则**,以及违反各项规则的对象。 在列表中的任意位置右键单击,或使用窗口顶部工具栏上的按钮,即可执行以下操作: 在列表中的任意位置右键单击,或使用窗口顶部工具栏上的按钮,即可执行以下操作: +Best Practice Analyzer 窗口会持续列出适用于你的模型的所有**有效规则**,以及违反各项规则的对象。 在列表中的任意位置右键单击,或使用窗口顶部工具栏上的按钮,即可执行以下操作: - **管理规则...**:这会打开“管理规则”界面,下面会详细介绍。 也可以通过主界面的“工具 > 管理 BPA 规则...”菜单打开此界面。 - **转到对象...**:选择此选项,或在列表中双击某个对象,都会在主界面中定位到该对象。 -- **忽略项/多项**:在列表中选择一个或多个对象并使用此选项后,系统会为所选对象添加一条注释,指示 Best Practice Analyzer 后续忽略这些对象。 如果你误忽略了某个对象,可以切换窗口顶部的“显示已忽略”按钮。 这样你就可以取消忽略之前已被忽略的对象。 如果你误忽略了某个对象,可以切换窗口顶部的“显示已忽略”按钮。 这样你就可以取消忽略之前已被忽略的对象。 -- **忽略规则**:如果你已在列表中选择了一条或多条规则,此选项会在模型级别添加一条注释,用于指示应始终忽略所选规则。 同样,通过切换“显示已忽略项”按钮,你也可以取消对规则的忽略。 同样,通过切换“显示已忽略项”按钮,你也可以取消对规则的忽略。 +- **忽略项/多项**:在列表中选择一个或多个对象并使用此选项后,系统会为所选对象添加一条注释,指示 Best Practice Analyzer 后续忽略这些对象。 如果你误忽略了某个对象,可以切换窗口顶部的“显示已忽略”按钮。 这样你就可以取消忽略之前已被忽略的对象。 +- **忽略规则**:如果你已在列表中选择了一条或多条规则,此选项会在模型级别添加一条注释,用于指示应始终忽略所选规则。 同样,通过切换“显示已忽略项”按钮,你也可以取消对规则的忽略。 - **生成修复脚本**:对于可轻松修复的规则(即只需在对象上设置单个属性即可解决问题),将启用此选项。 点击后,会将一段 C# Script 复制到你的剪贴板。 随后,你可以将该脚本粘贴到 Tabular Editor 的 [Advanced Scripting](../how-tos/Advanced-Scripting.md) 区域,在执行以应用修复之前先进行检查。 - **应用修复**:如上所述,此选项同样适用于可轻松修复的规则。 脚本不会被复制到剪贴板,而是会立即执行。 ## 管理最佳实践规则 -如果你需要添加、删除或修改应用于模型的规则,这里也提供了一个全新的 UI 来完成这些操作。 如果你需要添加、删除或修改应用于模型的规则,这里也提供了一个全新的 UI 来完成这些操作。 你可以通过点击 Best Practice Analyzer 窗口左上角的按钮打开它,也可以在主窗口中使用“Tools > Manage BPA Rules...”菜单项。 +如果你需要添加、删除或修改应用于模型的规则,这里也提供了一个全新的 UI 来完成这些操作。 你可以通过点击 Best Practice Analyzer 窗口左上角的按钮打开它,也可以在主窗口中使用“Tools > Manage BPA Rules...”菜单项。 ![图片](https://user-images.githubusercontent.com/8976200/53632990-2f29fb80-3c0e-11e9-82fe-ee9c921662c7.png) -该界面包含两个列表:上方列表显示当前已加载的**规则集**。 在此列表中选择某个规则集后,下方列表会显示该规则集中定义的所有规则。 默认会显示三个规则集: 在此列表中选择某个规则集后,下方列表会显示该规则集中定义的所有规则。 默认会显示三个规则集: +该界面包含两个列表:上方列表显示当前已加载的**规则集**。 在此列表中选择某个规则集后,下方列表会显示该规则集中定义的所有规则。 默认会显示三个规则集: -- **当前模型中的规则**:顾名思义,这是在当前模型内定义的规则集。 **当前模型中的规则**:顾名思义,这是在当前模型内定义的规则集。 这些规则定义作为注释存储在 Model 对象上。 -- **本地用户规则**:这些规则存储在 `%AppData%\..\Local\TabularEditor3\BPARules.json` 文件(Tabular Editor 3)或 `%AppData%\..\Local\TabularEditor\BPARules.json` 文件(Tabular Editor 2)中。 这些规则将应用于当前登录的 Windows 用户在 Tabular Editor 中加载的所有模型。 这些规则将应用于当前登录的 Windows 用户在 Tabular Editor 中加载的所有模型。 -- **本地计算机上的规则**:这些规则存储在 `%ProgramData%\TabularEditor\BPARules.json` 中。 这些规则将应用于当前计算机上在 Tabular Editor 中加载的所有模型。 这些规则将应用于当前计算机上在 Tabular Editor 中加载的所有模型。 +- **当前模型中的规则**:顾名思义,这是在当前模型内定义的规则集。 这些规则定义作为注释存储在 Model 对象上。 +- **本地用户规则**:这些规则存储在 `%AppData%\..\Local\TabularEditor3\BPARules.json` 文件(Tabular Editor 3)或 `%AppData%\..\Local\TabularEditor\BPARules.json` 文件(Tabular Editor 2)中。 这些规则将应用于当前登录的 Windows 用户在 Tabular Editor 中加载的所有模型。 +- **本地计算机上的规则**:这些规则存储在 `%ProgramData%\TabularEditor\BPARules.json` 中。 这些规则将应用于当前计算机上在 Tabular Editor 中加载的所有模型。 -如果多个规则集中都包含同一条规则(按 ID),则优先级从上到下。也就是说,模型内定义的规则优先于本地计算机上定义的同 ID 规则。 这样你就可以覆盖现有规则,例如将模型特定的约定考虑在内。 这样你就可以覆盖现有规则,例如将模型特定的约定考虑在内。 +如果多个规则集中都包含同一条规则(按 ID),则优先级从上到下。也就是说,模型内定义的规则优先于本地计算机上定义的同 ID 规则。 这样你就可以覆盖现有规则,例如将模型特定的约定考虑在内。 -在列表顶部,你会看到一个名为 **(Effective rules)** 的特殊集合。 在列表顶部,你会看到一个名为 **(Effective rules)** 的特殊集合。 选择此集合后,你将看到实际应用于当前已加载模型的规则列表,并会按前文所述遵循相同 ID 规则的优先级。 下方列表会指明每条规则所属的规则集。 此外,如果在优先级更高的集合中存在 ID 相同的规则,你会注意到该规则的名称会显示为删除线: 下方列表会指明每条规则所属的规则集。 此外,如果在优先级更高的集合中存在 ID 相同的规则,你会注意到该规则的名称会显示为删除线: +在列表顶部,你会看到一个名为 **(Effective rules)** 的特殊集合。 选择此集合后,你将看到实际应用于当前已加载模型的规则列表,并会按前文所述遵循相同 ID 规则的优先级。 下方列表会指明每条规则所属的规则集。 此外,如果在优先级更高的集合中存在 ID 相同的规则,你会注意到该规则的名称会显示为删除线: ![image](https://user-images.githubusercontent.com/8976200/53633831-74e7c380-3c10-11e9-925e-1419987f5a17.png) ### 添加更多规则集 -Tabular Editor 2.8.1 的一项新功能是,可以在模型中包含来自其他来源的规则。 例如,如果你的某个规则文件位于网络共享上,现在可以将该文件作为规则集包含到当前模型中。 如果你对该文件所在位置具有写入权限,还可以添加/修改/删除该文件中的规则。 以这种方式添加的规则集,其优先级高于模型内定义的规则。 如果你添加了多个此类规则集,可以通过上移和下移来控制它们之间的优先级。 例如,如果你的某个规则文件位于网络共享上,现在可以将该文件作为规则集包含到当前模型中。 如果你对该文件所在位置具有写入权限,还可以添加/修改/删除该文件中的规则。 以这种方式添加的规则集,其优先级高于模型内定义的规则。 如果你添加了多个此类规则集,可以通过上移和下移来控制它们之间的优先级。 +Tabular Editor 2.8.1 的一项新功能是,可以在模型中包含来自其他来源的规则。 例如,如果你的某个规则文件位于网络共享上,现在可以将该文件作为规则集包含到当前模型中。 如果你对该文件所在位置具有写入权限,还可以添加/修改/删除该文件中的规则。 以这种方式添加的规则集,其优先级高于模型内定义的规则。 如果你添加了多个此类规则集,可以通过上移和下移来控制它们之间的优先级。 -点击“添加...”按钮,将新规则集添加到模型中。 这会提供以下选项: 这会提供以下选项: +点击“添加...”按钮,将新规则集添加到模型中。 这会提供以下选项: ![image](https://user-images.githubusercontent.com/8976200/53634211-7cf43300-3c11-11e9-8fed-7df113264a6f.png) - **创建新规则文件**:这会在指定位置创建一个新的空 .json 文件,之后你可以向其中添加规则。 选择文件时,注意有一个使用相对文件路径的选项。 如果你希望将规则文件存储在与当前模型相同的 repository 中,这会很有用。 但要注意,相对规则文件引用仅在模型从磁盘加载时才有效(因为从 Analysis Services 实例加载模型时不存在工作目录)。 -- **包含本地规则文件**:如果你已经有一个包含规则的 .json 文件,并想把它包含到模型中,就用这个选项。 同样,你也可以使用相对文件路径;如果该文件位于靠近模型元数据的位置,这会更方便。 如果该文件位于网络共享上(或者更一般地说,位于与当前已加载模型元数据所在位置不同的驱动器上),则只能使用绝对路径来包含它。 同样,你也可以使用相对文件路径;如果该文件位于靠近模型元数据的位置,这会更方便。 如果该文件位于网络共享上(或者更一般地说,位于与当前已加载模型元数据所在位置不同的驱动器上),则只能使用绝对路径来包含它。 -- **从 URL 包含规则文件**:此选项允许你指定一个 HTTP/HTTPS URL,该 URL 应返回有效的规则定义(JSON)。 **从 URL 包含规则文件**:此选项允许你指定一个 HTTP/HTTPS URL,该 URL 应返回有效的规则定义(JSON)。 如果你想包含来自在线来源的规则,这会很有用,例如来自 [BestPracticeRules GitHub 站点](https://github.com/microsoft/Analysis-Services/tree/master/BestPracticeRules) 的 [标准 BPA 规则](https://raw.githubusercontent.com/microsoft/Analysis-Services/master/BestPracticeRules/BPARules.json)。 注意,从在线来源添加的规则集将是只读的。 注意,从在线来源添加的规则集将是只读的。 +- **包含本地规则文件**:如果你已经有一个包含规则的 .json 文件,并想把它包含到模型中,就用这个选项。 同样,你也可以使用相对文件路径;如果该文件位于靠近模型元数据的位置,这会更方便。 如果该文件位于网络共享上(或者更一般地说,位于与当前已加载模型元数据所在位置不同的驱动器上),则只能使用绝对路径来包含它。 +- **从 URL 包含规则文件**:此选项允许你指定一个 HTTP/HTTPS URL,该 URL 应返回有效的规则定义(JSON)。 如果你想包含来自在线来源的规则,这会很有用,例如来自 [BestPracticeRules GitHub 站点](https://github.com/microsoft/Analysis-Services/tree/master/BestPracticeRules) 的 [标准 BPA 规则](https://raw.githubusercontent.com/microsoft/Analysis-Services/master/BestPracticeRules/BPARules.json)。 注意,从在线来源添加的规则集将是只读的。 ### 修改规则集中的规则 -屏幕下半部分允许你在当前选中的规则集中添加、编辑、克隆和删除规则,前提是你对该规则集的存储位置具有写入权限。 此外,“移动到...”按钮允许你将所选规则移动或复制到另一个规则集,从而更轻松地管理多个规则集。 此外,“移动到...”按钮允许你将所选规则移动或复制到另一个规则集,从而更轻松地管理多个规则集。 +屏幕下半部分允许你在当前选中的规则集中添加、编辑、克隆和删除规则,前提是你对该规则集的存储位置具有写入权限。 此外,“移动到...”按钮允许你将所选规则移动或复制到另一个规则集,从而更轻松地管理多个规则集。 ### 规则说明占位符 -相比之前版本有一个小改进:现在你可以在最佳实践规则的说明中使用以下占位符值。 这将提供更多可自定义的说明,并在“最佳实践”界面中以工具提示的形式显示: 这将提供更多可自定义的说明,并在“最佳实践”界面中以工具提示的形式显示: +相比之前版本有一个小改进:现在你可以在最佳实践规则的说明中使用以下占位符值。 这将提供更多可自定义的说明,并在“最佳实践”界面中以工具提示的形式显示: - `%object%` 返回当前对象的完全限定 DAX 引用(如适用) - `%objectname%` 仅返回当前对象的名称 From 6cbd14971f7e6d6e15763dfba283bd763a313abf Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 15:00:44 +0200 Subject: [PATCH 23/31] New translations script-add-databricks-metadata-descriptions.md (Chinese Simplified) --- .../Advanced/script-add-databricks-metadata-descriptions.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/localizedContent/zh/content/features/CSharpScripts/Advanced/script-add-databricks-metadata-descriptions.md b/localizedContent/zh/content/features/CSharpScripts/Advanced/script-add-databricks-metadata-descriptions.md index 918e3fec..39403a05 100644 --- a/localizedContent/zh/content/features/CSharpScripts/Advanced/script-add-databricks-metadata-descriptions.md +++ b/localizedContent/zh/content/features/CSharpScripts/Advanced/script-add-databricks-metadata-descriptions.md @@ -15,12 +15,11 @@ applies_to: ## 脚本用途 -这个脚本是 Tabular Editor x Databricks 系列的一部分。 在 Unity Catalog 中,可以为表和列添加描述性注释。 此脚本可复用这些信息,自动补全语义模型中的表和列说明。

在 Unity Catalog 中,可以为表和列添加描述性注释。 此脚本可复用这些信息,自动补全语义模型中的表和列说明。

+这个脚本是 Tabular Editor x Databricks 系列的一部分。 在 Unity Catalog 中,可以为表和列添加描述性注释。 此脚本可复用这些信息,自动补全语义模型中的表和列说明。

> [!NOTE] > 这个脚本需要先安装 Simba Spark ODBC Driver(可从 https://www.databricks.com/spark/odbc-drivers-download 下载) > 每次运行脚本时,都会提示你输入 Databricks 个人访问令牌。 这是用于向 Databricks 进行身份验证所必需的。 -> 这个脚本使用 Unity Catalog 中的 information_schema 表来检索关系信息,因此你可能需要和你的 Databricks 管理员再确认一下,确保你有权限查询这些表。

这是用于向 Databricks 进行身份验证所必需的。 > 这个脚本使用 Unity Catalog 中的 information_schema 表来检索关系信息,因此你可能需要和你的 Databricks 管理员再确认一下,确保你有权限查询这些表。

## 脚本 From aab8f595bf27820cd8be5808f136a5d92230611c Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 15:00:47 +0200 Subject: [PATCH 24/31] New translations direct-lake-sql-model.md (Chinese Simplified) --- .../Semantic-Model/direct-lake-sql-model.md | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/localizedContent/zh/content/features/Semantic-Model/direct-lake-sql-model.md b/localizedContent/zh/content/features/Semantic-Model/direct-lake-sql-model.md index 603ef1a5..9ba53447 100644 --- a/localizedContent/zh/content/features/Semantic-Model/direct-lake-sql-model.md +++ b/localizedContent/zh/content/features/Semantic-Model/direct-lake-sql-model.md @@ -22,13 +22,12 @@ applies_to: SQL 语义模型上的 Direct Lake 可通过 SQL 端点直接连接到存储在 [Fabric 中的 OneLake](https://learn.microsoft.com/en-us/fabric/onelake/onelake-overview) 中的数据源。 > [!IMPORTANT] -> 自 [Tabular Editor 3.22.0](../../references/release-notes/3_22_0.md) 起,Tabular Editor 3 支持 OneLake 上的 Direct Lake,在大多数场景下推荐使用。 更多信息请参阅我们的 [Direct Lake 指南](xref:direct-lake-guidance)。 更多信息请参阅我们的 [Direct Lake 指南](xref:direct-lake-guidance)。 +> 自 [Tabular Editor 3.22.0](../../references/release-notes/3_22_0.md) 起,Tabular Editor 3 支持 OneLake 上的 Direct Lake,在大多数场景下推荐使用。 更多信息请参阅我们的 [Direct Lake 指南](xref:direct-lake-guidance)。 -Tabular Editor 3 可以创建并连接此类模型。 如需教程,请参阅我们的博客文章:[Direct Lake 语义模型:如何在 Tabular Editor 中使用](https://blog.tabulareditor.com/2023/09/26/fabric-direct-lake-with-tabular-editor-part-2-creation/)。 Tabular Editor 3 可以创建并连接此类模型。 如需教程,请参阅我们的博客文章:[Direct Lake 语义模型:如何在 Tabular Editor 中使用](https://blog.tabulareditor.com/2023/09/26/fabric-direct-lake-with-tabular-editor-part-2-creation/)。 Tabular Editor 3 可以使用 Lakehouse 和 Datawarehouse 的 SQL 端点创建 Direct Lake 语义模型。 -Tabular Editor 2 可以连接到 Direct Lake 语义模型,但不提供用于创建新表或 Direct Lake 语义模型的内置功能。 这需要手动完成,或使用 C# Script 来实现。 这需要手动完成,或使用 C# Script 来实现。 +Tabular Editor 2 可以连接到 Direct Lake 语义模型,但不提供用于创建新表或 Direct Lake 语义模型的内置功能。 这需要手动完成,或使用 C# Script 来实现。
Direct Lake 的限制
@@ -45,28 +44,26 @@ Tabular Editor 2 可以连接到 Direct Lake 语义模型,但不提供用于 > [!NOTE] > SQL 上的 Direct Lake 模型目前使用的排序规则与常规 Power BI 导入语义模型不同。 这可能会导致在查询模型或在 DAX 代码中引用对象名称时得到不同的结果。 -> 更多信息,请参阅 Kurt Buhler 的这篇博客文章:[Power BI 中区分大小写的模型:影响与注意事项](https://data-goblins.com/power-bi/case-specific) 这可能会导致在查询模型或在 DAX 代码中引用对象名称时得到不同的结果。 > 更多信息,请参阅 Kurt Buhler 的这篇博客文章:[Power BI 中区分大小写的模型:影响与注意事项](https://data-goblins.com/power-bi/case-specific) > [!IMPORTANT] -> 从 [Tabular Editor 3.22.0](../../references/release-notes/3_22_0.md) 开始,“新建模型”对话框中已移除 Direct Lake 复选框。 [!IMPORTANT] > 从 [Tabular Editor 3.22.0](../../references/release-notes/3_22_0.md) 开始,“新建模型”对话框中已移除 Direct Lake 复选框。 如果在 SQL 上使用 Direct Lake,则必须[手动将模型的排序规则设置为与 Fabric Warehouse 的排序规则一致](xref:direct-lake-guidance#collation)。 ## 为新模型和表导入设定框架 -Tabular Editor 3(3.15.0 或更高版本)会在首次部署时自动对模型执行框架化(刷新)。 Tabular Editor 3(3.15.0 或更高版本)会在首次部署时自动对模型执行框架化(刷新)。 这样可以确保 Direct Lake 模式已启用——否则模型会自动回退到 DirectQuery。 +Tabular Editor 3(3.15.0 或更高版本)会在首次部署时自动对模型执行框架化(刷新)。 这样可以确保 Direct Lake 模式已启用——否则模型会自动回退到 DirectQuery。 -此外,在导入新表后,Tabular Editor 3(3.15.0 或更高版本)会在下一次保存时对模型执行框架化(刷新)。 该首选项位于 **Tools > Preferences > Model Deployment > Data Refresh** 下。 该首选项位于 **Tools > Preferences > Model Deployment > Data Refresh** 下。 +此外,在导入新表后,Tabular Editor 3(3.15.0 或更高版本)会在下一次保存时对模型执行框架化(刷新)。 该首选项位于 **Tools > Preferences > Model Deployment > Data Refresh** 下。 ## 识别 Direct Lake 模型 -Tabular Editor 顶部标题栏会显示该 Tabular Editor 实例当前打开的模型类型。 此外,TOM Explorer 会显示每张表的类型和模式(Import、DirectQuery、Dual 或 Direct Lake)。 如果模型混用了多种表模式,标题栏将显示“混合”。 目前,Direct Lake on SQL 模型无法包含处于 Import、DirectQuery 或 Dual 模式的表。 此外,TOM Explorer 会显示每张表的类型和模式(Import、DirectQuery、Dual 或 Direct Lake)。 如果模型混用了多种表模式,标题栏将显示“混合”。 目前,Direct Lake on SQL 模型无法包含处于 Import、DirectQuery 或 Dual 模式的表。 +Tabular Editor 顶部标题栏会显示该 Tabular Editor 实例当前打开的模型类型。 此外,TOM Explorer 会显示每张表的类型和模式(Import、DirectQuery、Dual 或 Direct Lake)。 如果模型混用了多种表模式,标题栏将显示“混合”。 目前,Direct Lake on SQL 模型无法包含处于 Import、DirectQuery 或 Dual 模式的表。 ## 将 Direct Lake 模型转换为导入模式 -下面的 C# 脚本可将一个现有模型转换为“导入模式”。 下面的 C# 脚本可将一个现有模型转换为“导入模式”。 如果你的模型对数据延迟的要求不需要使用 Direct Lake,或者你想避开 Direct Lake 模型的限制,但已经在 Fabric 中开始构建该模型,那么这会很有用。 +下面的 C# 脚本可将一个现有模型转换为“导入模式”。 如果你的模型对数据延迟的要求不需要使用 Direct Lake,或者你想避开 Direct Lake 模型的限制,但已经在 Fabric 中开始构建该模型,那么这会很有用。 -当 Tabular Editor 通过 XMLA endpoint 连接到语义模型时,即可运行该脚本。 不过,Microsoft 不支持直接将更改保存回 Power BI/Fabric Workspace。 为规避这一限制,建议使用“Model > Deploy...”选项。 这样就可以将新转换的模型作为 Workspace 中的一个新实体进行部署。 不过,Microsoft 不支持直接将更改保存回 Power BI/Fabric Workspace。 为规避这一限制,建议使用“Model > Deploy...”选项。 这样就可以将新转换的模型作为 Workspace 中的一个新实体进行部署。 +当 Tabular Editor 通过 XMLA endpoint 连接到语义模型时,即可运行该脚本。 不过,Microsoft 不支持直接将更改保存回 Power BI/Fabric Workspace。 为规避这一限制,建议使用“Model > Deploy...”选项。 这样就可以将新转换的模型作为 Workspace 中的一个新实体进行部署。 > [!NOTE] > 部署新转换的导入模式模型后,你需要指定用于访问 Lakehouse 的凭据,才能将数据刷新到模型中。 From 265ff775ad2a9cfbd7da0f2dcab028b9a9a50957 Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 15:00:50 +0200 Subject: [PATCH 25/31] New translations useful-script-snippets.md (Chinese Simplified) --- .../features/Useful-script-snippets.md | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/localizedContent/zh/content/features/Useful-script-snippets.md b/localizedContent/zh/content/features/Useful-script-snippets.md index 897f0fba..cfbbb952 100644 --- a/localizedContent/zh/content/features/Useful-script-snippets.md +++ b/localizedContent/zh/content/features/Useful-script-snippets.md @@ -18,7 +18,7 @@ applies_to: # 实用脚本片段 -这里汇总了一些简短的脚本片段,帮助你快速上手 Tabular Editor 的 [高级脚本功能](/Advanced-Scripting)。 其中很多脚本都适合保存为 [自定义操作](/Custom-Actions),这样你就可以通过上下文菜单轻松复用它们。' 其中很多脚本都适合保存为 [自定义操作](/Custom-Actions),这样你就可以通过上下文菜单轻松复用它们。' +这里汇总了一些简短的脚本片段,帮助你快速上手 Tabular Editor 的 [高级脚本功能](/Advanced-Scripting)。 其中很多脚本都适合保存为 [自定义操作](/Custom-Actions),这样你就可以通过上下文菜单轻松复用它们。' 另外,也别忘了看看我们的脚本库 @csharp-script-library,里面有更多贴近实际场景的示例,展示了你可以如何利用 Tabular Editor 的脚本功能。 @@ -47,13 +47,13 @@ foreach(var c in Selected.Columns) } ``` -这个片段使用 `
.AddMeasure(, , )` 函数,在表中创建一个新的度量值。 我们使用 `DaxObjectFullName` 属性来获取列的完全限定名称,以便在 DAX 表达式中使用:`'TableName'[ColumnName]`。 我们使用 `DaxObjectFullName` 属性来获取列的完全限定名称,以便在 DAX 表达式中使用:`'TableName'[ColumnName]`。 +这个片段使用 `
.AddMeasure(, , )` 函数,在表中创建一个新的度量值。 我们使用 `DaxObjectFullName` 属性来获取列的完全限定名称,以便在 DAX 表达式中使用:`'TableName'[ColumnName]`。 *** ## 生成时间智能度量值 -首先,为各个时间智能聚合分别创建自定义操作。 例如: 例如: +首先,为各个时间智能聚合分别创建自定义操作。 例如: ```csharp // 为每个选中的度量值创建一个 TOTALYTD 度量值。 @@ -66,7 +66,7 @@ foreach(var m in Selected.Measures) { } ``` -这里我们使用 `DaxObjectName` 属性来生成用于 DAX 表达式的不带限定符的引用,因为这是一个度量值:`[MeasureName]`。 将其保存为一个适用于度量值的时间智能自定义操作,命名为 "Time Intelligence\Create YTD measure"。 为 MTD、LY 以及其他你需要的类型创建类似的操作。 然后,新建一个操作,并填入下面的脚本: 将其保存为一个适用于度量值的时间智能自定义操作,命名为 "Time Intelligence\Create YTD measure"。 为 MTD、LY 以及其他你需要的类型创建类似的操作。 然后,新建一个操作,并填入下面的脚本: +这里我们使用 `DaxObjectName` 属性来生成用于 DAX 表达式的不带限定符的引用,因为这是一个度量值:`[MeasureName]`。 将其保存为一个适用于度量值的时间智能自定义操作,命名为 "Time Intelligence\Create YTD measure"。 为 MTD、LY 以及其他你需要的类型创建类似的操作。 然后,新建一个操作,并填入下面的脚本: ```csharp // 调用所有时间智能自定义操作: @@ -154,7 +154,7 @@ foreach(var m in Selected.Measures) { ## 设置默认翻译 -有时,为所有(可见)对象应用默认翻译会很有用。 在这种情况下,默认翻译其实就是对象的原始名称/描述/显示文件夹。 有时,为所有(可见)对象应用默认翻译会很有用。 在这种情况下,默认翻译其实就是对象的原始名称/描述/显示文件夹。 这样做的一个好处是:以 JSON 格式导出翻译时会包含所有翻译对象,例如可用于 [SSAS Tabular Translator](https://www.sqlbi.com/tools/ssas-tabular-translator/)。 +有时,为所有(可见)对象应用默认翻译会很有用。 在这种情况下,默认翻译其实就是对象的原始名称/描述/显示文件夹。 这样做的一个好处是:以 JSON 格式导出翻译时会包含所有翻译对象,例如可用于 [SSAS Tabular Translator](https://www.sqlbi.com/tools/ssas-tabular-translator/)。 以下脚本会遍历模型中的所有区域设置;对于每个可见对象,若尚无翻译,则会为其赋予默认值: @@ -208,7 +208,7 @@ void ApplyDefaultTranslation(ITranslatableObject obj, Culture culture) ## 处理透视 -度量值、列、层级结构和表都提供 `InPerspective` 属性。该属性会为模型中的每个透视保存一个 True/False 值,用来指示给定对象是否属于该透视。 比如: 比如: +度量值、列、层级结构和表都提供 `InPerspective` 属性。该属性会为模型中的每个透视保存一个 True/False 值,用来指示给定对象是否属于该透视。 比如: ```csharp foreach(var measure in Selected.Measures) @@ -242,7 +242,7 @@ foreach(var measure in Selected.Measures) } ``` -这种技巧也可用于通过代码生成新对象。 这种技巧也可用于通过代码生成新对象。 例如,如果我们希望确保自动生成的时间智能度量值只在与其基础度量值相同的透视中可见,可以在上一节的脚本基础上扩展如下: +这种技巧也可用于通过代码生成新对象。 例如,如果我们希望确保自动生成的时间智能度量值只在与其基础度量值相同的透视中可见,可以在上一节的脚本基础上扩展如下: ```csharp // 为每个选中的度量值创建一个 TOTALYTD 度量值。 @@ -260,11 +260,11 @@ foreach(var m in Selected.Measures) { ## 生成分区 -如果你需要对某个表进行自定义分区,C# Script 可以帮助你快速生成大量分区。 基本思路是:为表添加一个注释,其中包含一个 SQL 或 M 查询,作为每个分区的模板。 然后脚本会根据需要替换筛选参数。 例如,使用 SQL 分区时,你可以添加一个名为 `PartitionTemplateSQL` 的注释,并将其值设置为 `SELECT * FROM fact_ResellerSales WHERE CalendarID BETWEEN {0} AND {1}`。 在生成最终分区时,我们的脚本会替换 `{0}` 和 `{1}` 占位符。 在此例中,`CalendarID` 是整数;但一般来说,你需要确保最终得到的字符串是有效的 SQL(或 M)查询。 基本思路是:为表添加一个注释,其中包含一个 SQL 或 M 查询,作为每个分区的模板。 然后脚本会根据需要替换筛选参数。 例如,使用 SQL 分区时,你可以添加一个名为 `PartitionTemplateSQL` 的注释,并将其值设置为 `SELECT * FROM fact_ResellerSales WHERE CalendarID BETWEEN {0} AND {1}`。 在生成最终分区时,我们的脚本会替换 `{0}` 和 `{1}` 占位符。 在此例中,`CalendarID` 是整数;但一般来说,你需要确保最终得到的字符串是有效的 SQL(或 M)查询。 +如果你需要对某个表进行自定义分区,C# Script 可以帮助你快速生成大量分区。 基本思路是:为表添加一个注释,其中包含一个 SQL 或 M 查询,作为每个分区的模板。 然后脚本会根据需要替换筛选参数。 例如,使用 SQL 分区时,你可以添加一个名为 `PartitionTemplateSQL` 的注释,并将其值设置为 `SELECT * FROM fact_ResellerSales WHERE CalendarID BETWEEN {0} AND {1}`。 在生成最终分区时,我们的脚本会替换 `{0}` 和 `{1}` 占位符。 在此例中,`CalendarID` 是整数;但一般来说,你需要确保最终得到的字符串是有效的 SQL(或 M)查询。 ![](https://user-images.githubusercontent.com/8976200/70135273-07c6fa00-168a-11ea-84f6-90f0b3498ed8.png) -这里的示例会按月生成分区。 这里的示例会按月生成分区。 选择一个带有 `PartitionTemplateSQL` 注释的表,然后运行该脚本。 +这里的示例会按月生成分区。 选择一个带有 `PartitionTemplateSQL` 注释的表,然后运行该脚本。 ```csharp var firstPartition = new DateTime(2018,1,1); // 第一个分区日期 @@ -308,9 +308,9 @@ SaveFile("Exported Properties 1.tsv", tsv); 在 Excel 中打开后,生成的 .TSV 文件如下所示: ![image](https://user-images.githubusercontent.com/8976200/36632472-e8e96ef6-197e-11e8-8285-6816b09ad036.png) -第一列(Object)中的内容是对该对象的引用。 如果更改了该列内容,后续导入这些属性时可能无法正常进行。 如果你想修改对象名称,只需更改第二列(Name)中的值。 如果更改了该列内容,后续导入这些属性时可能无法正常进行。 如果你想修改对象名称,只需更改第二列(Name)中的值。 +第一列(Object)中的内容是对该对象的引用。 如果更改了该列内容,后续导入这些属性时可能无法正常进行。 如果你想修改对象名称,只需更改第二列(Name)中的值。 -默认情况下,文件会保存到 TabularEditor.exe 所在的同一文件夹中。 默认情况下,仅导出以下属性(如适用,具体取决于所导出对象的类型): 默认情况下,仅导出以下属性(如适用,具体取决于所导出对象的类型): +默认情况下,文件会保存到 TabularEditor.exe 所在的同一文件夹中。 默认情况下,仅导出以下属性(如适用,具体取决于所导出对象的类型): - 名称 - 描述 @@ -327,7 +327,7 @@ var tsv = ExportProperties(Selected.Table.Measures, "Name,DetailRowsExpression") SaveFile("Exported Properties 2.tsv", tsv); ``` -可用的属性名称可在 [TOM API 文档](https://msdn.microsoft.com/en-us/library/microsoft.analysisservices.tabular.aspx) 中找到。 这些名称大多与 Tabular Editor 属性网格中显示的名称一致,只是采用 CamelCase 并去掉了空格(少数情况例外,例如,“Hidden” 属性在 TOM API 中称为 `IsHidden`)。 这些名称大多与 Tabular Editor 属性网格中显示的名称一致,只是采用 CamelCase 并去掉了空格(少数情况例外,例如,“Hidden” 属性在 TOM API 中称为 `IsHidden`)。 +可用的属性名称可在 [TOM API 文档](https://msdn.microsoft.com/en-us/library/microsoft.analysisservices.tabular.aspx) 中找到。 这些名称大多与 Tabular Editor 属性网格中显示的名称一致,只是采用 CamelCase 并去掉了空格(少数情况例外,例如,“Hidden” 属性在 TOM API 中称为 `IsHidden`)。 要导入属性,请使用以下代码片段: @@ -363,7 +363,7 @@ var tsv = ExportProperties(Model.AllMeasures, "Name,InPerspective[Inventory]"); SaveFile(@"c:\Project\MeasurePerspectiveInventory.tsv", tsv); ``` -同理,翻译、注释等也是如此。 同理,翻译、注释等也是如此。 例如,如果你想查看应用于表、列、层次结构、级别和度量值的所有丹麦语翻译: +同理,翻译、注释等也是如此。 例如,如果你想查看应用于表、列、层次结构、级别和度量值的所有丹麦语翻译: ```csharp // 构造对象列表: @@ -382,7 +382,7 @@ SaveFile(@"c:\Project\ObjectTranslations.tsv", tsv); ## 生成文档 -如果你想为模型的全部或部分内容生成文档,也可以使用上面展示的 `ExportProperties` 方法。 如果你想为模型的全部或部分内容生成文档,也可以使用上面展示的 `ExportProperties` 方法。 下面的代码片段会从 Tabular 模型中所有可见的度量值或列提取一组属性,并将其保存为 TSV 文件: +如果你想为模型的全部或部分内容生成文档,也可以使用上面展示的 `ExportProperties` 方法。 下面的代码片段会从 Tabular 模型中所有可见的度量值或列提取一组属性,并将其保存为 TSV 文件: ```csharp // 构造所有可见列和度量值的列表: @@ -403,9 +403,9 @@ SaveFile("documentation.tsv", tsv); ## 从文件生成度量值 -如果你想批量编辑模型中_现有_对象的属性,上述导出/导入属性的方法会很有用。 如果你想导入一个尚不存在的度量值列表,该怎么办? 如果你想导入一个尚不存在的度量值列表,该怎么办? +如果你想批量编辑模型中_现有_对象的属性,上述导出/导入属性的方法会很有用。 如果你想导入一个尚不存在的度量值列表,该怎么办? -假设你有一个 TSV(制表符分隔值)文件,其中包含要导入到现有 Tabular 模型中的度量值名称、说明和 DAX 表达式。 你可以使用下面的脚本读取该文件,将其拆分为行和列,并生成这些度量值。 该脚本还会为每个度量值分配一个特殊注释,这样它就能删除之前使用同一脚本创建的度量值。 你可以使用下面的脚本读取该文件,将其拆分为行和列,并生成这些度量值。 该脚本还会为每个度量值分配一个特殊注释,这样它就能删除之前使用同一脚本创建的度量值。 +假设你有一个 TSV(制表符分隔值)文件,其中包含要导入到现有 Tabular 模型中的度量值名称、说明和 DAX 表达式。 你可以使用下面的脚本读取该文件,将其拆分为行和列,并生成这些度量值。 该脚本还会为每个度量值分配一个特殊注释,这样它就能删除之前使用同一脚本创建的度量值。 ```csharp var targetTable = Model.Tables["Program"]; // 用于存放这些度量值的表的名称 @@ -459,7 +459,7 @@ start /wait TabularEditor.exe "localhost" "AdventureWorks" -S "c:\Projects\Autog ## 根据分区源元数据创建数据列 > [!NOTE] -> 下文所述的 `RefreshDataColumns()` 方法仅在 **Tabular Editor 2** 中可用。 在 Tabular Editor 3 中,请改用 **Import Table...** 功能。 在 Tabular Editor 3 中,请改用 **Import Table...** 功能。 +> 下文所述的 `RefreshDataColumns()` 方法仅在 **Tabular Editor 2** 中可用。 在 Tabular Editor 3 中,请改用 **Import Table...** 功能。 如果某个表使用基于 OLE DB Provider数据源的查询分区,我们可以通过执行以下代码片段来自动刷新该表的列元数据: @@ -504,7 +504,7 @@ foreach(var m in Selected.Measures) ## 生成表的源列列表 -下面的脚本会为当前选定的表输出一份格式良好的源列清单。 如果你想将使用 `SELECT *` 的分区查询替换为显式列清单,这会很有用。 如果你想将使用 `SELECT *` 的分区查询替换为显式列清单,这会很有用。 +下面的脚本会为当前选定的表输出一份格式良好的源列清单。 如果你想将使用 `SELECT *` 的分区查询替换为显式列清单,这会很有用。 ```csharp string.Join(",\r\n", @@ -520,7 +520,7 @@ string.Join(",\r\n", 如果你的团队一直采用一套固定的命名约定,你很快就会发现脚本的威力会更大。 -在一个或多个事实表上执行以下脚本后,脚本会根据列名自动创建与所有相关维度表的关系。 在一个或多个事实表上执行以下脚本后,脚本会根据列名自动创建与所有相关维度表的关系。 脚本会查找事实表中名称符合 `xxxyyyKey` 模式的列,其中 xxx 是用于角色扮演维度的可选限定符,yyy 是维度表名称。 在维度表中必须有一列名为 `yyyKey`,且其数据类型必须与事实表上的对应列相同。 例如,名为“ProductKey”的列会与 Product 表中的“ProductKey”列建立关系。 你也可以指定其他列名后缀来替换“Key”。 在维度表中必须有一列名为 `yyyKey`,且其数据类型必须与事实表上的对应列相同。 例如,名为“ProductKey”的列会与 Product 表中的“ProductKey”列建立关系。 你也可以指定其他列名后缀来替换“Key”。 +在一个或多个事实表上执行以下脚本后,脚本会根据列名自动创建与所有相关维度表的关系。 脚本会查找事实表中名称符合 `xxxyyyKey` 模式的列,其中 xxx 是用于角色扮演维度的可选限定符,yyy 是维度表名称。 在维度表中必须有一列名为 `yyyKey`,且其数据类型必须与事实表上的对应列相同。 例如,名为“ProductKey”的列会与 Product 表中的“ProductKey”列建立关系。 你也可以指定其他列名后缀来替换“Key”。 如果事实表与维度表之间已经存在关系,脚本会将新关系创建为非活动状态。 @@ -596,7 +596,7 @@ Selected.Table.AddMeasure("DumpFilters", dax); ## 将 CamelCase 转换为 Proper Case -在关系数据库中,列和表的一种常见命名方式是 CamelCase。 也就是说,名称中不含任何空格,且每个单词都以大写字母开头。 在 Tabular 模型中,未隐藏的表和列会对业务用户可见,因此通常更适合使用更“易读”的命名方式。 以下脚本会将 CamelCased 名称转换为 Proper Case。 连续的大写字母会原样保留(作为首字母缩写)。 例如,该脚本会将以下内容转换为: 也就是说,名称中不含任何空格,且每个单词都以大写字母开头。 在 Tabular 模型中,未隐藏的表和列会对业务用户可见,因此通常更适合使用更“易读”的命名方式。 以下脚本会将 CamelCased 名称转换为 Proper Case。 连续的大写字母会原样保留(作为首字母缩写)。 例如,该脚本会将以下内容转换为: +在关系数据库中,列和表的一种常见命名方式是 CamelCase。 也就是说,名称中不含任何空格,且每个单词都以大写字母开头。 在 Tabular 模型中,未隐藏的表和列会对业务用户可见,因此通常更适合使用更“易读”的命名方式。 以下脚本会将 CamelCased 名称转换为 Proper Case。 连续的大写字母会原样保留(作为首字母缩写)。 例如,该脚本会将以下内容转换为: - `CustomerWorkZipcode` 转换为 `Customer Work Zipcode` - `CustomerAccountID` 转换为 `Customer Account ID` @@ -640,7 +640,7 @@ foreach(var obj in Selected.OfType()) { 假设你有一个大型且复杂的模型,并希望了解哪些度量值可能会受到底层数据变更的影响。 -下面的脚本会遍历模型中的所有度量值,并针对每个度量值输出其依赖的表列表——包括直接依赖和间接依赖。 该列表会输出为制表符分隔文件。 该列表会输出为制表符分隔文件。 +下面的脚本会遍历模型中的所有度量值,并针对每个度量值输出其依赖的表列表——包括直接依赖和间接依赖。 该列表会输出为制表符分隔文件。 ```csharp string tsv = "度量值\tDependsOnTable"; // TSV 文件表头行 @@ -677,7 +677,7 @@ tsv.Output(); foreach(var col in Selected.Columns) col.AddAlternateOf(); ``` -接下来逐列处理,将它们映射到基础列,并相应设置汇总方式(Sum/Min/Max/GroupBy)。 接下来逐列处理,将它们映射到基础列,并相应设置汇总方式(Sum/Min/Max/GroupBy)。 或者,如果你想自动化此流程,并且聚合表中的列与基础表中的列名称完全相同,可以使用下面的脚本,它会为你自动映射这些列: +接下来逐列处理,将它们映射到基础列,并相应设置汇总方式(Sum/Min/Max/GroupBy)。 或者,如果你想自动化此流程,并且聚合表中的列与基础表中的列名称完全相同,可以使用下面的脚本,它会为你自动映射这些列: ```csharp // 在树中选择两张表(Ctrl+单击)。默认聚合表是列数最少的那张。 @@ -697,7 +697,7 @@ foreach(var col in aggTable.Columns) } ``` -运行脚本后,你应该会看到聚合表上的所有列都已设置了 `AlternateOf` 属性(见下方截图)。 请注意:要让聚合生效,基础表分区必须使用 DirectQuery。 请注意:要让聚合生效,基础表分区必须使用 DirectQuery。 +运行脚本后,你应该会看到聚合表上的所有列都已设置了 `AlternateOf` 属性(见下方截图)。 请注意:要让聚合生效,基础表分区必须使用 DirectQuery。 ![image](https://user-images.githubusercontent.com/8976200/85851134-6ed70800-b7ae-11ea-82eb-37fcaa2ca9c4.png) @@ -709,18 +709,18 @@ foreach(var col in aggTable.Columns) 以下方法可用: -| 方法 | 描述 | -| ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `void ExecuteCommand(string tmslOrXmla, bool isXmla = false)` | 这个方法会将指定的 TMSL 或 XMLA 脚本传递给已连接的 Analysis Services 实例。 当你想要刷新 AS 实例中某个表的数据时,这会很有用。 注意,如果你用这个方法更改模型元数据,本地模型元数据将与 AS 实例上的元数据不同步,并且下次尝试保存模型元数据时,你可能会收到版本冲突警告。 如果要发送 XMLA 脚本,请将 `isXmla` 参数设为 `true`。 | -| `IDataReader ExecuteReader(string dax)` | 在已连接的 AS 数据库上执行指定的 DAX _查询_,并返回得到的 [AmoDataReader](https://docs.microsoft.com/en-us/dotnet/api/microsoft.analysisservices.amodatareader?view=analysisservices-dotnet) 对象。 DAX 查询由一个或多个 [`EVALUATE`](https://dax.guide/EVALUATE) 语句组成。 注意,你不能同时打开多个数据读取器。 如果你忘记显式关闭或释放读取器,Tabular Editor 会自动关闭它们。 DAX 查询由一个或多个 [`EVALUATE`](https://dax.guide/EVALUATE) 语句组成。 注意,你不能同时打开多个数据读取器。 如果你忘记显式关闭或释放读取器,Tabular Editor 会自动关闭它们。 | -| `Dataset ExecuteDax(string dax)` | 对已连接的 AS 数据库执行指定的 DAX _查询_,并返回一个 [Dataset](https://docs.microsoft.com/en-us/dotnet/api/system.data.dataset?view=netframework-4.6) 对象,其中包含查询返回的数据。 DAX 查询由一个或多个 [`EVALUATE`](https://dax.guide/EVALUATE) 语句组成。 返回的 Dataset 对象中,每个 `EVALUATE` 语句都会对应一个 DataTable。 不建议返回超大的数据表,因为这可能会导致内存不足或其他稳定性问题。 DAX 查询由一个或多个 [`EVALUATE`](https://dax.guide/EVALUATE) 语句组成。 返回的 Dataset 对象中,每个 `EVALUATE` 语句都会对应一个 DataTable。 不建议返回超大的数据表,因为这可能会导致内存不足或其他稳定性问题。 | -| `object EvaluateDax(string dax)` | 对已连接的 AS 数据库执行指定的 DAX _表达式_,并返回一个表示执行结果的对象。 如果 DAX 表达式是标量,则会返回相应类型的对象(string、long、decimal、double、DateTime)。 对已连接的 AS 数据库执行指定的 DAX _表达式_,并返回一个表示执行结果的对象。 如果 DAX 表达式是标量,则会返回相应类型的对象(string、long、decimal、double、DateTime)。 如果 DAX 表达式为表值,则会返回一个 [DataTable](https://docs.microsoft.com/en-us/dotnet/api/system.data.datatable?view=netframework-4.6)。 | +| 方法 | 描述 | +| ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `void ExecuteCommand(string tmslOrXmla, bool isXmla = false)` | 这个方法会将指定的 TMSL 或 XMLA 脚本传递给已连接的 Analysis Services 实例。 当你想要刷新 AS 实例中某个表的数据时,这会很有用。 注意,如果你用这个方法更改模型元数据,本地模型元数据将与 AS 实例上的元数据不同步,并且下次尝试保存模型元数据时,你可能会收到版本冲突警告。 如果要发送 XMLA 脚本,请将 `isXmla` 参数设为 `true`。 | +| `IDataReader ExecuteReader(string dax)` | 在已连接的 AS 数据库上执行指定的 DAX _查询_,并返回得到的 [AmoDataReader](https://docs.microsoft.com/en-us/dotnet/api/microsoft.analysisservices.amodatareader?view=analysisservices-dotnet) 对象。 DAX 查询由一个或多个 [`EVALUATE`](https://dax.guide/EVALUATE) 语句组成。 注意,你不能同时打开多个数据读取器。 如果你忘记显式关闭或释放读取器,Tabular Editor 会自动关闭它们。 | +| `Dataset ExecuteDax(string dax)` | 对已连接的 AS 数据库执行指定的 DAX _查询_,并返回一个 [Dataset](https://docs.microsoft.com/en-us/dotnet/api/system.data.dataset?view=netframework-4.6) 对象,其中包含查询返回的数据。 DAX 查询由一个或多个 [`EVALUATE`](https://dax.guide/EVALUATE) 语句组成。 返回的 Dataset 对象中,每个 `EVALUATE` 语句都会对应一个 DataTable。 不建议返回超大的数据表,因为这可能会导致内存不足或其他稳定性问题。 | +| `object EvaluateDax(string dax)` | 对已连接的 AS 数据库执行指定的 DAX _表达式_,并返回一个表示执行结果的对象。 如果 DAX 表达式是标量,则会返回相应类型的对象(string、long、decimal、double、DateTime)。 如果 DAX 表达式为表值,则会返回一个 [DataTable](https://docs.microsoft.com/en-us/dotnet/api/system.data.datatable?view=netframework-4.6)。 | 这些方法属于 `Model.Database` 对象,但也可以不加任何前缀直接执行。 Darren Gosbell 在 [此处](https://darren.gosbell.com/2020/08/the-best-way-to-generate-data-driven-measures-in-power-bi-using-tabular-editor/) 介绍了一个有趣的用例:如何使用 `ExecuteDax` 方法生成数据驱动的度量值。 -另一种做法是创建一个可复用的脚本,用于刷新某个表。 例如,要执行重新计算,可使用下面的代码: 例如,要执行重新计算,可使用下面的代码: +另一种做法是创建一个可复用的脚本,用于刷新某个表。 例如,要执行重新计算,可使用下面的代码: ```csharp var type = "calculate"; @@ -736,7 +736,7 @@ ExecuteCommand(tmsl); ### 清除 Analysis Services 引擎的缓存 -从 Tabular Editor 2.16.6 或 Tabular Editor 3.2.3 起,你可以使用以下语法向 Analysis Services 发送原始 XMLA 命令。 下面的示例展示了如何使用它来清除 AS 引擎缓存: 下面的示例展示了如何使用它来清除 AS 引擎缓存: +从 Tabular Editor 2.16.6 或 Tabular Editor 3.2.3 起,你可以使用以下语法向 Analysis Services 发送原始 XMLA 命令。 下面的示例展示了如何使用它来清除 AS 引擎缓存: ```csharp var clearCacheXmla = string.Format(@" @@ -786,7 +786,7 @@ EvaluateDax(dax).Output(); ![图片](https://user-images.githubusercontent.com/8976200/91638389-9b5a0b00-ea0f-11ea-819f-d3eee3ddfa71.png) -别忘了点击脚本编辑器正上方的“+”图标,将这些脚本保存为自定义操作。 别忘了点击脚本编辑器正上方的“+”图标,将这些脚本保存为自定义操作。 这样,你就能拥有一套易于复用的 DAX 查询集合,可直接在 Tabular Editor 的上下文菜单中执行并可视化: +别忘了点击脚本编辑器正上方的“+”图标,将这些脚本保存为自定义操作。 这样,你就能拥有一套易于复用的 DAX 查询集合,可直接在 Tabular Editor 的上下文菜单中执行并可视化: ![图片](https://user-images.githubusercontent.com/8976200/91638790-305e0380-ea12-11ea-9d84-313f4388496f.png) @@ -819,7 +819,7 @@ using(var fileWriter = new StreamWriter(file)) } ``` -如果你想到了这些方法的其他有趣用法,欢迎在[社区脚本 repository](https://github.com/TabularEditor/Scripts)中分享。 谢谢! 谢谢! +如果你想到了这些方法的其他有趣用法,欢迎在[社区脚本 repository](https://github.com/TabularEditor/Scripts)中分享。 谢谢! *** @@ -836,7 +836,7 @@ in dbo_DimProduct ``` -以下脚本会将双引号中第一次出现的值替换为服务器名称,并将双引号中第二次出现的值替换为数据库名称。 这两个替换值都从环境变量中读取: 这两个替换值都从环境变量中读取: +以下脚本会将双引号中第一次出现的值替换为服务器名称,并将双引号中第二次出现的值替换为数据库名称。 这两个替换值都从环境变量中读取: ```csharp // 这个脚本用于将所有 Power Query 分区中的服务器和数据库名称, From 7a6bc09f19918913cbcb34cc99cada40c0893ce2 Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 15:00:53 +0200 Subject: [PATCH 26/31] New translations code-actions.md (Chinese Simplified) --- .../zh/content/features/code-actions.md | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/localizedContent/zh/content/features/code-actions.md b/localizedContent/zh/content/features/code-actions.md index d29e3708..036c602b 100644 --- a/localizedContent/zh/content/features/code-actions.md +++ b/localizedContent/zh/content/features/code-actions.md @@ -20,9 +20,9 @@ applies_to: # 代码操作 -Tabular Editor 3.18.0 引入了一项名为 **代码操作** 的新功能。 此功能默认启用,但可在 **工具 > 偏好** 对话框中,于 **文本编辑器 > DAX编辑器 > 代码操作** 下将其禁用。 此功能默认启用,但可在 **工具 > 偏好** 对话框中,于 **文本编辑器 > DAX编辑器 > 代码操作** 下将其禁用。 +Tabular Editor 3.18.0 引入了一项名为 **代码操作** 的新功能。 此功能默认启用,但可在 **工具 > 偏好** 对话框中,于 **文本编辑器 > DAX编辑器 > 代码操作** 下将其禁用。 -代码操作是一项提升效率的功能,会在不打断你工作的情况下提供改进 DAX 代码的建议。 单击即可应用这些建议。 代码操作还可让你快速访问常用的代码重构操作。 单击即可应用这些建议。 代码操作还可让你快速访问常用的代码重构操作。 +代码操作是一项提升效率的功能,会在不打断你工作的情况下提供改进 DAX 代码的建议。 单击即可应用这些建议。 代码操作还可让你快速访问常用的代码重构操作。 代码操作分为三类: @@ -35,14 +35,14 @@ Tabular Editor 3.18.0 引入了一项名为 **代码操作** 的新功能。 此 - 在可能的情况下简化复杂表达式 - 删除冗余或不必要的代码 - 应用一致的格式和命名规范 -3. **重写**:这些是用于重构你的 DAX 代码的建议。 它们未必是改进,但在进行较大规模的代码重构时通常很有用。 例如: 它们未必是改进,但在进行较大规模的代码重构时通常很有用。 例如: +3. **重写**:这些是用于重构你的 DAX 代码的建议。 它们未必是改进,但在进行较大规模的代码重构时通常很有用。 例如: - 将 DAX “语法糖”改写为更冗长但更明确的显式代码 - 重命名变量或扩展列的所有实例 - 格式化代码 ## 如何使用代码操作 -新增了一个命令及其对应的工具栏/菜单按钮 **显示代码操作**,默认键盘快捷键为 `Ctrl+.`。 该命令会在当前光标位置显示适用的代码操作: 该命令会在当前光标位置显示适用的代码操作: +新增了一个命令及其对应的工具栏/菜单按钮 **显示代码操作**,默认键盘快捷键为 `Ctrl+.`。 该命令会在当前光标位置显示适用的代码操作: ![代码操作调用菜单](~/content/assets/images/features/code-action-invoke-menu.png) @@ -50,25 +50,25 @@ Tabular Editor 3.18.0 引入了一项名为 **代码操作** 的新功能。 此 ![代码操作重构子菜单](~/content/assets/images/features/code-action-refactor-submenu.png) -最后,当光标放在具有可用操作的代码分段上时,编辑器左侧边距会显示一个灯泡或螺丝刀图标。 点击该图标也会打开代码操作菜单: 点击该图标也会打开代码操作菜单: +最后,当光标放在具有可用操作的代码分段上时,编辑器左侧边距会显示一个灯泡或螺丝刀图标。 点击该图标也会打开代码操作菜单: ![代码操作边距](~/content/assets/images/features/code-action-margin.png) -当你将鼠标指针悬停在代码操作菜单中的某个操作上时,工具提示会显示该操作的更多信息。 点击“了解更多”链接,即可查看该操作对应的知识库 (KB) 文章。 点击“了解更多”链接,即可查看该操作对应的知识库 (KB) 文章。 +当你将鼠标指针悬停在代码操作菜单中的某个操作上时,工具提示会显示该操作的更多信息。 点击“了解更多”链接,即可查看该操作对应的知识库 (KB) 文章。 ![代码操作工具提示](~/content/assets/images/features/code-action-tooltip.png) ## 代码操作指示器 -**改进**和**可读性**类代码操作也会在代码编辑器中以可视化方式标记。 这能让你快速判断代码的哪些部分可以改进或提升可读性。 这能让你快速判断代码的哪些部分可以改进或提升可读性。 +**改进**和**可读性**类代码操作也会在代码编辑器中以可视化方式标记。 这能让你快速判断代码的哪些部分可以改进或提升可读性。 -- **改进** 会在代码分段开头的前几个字符下方显示橙色圆点(除非该代码分段已显示橙色的警告波浪线)。 当光标移动到代码分段上时,左侧边距会出现一个_灯泡_图标。 当光标移动到代码分段上时,左侧边距会出现一个_灯泡_图标。 -- **可读性**操作会在代码分段开头的前几个字符下方显示青绿色圆点。 当光标移到代码分段上时,左侧边距会显示一个_螺丝刀_图标。 当光标移到代码分段上时,左侧边距会显示一个_螺丝刀_图标。 +- **改进** 会在代码分段开头的前几个字符下方显示橙色圆点(除非该代码分段已显示橙色的警告波浪线)。 当光标移动到代码分段上时,左侧边距会出现一个_灯泡_图标。 +- **可读性**操作会在代码分段开头的前几个字符下方显示青绿色圆点。 当光标移到代码分段上时,左侧边距会显示一个_螺丝刀_图标。 - 代码本身不会在视觉上直接标示出 **重写**;不过,当光标放在包含可用重写的代码分段上时,左侧边距会显示 _螺丝刀_ 图标。 ## 应用到所有出现位置 -有些代码操作可以应用到当前 DAX 表达式、DAX 脚本或 DAX 查询中的所有出现位置,而不仅仅是光标所在的代码分段。 在这种情况下,代码操作会显示在“代码操作”菜单中,并在操作说明后追加 " (所有出现位置)"。 点击该操作会将更改应用到文档中的所有出现位置。 在这种情况下,代码操作会显示在“代码操作”菜单中,并在操作说明后追加 " (所有出现位置)"。 点击该操作会将更改应用到文档中的所有出现位置。 +有些代码操作可以应用到当前 DAX 表达式、DAX 脚本或 DAX 查询中的所有出现位置,而不仅仅是光标所在的代码分段。 在这种情况下,代码操作会显示在“代码操作”菜单中,并在操作说明后追加 " (所有出现位置)"。 点击该操作会将更改应用到文档中的所有出现位置。 例如在下面的截图中,**为变量添加 '_' 前缀** 操作可以应用到文档中的所有出现位置(即所有变量),而不只是光标下的 `totalSales` 变量: @@ -84,24 +84,24 @@ Tabular Editor 3.18.0 引入了一项名为 **代码操作** 的新功能。 此 当光标放在代码分段上时,下列代码操作会在适用代码的前两个字符下方显示橙色圆点,并在左侧边距显示一个灯泡图标: -| ID | 名称 | 说明 | -| ----- | ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| DI001 | [删除未使用的变量](xref:DI001) | 未在任何位置被引用的变量应当删除。 示例:
`VAR a = 1 VAR b = 2 RETURN a` -> `VAR a = 1 RETURN a` 示例:
`VAR a = 1 VAR b = 2 RETURN a` -> `VAR a = 1 RETURN a` | -| DI002 | [删除所有未使用的变量](xref:DI002) | 在变量块的 `RETURN` 部分未被使用的变量(无论是直接使用,还是通过其他变量间接使用)都应删除。 示例:
`VAR a = 1 VAR b = a RETURN 123` -> `123` 示例:
`VAR a = 1 VAR b = a RETURN 123` -> `123` | -| DI003 | [移除表名](xref:DI003) | 度量值引用不应包含表名,因为引用度量值时无需表名。 此外,这种做法还能让度量值引用更容易与列引用区分开来。 示例:
`Sales[Total Sales]` -> `[Total Sales]` | -| DI004 | [添加表名](xref:DI004) | 列引用应包含表名,以避免歧义,并更容易将列引用与度量值引用区分开来。 示例:
`SUM([SalesAmount])` -> `SUM(Sales[SalesAmount])` 示例:
`SUM([SalesAmount])` -> `SUM(Sales[SalesAmount])` | -| DI005 | [将表筛选重写为标量谓词](xref:DI005) | DAX 中一个常见的反模式是:在 [`CALCULATE`](https://dax.guide/CALCULATE) 的筛选参数中对一个表进行筛选,而实际上只需筛选该表中的一个或多个列即可。 示例:
`CALCULATE([Total Sales], FILTER(Products, Products[Color] = "Red"))` -> `CALCULATE([Total Sales], KEEPFILTERS(Products[Color] = "Red"))`
此代码操作支持原始表达式的多种变体。 示例:
`CALCULATE([Total Sales], FILTER(Products, Products[Color] = "Red"))` -> `CALCULATE([Total Sales], KEEPFILTERS(Products[Color] = "Red"))`
此代码操作支持原始表达式的多种变体。 | -| DI006 | [将多列筛选拆分为多个筛选](xref:DI006) | 当使用 `AND` (或等效的 `&&` 运算符) 将表在多个列上的筛选组合在一起时,通常可以通过为每一列分别指定一个筛选来获得更好的性能。 示例:
`CALCULATE(..., Products[Color] = "Red" && Products[Size] = "Large")` -> `CALCULATE(..., Products[Color] = "Red", Products[Size] = "Large")` | -| DI007 | [简化 SWITCH 语句](xref:DI007) | 当 [`SWITCH`](https://dax.guide/SWITCH) 语句将 **<Expression>** 参数指定为 `TRUE()`,且所有 **<Value>** 参数都是对同一变量/度量值的简单比较时,该语句可以被简化。 示例:
`SWITCH(TRUE(), a = 1, ..., a = 2, ...)` -> `SWITCH(a, 1, ..., 2, ...)` 示例:
`SWITCH(TRUE(), a = 1, ..., a = 2, ...)` -> `SWITCH(a, 1, ..., 2, ...)` | -| DI008 | [移除多余的 CALCULATE](xref:DI008) | 应移除不必要的 [`CALCULATE`](https://dax.guide/CALCULATE) 函数:因为它不会修改筛选语境,或因为即使不写也会发生隐式语境转换。 应移除不必要的 [`CALCULATE`](https://dax.guide/CALCULATE) 函数:因为它不会修改筛选语境,或因为即使不写也会发生隐式语境转换。 示例:
`CALCULATE([Total Sales])` -> `[Total Sales]`
`AVERAGEX(Product, CALCULATE([Total Sales]))` -> `AVERAGEX(Product, [Total Sales])`

当 `CALCULATE` / `CALCULATETABLE` 的第一个参数是 DAX 变量时同样适用,例如:
`VAR x = [Total Sales] RETURN CALCULATE(x, Product[Color] = "Red")` ->
`VAR x = [Total Sales] RETURN x` | -| DI009 | [避免使用 CALCULATE 简写语法](xref:DI009) | 示例:
`[Total Sales](Products[Color] = "Red")` -> `CALCULATE([Total Sales], Products[Color] = "Red")` | -| DI010 | [用 MIN/MAX 替代 IF](xref:DI010) | 当条件表达式用于返回两个值中的最小值或最大值时,使用 [`MIN`](https://dax.guide/MIN) 或 [`MAX`](https://dax.guide/MAX) 函数会更高效、更简洁。 示例:
`IF(a > b, a, b)` -> `MAX(a, b)` 示例:
`IF(a > b, a, b)` -> `MAX(a, b)` | -| DI011 | [用 ISEMPTY 替代 COUNTROWS](xref:DI011) | 检查表是否为空时,使用 [`ISEMPTY`](https://dax.guide/ISEMPTY) 比统计表的行数更高效。 示例:
`COUNTROWS(Products) = 0` -> `ISEMPTY(Products)` 示例:
`COUNTROWS(Products) = 0` -> `ISEMPTY(Products)` | -| DI012 | [用 DIVIDE 替代除法运算符](xref:DI012) | 当除法的分母是任意表达式时,请使用 [`DIVIDE`](https://dax.guide/DIVIDE) 而不是除法运算符,以避免除以零的错误。 示例:
`x / y` -> `DIVIDE(x, y)` 示例:
`x / y` -> `DIVIDE(x, y)` | -| DI013 | [使用除法运算符而不是 DIVIDE](xref:DI013) | 当 [`DIVIDE`](https://dax.guide/DIVIDE) 的第二个参数是非零常量时,使用除法运算符更高效。 示例:
`DIVIDE(x, 2)` -> `x / 2` 示例:
`DIVIDE(x, 2)` -> `x / 2` | -| DI014 | [用 DIVIDE 替换 IFERROR](xref:DI014) | 当除法的分母为零时,请使用 [`DIVIDE`](https://dax.guide/DIVIDE) 函数替代 [`IFERROR`](https://dax.guide/IFERROR),从而返回替代结果。 示例:
`IFERROR(x / y, 0)` -> `DIVIDE(x, y, 0)` 示例:
`IFERROR(x / y, 0)` -> `DIVIDE(x, y, 0)` | -| DI015 | [用 DIVIDE 替换 IF](xref:DI015) | 使用 [`DIVIDE`](https://dax.guide/DIVIDE) 函数代替 [`IF`](https://dax.guide/IF),可以更方便地检查分母是否为零或空白。 示例:
`IF(y <> 0, x / y)` -> `DIVIDE(x, y)` 示例:
`IF(y <> 0, x / y)` -> `DIVIDE(x, y)` | -| DI016 | 使用正确的 UDF 语法 | 为用户定义函数表达式使用正确的语法。 示例:
`(x, y) => x + y` 示例:
`(x, y) => x + y` | +| ID | 名称 | 说明 | +| ----- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| DI001 | [删除未使用的变量](xref:DI001) | 未在任何位置被引用的变量应当删除。 示例:
`VAR a = 1 VAR b = 2 RETURN a` -> `VAR a = 1 RETURN a` 示例:
`VAR a = 1 VAR b = 2 RETURN a` -> `VAR a = 1 RETURN a` | +| DI002 | [删除所有未使用的变量](xref:DI002) | 在变量块的 `RETURN` 部分未被使用的变量(无论是直接使用,还是通过其他变量间接使用)都应删除。 示例:
`VAR a = 1 VAR b = a RETURN 123` -> `123` | +| DI003 | [移除表名](xref:DI003) | 度量值引用不应包含表名,因为引用度量值时无需表名。 此外,这种做法还能让度量值引用更容易与列引用区分开来。 示例:
`Sales[Total Sales]` -> `[Total Sales]` | +| DI004 | [添加表名](xref:DI004) | 列引用应包含表名,以避免歧义,并更容易将列引用与度量值引用区分开来。 示例:
`SUM([SalesAmount])` -> `SUM(Sales[SalesAmount])` | +| DI005 | [将表筛选重写为标量谓词](xref:DI005) | DAX 中一个常见的反模式是:在 [`CALCULATE`](https://dax.guide/CALCULATE) 的筛选参数中对一个表进行筛选,而实际上只需筛选该表中的一个或多个列即可。 示例:
`CALCULATE([Total Sales], FILTER(Products, Products[Color] = "Red"))` -> `CALCULATE([Total Sales], KEEPFILTERS(Products[Color] = "Red"))`
此代码操作支持原始表达式的多种变体。 | +| DI006 | [将多列筛选拆分为多个筛选](xref:DI006) | 当使用 `AND` (或等效的 `&&` 运算符) 将表在多个列上的筛选组合在一起时,通常可以通过为每一列分别指定一个筛选来获得更好的性能。 示例:
`CALCULATE(..., Products[Color] = "Red" && Products[Size] = "Large")` -> `CALCULATE(..., Products[Color] = "Red", Products[Size] = "Large")` | +| DI007 | [简化 SWITCH 语句](xref:DI007) | 当 [`SWITCH`](https://dax.guide/SWITCH) 语句将 **<Expression>** 参数指定为 `TRUE()`,且所有 **<Value>** 参数都是对同一变量/度量值的简单比较时,该语句可以被简化。 示例:
`SWITCH(TRUE(), a = 1, ..., a = 2, ...)` -> `SWITCH(a, 1, ..., 2, ...)` | +| DI008 | [移除多余的 CALCULATE](xref:DI008) | 应移除不必要的 [`CALCULATE`](https://dax.guide/CALCULATE) 函数:因为它不会修改筛选语境,或因为即使不写也会发生隐式语境转换。 示例:
`CALCULATE([Total Sales])` -> `[Total Sales]`
`AVERAGEX(Product, CALCULATE([Total Sales]))` -> `AVERAGEX(Product, [Total Sales])`

当 `CALCULATE` / `CALCULATETABLE` 的第一个参数是 DAX 变量时同样适用,例如:
`VAR x = [Total Sales] RETURN CALCULATE(x, Product[Color] = "Red")` ->
`VAR x = [Total Sales] RETURN x` | +| DI009 | [避免使用 CALCULATE 简写语法](xref:DI009) | 示例:
`[Total Sales](Products[Color] = "Red")` -> `CALCULATE([Total Sales], Products[Color] = "Red")` | +| DI010 | [用 MIN/MAX 替代 IF](xref:DI010) | 当条件表达式用于返回两个值中的最小值或最大值时,使用 [`MIN`](https://dax.guide/MIN) 或 [`MAX`](https://dax.guide/MAX) 函数会更高效、更简洁。 示例:
`IF(a > b, a, b)` -> `MAX(a, b)` | +| DI011 | [用 ISEMPTY 替代 COUNTROWS](xref:DI011) | 检查表是否为空时,使用 [`ISEMPTY`](https://dax.guide/ISEMPTY) 比统计表的行数更高效。 示例:
`COUNTROWS(Products) = 0` -> `ISEMPTY(Products)` | +| DI012 | [用 DIVIDE 替代除法运算符](xref:DI012) | 当除法的分母是任意表达式时,请使用 [`DIVIDE`](https://dax.guide/DIVIDE) 而不是除法运算符,以避免除以零的错误。 示例:
`x / y` -> `DIVIDE(x, y)` 示例:
`x / y` -> `DIVIDE(x, y)` | +| DI013 | [使用除法运算符而不是 DIVIDE](xref:DI013) | 当 [`DIVIDE`](https://dax.guide/DIVIDE) 的第二个参数是非零常量时,使用除法运算符更高效。 示例:
`DIVIDE(x, 2)` -> `x / 2` 示例:
`DIVIDE(x, 2)` -> `x / 2` | +| DI014 | [用 DIVIDE 替换 IFERROR](xref:DI014) | 当除法的分母为零时,请使用 [`DIVIDE`](https://dax.guide/DIVIDE) 函数替代 [`IFERROR`](https://dax.guide/IFERROR),从而返回替代结果。 示例:
`IFERROR(x / y, 0)` -> `DIVIDE(x, y, 0)` 示例:
`IFERROR(x / y, 0)` -> `DIVIDE(x, y, 0)` | +| DI015 | [用 DIVIDE 替换 IF](xref:DI015) | 使用 [`DIVIDE`](https://dax.guide/DIVIDE) 函数代替 [`IF`](https://dax.guide/IF),可以更方便地检查分母是否为零或空白。 示例:
`IF(y <> 0, x / y)` -> `DIVIDE(x, y)` 示例:
`IF(y <> 0, x / y)` -> `DIVIDE(x, y)` | +| DI016 | 使用正确的 UDF 语法 | 为用户定义函数表达式使用正确的语法。 示例:
`(x, y) => x + y` 示例:
`(x, y) => x + y` | ### 可读性 From 1b9bb6622f3b7296a84d2c4af87e92e4fb129622 Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 15:00:56 +0200 Subject: [PATCH 27/31] New translations tom-explorer-view.md (Chinese Simplified) --- .../features/views/tom-explorer-view.md | 42 +++++++------------ 1 file changed, 14 insertions(+), 28 deletions(-) diff --git a/localizedContent/zh/content/features/views/tom-explorer-view.md b/localizedContent/zh/content/features/views/tom-explorer-view.md index 9f547afc..a72f6dbb 100644 --- a/localizedContent/zh/content/features/views/tom-explorer-view.md +++ b/localizedContent/zh/content/features/views/tom-explorer-view.md @@ -20,7 +20,7 @@ applies_to: # 在 Tabular Editor 3 中使用 TOM Explorer -TOM Explorer 是你与 Data model 对象交互的主窗口。 表、列、度量值、安全组等对象都以分层结构显示。 TOM Explorer 是你与 Data model 对象交互的主窗口。 表、列、度量值、安全组等对象都以分层结构显示。 表格数据模型由所谓的 [Tabular Object Model (TOM)](https://docs.microsoft.com/en-us/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions) 来表示,而在 TOM Explorer 中显示的正是该 TOM 的元数据。 +TOM Explorer 是你与 Data model 对象交互的主窗口。 表、列、度量值、安全组等对象都以分层结构显示。 表格数据模型由所谓的 [Tabular Object Model (TOM)](https://docs.microsoft.com/en-us/analysis-services/tom/introduction-to-the-tabular-object-model-tom-in-analysis-services-amo?view=asallproducts-allversions) 来表示,而在 TOM Explorer 中显示的正是该 TOM 的元数据。 TOM Explorer 由两个主要区域组成:第一部分是数据模型对象;第二部分是菜单栏,用于筛选并更改主窗口中显示的内容。 @@ -37,52 +37,51 @@ TOM Explorer 由两个主要区域组成:第一部分是数据模型对象; ### 右键菜单中的选项 - **更新表架构...**: - 检查外部数据源的结构变化,并据此更新表的架构。 当源端新增、重命名或删除列时,这会很有用。 当源端新增、重命名或删除列时,这会很有用。 + 检查外部数据源的结构变化,并据此更新表的架构。 当源端新增、重命名或删除列时,这会很有用。 - **编写 DAX 脚本**: - 为所选表及其对象生成 DAX 脚本。 将打开一个新的脚本编辑器窗口,便于你集中查看或编辑 DAX 定义。 将打开一个新的脚本编辑器窗口,便于你集中查看或编辑 DAX 定义。 + 为所选表及其对象生成 DAX 脚本。 将打开一个新的脚本编辑器窗口,便于你集中查看或编辑 DAX 定义。 - **预览数据**: - 打开数据预览窗格,显示加载到所选表中的数据样本。 可用于验证或调试。 仅在右键单击表时才会出现。 可用于验证或调试。 仅在右键单击表时才会出现。 + 打开数据预览窗格,显示加载到所选表中的数据样本。 可用于验证或调试。 仅在右键单击表时才会出现。 - **刷新**: 展开后会显示可对所选表执行的刷新操作列表。 仅当模型以独立模式或工作区模式连接到实时模型时才可用。 此选项仅适用于表和分区。 - **创建**: - 展开为子菜单,可在所选对象下新建度量值、列、层级结构、显示文件夹或计算项。 可用选项取决于所选对象的类型。 可用选项取决于所选对象的类型。 + 展开为子菜单,可在所选对象下新建度量值、列、层级结构、显示文件夹或计算项。 可用选项取决于所选对象的类型。 - **移至组**: - 可在 TOM Explorer 中将该表移入某个表格组,便于浏览模型。 此选项仅对表可用。 此选项仅对表可用。 + 可在 TOM Explorer 中将该表移入某个表格组,便于浏览模型。 此选项仅对表可用。 - **设为不可见** 将对象标记为在客户端工具中不显示。 该表仍是模型的一部分,但会对报表作者隐藏。 也可以使用快捷键 **Ctrl+I** 隐藏对象。 - **在透视中显示**: - 控制该表是否包含在一个或多个透视中。 **在透视中显示**: 控制该表是否包含在一个或多个透视中。 透视会限制最终用户在 Power BI 等工具中可见的内容。 -- **批量重命名**:选择多个对象时,你可以通过字符串替换或正则表达式批量重命名这些对象。 批量重命名的快捷键为 **F2**。 批量重命名的快捷键为 **F2**。 +- **批量重命名**:选择多个对象时,你可以通过字符串替换或正则表达式批量重命名这些对象。 批量重命名的快捷键为 **F2**。 - **批量重命名子对象...**: - 使用正则表达式或字符串替换规则,对表或显示文件夹下的所有子对象进行批量重命名。 也可通过快捷键 **Shift+F2** 访问。 也可通过快捷键 **Shift+F2** 访问。 + 使用正则表达式或字符串替换规则,对表或显示文件夹下的所有子对象进行批量重命名。 也可通过快捷键 **Shift+F2** 访问。 - **复制**: - 创建所选表的副本,包括其所有列、度量值和分区。 TOM Explorer 中的所有其他对象也都有此功能。 TOM Explorer 中的所有其他对象也都有此功能。 + 创建所选表的副本,包括其所有列、度量值和分区。 TOM Explorer 中的所有其他对象也都有此功能。 - **标记为日期表格...**: - 将该表标记为日期表格,以启用时间智能功能。 要求该表包含有效的日期列。 要求该表包含有效的日期列。 + 将该表标记为日期表格,以启用时间智能功能。 要求该表包含有效的日期列。 - **显示依赖项**: - 可视化所选表与其他模型对象之间的依赖关系。 也可使用快捷键 **Shift+F12** 访问。 也可使用快捷键 **Shift+F12** 访问。 + 可视化所选表与其他模型对象之间的依赖关系。 也可使用快捷键 **Shift+F12** 访问。 - **导出脚本**: 将所选对象导出为 TMSL 或 TMDL 脚本,以便用于部署或源代码管理。 - **宏菜单**: - 可将宏放入文件夹中,并对所选对象运行。 在上面的示例中,用户有一个名为“建模和分析”的文件夹,用于存放表对象的宏脚本。 在上面的示例中,用户有一个名为“建模和分析”的文件夹,用于存放表对象的宏脚本。 + 可将宏放入文件夹中,并对所选对象运行。 在上面的示例中,用户有一个名为“建模和分析”的文件夹,用于存放表对象的宏脚本。 - **剪切 / 复制 / 粘贴 / 删除** - 常规剪贴板操作。 可用于移动、复制或删除模型对象。 可用于移动、复制或删除模型对象。 + 常规剪贴板操作。 可用于移动、复制或删除模型对象。 - **属性** 打开所选对象的“属性”窗格。 快捷键:**Alt+Enter**。 用于查看和编辑元数据、表达式、格式和可见性设置。 @@ -91,64 +90,52 @@ TOM Explorer 由两个主要区域组成:第一部分是数据模型对象; TOM Explorer 允许切换显示有关数据模型对象的额外信息列。 可通过快捷键 **Ctrl+7** 实现。 这些额外信息在属性窗口中也能查看,但在这里可以快速查看对象类型、格式字符串、数据类型、表达式和说明。 -![TOM Explorer 显示/隐藏列](~/content/assets/images/user-interface/TOMExplorerInfoColumns.png) 可通过快捷键 **Ctrl+7** 实现。 -这些额外信息在属性窗口中也能查看,但在这里可以快速查看对象类型、格式字符串、数据类型、表达式和说明。 ![TOM Explorer 显示/隐藏列](~/content/assets/images/user-interface/TOMExplorerInfoColumns.png) ## TOM Explorer 工具栏 工具栏可让你显示或隐藏不同类型的对象,切换透视和语言,并在 Data model 中搜索特定对象。 ![TOM Explorer 工具条](~/content/assets/images/user-interface/TOMExplorerToolbar.png) -![TOM Explorer 工具条](~/content/assets/images/user-interface/TOMExplorerToolbar.png) 1. **显示/隐藏度量值** 切换表中度量值的可见性。 **快捷键:** **Ctrl+1** - **快捷键:** **Ctrl+1** 2. **显示/隐藏列** 切换表内列的可见性。 **快捷键:** **Ctrl+2** - **快捷键:** **Ctrl+2** 3. **显示/隐藏层级结构** 切换 TOM Explorer 中层级结构是否可见。 **快捷键:** **Ctrl+3** - **快捷键:** **Ctrl+3** 4. **显示/隐藏分区** 控制表是否显示分区。 **快捷键:** **Ctrl+4** - **快捷键:** **Ctrl+4** 5. **显示/隐藏日历** 控制日历是否可见。 **快捷键:** **Ctrl+8** - **快捷键:** **Ctrl+8** 6. **显示/隐藏显示文件夹** 启用或禁用表内按文件夹组织的显示方式。 **快捷键:** **Ctrl+5** - **快捷键:** **Ctrl+5** 7. **按命名空间对用户自定义函数分组** 启用后,DAX 用户自定义函数会按 [命名空间](xref:udfs#namespaces) 分层分组显示,而不是以扁平列表显示。 8. **显示/隐藏表格组** - 切换 TOM Explorer 树中表格组是否可见。 无需离开资源管理器,即可快速访问 **工具 > 偏好** 中的相同设置。 无需离开资源管理器,即可快速访问 **工具 > 偏好** 中的相同设置。 + 切换 TOM Explorer 树中表格组的可见性。 无需离开资源管理器,即可快速访问 **工具 > 偏好** 中的相同设置。 9. **显示/隐藏隐藏对象** 切换是否显示隐藏对象。 **快捷键:** **Ctrl+6** - **快捷键:** **Ctrl+6** 10. **显示/隐藏信息列** 显示或隐藏元数据列,例如数据类型或对象状态。 **快捷键:** **Ctrl+7** - **快捷键:** **Ctrl+7** 11. **透视选择器** - 下拉列表,用于选择特定透视。 **透视选择器** 下拉列表,用于选择特定透视。 TOM Explorer 中仅显示所选透视中的对象。 12. **语言选择器** @@ -158,5 +145,4 @@ TOM Explorer 允许切换显示有关数据模型对象的额外信息列。 可 将 TOM Explorer 树视图中的所有节点全部折叠。 14. **搜索栏** - 在 TOM Explorer 中提供实时筛选和导航。 **搜索栏** 在 TOM Explorer 中提供实时筛选和导航。 输入即可搜索所有可见的模型对象。 From 1aeb177a90dba4b6f45b3a421c901518a1448272 Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 15:01:03 +0200 Subject: [PATCH 28/31] New translations script-convert-dlol-to-import.md (Chinese Simplified) --- .../Advanced/script-convert-dlol-to-import.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/localizedContent/zh/content/features/CSharpScripts/Advanced/script-convert-dlol-to-import.md b/localizedContent/zh/content/features/CSharpScripts/Advanced/script-convert-dlol-to-import.md index cf8cfc56..afa71dd0 100644 --- a/localizedContent/zh/content/features/CSharpScripts/Advanced/script-convert-dlol-to-import.md +++ b/localizedContent/zh/content/features/CSharpScripts/Advanced/script-convert-dlol-to-import.md @@ -15,11 +15,11 @@ applies_to: ## 脚本用途 -此脚本用于将 OneLake 上的 Direct Lake(DL/OL)表转换为导入模式表。 此脚本用于将 OneLake 上的 Direct Lake(DL/OL)表转换为导入模式表。 如 [Direct Lake 指南文章](xref:direct-lake-guidance) 中所述,我们需要将此类表上的 [EntityPartition](https://learn.microsoft.com/en-us/dotnet/api/microsoft.analysisservices.tabular.entitypartitionsource?view=analysisservices-dotnet) 替换为导入模式下相应的常规 M 分区。 +此脚本用于将 OneLake 上的 Direct Lake(DL/OL)表转换为导入模式表。 如 [Direct Lake 指南文章](xref:direct-lake-guidance) 中所述,我们需要将此类表上的 [EntityPartition](https://learn.microsoft.com/en-us/dotnet/api/microsoft.analysisservices.tabular.entitypartitionsource?view=analysisservices-dotnet) 替换为导入模式下相应的常规 M 分区。 ## 前提条件 -你需要 **SQL Endpoint**,以及 Fabric **Warehouse** 或 **Lakehouse** 的 **名称**。 这两项都可以在 Fabric 门户中找到。 这两项都可以在 Fabric 门户中找到。 +你需要 **SQL Endpoint**,以及 Fabric **Warehouse** 或 **Lakehouse** 的 **名称**。 这两项都可以在 Fabric 门户中找到。 你还需要知道要连接的表/物化视图的 **Schema**。 对于 Lakehouse,默认值为 dbo。 @@ -274,11 +274,11 @@ Info("Conversion complete: Direct Lake → Import" + 接着,脚本会提示你输入 SQL analytics endpoint、Lakehouse 或 Warehouse 的名称,以及必填的 Schema 名称。 脚本会确保这三个字段都已填写后,才允许你继续。 -接下来,脚本会使用提供的连接详细信息创建或更新一个名为 `SQLEndpoint` 的共享表达式。 此表达式使用 `Sql.Database` 连接器访问 Lakehouse 或 Warehouse。 此表达式使用 `Sql.Database` 连接器访问 Lakehouse 或 Warehouse。 +接下来,脚本会使用提供的连接详细信息创建或更新一个名为 `SQLEndpoint` 的共享表达式。 此表达式使用 `Sql.Database` 连接器访问 Lakehouse 或 Warehouse。 -对于每个要转换的表,脚本都会创建一个新的导入模式 M 分区,该分区引用 `SQLEndpoint` 表达式,并使用指定的 Schema 和表名。 现有的 Direct Lake 分区会先被重命名,然后被删除,最终只保留新的导入分区。 现有的 Direct Lake 分区会先被重命名,然后被删除,最终只保留新的导入分区。 +对于每个要转换的表,脚本都会创建一个新的导入模式 M 分区,该分区引用 `SQLEndpoint` 表达式,并使用指定的 Schema 和表名。 现有的 Direct Lake 分区会先被重命名,然后被删除,最终只保留新的导入分区。 -最后,如果你选择转换模型中的所有 Direct Lake 表,脚本会检查是否存在名为 `DatabaseQuery` 的共享表达式;如果存在,就将其删除。 随后,模型的默认存储模式会设置为导入模式,并显示确认信息。 随后,模型的默认存储模式会设置为导入模式,并显示确认信息。 +最后,如果你选择转换模型中的所有 Direct Lake 表,脚本会检查是否存在名为 `DatabaseQuery` 的共享表达式;如果存在,就将其删除。 随后,模型的默认存储模式会设置为导入模式,并显示确认信息。 ## AI 使用声明 From f9ae2bc0bb8610fe9b8eb50c7f33a2b2ce5fbf49 Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 16:24:12 +0200 Subject: [PATCH 29/31] New translations code-actions.md (Spanish) --- localizedContent/es/content/features/code-actions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/localizedContent/es/content/features/code-actions.md b/localizedContent/es/content/features/code-actions.md index 0ecc3d1c..26081c5d 100644 --- a/localizedContent/es/content/features/code-actions.md +++ b/localizedContent/es/content/features/code-actions.md @@ -122,7 +122,7 @@ Las acciones de código siguientes aparecerán con puntos verde azulado debajo d | DR011 | [Reescribir con ISBLANK](xref:DR011) | En lugar de comparar una expresión con [`BLANK()`](https://dax.guide/BLANK), usa la función [`ISBLANK`](https://dax.guide/ISBLANK). Ejemplo:
`IF([Sales] = BLANK(), [Budget], [Sales])` -> `IF(ISBLANK([Sales], [Budget], [Sales])` | | DR012 | [Eliminar BLANK innecesario](xref:DR012) | Algunas funciones de DAX, como [`IF`](https://dax.guide/IF) y [`SWITCH`](https://dax.guide/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](xref:DR013) | 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](xref:DR014) | Reescribe los predicados compuestos (comparaciones de igualdad de la misma expresión combinadas usando [`OR`](https://dax.guide/OR) o [`\|\|`](https://dax.guide/op/or/)) con el operador [`IN`](https://dax.guide/IN). Ejemplo:
`a = 1 \\|\\| a = 2 \\|\\| a = 100` -> `a IN { 1, 2, 100 }` | +| DR014 | [Simplificar con IN](xref:DR014) | Reescriba los predicados compuestos (comparaciones de igualdad de una misma expresión combinadas con [`OR`](https://dax.guide/OR) o [`\|\|`](https://dax.guide/op/or/)) con el operador [`IN`](https://dax.guide/IN). Ejemplo:
`a = 1 \|\| a = 2 \|\| a = 100` -> `a IN { 1, 2, 100 }` | ### Reescrituras From da987145b945d7a5a004c0abfc9001e62b60f70b Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 16:28:43 +0200 Subject: [PATCH 30/31] New translations preferences.md (Spanish) --- localizedContent/es/content/references/preferences.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/localizedContent/es/content/references/preferences.md b/localizedContent/es/content/references/preferences.md index 018a4cf2..c8d0f848 100644 --- a/localizedContent/es/content/references/preferences.md +++ b/localizedContent/es/content/references/preferences.md @@ -184,7 +184,7 @@ Crea una copia de seguridad del modelo de destino antes de implementar los cambi ##### _Ubicación de copia de seguridad_ -Especifica la carpeta donde se almacenan las copias de seguridad de los despliegues. Especifica la carpeta donde se almacenan las copias de seguridad creadas al guardar. +Especifica la carpeta donde se almacenan las copias de seguridad de los despliegues. De forma predeterminada, no se crean copias de seguridad a menos que se especifique una ubicación. ## Tabular Editor > Valores predeterminados @@ -714,7 +714,7 @@ Define prefijos aceptables para nombres de variables (p. ej., `_`, `__`, `var_`, Define prefijos aceptables para nombres de columnas temporales (p. ej., `@`, `_`, `x`, `x_`). Las acciones de código sugerirán añadir estos prefijos a los nombres de columnas temporales que no sigan la convención. -## Editor SQL / Editor M / Editor de C\\# +## Editor SQL / Editor M / Editor de C\# ![Marcador de posición: captura de pantalla de las páginas de preferencias de los editores SQL/M/C#] From 795e6eb64286ef79cc9fc9c9650aa94306772d99 Mon Sep 17 00:00:00 2001 From: David Bojsen Date: Thu, 9 Apr 2026 16:36:23 +0200 Subject: [PATCH 31/31] New translations code-actions.md (Chinese Simplified) --- .../zh/content/features/code-actions.md | 92 +++++++++---------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/localizedContent/zh/content/features/code-actions.md b/localizedContent/zh/content/features/code-actions.md index 036c602b..eaa8d7ca 100644 --- a/localizedContent/zh/content/features/code-actions.md +++ b/localizedContent/zh/content/features/code-actions.md @@ -20,50 +20,50 @@ applies_to: # 代码操作 -Tabular Editor 3.18.0 引入了一项名为 **代码操作** 的新功能。 此功能默认启用,但可在 **工具 > 偏好** 对话框中,于 **文本编辑器 > DAX编辑器 > 代码操作** 下将其禁用。 +Tabular Editor 3.18.0 引入了一项名为 **代码操作** 的新功能。 此功能默认启用,但也可以在 **工具 > 偏好** 对话框中,进入 **文本编辑器 > DAX编辑器 > 代码操作** 将其禁用。 -代码操作是一项提升效率的功能,会在不打断你工作的情况下提供改进 DAX 代码的建议。 单击即可应用这些建议。 代码操作还可让你快速访问常用的代码重构操作。 +代码操作是一项提升效率的功能,会以不打扰你的方式提供改进 DAX 代码的建议。 单击一下即可应用这些建议。 代码操作还让你可以轻松使用常见的代码重构操作。 代码操作分为三类: -1. **改进**:这些是围绕以下方面改进 DAX 代码的推荐建议: +1. **改进**:这些建议会从以下方面帮助你改进 DAX 代码: - 遵循最佳实践 - 避免常见陷阱和反模式 - 避免使用过时或已弃用的 DAX 功能 - - 编写更优、更高性能的 DAX 代码 -2. **可读性**:这些是让你的 DAX 代码更易读的建议,方法包括…… + - 编写更好、性能更高的 DAX 代码 +2. **可读性**:这些建议可通过以下方式提高 DAX 代码的可读性…… - 在可能的情况下简化复杂表达式 - 删除冗余或不必要的代码 - - 应用一致的格式和命名规范 -3. **重写**:这些是用于重构你的 DAX 代码的建议。 它们未必是改进,但在进行较大规模的代码重构时通常很有用。 例如: - - 将 DAX “语法糖”改写为更冗长但更明确的显式代码 - - 重命名变量或扩展列的所有实例 + - 应用一致的格式和命名约定 +3. **重写**:这些是用于重构 DAX 代码的建议。 它们不一定是改进,但通常对较大规模的代码重构很有用。 示例包括: + - 将 DAX “语法糖”转换为更冗长但更明确的代码 + - 重命名某个变量或扩展列的所有引用 - 格式化代码 ## 如何使用代码操作 -新增了一个命令及其对应的工具栏/菜单按钮 **显示代码操作**,默认键盘快捷键为 `Ctrl+.`。 该命令会在当前光标位置显示适用的代码操作: +新增了一个命令及其对应的工具栏/菜单按钮 **显示代码操作**,默认快捷键为 `Ctrl+.`。 这个命令会显示当前光标位置可用的代码操作: ![代码操作调用菜单](~/content/assets/images/features/code-action-invoke-menu.png) -你也可以通过右键上下文菜单中的 **重构** 子菜单找到适用的代码操作: +你也可以通过右键上下文菜单中的 **重构** 子菜单找到当前可用的代码操作: -![代码操作重构子菜单](~/content/assets/images/features/code-action-refactor-submenu.png) +![代码操作“重构”子菜单](~/content/assets/images/features/code-action-refactor-submenu.png) -最后,当光标放在具有可用操作的代码分段上时,编辑器左侧边距会显示一个灯泡或螺丝刀图标。 点击该图标也会打开代码操作菜单: +最后,当光标放在有可用操作的代码分段上时,编辑器左侧边距会显示灯泡或螺丝刀图标。 点击该图标也会打开“代码操作”菜单: ![代码操作边距](~/content/assets/images/features/code-action-margin.png) -当你将鼠标指针悬停在代码操作菜单中的某个操作上时,工具提示会显示该操作的更多信息。 点击“了解更多”链接,即可查看该操作对应的知识库 (KB) 文章。 +将鼠标悬停在“代码操作”菜单中的某个操作上时,工具提示会显示有关该操作的更多信息。 点击“了解更多”链接,即可查看该操作对应的知识库(KB)文章。 ![代码操作工具提示](~/content/assets/images/features/code-action-tooltip.png) ## 代码操作指示器 -**改进**和**可读性**类代码操作也会在代码编辑器中以可视化方式标记。 这能让你快速判断代码的哪些部分可以改进或提升可读性。 +**改进**和**可读性**代码操作也会在代码编辑器中以视觉方式标注。 这样,你就能快速判断代码中哪些部分可以改进,或提高可读性。 -- **改进** 会在代码分段开头的前几个字符下方显示橙色圆点(除非该代码分段已显示橙色的警告波浪线)。 当光标移动到代码分段上时,左侧边距会出现一个_灯泡_图标。 -- **可读性**操作会在代码分段开头的前几个字符下方显示青绿色圆点。 当光标移到代码分段上时,左侧边距会显示一个_螺丝刀_图标。 +- **改进**会在代码分段的前几个字符下方显示为橙色圆点(除非该代码分段已显示橙色警告波浪线)。 当光标移到该代码分段上时,左侧边距会显示一个_灯泡_图标。 +- **可读性**操作会在代码分段的前几个字符下方显示为青绿色圆点。 当光标移到代码分段上时,左侧边距会显示一个_螺丝刀_图标。 - 代码本身不会在视觉上直接标示出 **重写**;不过,当光标放在包含可用重写的代码分段上时,左侧边距会显示 _螺丝刀_ 图标。 ## 应用到所有出现位置 @@ -86,7 +86,7 @@ Tabular Editor 3.18.0 引入了一项名为 **代码操作** 的新功能。 此 | ID | 名称 | 说明 | | ----- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| DI001 | [删除未使用的变量](xref:DI001) | 未在任何位置被引用的变量应当删除。 示例:
`VAR a = 1 VAR b = 2 RETURN a` -> `VAR a = 1 RETURN a` 示例:
`VAR a = 1 VAR b = 2 RETURN a` -> `VAR a = 1 RETURN a` | +| DI001 | [删除未使用的变量](xref:DI001) | 未在任何位置被引用的变量应当删除。 示例:
`VAR a = 1 VAR b = 2 RETURN a` -> `VAR a = 1 RETURN a` | | DI002 | [删除所有未使用的变量](xref:DI002) | 在变量块的 `RETURN` 部分未被使用的变量(无论是直接使用,还是通过其他变量间接使用)都应删除。 示例:
`VAR a = 1 VAR b = a RETURN 123` -> `123` | | DI003 | [移除表名](xref:DI003) | 度量值引用不应包含表名,因为引用度量值时无需表名。 此外,这种做法还能让度量值引用更容易与列引用区分开来。 示例:
`Sales[Total Sales]` -> `[Total Sales]` | | DI004 | [添加表名](xref:DI004) | 列引用应包含表名,以避免歧义,并更容易将列引用与度量值引用区分开来。 示例:
`SUM([SalesAmount])` -> `SUM(Sales[SalesAmount])` | @@ -97,48 +97,48 @@ Tabular Editor 3.18.0 引入了一项名为 **代码操作** 的新功能。 此 | DI009 | [避免使用 CALCULATE 简写语法](xref:DI009) | 示例:
`[Total Sales](Products[Color] = "Red")` -> `CALCULATE([Total Sales], Products[Color] = "Red")` | | DI010 | [用 MIN/MAX 替代 IF](xref:DI010) | 当条件表达式用于返回两个值中的最小值或最大值时,使用 [`MIN`](https://dax.guide/MIN) 或 [`MAX`](https://dax.guide/MAX) 函数会更高效、更简洁。 示例:
`IF(a > b, a, b)` -> `MAX(a, b)` | | DI011 | [用 ISEMPTY 替代 COUNTROWS](xref:DI011) | 检查表是否为空时,使用 [`ISEMPTY`](https://dax.guide/ISEMPTY) 比统计表的行数更高效。 示例:
`COUNTROWS(Products) = 0` -> `ISEMPTY(Products)` | -| DI012 | [用 DIVIDE 替代除法运算符](xref:DI012) | 当除法的分母是任意表达式时,请使用 [`DIVIDE`](https://dax.guide/DIVIDE) 而不是除法运算符,以避免除以零的错误。 示例:
`x / y` -> `DIVIDE(x, y)` 示例:
`x / y` -> `DIVIDE(x, y)` | -| DI013 | [使用除法运算符而不是 DIVIDE](xref:DI013) | 当 [`DIVIDE`](https://dax.guide/DIVIDE) 的第二个参数是非零常量时,使用除法运算符更高效。 示例:
`DIVIDE(x, 2)` -> `x / 2` 示例:
`DIVIDE(x, 2)` -> `x / 2` | -| DI014 | [用 DIVIDE 替换 IFERROR](xref:DI014) | 当除法的分母为零时,请使用 [`DIVIDE`](https://dax.guide/DIVIDE) 函数替代 [`IFERROR`](https://dax.guide/IFERROR),从而返回替代结果。 示例:
`IFERROR(x / y, 0)` -> `DIVIDE(x, y, 0)` 示例:
`IFERROR(x / y, 0)` -> `DIVIDE(x, y, 0)` | -| DI015 | [用 DIVIDE 替换 IF](xref:DI015) | 使用 [`DIVIDE`](https://dax.guide/DIVIDE) 函数代替 [`IF`](https://dax.guide/IF),可以更方便地检查分母是否为零或空白。 示例:
`IF(y <> 0, x / y)` -> `DIVIDE(x, y)` 示例:
`IF(y <> 0, x / y)` -> `DIVIDE(x, y)` | -| DI016 | 使用正确的 UDF 语法 | 为用户定义函数表达式使用正确的语法。 示例:
`(x, y) => x + y` 示例:
`(x, y) => x + y` | +| DI012 | [用 DIVIDE 替代除法运算符](xref:DI012) | 当除法的分母是任意表达式时,请使用 [`DIVIDE`](https://dax.guide/DIVIDE) 而不是除法运算符,以避免除以零的错误。 示例:
`x / y` -> `DIVIDE(x, y)` | +| DI013 | [使用除法运算符而不是 DIVIDE](xref:DI013) | 当 [`DIVIDE`](https://dax.guide/DIVIDE) 的第二个参数是非零常量时,使用除法运算符更高效。 示例:
`DIVIDE(x, 2)` -> `x / 2` | +| DI014 | [用 DIVIDE 替换 IFERROR](xref:DI014) | 当除法的分母为零时,请使用 [`DIVIDE`](https://dax.guide/DIVIDE) 函数替代 [`IFERROR`](https://dax.guide/IFERROR),从而返回替代结果。 示例:
`IFERROR(x / y, 0)` -> `DIVIDE(x, y, 0)` | +| DI015 | [用 DIVIDE 替换 IF](xref:DI015) | 使用 [`DIVIDE`](https://dax.guide/DIVIDE) 函数代替 [`IF`](https://dax.guide/IF),可以更方便地检查分母是否为零或空白。 示例:
`IF(y <> 0, x / y)` -> `DIVIDE(x, y)` | +| DI016 | 使用正确的 UDF 语法 | 为用户定义函数表达式使用正确的语法。 示例:
`(x, y) => x + y` | ### 可读性 当光标置于代码分段上时,下面的代码操作会在适用代码的前两个字符下方显示青绿色圆点,并在左侧边距显示螺丝刀图标 -| ID | 名称 | 说明 | -| ----- | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| DR001 | [转换为标量谓词](xref:DR001) | 列筛选器可以在不显式使用 [`FILTER`](https://dax.guide/FILTER) 函数的情况下,更简洁地写成标量谓词。 示例:
`FILTER(ALL(Products[Color]), Products[Color] = "Red")` -> `Products[Color] = "Red"`
`FILTER(VALUES(Products[Color]), Products[Color] = "Red")` -> `KEEPFILTERS(Products[Color] = "Red")` 示例:
`FILTER(ALL(Products[Color]), Products[Color] = "Red")` -> `Products[Color] = "Red"`
`FILTER(VALUES(Products[Color]), Products[Color] = "Red")` -> `KEEPFILTERS(Products[Color] = "Red")` | -| DR002 | [使用聚合函数替代迭代器](xref:DR002) | 尽可能使用聚合函数而不是迭代器函数,以简化代码。 示例:
`SUMX(Products, Products[SalesAmount])` -> `SUM(Products[SalesAmount])` | -| DR003 | [使用 VALUES 替代 SUMMARIZE](xref:DR003) | 当 [`SUMMARIZE`](https://dax.guide/SUMMARIZE) 只指定一列,且该列属于第一个参数中指定的表时,可以使用 [`VALUES`](https://dax.guide/VALUES) 更简洁地编写代码。 示例:
`SUMMARIZE(Products, Products[Color])` -> `VALUES(Products[Color])` 示例:
`SUMMARIZE(Products, Products[Color])` -> `VALUES(Products[Color])` | -| DR004 | [变量前缀](xref:DR004) | 变量应使用一致的命名约定。 建议使用前缀,例如下划线。 可以配置要使用的前缀,以符合偏好的样式。 示例:
`VAR totalSales = SUM(Sales[SalesAmount])` -> `VAR _totalSales = SUM(Sales[SalesAmount])` | -| DR005 | [为临时列添加前缀](xref:DR005) | 建议为临时列使用一致的前缀,以便更容易将它们与基列或度量值区分开来。 你可以配置要使用的前缀,以符合你偏好的风格。 示例:
`ADDCOLUMNS(Product, "SalesByProd", [Sales])` -> `ADDCOLUMNS(Product, "@SalesByProd", [Sales])` | -| DR006 | [将常量聚合移至变量](xref:DR006) | 当在迭代器或标量谓词中使用聚合函数时,该聚合对迭代中的每一行都会返回相同的结果。 因此,可以将该聚合移到迭代之外的 DAX 变量中。 示例:
`CALCULATE(..., 'Date'[Date] = MAX('Date'[Date]))` ->
`VAR _maxDate = MAX('Date'[Date]) RETURN CALCULATE(..., 'Date'[Date] = _maxDate)` | -| DR007 | [简化 1 个变量代码块](xref:DR007) | 仅包含一个变量的变量块可通过将表达式直接移入块的 `RETURN` 部分来简化。 前提是该变量只被引用一次,且不带任何上下文修饰符。 示例:
`VAR _result = [Sales] * 1.25 RETURN _result` -> `[Sales] * 1.25` 前提是该变量只被引用一次,且不带任何上下文修饰符。 示例:
`VAR _result = [Sales] * 1.25 RETURN _result` -> `[Sales] * 1.25` | -| DR008 | [简化多变量代码块](xref:DR008) | 对于包含多个变量的变量块,如果每个变量都是简单的度量值引用,并且仅在 `RETURN` 部分使用一次且没有任何上下文修饰符,则应进行简化。 示例:
`VAR _sales = [Sales] VAR _cost = [Cost] RETURN _sales - _cost` -> `[Sales] - [Cost]` 示例:
`VAR _sales = [Sales] VAR _cost = [Cost] RETURN _sales - _cost` -> `[Sales] - [Cost]` | -| DR009 | [改用 DISTINCTCOUNT 重写](xref:DR009) | 不要使用 `COUNTROWS(DISTINCT(T[c])` 来统计某列中不同值的数量,改用 [`DISTINCTCOUNT`](https://dax.guide/DISTINCTCOUNT) 函数。 | -| DR010 | [改用 COALESCE 重写](xref:DR010) | 不要使用 `IF` 从一组表达式中返回第一个非空值,改用 [`COALESCE`](https://dax.guide/COALESCE) 函数。 示例:
`IF(ISBLANK([Sales]), [Sales2], [Sales])` -> `COALESCE([Sales], [Sales2])` 示例:
`IF(ISBLANK([Sales]), [Sales2], [Sales])` -> `COALESCE([Sales], [Sales2])` | -| DR011 | [使用 ISBLANK 重写](xref:DR011) | 不要将表达式与 [`BLANK()`](https://dax.guide/BLANK) 进行比较,而应使用 [`ISBLANK`](https://dax.guide/ISBLANK) 函数。 示例:
`IF([Sales] = BLANK(), [Budget], [Sales])` -> `IF(ISBLANK([Sales], [Budget], [Sales])` 示例:
`IF([Sales] = BLANK(), [Budget], [Sales])` -> `IF(ISBLANK([Sales], [Budget], [Sales])` | -| DR012 | [移除不必要的 BLANK](xref:DR012) | 某些 DAX 函数,例如 [`IF`](https://dax.guide/IF) 和 [`SWITCH`](https://dax.guide/SWITCH) 在条件为 false 时本就会返回 `BLANK()`,因此无需显式指定 `BLANK()`。 示例:
`IF(a > b, a, BLANK())` -> `IF(a > b, a)` 示例:
`IF(a > b, a, BLANK())` -> `IF(a > b, a)` | -| DR013 | [简化否定逻辑](xref:DR013) | 当对逻辑表达式取反时,使用相反的运算符重写表达式通常更易读。 示例:
`NOT(a = b)` -> `a <> b` 示例:
`NOT(a = b)` -> `a <> b` | -| DR014 | [使用 IN 简化](xref:DR014) | 将复合谓词(对同一表达式进行相等比较,并通过 [`OR`](https://dax.guide/OR) 或 [`\\|\\|`](https://dax.guide/op/or/) 组合)改写为使用 [`IN`](https://dax.guide/IN) 运算符。 示例:
`a = 1 \\|\\| a = 2 \\|\\| a = 100` -> `a IN { 1, 2, 100 }` 示例:
`a = 1 \|\| a = 2 \|\| a = 100` -> `a IN { 1, 2, 100 }` | +| ID | 名称 | 说明 | +| ----- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| DR001 | [转换为标量谓词](xref:DR001) | 列筛选器可以在不显式使用 [`FILTER`](https://dax.guide/FILTER) 函数的情况下,更简洁地写成标量谓词。 示例:
`FILTER(ALL(Products[Color]), Products[Color] = "Red")` -> `Products[Color] = "Red"`
`FILTER(VALUES(Products[Color]), Products[Color] = "Red")` -> `KEEPFILTERS(Products[Color] = "Red")` | +| DR002 | [使用聚合函数替代迭代器](xref:DR002) | 尽可能使用聚合函数而不是迭代器函数,以简化代码。 示例:
`SUMX(Products, Products[SalesAmount])` -> `SUM(Products[SalesAmount])` | +| DR003 | [使用 VALUES 替代 SUMMARIZE](xref:DR003) | 当 [`SUMMARIZE`](https://dax.guide/SUMMARIZE) 只指定一列,且该列属于第一个参数中指定的表时,可以使用 [`VALUES`](https://dax.guide/VALUES) 更简洁地编写代码。 示例:
`SUMMARIZE(Products, Products[Color])` -> `VALUES(Products[Color])` | +| DR004 | [变量前缀](xref:DR004) | 变量应使用一致的命名约定。 建议使用前缀,例如下划线。 可以配置要使用的前缀,以符合偏好的样式。 示例:
`VAR totalSales = SUM(Sales[SalesAmount])` -> `VAR _totalSales = SUM(Sales[SalesAmount])` | +| DR005 | [为临时列添加前缀](xref:DR005) | 建议为临时列使用一致的前缀,以便更容易将它们与基列或度量值区分开来。 你可以配置要使用的前缀,以符合你偏好的风格。 示例:
`ADDCOLUMNS(Product, "SalesByProd", [Sales])` -> `ADDCOLUMNS(Product, "@SalesByProd", [Sales])` | +| DR006 | [将常量聚合移至变量](xref:DR006) | 当在迭代器或标量谓词中使用聚合函数时,该聚合对迭代中的每一行都会返回相同的结果。 因此,可以将该聚合移到迭代之外的 DAX 变量中。 示例:
`CALCULATE(..., 'Date'[Date] = MAX('Date'[Date]))` ->
`VAR _maxDate = MAX('Date'[Date]) RETURN CALCULATE(..., 'Date'[Date] = _maxDate)` | +| DR007 | [简化 1 个变量代码块](xref:DR007) | 仅包含一个变量的变量块可通过将表达式直接移入块的 `RETURN` 部分来简化。 前提是该变量只被引用一次,且不带任何上下文修饰符。 示例:
`VAR _result = [Sales] * 1.25 RETURN _result` -> `[Sales] * 1.25` | +| DR008 | [简化多变量代码块](xref:DR008) | 对于包含多个变量的变量块,如果每个变量都是简单的度量值引用,并且仅在 `RETURN` 部分使用一次且没有任何上下文修饰符,则应进行简化。 示例:
`VAR _sales = [Sales] VAR _cost = [Cost] RETURN _sales - _cost` -> `[Sales] - [Cost]` | +| DR009 | [改用 DISTINCTCOUNT 重写](xref:DR009) | 不要使用 `COUNTROWS(DISTINCT(T[c])` 来统计某列中不同值的数量,改用 [`DISTINCTCOUNT`](https://dax.guide/DISTINCTCOUNT) 函数。 | +| DR010 | [改用 COALESCE 重写](xref:DR010) | 不要使用 `IF` 从一组表达式中返回第一个非空值,改用 [`COALESCE`](https://dax.guide/COALESCE) 函数。 示例:
`IF(ISBLANK([Sales]), [Sales2], [Sales])` -> `COALESCE([Sales], [Sales2])` | +| DR011 | [使用 ISBLANK 重写](xref:DR011) | 不要将表达式与 [`BLANK()`](https://dax.guide/BLANK) 进行比较,而应使用 [`ISBLANK`](https://dax.guide/ISBLANK) 函数。 示例:
`IF([Sales] = BLANK(), [Budget], [Sales])` -> `IF(ISBLANK([Sales], [Budget], [Sales])` | +| DR012 | [移除不必要的 BLANK](xref:DR012) | 某些 DAX 函数,例如 [`IF`](https://dax.guide/IF) 和 [`SWITCH`](https://dax.guide/SWITCH) 在条件为 false 时本就会返回 `BLANK()`,因此无需显式指定 `BLANK()`。 示例:
`IF(a > b, a, BLANK())` -> `IF(a > b, a)` | +| DR013 | [简化否定逻辑](xref:DR013) | 当对逻辑表达式取反时,使用相反的运算符重写表达式通常更易读。 示例:
`NOT(a = b)` -> `a <> b` | +| DR014 | [使用 IN 简化](xref:DR014) | 将复合谓词(对同一表达式进行相等比较,并通过 [`OR`](https://dax.guide/OR) 或 [`\|\|`](https://dax.guide/op/or/) 组合)改写为使用 [`IN`](https://dax.guide/IN) 运算符。 示例:
`a = 1 \|\| a = 2 \|\| a = 100` -> `a IN { 1, 2, 100 }` | ### 重写 当光标放在代码分段上时,下面的“代码操作”会在左侧边距以螺丝刀图标显示。 -| ID | 名称 | 说明 | -| ----- | -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| RW001 | [使用 CALCULATE 改写 TOTALxTD](xref:RW001) | 诸如 [`TOTALMTD`](https://dax.guide/TOTALMTD)、[`TOTALQTD`](https://dax.guide/TOTALQTD) 和 [`TOTALYTD`](https://dax.guide/TOTALYTD) 之类的函数,都可以用更具表达力且更灵活的 [`CALCULATE`](https://dax.guide/CALCULATE) 函数来重写。 诸如 [`TOTALMTD`](https://dax.guide/TOTALMTD)、[`TOTALQTD`](https://dax.guide/TOTALQTD) 和 [`TOTALYTD`](https://dax.guide/TOTALYTD) 之类的函数,都可以用更具表达力且更灵活的 [`CALCULATE`](https://dax.guide/CALCULATE) 函数来重写。 示例:
`TOTALYTD([Total Sales], 'Date'[Date])` -> `CALCULATE([Total Sales], DATESYTD('Date'[Date]))` | -| RW002 | [使用 FILTER 重写](xref:RW002) | 在 `CALCULATE` 的筛选器参数中,标量谓词可以用 `FILTER` 重写。 例如,当你需要添加更复杂的筛选逻辑时,这会很有用。 示例:
`CALCULATE(..., Products[Color] = "Red")` -> `CALCULATE(..., FILTER(ALL(Products[Color]), Products[Color] = "Red"))` 例如,当你需要添加更复杂的筛选逻辑时,这会很有用。 示例:
`CALCULATE(..., Products[Color] = "Red")` -> `CALCULATE(..., FILTER(ALL(Products[Color]), Products[Color] = "Red"))` | -| RW003 | [反转 IF](xref:RW003) | 为了提升可读性,有时把 `IF` 语句反过来写会更清晰。 为了提升可读性,有时把 `IF` 语句反过来写会更清晰。 示例:
`IF(a < b, "B is greater", "A is greater")` -> `IF(a > b, "A is greater", "B is greater")` | +| ID | 名称 | 说明 | +| ----- | -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| RW001 | [使用 CALCULATE 改写 TOTALxTD](xref:RW001) | 诸如 [`TOTALMTD`](https://dax.guide/TOTALMTD)、[`TOTALQTD`](https://dax.guide/TOTALQTD) 和 [`TOTALYTD`](https://dax.guide/TOTALYTD) 之类的函数,都可以用更具表达力且更灵活的 [`CALCULATE`](https://dax.guide/CALCULATE) 函数来重写。 示例:
`TOTALYTD([Total Sales], 'Date'[Date])` -> `CALCULATE([Total Sales], DATESYTD('Date'[Date]))` | +| RW002 | [使用 FILTER 重写](xref:RW002) | 在 `CALCULATE` 的筛选器参数中,标量谓词可以用 `FILTER` 重写。 例如,当你需要添加更复杂的筛选逻辑时,这会很有用。 示例:
`CALCULATE(..., Products[Color] = "Red")` -> `CALCULATE(..., FILTER(ALL(Products[Color]), Products[Color] = "Red"))` | +| RW003 | [反转 IF](xref:RW003) | 为了提升可读性,有时把 `IF` 语句反过来写会更清晰。 示例:
`IF(a < b, "B is greater", "A is greater")` -> `IF(a > b, "A is greater", "B is greater")` | ## 自定义代码操作 -你可以通过 **工具 > 偏好** 对话框,在 **文本编辑器 > DAX编辑器 > 代码操作** 中自定义代码操作的行为。 在这里,你可以启用或禁用该功能,并为部分代码操作配置更多选项,例如用于变量名和扩展列的前缀。 在这里,你可以启用或禁用该功能,并为部分代码操作配置更多选项,例如用于变量名和扩展列的前缀。 +你可以通过 **工具 > 偏好** 对话框,在 **文本编辑器 > DAX编辑器 > 代码操作** 中自定义代码操作的行为。 在这里,你可以启用或禁用该功能,并为部分代码操作配置更多选项,例如用于变量名和扩展列的前缀。 -我们计划在后续版本中为此界面增加更多配置项,例如用于单独启用或禁用某个代码操作的选项。 敬请期待! 敬请期待! +我们计划在后续版本中为此界面增加更多配置项,例如用于单独启用或禁用某个代码操作的选项。 敬请期待! ![代码操作偏好](~/content/assets/images/code-actions-preferences.png)