diff --git a/content/features/code-actions.md b/content/features/code-actions.md
index b7513e1a..a531b54b 100644
--- a/content/features/code-actions.md
+++ b/content/features/code-actions.md
@@ -121,7 +121,7 @@ The Code Actions below will appear with teal green dots under the first two char
| DR011 | [Rewrite using ISBLANK](xref:DR011) | Instead of comparing an expression with [`BLANK()`](https://dax.guide/BLANK), use the [`ISBLANK`](https://dax.guide/ISBLANK) function. Example: `IF([Sales] = BLANK(), [Budget], [Sales])` -> `IF(ISBLANK([Sales], [Budget], [Sales])` |
| DR012 | [Remove unnecessary BLANK](xref:DR012) | Some DAX functions, such as [`IF`](https://dax.guide/IF) and [`SWITCH`](https://dax.guide/SWITCH) already return `BLANK()` when the condition is false, so there is no need to explicitly specify `BLANK()`. Example: `IF(a > b, a, BLANK())` -> `IF(a > b, a)` |
| DR013 | [Simplify negated logic](xref:DR013) | When a logical expression is negated, it is often more readable to rewrite the expression using the negated operator. Example: `NOT(a = b)` -> `a <> b` |
-| DR014 | [Simplify using IN](xref:DR014) | Rewrite compound predicates (equality comparisons of the same expression that are combined using [`OR`](https://dax.guide/OR) or [`||`](https://dax.guide/op/or/)) with the [`IN`](https://dax.guide/IN) operator. Example: `a = 1 || a = 2 || a = 100` -> `a IN { 1, 2, 100 }` |
+| DR014 | [Simplify using IN](xref:DR014) | Rewrite compound predicates (equality comparisons of the same expression that are combined using [`OR`](https://dax.guide/OR) or [`\|\|`](https://dax.guide/op/or/)) with the [`IN`](https://dax.guide/IN) operator. Example: `a = 1 \|\| a = 2 \|\| a = 100` -> `a IN { 1, 2, 100 }` |
### Rewrites
diff --git a/localizedContent/es/content/_ui-strings.json b/localizedContent/es/content/_ui-strings.json
index 589764cb..5b6b37c6 100644
--- a/localizedContent/es/content/_ui-strings.json
+++ b/localizedContent/es/content/_ui-strings.json
@@ -35,5 +35,14 @@
"themeAuto": "Automático",
"changeTheme": "Cambiar tema",
"copy": "Copiar",
- "downloadPdf": "Descargar PDF"
+ "downloadPdf": "Descargar PDF",
+ "search": "Buscar documentación",
+ "note": "Nota",
+ "warning": "Advertencia",
+ "tip": "Consejo",
+ "important": "Importante",
+ "caution": "Precaución",
+ "tableOfContents": "Tabla de contenidos",
+ "selectLanguage": "Seleccionar idioma",
+ "copyCode": "Copiar código"
}
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 fc77810b..50acc819 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
@@ -26,69 +26,69 @@ Si quieres reemplazar una cadena en las particiones M del modelo (por ejemplo, l
### Crear un nuevo parámetro M y agregarlo a las particiones M existentes
```csharp
-// Este script crea un nuevo parámetro M como una 'expresión compartida'.
-// También buscará el valor predeterminado en todas las particiones M y lo reemplazará por el nombre del objeto del parámetro.
+// This script creates a new M Parameter as a 'Shared Expression'.
+// It will also find the default value in all M partitions and replace them with the parameter object name.
//#r "System.Drawing"
using System.Drawing;
using System.Text.RegularExpressions;
using System.Windows.Forms;
-// Ocultar el control giratorio de 'Running Macro'
+// Hide the 'Running Macro' spinbox
ScriptHelper.WaitFormVisible = false;
-// Inicializar variables
+// Initialize variables
string _ParameterName = "New Parameter";
string _ParameterValue = "ParameterValue";
-// Cuadro de diálogo de WinForms para obtener el nombre/valor del parámetro
+// WinForms prompt to get Parameter Name / Value input
using (Form prompt = new Form())
{
Font formFont = new Font("Segoe UI", 11);
- // Configuración del cuadro de diálogo
+ // Prompt config
prompt.AutoSize = true;
prompt.MinimumSize = new Size(380, 120);
- prompt.Text = "Crear nuevo parámetro M";
+ prompt.Text = "Create New M Parameter";
prompt.StartPosition = FormStartPosition.CenterScreen;
- // Buscar: etiqueta
- Label parameterNameLabel = new Label() { Text = "Escribe el nombre:" };
+ // Find: label
+ Label parameterNameLabel = new Label() { Text = "Enter Name:" };
parameterNameLabel.Location = new Point(20, 20);
parameterNameLabel.AutoSize = true;
parameterNameLabel.Font = formFont;
- // Cuadro de texto para introducir el texto de la subcadena
+ // Textbox for inputing the substring text
TextBox parameterNameBox = new TextBox();
parameterNameBox.Width = 200;
parameterNameBox.Location = new Point(parameterNameLabel.Location.X + parameterNameLabel.Width + 20, parameterNameLabel.Location.Y - 4);
parameterNameBox.SelectedText = "New Parameter";
parameterNameBox.Font = formFont;
- // Reemplazar: etiqueta
- Label parameterValueLabel = new Label() { Text = "Escribe el valor:" };
+ // Replace: label
+ Label parameterValueLabel = new Label() { Text = "Enter Value:" };
parameterValueLabel.Location = new Point(parameterNameLabel.Location.X, parameterNameLabel.Location.Y + parameterNameLabel.Height + 20);
parameterValueLabel.AutoSize = true;
parameterValueLabel.Font = formFont;
- // Cuadro de texto para introducir el texto de la subcadena
+ // Textbox for inputting the substring text
TextBox parameterValueBox = new TextBox() { Left = parameterValueLabel.Right + 20, Top = parameterValueLabel.Location.Y - 4, Width = parameterNameBox.Width };
parameterValueBox.SelectedText = "Parameter Value";
parameterValueBox.Font = formFont;
- // Botón Aceptar
- Button okButton = new Button() { Text = "Crear", Left = 20, Width = 75, Top = parameterValueBox.Location.Y + parameterValueBox.Height + 20 };
+ // OK Button
+ Button okButton = new Button() { Text = "Create", Left = 20, Width = 75, Top = parameterValueBox.Location.Y + parameterValueBox.Height + 20 };
okButton.MinimumSize = new Size(75, 25);
okButton.AutoSize = true;
okButton.Font = formFont;
- // Botón Cancelar
- Button cancelButton = new Button() { Text = "Cancelar", Left = okButton.Location.X + okButton.Width + 10, Top = okButton.Location.Y };
+ // Cancel Button
+ Button cancelButton = new Button() { Text = "Cancel", Left = okButton.Location.X + okButton.Width + 10, Top = okButton.Location.Y };
cancelButton.MinimumSize = new Size(75, 25);
cancelButton.AutoSize = true;
cancelButton.Font = formFont;
- // Acciones de los botones
+ // Button actions
okButton.Click += (sender, e) => { _ParameterName = parameterNameBox.Text; _ParameterValue = parameterValueBox.Text; prompt.DialogResult = DialogResult.OK; };
cancelButton.Click += (sender, e) => { prompt.DialogResult = DialogResult.Cancel; };
@@ -102,11 +102,11 @@ using (Form prompt = new Form())
prompt.Controls.Add(okButton);
prompt.Controls.Add(cancelButton);
- // El usuario hizo clic en Aceptar, así que se ejecuta la lógica de buscar y reemplazar
+ // The user clicked OK, so perform the find-and-replace logic
if (prompt.ShowDialog() == DialogResult.OK)
{
- // Crea el parámetro
+ // Creates the parameter
Model.AddExpression(
_ParameterName,
@"
@@ -120,21 +120,21 @@ using (Form prompt = new Form())
);
- // Informa al usuario de que el parámetro se creó correctamente
+ // Informs the user that the parameter was successfully created
Info (
- "Se creó correctamente un nuevo parámetro: " + @"""" +
+ "Successfully created a new parameter: " + @"""" +
_ParameterName + @"""" +
- "\nValor predeterminado: " + @"""" +
+ "\nDefault value: " + @"""" +
_ParameterValue + @"""");
- // Busca el valor predeterminado del parámetro en las particiones M y lo reemplaza por el nombre del parámetro
+ // Finds the parameter default value in M Partitions & replaces with the parameter name
string _Find = @"""" + _ParameterValue + @"""";
string _Replace = @"#""" + _ParameterName + @"""";
int _NrMPartitions = 0;
int _NrReplacements = 0;
- var _ReplacementsList = new List();
+ var _ReplacementsList = new List<0>();
foreach ( var _Tables in Model.Tables )
{
@@ -146,43 +146,43 @@ using (Form prompt = new Form())
{
_p.Expression = _p.Expression.Replace( _Find, _Replace );
- // Lleva el control de qué particiones M se reemplazaron (y cuántas)
+ // Tracks which M partitions were replaced (and how many)
_NrReplacements = _NrReplacements + 1;
_ReplacementsList.Add( _p.Name );
}
- // Cuenta el total de particiones M
+ // Counts the total # M Partitions
_NrMPartitions = _NrMPartitions + 1;
}
}
}
- // Crea una lista con viñetas de todas las particiones M que se reemplazaron
+ // Makes a bulleted list of all the M partitions that were replaced
string _ReplacedPartitions = " • " + String.Join("\n • ", _ReplacementsList );
- // Informa
- // - Si la búsqueda y el reemplazo se realizaron correctamente
- // - Cuántas particiones M se reemplazaron
- // - En qué particiones M se aplicó la búsqueda y el reemplazo
+ // Informs
+ // - Whether the Find & Replace was successful
+ // - How many M partitions were replaced
+ // - Which M partitions had the Find & Replace done
Info (
- "Se reemplazó correctamente\n\n " +
+ "Successfully replaced\n\n " +
_Find +
- "\n\n por: \n\n" +
+ "\n\n with: \n\n" +
_Replace +
- "\n\n en " +
+ "\n\n in " +
Convert.ToString(_NrReplacements) +
- " de " +
+ " of " +
Convert.ToString(_NrMPartitions) +
- " particiones M:\n" +
+ " M Partitions:\n" +
_ReplacedPartitions
);
}
else
{
- Error ( "Entrada cancelada. El script finalizó sin cambios.");
+ Error ( "Cancelled input! Ended script without changes.");
}
}
```
@@ -199,6 +199,5 @@ Luego buscará el valor predeterminado en todas las particiones M y lo reemplaza
- 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.
+ 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
diff --git a/localizedContent/es/content/features/CSharpScripts/Advanced/script-implement-incremental-refresh.md b/localizedContent/es/content/features/CSharpScripts/Advanced/script-implement-incremental-refresh.md
index fda0e357..939c94b2 100644
--- a/localizedContent/es/content/features/CSharpScripts/Advanced/script-implement-incremental-refresh.md
+++ b/localizedContent/es/content/features/CSharpScripts/Advanced/script-implement-incremental-refresh.md
@@ -25,7 +25,7 @@ Para usar el script, selecciona la columna de fecha de la tabla para la que quie
> Asegúrate de comprobar que se ha hecho correctamente.
>
> Si tienes muchos pasos, asegúrate de mover este paso a un punto en el que pueda plegarse hasta la fuente de datos.
-> Asegúrate de ajustar todas las \\`#"Step References" en Power Query
+> Asegúrate de ajustar todas las \`#"Step References" en Power Query
> [!NOTE]
> Este script usa la entrada del usuario para generar la política de actualización.
diff --git a/localizedContent/es/content/features/CSharpScripts/csharp-script-library.md b/localizedContent/es/content/features/CSharpScripts/csharp-script-library.md
index d9a434ff..6d321d86 100644
--- a/localizedContent/es/content/features/CSharpScripts/csharp-script-library.md
+++ b/localizedContent/es/content/features/CSharpScripts/csharp-script-library.md
@@ -5,7 +5,7 @@ author: Morten Lønskov
updated: 2023-02-23
---
-# Biblioteca de scripts de C\\#
+# Biblioteca de scripts de C\#

diff --git a/localizedContent/es/content/features/Command-line-Options.md b/localizedContent/es/content/features/Command-line-Options.md
index fc316315..f2c08b32 100644
--- a/localizedContent/es/content/features/Command-line-Options.md
+++ b/localizedContent/es/content/features/Command-line-Options.md
@@ -42,63 +42,63 @@ TABULAREDITOR ( file | server database | -L [name] ) [-S script1 [script2] [...]
[-P [-Y]] [-S] [-R [-M]]]
[-X xmla_script]] [-W] [-E]]
-file Ruta de acceso completa al archivo Model.bim o a la carpeta del modelo database.json que se va a cargar.
-server Nombre de servidor\instancia o cadena de conexión desde la que se cargará el modelo
-database ID de la base de datos del modelo que se va a cargar. Si se deja en blanco (""), selecciona la primera
+file Ruta completa del archivo Model.bim o de la carpeta del modelo database.json que se va a cargar.
+server Nombre del servidor\instancia o cadena de conexión desde la que se cargará el modelo.
+database Id de la base de datos del modelo que se va a cargar. Si se deja en blanco (\"), se selecciona la primera
base de datos disponible en el servidor.
--L / -LOCAL Se conecta a una instancia (local) de Analysis Services de Power BI Desktop. Si no se especifica un
- nombre, se supone que se está ejecutando exactamente 1 instancia. En caso contrario,
+-L / -LOCAL Se conecta a una instancia (local) de Analysis Services de Power BI Desktop. Si no se
+ especifica ningún nombre, se asume que hay exactamente 1 instancia en ejecución. En caso contrario,
el nombre debe coincidir con el nombre del archivo .pbix cargado en Power BI Desktop.
-S / -SCRIPT Ejecuta el script especificado en el modelo después de cargarlo.
- scriptN Ruta de acceso completa a uno o varios archivos que contienen un C# Script que se va a ejecutar o un
+ scriptN Ruta completa de uno o varios archivos que contienen un C# Script para ejecutar o un
script en línea.
--SC / -SCHEMACHECK Intenta conectarse a todos los orígenes de datos del proveedor para detectar cambios en el esquema de la tabla.
- Genera...
- ...advertencias para tipos de datos no coincidentes y columnas de origen no asignadas
- ...errores para columnas del modelo no asignadas.
+-SC / -SCHEMACHECK Intenta conectarse a todos los orígenes de datos del proveedor para detectar cambios en el esquema
+ de las tablas. Genera...
+ ...advertencias por tipos de datos no coincidentes y columnas de origen no asignadas
+ ...errores por columnas del modelo no asignadas.
-A / -ANALYZE Ejecuta Best Practice Analyzer y muestra el resultado en la consola.
- rules Ruta opcional de un archivo o una URL con reglas BPA adicionales que se van a analizar. Si se
- especifica, el modelo no se analiza con reglas locales del usuario o del equipo,
+ rules Ruta opcional de un archivo o la URL de reglas BPA adicionales que se van a analizar. Si
+ se especifica, el modelo no se analiza con las reglas del usuario local ni de la máquina local,
pero las reglas definidas dentro del modelo se siguen aplicando.
-AX / -ANALYZEX Igual que -A / -ANALYZE, pero excluye las reglas especificadas en las anotaciones del modelo.
-B / -BIM / -BUILD Guarda el modelo (después de la ejecución opcional del script) como un archivo Model.bim.
- output Ruta de acceso completa del archivo Model.bim donde se guardará.
- id ID/nombre opcional que se asignará al objeto Database al guardar.
+ output Ruta completa del archivo Model.bim donde se guardará.
+ id Id/nombre opcional que se asignará al objeto Database al guardar.
-F / -FOLDER Guarda el modelo (después de la ejecución opcional del script) como una estructura de carpetas.
- output Ruta de acceso completa de la carpeta donde se guardará. La carpeta se crea si no existe.
- id ID/nombre opcional que se asignará al objeto Database al guardar.
+ output Ruta completa de la carpeta donde se guardará. La carpeta se crea si no existe.
+ id Id/nombre opcional que se asignará al objeto Database al guardar.
-TMDL Guarda el modelo (después de la ejecución opcional del script) como una estructura de carpetas TMDL.
- output Ruta de acceso completa de la carpeta TMDL donde se guardará. La carpeta se crea si no existe.
- id ID/nombre opcional que se asignará al objeto Database al guardar.
+ output Ruta completa de la carpeta TMDL donde se guardará. La carpeta se crea si no existe.
+ id Id/nombre opcional que se asignará al objeto Database al guardar.
-V / -VSTS Genera comandos de registro de Visual Studio Team Services.
--G / -GITHUB Genera comandos de flujo de trabajo de GitHub Actions.
--T / -TRX Genera un archivo VSTEST (trx) con detalles sobre la ejecución.
- resultsfile Nombre de archivo del XML de VSTEST.
--D / -DEPLOY Implementación desde la línea de comandos
+-G / -GITHUB Genera comandos de flujo de trabajo para GitHub Actions.
+-T / -TRX Genera un archivo VSTEST (trx) con detalles de la ejecución.
+ resultsfile Nombre del archivo XML de VSTEST.
+-D / -DEPLOY Despliegue desde la línea de comandos
Si no se especifican parámetros adicionales, este modificador guardará los metadatos del modelo
de nuevo en el origen (archivo o base de datos).
- server Nombre del servidor en el que implementar o cadena de conexión a Analysis Services.
- database ID de la base de datos que se va a implementar (crear/sobrescribir).
- -L / -LOGIN Deshabilita la seguridad integrada al conectarse al servidor. Especifica:
- user Nombre de usuario (debe ser un usuario con permisos de administrador en el servidor)
+ server Nombre del servidor donde se realizará el despliegue o cadena de conexión a Analysis Services.
+ database Id de la base de datos que se va a desplegar (crear/sobrescribir).
+ -L / -LOGIN Desactiva la seguridad integrada al conectarse al servidor. Especifica:
+ user Nombre de usuario (debe ser un usuario con derechos de administrador en el servidor)
pass Contraseña
- -F / -FULL Implementa todos los metadatos del modelo, permitiendo sobrescribir una base de datos existente.
- -O / -OVERWRITE Permite implementar (sobrescribir) una base de datos existente.
- -C / -CONNECTIONS Implementa (sobrescribe) los Data source existentes en el modelo. Después del modificador -C, puedes
- (opcionalmente) especificar cualquier número de pares marcador de posición-valor. Al hacerlo,
+ -F / -FULL Despliega todos los metadatos del modelo, permitiendo sobrescribir una base de datos existente.
+ -O / -OVERWRITE Permite desplegar (sobrescribir) una base de datos existente.
+ -C / -CONNECTIONS Despliega (sobrescribe) los Data sources existentes en el modelo. Después del modificador -C,
+ puedes especificar, opcionalmente, cualquier cantidad de pares marcador de posición/valor. Al hacerlo,
se reemplazará cualquier aparición de los marcadores de posición especificados (plch1, plch2, ...) en las
cadenas de conexión de cada Data source del modelo por los valores especificados
(value1, value2, ...).
- -P / -PARTITIONS Implementa (sobrescribe) las particiones de tabla existentes del modelo.
- -Y / -SKIPPOLICY No sobrescribe particiones que tengan definidas políticas de actualización incremental.
- -S / -SHARED Implementa (sobrescribe) expresiones compartidas.
- -R / -ROLES Implementa roles.
- -M / -MEMBERS Implementa miembros del rol.
- -X / -XMLA Sin implementación. En su lugar, genera un script XMLA/TMSL para una implementación posterior.
- xmla_script Nombre de archivo del nuevo script de salida XMLA/TMSL.
- -W / -WARN Muestra, como advertencias, información sobre objetos no procesados.
- -E / -ERR Devuelve un código de salida distinto de cero si Analysis Services devuelve algunos mensajes de error después de que
- los metadatos se hayan implementado/actualizado.
+ -P / -PARTITIONS Despliega (sobrescribe) las particiones de tabla existentes en el modelo.
+ -Y / -SKIPPOLICY No sobrescribe las particiones que tengan definidas políticas de actualización incremental.
+ -S / -SHARED Despliega (sobrescribe) expresiones compartidas.
+ -R / -ROLES Despliega roles.
+ -M / -MEMBERS Despliega miembros del rol.
+ -X / -XMLA No realiza ningún despliegue. En su lugar, genera un script XMLA/TMSL para desplegarlo más tarde.
+ xmla_script Nombre del archivo de salida del nuevo script XMLA/TMSL.
+ -W / -WARN Muestra información sobre objetos sin procesar en forma de advertencias.
+ -E / -ERR Devuelve un código de salida distinto de cero si Analysis Services devuelve mensajes de error después de que
+ se hayan desplegado o actualizado los metadatos.
```
> [!WARNING]
@@ -164,8 +164,8 @@ Durante el despliegue, quieres modificar la cadena para que apunte a una base de
Coloca el siguiente script en un archivo llamado "ClearConnectionStrings.cs" o similar:
```csharp
-// Esto reemplazará la cadena de conexión de todos los orígenes de datos de proveedor (heredados) del modelo
-// por un marcador de posición basado en el nombre del origen de datos. Por ejemplo, si tu origen de datos se llama
+// Esto reemplazará la cadena de conexión de todos los orígenes de datos del proveedor (heredados) del modelo
+// por un marcador de posición basado en el nombre del Data source. Por ejemplo, si tu Data source se llama
// "SQLDW", la cadena de conexión después de ejecutar este script sería "SQLDW":
foreach(var ds in Model.DataSources.OfType())
@@ -241,7 +241,7 @@ variables:
steps:
- script: TabularEditor.exe "Model.bim" -S "UpdateModel.csx" -D "$(serverName)" "MyDatabase" -O -V -E -W
- displayName: 'Deploy with Script Parameters'
+ displayName: 'Despliegue con parámetros de script'
env:
DEPLOY_ENV: $(deployEnv)
SERVER_NAME: $(serverName)
@@ -251,7 +251,7 @@ steps:
```yaml
- task: PowerShell@2
- displayName: 'Run Tabular Editor Script'
+ displayName: 'Ejecutar script de Tabular Editor'
env:
DEPLOY_ENV: 'UAT'
CONNECTION_STRING: $(sqldwConnectionString)
@@ -269,9 +269,9 @@ steps:
var deployEnv = Environment.GetEnvironmentVariable("DEPLOY_ENV");
var serverName = Environment.GetEnvironmentVariable("SERVER_NAME");
-Info($"Configuring model for {deployEnv} environment on {serverName}");
+Info($"Configurando el modelo para el entorno {deployEnv} en {serverName}");
-// Apply environment-specific changes
+// Aplicar cambios específicos del entorno
foreach(var ds in Model.DataSources.OfType())
{
ds.ConnectionString = ds.ConnectionString.Replace("{SERVER}", serverName);
@@ -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. |
diff --git a/localizedContent/es/content/features/Useful-script-snippets.md b/localizedContent/es/content/features/Useful-script-snippets.md
index e9f4ef4b..a6fb8d61 100644
--- a/localizedContent/es/content/features/Useful-script-snippets.md
+++ b/localizedContent/es/content/features/Useful-script-snippets.md
@@ -27,22 +27,22 @@ Además, asegúrate de echar un vistazo a nuestra biblioteca de scripts @csharp-
## Crear medidas a partir de columnas
```csharp
-// Crea una medida SUM para cada columna seleccionada actualmente y oculta la columna.
+// Creates a SUM measure for every currently selected column and hide the column.
foreach(var c in Selected.Columns)
{
var newMeasure = c.Table.AddMeasure(
- "Suma de " + c.Name, // Nombre
- "SUM(" + c.DaxObjectFullName + ")", // Expresión DAX
- c.DisplayFolder // Carpeta de visualización
+ "Sum of " + c.Name, // Name
+ "SUM(" + c.DaxObjectFullName + ")", // DAX expression
+ c.DisplayFolder // Display Folder
);
- // Establece la cadena de formato en la nueva medida:
+ // Set the format string on the new measure:
newMeasure.FormatString = "0.00";
- // Añade algo de documentación:
- newMeasure.Description = "Esta medida es la suma de la columna " + c.DaxObjectFullName;
+ // Provide some documentation:
+ newMeasure.Description = "This measure is the sum of column " + c.DaxObjectFullName;
- // Oculta la columna base:
+ // Hide the base column:
c.IsHidden = true;
}
```
@@ -56,12 +56,12 @@ Este fragmento usa la función `
.AddMeasure(, , " -S "" -B ""
+start /wait TabularEditor.exe "<0>" -S "<1>" -B "<2>"
```
por ejemplo:
@@ -701,7 +701,7 @@ foreach(var col in aggTable.Columns)
Después de ejecutar el script, deberías ver que la propiedad `AlternateOf` se ha asignado a todas las columnas de tu tabla de agregación (consulta la captura de pantalla a continuación). Ten en cuenta que la partición de la tabla base debe usar DirectQuery para que las agregaciones funcionen.
-
+
***
@@ -715,7 +715,7 @@ Están disponibles los siguientes métodos:
| ------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `void ExecuteCommand(string tmslOrXmla, bool isXmla = false)` | Este método envía el script TMSL o XMLA especificado a la instancia conectada de Analysis Services. Esto resulta útil cuando desea actualizar datos de una tabla en la instancia de AS. Tenga en cuenta que, si utiliza este método para realizar cambios de metadatos en su modelo, los metadatos del modelo local quedarán desincronizados respecto a los metadatos de la instancia de AS, y es posible que reciba una advertencia de conflicto de versiones la próxima vez que intente guardar los metadatos del modelo. Establezca el parámetro `isXmla` en `true` si envía un script XMLA. |
| `IDataReader ExecuteReader(string dax)` | Ejecuta la _consulta_ DAX especificada contra la base de datos de AS conectada y devuelve el objeto [AmoDataReader](https://docs.microsoft.com/en-us/dotnet/api/microsoft.analysisservices.amodatareader?view=analysisservices-dotnet) resultante. Una consulta DAX contiene una o varias instrucciones [`EVALUATE`](https://dax.guide/EVALUATE). Tenga en cuenta que no puede tener varios lectores de datos abiertos al mismo tiempo. Tabular Editor los cerrará automáticamente en caso de que olvide cerrar o liberar el lector de forma explícita. |
-| `DataSet ExecuteDax(string dax)` | Ejecuta la _consulta_ DAX especificada contra la base de datos de AS conectada y devuelve un objeto [Dataset](https://docs.microsoft.com/en-us/dotnet/api/system.data.dataset?view=netframework-4.6) que contiene los datos devueltos por la consulta. Una consulta DAX contiene una o varias instrucciones [`EVALUATE`](https://dax.guide/EVALUATE). El objeto Dataset resultante contiene una DataTable por cada instrucción `EVALUATE`. No se recomienda devolver tablas de datos muy grandes, ya que pueden provocar errores de falta de memoria u otros errores de estabilidad. |
+| `Dataset ExecuteDax(string dax)` | Ejecuta la _consulta_ DAX especificada contra la base de datos de AS conectada y devuelve un objeto [Dataset](https://docs.microsoft.com/en-us/dotnet/api/system.data.dataset?view=netframework-4.6) que contiene los datos devueltos por la consulta. Una consulta DAX contiene una o varias instrucciones [`EVALUATE`](https://dax.guide/EVALUATE). El objeto Dataset resultante contiene una DataTable por cada instrucción `EVALUATE`. No se recomienda devolver tablas de datos muy grandes, ya que pueden provocar errores de falta de memoria u otros errores de estabilidad. |
| `object EvaluateDax(string dax)` | Ejecuta la _expresión_ DAX especificada contra la base de datos de AS conectada y devuelve un objeto que representa el resultado. Si la expresión DAX es escalar, se devuelve un objeto del tipo correspondiente (string, long, decimal, double, DateTime). Si la expresión DAX es de tipo tabla, se devuelve un [DataTable](https://docs.microsoft.com/en-us/dotnet/api/system.data.datatable?view=netframework-4.6). |
Los métodos están acotados al objeto `Model.Database`, pero también se pueden ejecutar directamente sin ningún prefijo.
@@ -741,11 +741,11 @@ ExecuteCommand(tmsl);
A partir de Tabular Editor 2.16.6 o Tabular Editor 3.2.3, puede usar la siguiente sintaxis para enviar comandos XMLA sin procesar a Analysis Services. El siguiente ejemplo muestra cómo se puede usar para vaciar la caché del motor de AS:
```csharp
-var clearCacheXmla = string.Format(@"
-
-", Model.Database.ID);
+var clearCacheXmla = string.Format(@"<0>
+ <1>
+ <2>{0}2>
+ 1>
+0>", Model.Database.ID);
ExecuteCommand(clearCacheXmla, isXmla: true);
```
@@ -760,7 +760,7 @@ EvaluateDax("\"Hello from AS\"").Output(); // A string
EvaluateDax("{ (1, 2, 3) }").Output(); // A table
```
-
+
...o, si desea devolver el valor de la medida seleccionada actualmente:
@@ -768,7 +768,7 @@ EvaluateDax("{ (1, 2, 3) }").Output(); // A table
EvaluateDax(Selected.Measure.DaxObjectFullName).Output();
```
-
+
Y aquí tiene un ejemplo más avanzado que permite seleccionar y evaluar varias medidas a la vez:
@@ -777,7 +777,7 @@ var dax = "ROW(" + string.Join(",", Selected.Measures.Select(m => "\"" + m.Name
EvaluateDax(dax).Output();
```
-
+
Si ya está en un nivel avanzado, puede usar SUMMARIZECOLUMNS u otra función DAX para visualizar la medida seleccionada desglosada por alguna columna:
@@ -786,11 +786,11 @@ var dax = "SUMMARIZECOLUMNS('Product'[Color], " + string.Join(",", Selected.Meas
EvaluateDax(dax).Output();
```
-
+
Recuerde que puede guardar estos scripts como Acciones personalizadas haciendo clic en el icono "+" justo encima del editor de scripts. De este modo, obtienes una colección de consultas DAX fácilmente reutilizable que puedes ejecutar y visualizar directamente desde el menú contextual de Tabular Editor:
-
+
### Exportación de datos
diff --git a/localizedContent/es/content/features/code-actions.md b/localizedContent/es/content/features/code-actions.md
index 25e50eee..25bfa782 100644
--- a/localizedContent/es/content/features/code-actions.md
+++ b/localizedContent/es/content/features/code-actions.md
@@ -107,22 +107,22 @@ Las acciones de código siguientes aparecerán con puntos naranjas debajo de los
Las acciones de código siguientes aparecerán con puntos verde azulado debajo de los dos primeros caracteres del código correspondiente y con un icono de destornillador en el margen izquierdo cuando el cursor se sitúe sobre uno de los segmentos de código
-| ID | Nombre | Descripción | | | | | | |
-| ----- | ------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | ---------------------------------------------------------------------------------------------- | - | ----- | - | --------------------------------- |
-| DR001 | [Convertir a predicado escalar](xref:DR001) | Un filtro de columna puede escribirse de forma más concisa como un predicado escalar sin usar explícitamente la función [`FILTER`](https://dax.guide/FILTER). Ejemplos: `FILTER(ALL(Products[Color]), Products[Color] = "Red")` -> `Products[Color] = "Red"` `FILTER(VALUES(Products[Color]), Products[Color] = "Red")` -> `KEEPFILTERS(Products[Color] = "Red")` | | | | | | |
-| DR002 | [Usar una función de agregación en lugar de una función iteradora](xref:DR002) | Use una función de agregación en lugar de una función iteradora, cuando sea posible, para simplificar el código. Ejemplo: `SUMX(Products, Products[SalesAmount])` -> `SUM(Products[SalesAmount])` | | | | | | |
-| DR003 | [Usar VALUES en lugar de SUMMARIZE](xref:DR003) | Cuando [`SUMMARIZE`](https://dax.guide/SUMMARIZE) especifica solo una columna y esa columna pertenece a la tabla indicada en el primer argumento, el código puede escribirse de forma más concisa mediante [`VALUES`](https://dax.guide/VALUES). Ejemplo: `SUMMARIZE(Products, Products[Color])` -> `VALUES(Products[Color])` | | | | | | |
-| DR004 | [Añadir prefijo a la variable](xref:DR004) | Las variables deben seguir una convención de nomenclatura coherente. Se recomienda usar un prefijo, como un guion bajo. Puede configurar qué prefijo usar para que coincida con el estilo que prefiera. Ejemplo: `VAR totalSales = SUM(Sales[SalesAmount])` -> `VAR _totalSales = SUM(Sales[SalesAmount])` | | | | | | |
-| DR005 | [Añadir prefijo a las columnas temporales](xref:DR005) | Se recomienda usar un prefijo uniforme para las columnas temporales para distinguirlas más fácilmente de las columnas base o las medidas. Puede configurar qué prefijo usar para que se ajuste a su estilo preferido. Ejemplo: `ADDCOLUMNS(Product, "SalesByProd", [Sales])` -> `ADDCOLUMNS(Product, "@SalesByProd", [Sales])` | | | | | | |
-| DR006 | [Mover la agregación constante a una variable](xref:DR006) | Cuando se usa una función de agregación dentro de un iterador o un predicado escalar, la agregación produce el mismo resultado para cada fila de la iteración. Por tanto, la agregación se podría mover a una variable de DAX fuera de la iteración. Ejemplo: `CALCULATE(..., 'Date'[Date] = MAX('Date'[Date]))` -> `VAR _maxDate = MAX('Date'[Date]) RETURN CALCULATE(..., 'Date'[Date] = _maxDate)` | | | | | | |
-| DR007 | [Simplificar un bloque de 1 variable](xref:DR007) | Un bloque de variables con una sola variable puede simplificarse moviendo la expresión directamente a la parte `RETURN` del bloque. Esto supone que la variable solo se referencia una vez y sin modificadores de contexto. Ejemplo: `VAR _result = [Sales] * 1.25 RETURN _result` -> `[Sales] * 1.25` | | | | | | |
-| DR008 | [Simplificar un bloque de varias variables](xref:DR008) | Un bloque de variables con varias variables en el que cada una sea una referencia simple a una medida y solo se use una vez en la sección `RETURN`, sin modificadores de contexto, debe simplificarse. Ejemplo: `VAR _sales = [Sales] VAR _cost = [Cost] RETURN _sales - _cost` -> `[Sales] - [Cost]` | | | | | | |
-| DR009 | [Reescribir usando DISTINCTCOUNT](xref:DR009) | En lugar de usar `COUNTROWS(DISTINCT(T[c])` para contar el número de valores distintos de una columna, usa la función [`DISTINCTCOUNT`](https://dax.guide/DISTINCTCOUNT). | | | | | | |
-| DR010 | [Reescribir usando COALESCE](xref:DR010) | En lugar de usar `IF` para devolver el primer valor no en blanco de una lista de expresiones, usa la función [`COALESCE`](https://dax.guide/COALESCE). Ejemplo: `IF(ISBLANK([Sales]), [Sales2], [Sales])` -> `COALESCE([Sales], [Sales2])` | | | | | | |
-| 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 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 }\\` |
+| ID | Nombre | Descripción | | | | | | |
+| ----- | ------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | ---------------------------------------------------------------------------------------------- | - | ----- | - | ----------------------------------- |
+| DR001 | [Convertir a predicado escalar](xref:DR001) | Un filtro de columna puede escribirse de forma más concisa como un predicado escalar sin usar explícitamente la función [`FILTER`](https://dax.guide/FILTER). Ejemplos: `FILTER(ALL(Products[Color]), Products[Color] = "Red")` -> `Products[Color] = "Red"` `FILTER(VALUES(Products[Color]), Products[Color] = "Red")` -> `KEEPFILTERS(Products[Color] = "Red")` | | | | | | |
+| DR002 | [Usar una función de agregación en lugar de una función iteradora](xref:DR002) | Use una función de agregación en lugar de una función iteradora, cuando sea posible, para simplificar el código. Ejemplo: `SUMX(Products, Products[SalesAmount])` -> `SUM(Products[SalesAmount])` | | | | | | |
+| DR003 | [Usar VALUES en lugar de SUMMARIZE](xref:DR003) | Cuando [`SUMMARIZE`](https://dax.guide/SUMMARIZE) especifica solo una columna y esa columna pertenece a la tabla indicada en el primer argumento, el código puede escribirse de forma más concisa mediante [`VALUES`](https://dax.guide/VALUES). Ejemplo: `SUMMARIZE(Products, Products[Color])` -> `VALUES(Products[Color])` | | | | | | |
+| DR004 | [Añadir prefijo a la variable](xref:DR004) | Las variables deben seguir una convención de nomenclatura coherente. Se recomienda usar un prefijo, como un guion bajo. Puede configurar qué prefijo usar para que coincida con el estilo que prefiera. Ejemplo: `VAR totalSales = SUM(Sales[SalesAmount])` -> `VAR _totalSales = SUM(Sales[SalesAmount])` | | | | | | |
+| DR005 | [Añadir prefijo a las columnas temporales](xref:DR005) | Se recomienda usar un prefijo uniforme para las columnas temporales para distinguirlas más fácilmente de las columnas base o las medidas. Puede configurar qué prefijo usar para que se ajuste a su estilo preferido. Ejemplo: `ADDCOLUMNS(Product, "SalesByProd", [Sales])` -> `ADDCOLUMNS(Product, "@SalesByProd", [Sales])` | | | | | | |
+| DR006 | [Mover la agregación constante a una variable](xref:DR006) | Cuando se usa una función de agregación dentro de un iterador o un predicado escalar, la agregación produce el mismo resultado para cada fila de la iteración. Por tanto, la agregación se podría mover a una variable de DAX fuera de la iteración. Ejemplo: `CALCULATE(..., 'Date'[Date] = MAX('Date'[Date]))` -> `VAR _maxDate = MAX('Date'[Date]) RETURN CALCULATE(..., 'Date'[Date] = _maxDate)` | | | | | | |
+| DR007 | [Simplificar un bloque de 1 variable](xref:DR007) | Un bloque de variables con una sola variable puede simplificarse moviendo la expresión directamente a la parte `RETURN` del bloque. Esto supone que la variable solo se referencia una vez y sin modificadores de contexto. Ejemplo: `VAR _result = [Sales] * 1.25 RETURN _result` -> `[Sales] * 1.25` | | | | | | |
+| DR008 | [Simplificar un bloque de varias variables](xref:DR008) | Un bloque de variables con varias variables en el que cada una sea una referencia simple a una medida y solo se use una vez en la sección `RETURN`, sin modificadores de contexto, debe simplificarse. Ejemplo: `VAR _sales = [Sales] VAR _cost = [Cost] RETURN _sales - _cost` -> `[Sales] - [Cost]` | | | | | | |
+| DR009 | [Reescribir usando DISTINCTCOUNT](xref:DR009) | En lugar de usar `COUNTROWS(DISTINCT(T[c])` para contar el número de valores distintos de una columna, usa la función [`DISTINCTCOUNT`](https://dax.guide/DISTINCTCOUNT). | | | | | | |
+| DR010 | [Reescribir usando COALESCE](xref:DR010) | En lugar de usar `IF` para devolver el primer valor no en blanco de una lista de expresiones, usa la función [`COALESCE`](https://dax.guide/COALESCE). Ejemplo: `IF(ISBLANK([Sales]), [Sales2], [Sales])` -> `COALESCE([Sales], [Sales2])` | | | | | | |
+| 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 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
diff --git a/localizedContent/es/content/features/dax-editor.md b/localizedContent/es/content/features/dax-editor.md
index 959e1cb3..9274e9c5 100644
--- a/localizedContent/es/content/features/dax-editor.md
+++ b/localizedContent/es/content/features/dax-editor.md
@@ -43,11 +43,11 @@ Estas funciones también se pueden activar desde el menú contextual del editor.
Los calltips de DAX se actualizan al alternar entre las opciones de sintaxis con las flechas Arriba/Abajo.
-
+
La mayoría de los aspectos de Code Assist se pueden configurar en [**Herramientas > Preferencias > Editores de texto > Editor de DAX > Code Assist**](xref:preferences#dax-editor--code-assist).
-## Ver la definición
+## Ver definición
Con el cursor sobre una referencia a un objeto, como una variable o una referencia a una medida, pulsa [Alt+F12] para mostrar un editor en línea con la definición de ese objeto, debajo del cursor. Esto resulta útil cuando desea ver el código DAX de un objeto al que se hace referencia sin salir de la posición actual del documento.
diff --git a/localizedContent/es/content/features/perspective-editor.md b/localizedContent/es/content/features/perspective-editor.md
index 83d20e34..69aa18b4 100644
--- a/localizedContent/es/content/features/perspective-editor.md
+++ b/localizedContent/es/content/features/perspective-editor.md
@@ -1,6 +1,6 @@
---
uid: perspective-editor
-title: Editor de perspectiva
+title: Editor de perspectivas
author: Šarūnas Jučius
updated: 2022-03-16
applies_to:
@@ -17,27 +17,27 @@ applies_to:
full: true
---
-# Editor de perspectiva
+# Editor de perspectivas
> [!NOTE]
-> Para poder agregar perspectivas a modelos que se ejecutan en SSAS o Azure AS, necesitarás una licencia de la edición Enterprise de Tabular Editor 3.
+> Para agregar perspectivas a modelos que se ejecuten en SSAS o Azure AS, necesitarás una licencia de la Edición Enterprise de Tabular Editor 3.
-El **Editor de perspectiva** ofrece una vista rápida de la asignación de perspectivas de los objetos del modelo (tablas, columnas, jerarquías y medidas). Puede abrir el Editor de perspectiva desde el menú **Ver**. Como alternativa, si solo necesita editar ciertas perspectivas, selecciónelas en el **Explorador TOM** (mantenga pulsadas las teclas CTRL o SHIFT para seleccionar varias) y, a continuación, haga clic con el botón derecho y elija **Mostrar en el Editor de perspectiva**.
+El **Editor de perspectivas** ofrece una vista rápida de la asignación de perspectivas a los objetos del modelo (tablas, columnas, jerarquías y medidas). Puedes abrir el Editor de perspectiva desde el menú **Ver**. Como alternativa, si solo necesitas editar ciertas perspectivas, selecciónalas en el **Explorador TOM** (mantén pulsadas las teclas CTRL o SHIFT para seleccionar varias) y, a continuación, haz clic con el botón derecho y elige **Mostrar en el Editor de perspectiva**.
-
+
-Utilice las casillas de verificación del Editor de perspectiva para agregar o quitar rápidamente varios objetos de una perspectiva. Puede usar Deshacer (Ctrl+Z) y Rehacer (Ctrl+Y) de la forma habitual. Tenga en cuenta que los cambios realizados a través del Editor de perspectiva se aplican inmediatamente al TOM, aunque aún deberá guardar (Ctrl+S) o implementar su modelo para que los cambios se apliquen en Analysis Services / Power BI.
+Usa las casillas de verificación del Editor de perspectiva para agregar o quitar rápidamente varios objetos de una perspectiva. Puedes usar Deshacer (Ctrl+Z) y Rehacer (Ctrl+Y) de la forma habitual. Ten en cuenta que los cambios realizados a través del Editor de perspectiva se aplican de inmediato al TOM, aunque aún tendrás que guardar (Ctrl+S) o implementar el modelo para que los cambios se reflejen en Analysis Services / Power BI.
-## Barra de herramientas del Editor de perspectiva
+## Barra de herramientas del Editor de perspectivas
-Mientras el Editor de perspectiva está activo, la barra de herramientas que lo acompaña ofrece las siguientes opciones:
+Mientras el Editor de perspectivas está activo, la barra de herramientas que lo acompaña ofrece las siguientes opciones:
--  **Nueva perspectiva**: Este botón agrega una nueva perspectiva al modelo. La perspectiva se mostrará en el Editor de perspectiva.
--  **Mostrar/ocultar opciones ocultas**: Active esta opción si desea ver todos los objetos en el Editor de perspectiva, incluidos los objetos ocultos.
--  **Mostrar/ocultar carpetas de visualización**: Active este botón de conmutación si desea que el Editor de perspectiva agrupe los objetos de las tablas (medidas, jerarquías, columnas) por carpetas de visualización.
+-  **Nueva perspectiva**: Este botón agrega una nueva perspectiva al modelo. La perspectiva se mostrará en el Editor de perspectivas.
+-  **Mostrar/ocultar opciones ocultas**: Activa esta opción si quieres ver todos los objetos en el Editor de perspectiva, incluidos los objetos ocultos.
+-  **Mostrar/ocultar carpetas de visualización**: Activa este botón de alternancia si quieres que el Editor de perspectiva agrupe los objetos de las tablas (medidas, jerarquías, columnas) por carpetas de visualización.
## Trabajar con varias perspectivas
-Si trabajas en un modelo con muchas perspectivas, puede que no sea práctico mostrarlas todas a la vez. Puedes reorganizar el orden de visualización de las perspectivas en el Editor de perspectivas arrastrando los encabezados de las columnas, lo que facilita comparar perspectivas una junto a otra. Además, puedes añadir o quitar perspectivas del editor en cualquier momento desde el menú contextual con clic derecho:
+Si estás trabajando en un modelo con muchas perspectivas, puede resultar poco práctico mostrarlas todas a la vez. Puedes reorganizar el orden de visualización de las perspectivas en el Editor de perspectivas arrastrando los encabezados de las columnas; así, será más fácil comparar las perspectivas una junto a otra. Además, puedes añadir o quitar perspectivas del editor en cualquier momento desde el menú contextual al hacer clic con el botón derecho:
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/localizedContent/es/content/features/semantic-bridge.md b/localizedContent/es/content/features/semantic-bridge.md
index 26cea134..361d41b2 100644
--- a/localizedContent/es/content/features/semantic-bridge.md
+++ b/localizedContent/es/content/features/semantic-bridge.md
@@ -167,7 +167,7 @@ Las Metric Views proporcionan una capa estructurada sobre expresiones SQL, por l
El MVP no se conecta a ninguna plataforma aparte de Tabular, sino que funciona completamente con archivos locales.
Debe crear su YAML de Metric View por su cuenta y luego colocarlo donde Tabular Editor pueda verlo.
-### API de C\\#
+### API de C\#
La interfaz de C# se ha diseñado para optimizar el flujo de trabajo de traducción automática.
Por ello, hay pocas opciones para interactuar con la Metric View cargada actualmente, y ciertos tipos de operaciones resultan torpes.
diff --git a/localizedContent/es/content/features/using-bpa.md b/localizedContent/es/content/features/using-bpa.md
index 684704ab..d48ade93 100644
--- a/localizedContent/es/content/features/using-bpa.md
+++ b/localizedContent/es/content/features/using-bpa.md
@@ -28,11 +28,11 @@ El Best Practice Analyzer (BPA) le permite definir reglas sobre los metadatos de
La descripción general de BPA le muestra todas las reglas definidas en su modelo que actualmente se están incumpliendo:
-
+
Y siempre podrá ver en la interfaz principal cuántas reglas está infringiendo actualmente.
-
+
Al hacer clic en el enlace (o pulsar F10) se abre la ventana completa de BPA.
@@ -60,8 +60,8 @@ La ventana del Best Practice Analyzer enumera continuamente todas las **reglas e
Si necesitas agregar, quitar o modificar las reglas que se aplican a tu modelo, hay una interfaz específica para ello. Puedes abrirla haciendo clic en el botón de la esquina superior izquierda de la ventana de Best Practice Analyzer, o usando la opción de menú "Herramientas > Administrar reglas de BPA..." en la ventana principal.
-
+
La ventana Administrar reglas de BPA contiene dos listas: la lista superior representa las **colecciones** de reglas que están cargadas actualmente. Al seleccionar una colección en esta lista, se mostrarán todas las reglas definidas dentro de esa colección en la lista inferior.
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/localizedContent/es/content/features/views/tom-explorer-view.md b/localizedContent/es/content/features/views/tom-explorer-view.md
index b2b07c66..cdbf86e9 100644
--- a/localizedContent/es/content/features/views/tom-explorer-view.md
+++ b/localizedContent/es/content/features/views/tom-explorer-view.md
@@ -36,55 +36,55 @@ El menú del botón derecho incluye los siguientes elementos, algunos de los cua
### Opciones del menú contextual de clic derecho
-- **Update table schema...**:
- Checks for structural changes in the external data source and updates the table's schema accordingly. Esto es útil cuando se han agregado, cambiado de nombre o quitado columnas en el origen.
+- **Actualizar el esquema de la tabla...**:
+ Comprueba si hay cambios estructurales en el Data source externo y actualiza el esquema de la tabla en consecuencia. Esto es útil cuando se han agregado, cambiado de nombre o quitado columnas en el origen.
- **Script DAX**:
- Generates a DAX script for the selected table and its objects. Abre una nueva ventana del editor de scripts donde puede revisar o editar en conjunto las definiciones de DAX.
+ Genera un script DAX para la tabla seleccionada y sus objetos. Abre una nueva ventana del editor de scripts donde puede revisar o editar en conjunto las definiciones de DAX.
-- **Preview data**:
- Opens the data preview pane displaying a sample of the data loaded into the selected table. Útil para validar o depurar. Solo existe al hacer clic con el botón derecho en las tablas.
+- **Vista previa de datos**:
+ Abre el panel de vista previa de datos y muestra un ejemplo de los datos cargados en la tabla seleccionada. Útil para la validación o la depuración. Solo existe al hacer clic con el botón derecho en las tablas.
-- **Refresh**:
- Expands to a selection of possible refresh operation for the selected table. Esto solo está disponible si el modelo está conectado a un modelo en vivo, ya sea de forma independiente o en modo del área de trabajo. Esta opción solo está disponible para tablas y particiones.
+- **Actualizar**:
+ Despliega una selección de posibles operaciones de actualización para la tabla seleccionada. Esto solo está disponible si el modelo está conectado a un modelo en vivo, ya sea de forma independiente o en modo del área de trabajo. Esta opción solo está disponible para tablas y particiones.
-- **Create**:
- Expands to a submenu allowing the creation of new measures, columns, hierarchies, display folders or calculation items under the selected object. Las opciones disponibles dependen del tipo de objeto seleccionado.
+- **Crear**:
+ Muestra un submenú que permite crear nuevas medidas, columnas, jerarquías, carpetas de visualización o elementos de cálculo bajo el objeto seleccionado. Las opciones disponibles dependen del tipo de objeto seleccionado.
-- **Move to group**:
- Allows you to organize the table into a Table group within the TOM Explorer for easier model navigation. Esta opción solo está disponible para tablas.
+- **Mover a un grupo**:
+ Te permite organizar la tabla en un grupo de tablas dentro del Explorador TOM para navegar por el modelo con más facilidad. Esta opción solo está disponible para tablas.
-- **Make invisible**:
- Marks the object as not visible in client tools. La tabla sigue formando parte del modelo, pero está oculta para los autores de informes. Como alternativa, usa el atajo **Ctrl+I** para ocultar el objeto.
+- **Hacer invisible**:
+ Marca el objeto como no visible en las herramientas cliente. La tabla sigue formando parte del modelo, pero está oculta para los autores de informes. Como alternativa, puedes usar el atajo **Ctrl+I** para ocultar el objeto.
-- **Shown in perspectives**:
- Enables or disables the table's inclusion in one or more perspectives. Las perspectivas limitan lo que los usuarios finales pueden ver en herramientas como Power BI.
+- **Mostrar en perspectivas**:
+ Activa o desactiva la inclusión de la tabla en una o varias perspectivas. Las perspectivas limitan lo que los usuarios finales pueden ver en herramientas como Power BI.
- **Cambio de nombre por lotes**: Al seleccionar más de un objeto, puede cambiarles el nombre por lotes mediante sustitución de cadenas o expresiones regulares. El atajo para renombrar por lotes es **F2**.
-- **Batch rename children...**:
- Enables bulk renaming of all child objects under the table or display folder using regex or string replacement rules. También se puede acceder mediante el atajo **Shift+F2**.
+- **Renombrar objetos secundarios por lotes...**:
+ Permite renombrar en bloque todos los objetos secundarios de la tabla o la carpeta de visualización mediante expresiones regulares o reglas de reemplazo de cadenas. También puedes acceder con el atajo **Shift+F2**.
-- **Duplicate**:
- Creates a copy of the selected table, including all its columns, measures and partitions. También existe para todos los demás objetos del Explorador TOM.
+- **Duplicar**:
+ Crea una copia de la tabla seleccionada, incluidas todas sus columnas, medidas y particiones. También existe para todos los demás objetos del Explorador TOM.
-- **Mark as date table...**:
- Marks the table as a date table, enabling time intelligence features. Requiere que la tabla contenga una columna de fecha válida.
+- **Marcar como tabla de fechas...**:
+ Marca la tabla como una tabla de fechas, habilitando las funciones de inteligencia temporal. Requiere que la tabla contenga una columna de fecha válida.
-- **Show dependencies**:
- Visualizes dependencies between the selected table and other model objects. También se puede acceder mediante el atajo **Shift+F12**.
+- **Mostrar dependencias**:
+ Visualiza las dependencias entre la tabla seleccionada y otros objetos del modelo. También se puede acceder mediante el atajo **Shift+F12**.
-- **Export script**:
- Exports the selected objects as a TMSL or TMDL script for use in deployment or source control.
+- **Exportar script**:
+ Exporta los objetos seleccionados como un script TMSL o TMDL para usarlo en la implementación o el control de código fuente.
-- **Macro Menus**:
- Macros can be placed into folders and run against the selected object. En el ejemplo anterior, el usuario tiene una carpeta de Modelado y análisis para scripts de macros aplicados a objetos de tabla.
+- **Menús de macros**:
+ Las macros se pueden colocar en carpetas y ejecutarse en el objeto seleccionado. En el ejemplo anterior, el usuario tiene una carpeta de Modelado y análisis para scripts de macros aplicados a objetos de tabla.
-- **Cut / Copy / Paste / Delete**:
- Standard clipboard operations. Úsalas para mover, duplicar o quitar objetos del modelo.
+- **Cortar / Copiar / Pegar / Eliminar**:
+ Operaciones estándar del portapapeles. Úsalas para mover, duplicar o quitar objetos del modelo.
-- **Properties**:
- Opens the Properties pane for the selected object. Atajo: **Alt+Enter**. Úsalo para inspeccionar y editar metadatos, expresiones, formato y configuración de visibilidad.
+- **Propiedades**:
+ Abre el panel de Propiedades del objeto seleccionado. Atajo: **Alt+Enter**. Sirve para inspeccionar y editar metadatos, expresiones, formato y configuración de visibilidad.
### Mostrar columnas de información
diff --git a/localizedContent/es/content/getting-started/Getting-Started-te2.md b/localizedContent/es/content/getting-started/Getting-Started-te2.md
index d2563515..69f44808 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, cuando necesitas esperar a que el despliegue se complete correctamente antes de continuar con la tarea.
+> 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ó: 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`
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.
diff --git a/localizedContent/es/content/getting-started/index.md b/localizedContent/es/content/getting-started/index.md
index 96a2633e..a5f74f37 100644
--- a/localizedContent/es/content/getting-started/index.md
+++ b/localizedContent/es/content/getting-started/index.md
@@ -38,24 +38,24 @@ Como este material de formación se centra en el producto Tabular Editor, asumim
- @user-interface
- @bpa-view
- - @vista de actualización de datos
- - @buscar y reemplazar
- - @vista de macros
- - @vista de mensajes
- - @vista de propiedades
+ - @data-refresh-view
+ - @find-replace
+ - @macros-view
+ - @messages-view
+ - @properties-view
- @tom-explorer-view
- - @vista del diagrama
+ - @diagram-view
-- @desarrollo en paralelo
- - @optimizar el flujo de trabajo con el modo de área de trabajo
+- @parallel-development
+ - @optimizing-workflow-workspace-mode
- @boosting-productivity-te3
- @importing-tables-data-modeling
- - @actualizar, previsualizar y consultar
+ - @refresh-preview-query
- @creating-and-testing-dax
- @dax-script-introduction
- @bpa
- - @scripts de C# y macros
+ - @cs-scripts-and-macros
- @personalizing-te3
**Recursos adicionales:**
diff --git a/localizedContent/es/content/getting-started/migrate-from-te2.md b/localizedContent/es/content/getting-started/migrate-from-te2.md
index b815e0f3..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 .
@@ -152,5 +152,5 @@ Para obtener más información, consulta @dax-script-introduction.
## Siguientes pasos
- @migrate-from-vs
-- @desarrollo-en-paralelo
-- @aumento-de-la-productividad-te3
+- @parallel-development
+- @boosting-productivity-te3
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
diff --git a/localizedContent/es/content/references/preferences.md b/localizedContent/es/content/references/preferences.md
index 0c5ceeca..5094a425 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#]
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).
diff --git a/localizedContent/es/content/tutorials/incremental-refresh/incremental-refresh-about.md b/localizedContent/es/content/tutorials/incremental-refresh/incremental-refresh-about.md
index abc0e42a..02787629 100644
--- a/localizedContent/es/content/tutorials/incremental-refresh/incremental-refresh-about.md
+++ b/localizedContent/es/content/tutorials/incremental-refresh/incremental-refresh-about.md
@@ -297,31 +297,31 @@ _A continuación se muestra un resumen de las propiedades de TOM de un Data mode
EnableRefreshPolicy
Actualizar esta tabla de forma incremental
-
Indica si hay una política de actualización habilitada para la tabla.
En Tabular Editor, otras propiedades de la política de actualización solo serán visibles si este valor se establece en True.
+
Indica si la tabla tiene habilitada una política de actualización.
En Tabular Editor, el resto de las propiedades de la política de actualización solo se mostrarán si este valor se establece en True.
True o False.
IncrementalGranularity
Período de actualización incremental
-
La granularidad de la ventana incremental.
Ejemplo: "Actualice los datos de los últimos 30 días antes de la fecha de actualización."
-
Day, Month, Quarter o Year. Debe ser menor o igual que el valor de IncrementalGranularity.
+
La granularidad de la ventana incremental.
Ejemplo: "Actualizar los datos de los últimos 30 días anteriores a la fecha de actualización."
+
Day, Month, Quarter o Year. Debe ser menor o igual que el IncrementalGranularity.
IncrementalPeriods
Número de períodos de actualización incremental
-
El número de períodos de la ventana incremental.
Ejemplo: "Actualice los datos de los últimos 30 días antes de la fecha de actualización."
-
Un número entero que indica la cantidad de períodos de IncrementalGranularity. Debe definir un período total inferior a RollingWindowPeriods
+
El número de períodos de la ventana incremental.
Ejemplo: "Actualizar los datos de los últimos 30 días antes de la fecha de actualización."
+
Un número entero que indique el número de períodos de IncrementalGranularity. Debe definir un período total inferior a RollingWindowPeriods
IncrementalPeriodsOffset
-
Actualizar solo los días completos
+
Actualizar solo días completos
El desplazamiento que se aplicará a IncrementalPeriods.
Ejemplo para: IncrementalPeriodsOffset=-1; IncrementalPeriods = 30; IncrementalGranularity = Day: "Actualizar solo los datos de los últimos 30 días, desde el día anterior a la fecha de actualización.
-
Un número entero que indica la cantidad de períodos de IncrementalGranularity para desplazar la ventana incremental.
+
Un número entero con el número de períodos de IncrementalGranularity para desplazar la ventana incremental.
Mode
-
Obtener los datos más recientes en tiempo real con DirectQuery
-
Especifica si la actualización incremental está configurada solo con particiones de importación o también con una partición de DirectQuery, para crear una "tabla híbrida".
+
Obtenga los datos más recientes en tiempo real con DirectQuery
+
Especifica si la actualización incremental se configura únicamente con particiones de importación o también con una partición de DirectQuery, para dar como resultado una "tabla híbrida".
Import o Hybrid.
@@ -333,7 +333,7 @@ _A continuación se muestra un resumen de las propiedades de TOM de un Data mode
PollingExpression (Opcional)
Detectar cambios en los datos
-
La expresión M utilizada para detectar cambios en una columna específica, como LastUpdateDate.
En Tabular Editor, la Polling Expression se puede ver y modificar desde la ventana del Editor de expresiones seleccionándola en el menú desplegable de la esquina superior izquierda.
Una expresión M válida que devuelve un valor escalar de la fecha más reciente de una columna. Se actualizarán todos los registros de las particiones activas de la ventana incremental que contengan ese valor en la columna.
Los registros de las particiones archivadas no se actualizan.
+
La expresión M que se usa para detectar cambios en una columna específica, como LastUpdateDate
En Tabular Editor, la PollingExpression se puede ver y modificar desde la ventana del Editor de expresiones seleccionándola en el menú desplegable de la esquina superior izquierda.
Una expresión M válida que devuelve un valor escalar de la fecha más reciente de una columna. Se actualizarán todos los registros de las particiones activas de la ventana incremental que contengan ese valor en la columna.
Los registros de las particiones archivadas no se actualizan.
RollingWindowGranularity
diff --git a/localizedContent/zh/content/_ui-strings.json b/localizedContent/zh/content/_ui-strings.json
index 5525fb60..cfffdf19 100644
--- a/localizedContent/zh/content/_ui-strings.json
+++ b/localizedContent/zh/content/_ui-strings.json
@@ -35,5 +35,14 @@
"themeAuto": "自动",
"changeTheme": "切换主题",
"copy": "复制",
- "downloadPdf": "下载 PDF"
+ "downloadPdf": "下载 PDF",
+ "search": "搜索文档",
+ "note": "注意",
+ "warning": "警告",
+ "tip": "提示",
+ "important": "重要",
+ "caution": "注意事项",
+ "tableOfContents": "目录",
+ "selectLanguage": "选择语言",
+ "copyCode": "复制代码"
}
diff --git a/localizedContent/zh/content/api/index.md b/localizedContent/zh/content/api/index.md
index 03eab007..b2204853 100644
--- a/localizedContent/zh/content/api/index.md
+++ b/localizedContent/zh/content/api/index.md
@@ -7,15 +7,15 @@ updated: 2026-01-27
# Tabular Editor API
-这是 Tabular Editor 的 C# 脚本编写功能的 API 文档。
+这是 Tabular Editor 的 C# Script 功能的 API 文档。
-具体而言,可用于脚本编写的对象来自 **TOMWrapper.dll**、**TabularEditor3.Shared.dll** 和 **SemanticBridge.dll** 库。
+具体来说,可用于编写脚本的对象来自 **TOMWrapper.dll**、**TabularEditor3.Shared.dll** 和 **SemanticBridge.dll** 库。
-## 入门
+## 开始使用
-在 Tabular Editor 中编写脚本时,最常用的两个对象是 [`Selected`](xref:TabularEditor.Shared.Interaction.Selection),它允许你访问当前在 TOM Explorer 中选中的对象,以及 [`Model`](xref:TabularEditor.TOMWrapper.Model),它允许你访问当前加载的数据模型中的任何对象。 这两个对象都作为全局 [`ScriptHost`](xref:TabularEditor.Shared.Scripting.ScriptHost) 对象的成员属性提供。
+在 Tabular Editor 中编写脚本时,最常用的两个对象是 [`Selected`](xref:TabularEditor.Shared.Interaction.Selection) 和 [`Model`](xref:TabularEditor.TOMWrapper.Model)。前者可让你访问当前在 TOM Explorer 中选中的对象,后者可让你访问当前已加载的 Data model 中的任何对象。 这两个对象都可作为全局 [`ScriptHost`](xref:TabularEditor.Shared.Scripting.ScriptHost) 对象的成员属性使用。
-此外,`ScriptHost` 对象还包含一些静态方法,这些方法会以全局方法的形式暴露给脚本(也就是说,你可以直接调用它们,无需加上 `ScriptHost` 前缀)。 这些方法也称为 @script-helper-methods(脚本帮助方法)。
+此外,`ScriptHost` 对象还包含一些静态方法,这些方法会作为全局方法向脚本公开(也就是说,无需加上 `ScriptHost` 前缀即可调用)。 这些方法也称为 @script-helper-methods。
## 示例
@@ -23,8 +23,8 @@ updated: 2026-01-27
// 显示一个对话框,提示用户选择一个度量值:
var myMeasure = SelectMeasure();
-// 在模型的第一张表上创建一个新度量值,其名称和表达式
-// 与前面选中的度量值相同:
+// 在模型的第一张表上创建一个新的度量值,其名称和表达式
+// 与先前选中的度量值相同:
Model.Tables.First().AddMeasure(myMeasure.Name + " copy", myMeasure.Expression);
```
diff --git a/localizedContent/zh/content/features/Best-Practice-Analyzer.md b/localizedContent/zh/content/features/Best-Practice-Analyzer.md
index 08f08a98..79cf2b36 100644
--- a/localizedContent/zh/content/features/Best-Practice-Analyzer.md
+++ b/localizedContent/zh/content/features/Best-Practice-Analyzer.md
@@ -1,85 +1,85 @@
---
uid: best-practice-analyzer
-title: 最佳实践分析器
+title: Best Practice Analyzer
applies_to:
products:
- product: Tabular Editor 2
full: true
- product: Tabular Editor 3
editions:
- - edition: Desktop
+ - edition: 桌面版
full: true
- - edition: Business
+ - edition: 商业版
full: true
- - edition: Enterprise
+ - edition: 企业版
full: true
---
-# 最佳实践分析器
+# Best Practice Analyzer
-自 [Tabular Editor 2.8.1](https://github.com/TabularEditor/TabularEditor/releases/tag/2.8.1) 起,最佳实践分析器已进行了重大改版。
+自 [Tabular Editor 2.8.1](https://github.com/TabularEditor/TabularEditor/releases/tag/2.8.1) 起,Best Practice Analyzer 迎来了一次重大改版。
-你首先会注意到,Tabular Editor 现在会在主 UI 中直接显示最佳实践问题的数量:
+你首先会注意到,Tabular Editor 现在会在主界面中直接报告最佳实践问题的数量:
-
+
-每当对模型进行更改时,最佳实践分析器都会在后台扫描你的模型以查找问题。 你可以在“文件 > 偏好设置”中禁用此功能。
+每当模型发生更改时,Best Practice Analyzer 都会在后台扫描你的模型以查找问题。 你可以在“文件 > 偏好设置”中禁用此功能。
-点击该链接(或按 F10),会打开全新升级的最佳实践分析器 UI:
+单击该链接(或按 F10)会打开全新改进后的 Best Practice Analyzer 界面:
-
+
-如果你在旧版本中用过最佳实践分析器,你首先会注意到该 UI 已完全重新设计,占用的屏幕空间更小。 这样你就可以将该窗口停靠在桌面一侧,同时将主窗口放在另一侧,从而同时操作两者。
+如果你在早期版本中用过 Best Practice Analyzer,首先会注意到它的界面已被彻底重新设计,占用的屏幕空间更少。 这样一来,你可以将该窗口停靠在屏幕的一侧,同时将主窗口放在另一侧,从而同时使用两者。
-最佳实践分析器窗口会持续列出模型中所有 **生效规则**,以及违反各规则的对象。 在列表中的任意位置右键单击,或使用窗口顶部的工具栏按钮,即可执行以下操作:
+Best Practice Analyzer 窗口会持续列出适用于你的模型的所有**有效规则**,以及违反各项规则的对象。 在列表中的任意位置右键单击,或使用窗口顶部工具栏上的按钮,即可执行以下操作:
-- **管理规则...**:打开“管理规则”界面,我们将在下文介绍。 你也可以在主界面通过“工具 > 管理 BPA 规则...”菜单打开此界面。
-- **转到对象...**:选择此选项,或在列表中双击某个对象,会在主界面中定位到同一对象。
-- **忽略项(单个/多个)**:在列表中选择一个或多个对象并选择此选项,会为所选对象添加注释,表明 Best Practice Analyzer 今后应忽略这些对象。 如果你误将某个对象设为忽略,请点击屏幕顶部的“显示已忽略”按钮。 这样你就可以取消忽略之前被忽略的对象。
-- **忽略规则**:如果你在列表中选择了一条或多条规则,此选项会在模型级别添加一条注释,用于指示所选规则应始终被忽略。 同样,通过切换“显示已忽略”按钮,你也可以取消忽略这些规则。
-- **生成修复脚本**:对于可轻松修复的规则(即只需在对象上设置一个属性就能解决问题),将启用此选项。 点击后,会将一个 C# Script 复制到剪贴板。 然后,你可以将该脚本粘贴到 Tabular Editor 的 [高级脚本](../how-tos/Advanced-Scripting.md) 区域中,在执行以应用修复之前先进行检查。
-- **应用修复**:如上所述,此选项也适用于可轻松修复的规则。 它不会将脚本复制到剪贴板,而是立即执行。
+- **管理规则...**:这会打开“管理规则”界面,下面会详细介绍。 也可以通过主界面的“工具 > 管理 BPA 规则...”菜单打开此界面。
+- **转到对象...**:选择此选项,或在列表中双击某个对象,都会在主界面中定位到该对象。
+- **忽略项/多项**:在列表中选择一个或多个对象并使用此选项后,系统会为所选对象添加一条注释,指示 Best Practice Analyzer 后续忽略这些对象。 如果你误忽略了某个对象,可以切换窗口顶部的“显示已忽略”按钮。 这样你就可以取消忽略之前已被忽略的对象。
+- **忽略规则**:如果你已在列表中选择了一条或多条规则,此选项会在模型级别添加一条注释,用于指示应始终忽略所选规则。 同样,通过切换“显示已忽略项”按钮,你也可以取消对规则的忽略。
+- **生成修复脚本**:对于可轻松修复的规则(即只需在对象上设置单个属性即可解决问题),将启用此选项。 点击后,会将一段 C# Script 复制到你的剪贴板。 随后,你可以将该脚本粘贴到 Tabular Editor 的 [Advanced Scripting](../how-tos/Advanced-Scripting.md) 区域,在执行以应用修复之前先进行检查。
+- **应用修复**:如上所述,此选项同样适用于可轻松修复的规则。 脚本不会被复制到剪贴板,而是会立即执行。
## 管理最佳实践规则
-如果你需要添加、删除或修改应用于模型的规则,这里也提供了一套全新的 UI。 你可以通过点击 Best Practice Analyzer 窗口左上角的按钮将其调出,或在主窗口中使用 "Tools > Manage BPA Rules..." 菜单项。
+如果你需要添加、删除或修改应用于模型的规则,这里也提供了一个全新的 UI 来完成这些操作。 你可以通过点击 Best Practice Analyzer 窗口左上角的按钮打开它,也可以在主窗口中使用“Tools > Manage BPA Rules...”菜单项。
-
+
-该 UI 包含两个列表:上方列表表示当前已加载的规则的 **集合**。 在此列表中选择一个规则集后,下方列表会显示该规则集中定义的所有规则。 默认会显示三个规则集:
+该界面包含两个列表:上方列表显示当前已加载的**规则集**。 在此列表中选择某个规则集后,下方列表会显示该规则集中定义的所有规则。 默认会显示三个规则集:
-- **当前模型中的规则**:顾名思义,这是在当前模型中定义的规则集。 规则定义以注释的形式存储在 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 中加载的所有模型。
+- **本地计算机上的规则**:这些规则存储在 `%ProgramData%\TabularEditor\BPARules.json` 中。 这些规则将应用于当前计算机上在 Tabular Editor 中加载的所有模型。
-如果同一条规则(按 ID)同时存在于多个规则集中,则优先级从上到下:也就是说,模型中定义的规则会优先于本机上定义的同 ID 规则。 这样你就可以覆盖现有规则,例如以便考虑模型特定的约定。
+如果多个规则集中都包含同一条规则(按 ID),则优先级从上到下。也就是说,模型内定义的规则优先于本地计算机上定义的同 ID 规则。 这样你就可以覆盖现有规则,例如将模型特定的约定考虑在内。
-在列表顶部,你会看到一个名为 **(Effective rules)** 的特殊集合。 选择此规则集后,将显示实际应用于当前加载模型的规则列表,并会遵循上述相同 ID 规则的优先级。 下方列表会标明每条规则属于哪个规则集。 此外,如果在优先级更高的规则集中已存在 ID 相近的规则,你会看到该规则的名称会被划线显示:
+在列表顶部,你会看到一个名为 **(Effective rules)** 的特殊集合。 选择此集合后,你将看到实际应用于当前已加载模型的规则列表,并会按前文所述遵循相同 ID 规则的优先级。 下方列表会指明每条规则所属的规则集。 此外,如果在优先级更高的集合中存在 ID 相同的规则,你会注意到该规则的名称会显示为删除线:

-### 添加额外规则集
+### 添加更多规则集
-Tabular Editor 2.8.1 的一项新功能是:可以在模型中包含来自其他来源的规则。 例如,如果你有一个存放在网络共享上的规则文件,现在可以将该文件作为规则集包含到当前模型中。 如果你对该文件所在位置有写入权限,还可以在该文件中添加/修改/删除规则。 以这种方式添加的规则集,其优先级高于模型内定义的规则。 如果你添加了多个此类规则集,可以通过上下移动它们来控制彼此之间的优先级。
+Tabular Editor 2.8.1 的一项新功能是,可以在模型中包含来自其他来源的规则。 例如,如果你的某个规则文件位于网络共享上,现在可以将该文件作为规则集包含到当前模型中。 如果你对该文件所在位置具有写入权限,还可以添加/修改/删除该文件中的规则。 以这种方式添加的规则集,其优先级高于模型内定义的规则。 如果你添加了多个此类规则集,可以通过上移和下移来控制它们之间的优先级。
-点击“添加...”按钮,将新的规则集添加到模型中。 这会提供以下选项:
+点击“添加...”按钮,将新规则集添加到模型中。 这会提供以下选项:

-- **创建新规则文件**:将在指定位置创建一个新的空的 .json 文件,之后你可以向其中添加规则。 选择文件时请注意:可以使用相对文件路径。 当你希望将规则文件与当前模型存放在同一个代码仓库中时,这会很有用。 不过请注意:相对路径的规则文件引用仅在模型从磁盘加载时才有效(因为从 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 文件,之后你可以向其中添加规则。 选择文件时,注意有一个使用相对文件路径的选项。 如果你希望将规则文件存储在与当前模型相同的 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)。 注意,从在线来源添加的规则集将是只读的。
### 修改规则集中的规则
-在你对规则集存储位置拥有写入权限的前提下,屏幕下半部分可让你在当前选中的规则集中添加、编辑、克隆和删除规则。 此外,“移动到...”按钮允许你将所选规则移动或复制到另一个规则集,便于管理多个规则集。
+屏幕下半部分允许你在当前选中的规则集中添加、编辑、克隆和删除规则,前提是你对该规则集的存储位置具有写入权限。 此外,“移动到...”按钮允许你将所选规则移动或复制到另一个规则集,从而更轻松地管理多个规则集。
### 规则说明占位符
-与之前版本相比,有一个小改进:现在你可以在“最佳实践规则”的描述中使用以下占位符值。 这将提供更多可自定义的描述,这些描述会在“最佳实践”界面中以工具提示的形式显示:
+相比之前版本有一个小改进:现在你可以在最佳实践规则的说明中使用以下占位符值。 这将提供更多可自定义的说明,并在“最佳实践”界面中以工具提示的形式显示:
-- `%object%` 返回对当前对象的完全限定 DAX 引用(如适用)
+- `%object%` 返回当前对象的完全限定 DAX 引用(如适用)
- `%objectname%` 仅返回当前对象的名称
- `%objecttype%` 返回当前对象的类型
-
+
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 a1f8c5f5..a06d668c 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,12 @@ applies_to:
## 脚本用途
-此脚本是 Tabular Editor x Databricks 系列的一部分。 在 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 管理员确认,确保你有权限查询这些表。
+> 这个脚本需要先安装 Simba Spark ODBC Driver(可从 https://www.databricks.com/spark/odbc-drivers-download 下载)
+> 每次运行脚本时,都会提示你输入 Databricks 个人访问令牌。 这是用于向 Databricks 进行身份验证所必需的。
+> 这个脚本使用 Unity Catalog 中的 information_schema 表来检索关系信息,因此你可能需要和你的 Databricks 管理员再确认一下,确保你有权限查询这些表。
## 脚本
@@ -28,20 +28,20 @@ applies_to:
```csharp
/*
- * Title: Add Databricks Metadata descriptions
- * Author: Johnny Winter, greyskullanalytics.com
+ * 标题:添加 Databricks 元数据说明
+ * 作者:Johnny Winter, greyskullanalytics.com
*
- * This script, when executed, will loop through the currently selected tables and send a query to Databricks to see if each table has metadata descriptions defined in Unity Catalog.
- * Where a description exists, this will be added to the semantic model description.
- * Step 1: Select one or more tables in the model
- * Step 2: Run this script
- * Step 3: Enter your Databricks Personal Access Token when prompted
- * Step 4: The script will connect to Databricks and update the table and column descriptions where they exist.
- * For each table processed, a message box will display the number of descriptions updated.
- * Click OK to continue to the next table.
- * Notes:
- * - This script requires the Simba Spark ODBC Driver to be installed (download from https://www.databricks.com/spark/odbc-drivers-download)
- * - Each run of the script will prompt the user for a Databricks Personal Access Token
+ * 运行这个脚本时,它会遍历当前选中的表,并向 Databricks 发送查询,检查每个表是否在 Unity Catalog 中定义了元数据说明。
+ * 如果有说明,就会把它添加到语义模型的说明中。
+ * 步骤 1:在模型中选择一个或多个表
+ * 步骤 2:运行这个脚本
+ * 步骤 3:在出现提示时输入你的 Databricks 个人访问令牌
+ * 步骤 4:脚本会连接到 Databricks,并在表和列存在说明时更新对应说明。
+ * 对于处理的每个表,都会显示一个消息框,指出已更新的说明数量。
+ * 点击“确定”继续处理下一个表。
+ * 备注:
+ * - 这个脚本需要先安装 Simba Spark ODBC Driver(可从 https://www.databricks.com/spark/odbc-drivers-download 下载)
+ * - 每次运行脚本时,都会提示你输入 Databricks 个人访问令牌
*/
#r "Microsoft.VisualBasic"
using System;
@@ -52,7 +52,7 @@ using System.Windows.Forms;
using Microsoft.VisualBasic;
using sysData = System.Data;
-//code to create a masked input box for Databricks PAT token
+//用于创建 Databricks PAT 令牌掩码输入框的代码
public partial class PasswordInputForm : Form
{
public string Password { get; private set; }
@@ -76,7 +76,7 @@ public partial class PasswordInputForm : Form
this.MaximizeBox = false;
this.MinimizeBox = false;
- // Prompt label
+ //提示标签
promptLabel = new Label();
promptLabel.Text = prompt;
promptLabel.Location = new System.Drawing.Point(12, 15);
@@ -84,11 +84,11 @@ public partial class PasswordInputForm : Form
promptLabel.AutoSize = false;
this.Controls.Add(promptLabel);
- // Password textbox
+ //密码文本框
passwordTextBox = new TextBox();
passwordTextBox.Location = new System.Drawing.Point(12, 55);
passwordTextBox.Size = new System.Drawing.Size(360, 20);
- passwordTextBox.UseSystemPasswordChar = true; // This masks the input
+ passwordTextBox.UseSystemPasswordChar = true; // 这会隐藏输入内容
passwordTextBox.KeyPress += (s, e) =>
{
if (e.KeyChar == (char)Keys.Return)
@@ -99,27 +99,27 @@ public partial class PasswordInputForm : Form
};
this.Controls.Add(passwordTextBox);
- // OK button
+ //确定按钮
okButton = new Button();
- okButton.Text = "OK";
+ okButton.Text = "确定";
okButton.Location = new System.Drawing.Point(216, 85);
okButton.Size = new System.Drawing.Size(150, 50);
okButton.Click += OkButton_Click;
this.Controls.Add(okButton);
- // Cancel button
+ //取消按钮
cancelButton = new Button();
- cancelButton.Text = "Cancel";
+ cancelButton.Text = "取消";
cancelButton.Location = new System.Drawing.Point(297, 85);
cancelButton.Size = new System.Drawing.Size(150, 50);
cancelButton.Click += CancelButton_Click;
this.Controls.Add(cancelButton);
- // Set default and cancel buttons
+ //设置默认按钮和取消按钮
this.AcceptButton = okButton;
this.CancelButton = cancelButton;
- // Focus on textbox when form loads
+ //窗体加载时将焦点置于文本框
this.Load += (s, e) => passwordTextBox.Focus();
}
@@ -178,7 +178,7 @@ public static class MaskedInputHelper
};
var buttonOk = new Button()
{
- Text = "OK",
+ Text = "确定",
Size = new System.Drawing.Size(150, 50),
Left = 12,
Width = 150,
@@ -187,7 +187,7 @@ public static class MaskedInputHelper
};
var buttonCancel = new Button()
{
- Text = "Cancel",
+ Text = "取消",
Size = new System.Drawing.Size(150, 50),
Left = 175,
Width = 150,
@@ -211,7 +211,7 @@ public static class MaskedInputHelper
}
}
-//Code to retrieve Databricks Connection information from the M Query in a table partition
+//从表分区中的 M 查询检索 Databricks 连接信息的代码
public class DatabricksConnectionInfo
{
public string ServerHostname { get; set; }
@@ -222,11 +222,11 @@ public class DatabricksConnectionInfo
public override string ToString()
{
- return $"Server: {ServerHostname}\n"
- + $"HTTP Path: {HttpPath}\n"
- + $"Database: {DatabaseName}\n"
- + $"Schema: {SchemaName}\n"
- + $"Table: {TableName}";
+ return $"服务器:{ServerHostname}\n"
+ + $"HTTP 路径:{HttpPath}\n"
+ + $"数据库:{DatabaseName}\n"
+ + $"架构:{SchemaName}\n"
+ + $"表:{TableName}";
}
}
@@ -235,35 +235,35 @@ public class PowerQueryMParser
public static DatabricksConnectionInfo ParseMQuery(string mQuery)
{
if (string.IsNullOrWhiteSpace(mQuery))
- throw new ArgumentException("M query cannot be null or empty");
+ throw new ArgumentException("M 查询不能为空或空字符串");
var connectionInfo = new DatabricksConnectionInfo();
try
{
- // Parse Source line to extract server hostname and HTTP path
+ //解析 Source 行以提取服务器主机名和 HTTP 路径
ParseSourceLine(mQuery, connectionInfo);
- // Parse Database line to extract database name
+ //解析 Database 行以提取数据库名称
ParseDatabaseLine(mQuery, connectionInfo);
- // Parse Schema line to extract schema name
+ //解析 Schema 行以提取架构名称
ParseSchemaLine(mQuery, connectionInfo);
- // Parse Data line to extract table name
+ //解析 Data 行以提取表名
ParseDataLine(mQuery, connectionInfo);
return connectionInfo;
}
catch (Exception ex)
{
- throw new InvalidOperationException($"Error parsing M query: {ex.Message}", ex);
+ throw new InvalidOperationException($"解析 M 查询时出错:{ex.Message}", ex);
}
}
private static void ParseSourceLine(string mQuery, DatabricksConnectionInfo connectionInfo)
{
- // Pattern to match both:
+ //匹配以下两种模式:
// Source = DatabricksMultiCloud.Catalogs("hostname", "httppath", null),
// Source = Databricks.Catalogs("hostname", "httppath", null),
var sourcePattern =
@@ -276,7 +276,7 @@ public class PowerQueryMParser
if (!sourceMatch.Success)
throw new FormatException(
- "Could not find valid Source definition in M query (supports both Databricks and DatabricksMultiCloud connectors)"
+ "在 M 查询中找不到有效的 Source 定义(同时支持 Databricks 和 DatabricksMultiCloud 连接器)"
);
connectionInfo.ServerHostname = sourceMatch.Groups[1].Value;
@@ -285,7 +285,7 @@ public class PowerQueryMParser
private static void ParseDatabaseLine(string mQuery, DatabricksConnectionInfo connectionInfo)
{
- // Pattern to match: Database = Source{[Name="databasename",Kind="Database"]}[Data],
+ //匹配模式:Database = Source{[Name="databasename",Kind="Database"]}[Data],
var databasePattern =
@"Database\s*=\s*Source\s*{\s*\[\s*Name\s*=\s*""([^""]+)""\s*,\s*Kind\s*=\s*""Database""\s*\]\s*}\s*\[\s*Data\s*\]";
var databaseMatch = Regex.Match(
@@ -295,14 +295,14 @@ public class PowerQueryMParser
);
if (!databaseMatch.Success)
- throw new FormatException("Could not find valid Database definition in M query");
+ throw new FormatException("在 M 查询中找不到有效的 Database 定义");
connectionInfo.DatabaseName = databaseMatch.Groups[1].Value;
}
private static void ParseSchemaLine(string mQuery, DatabricksConnectionInfo connectionInfo)
{
- // Pattern to match: Schema = Database{[Name="schemaname",Kind="Schema"]}[Data],
+ //匹配模式:Schema = Database{[Name="schemaname",Kind="Schema"]}[Data],
var schemaPattern =
@"Schema\s*=\s*Database\s*{\s*\[\s*Name\s*=\s*""([^""]+)""\s*,\s*Kind\s*=\s*""Schema""\s*\]\s*}\s*\[\s*Data\s*\]";
var schemaMatch = Regex.Match(
@@ -312,14 +312,14 @@ public class PowerQueryMParser
);
if (!schemaMatch.Success)
- throw new FormatException("Could not find valid Schema definition in M query");
+ throw new FormatException("在 M 查询中找不到有效的 Schema 定义");
connectionInfo.SchemaName = schemaMatch.Groups[1].Value;
}
private static void ParseDataLine(string mQuery, DatabricksConnectionInfo connectionInfo)
{
- // Pattern to match: Data = Schema{[Name="tablename",Kind="Table"]}[Data]
+ //匹配模式:Data = Schema{[Name="tablename",Kind="Table"]}[Data]
var dataPattern =
@"Data\s*=\s*Schema\s*{\s*\[\s*Name\s*=\s*""([^""]+)""\s*,\s*Kind\s*=\s*""Table""\s*\]\s*}\s*\[\s*Data\s*\]";
var dataMatch = Regex.Match(
@@ -329,70 +329,70 @@ public class PowerQueryMParser
);
if (!dataMatch.Success)
- throw new FormatException("Could not find valid Data definition in M query");
+ throw new FormatException("在 M 查询中找不到有效的 Data 定义");
connectionInfo.TableName = dataMatch.Groups[1].Value;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//main script
+//主脚本
-//check that user has a table selected
+//检查你是否已选择表
if (Selected.Tables.Count == 0)
{
- // toggle the 'Running Macro' spinbox
+ //切换“正在运行宏”指示器
ScriptHelper.WaitFormVisible = false;
- Interaction.MsgBox("Select one or more tables", MsgBoxStyle.Critical, "Table Required");
+ Interaction.MsgBox("请选择一个或多个表", MsgBoxStyle.Critical, "需要选择表");
return;
}
-//prompt for personal access token - required to authenticate to Databricks
+//提示输入个人访问令牌 - 这是连接 Databricks 进行身份验证所必需的
string dbxPAT;
do
{
- // toggle the 'Running Macro' spinbox
+ //切换“正在运行宏”指示器
ScriptHelper.WaitFormVisible = false;
dbxPAT = MaskedInputHelper.GetMaskedInput(
- "Please enter your Databricks Personal Access Token (needed to connect to the SQL Endpoint)",
- "Personal Access Token"
+ "请输入你的 Databricks 个人访问令牌(连接到 SQL 终结点时需要)",
+ "个人访问令牌"
);
if (string.IsNullOrEmpty(dbxPAT))
{
- return; // User cancelled
+ return; // 你已取消
}
if (string.IsNullOrWhiteSpace(dbxPAT))
{
MessageBox.Show(
- "Personal Access Token required",
- "Personal Access Token required",
+ "需要提供个人访问令牌",
+ "需要提供个人访问令牌",
MessageBoxButtons.OK,
MessageBoxIcon.Warning
);
}
} while (string.IsNullOrWhiteSpace(dbxPAT));
-// toggle the 'Running Macro' spinbox
+//切换“正在运行宏”指示器
ScriptHelper.WaitFormVisible = true;
-//for each selected table, get the Databricks connection info from the partition info
+//对每个选中的表,从分区信息中获取 Databricks 连接信息
foreach (var t in Selected.Tables)
{
string mQuery = t.Partitions[t.Name].Expression;
var connectionInfo = PowerQueryMParser.ParseMQuery(mQuery);
var columnDescriptions = 0;
var tableDescriptions = 0;
- // Access individual components
+ //访问各个部分
string serverHostname = connectionInfo.ServerHostname;
string httpPath = connectionInfo.HttpPath;
string databaseName = connectionInfo.DatabaseName;
string schemaName = connectionInfo.SchemaName;
string tableName = connectionInfo.TableName;
- //set DBX connection string
+ //设置 DBX 连接字符串
var odbcConnStr =
@"DSN=Simba Spark;driver=C:\Program Files\Simba Spark ODBC Driver;host="
+ serverHostname
@@ -401,7 +401,7 @@ foreach (var t in Selected.Tables)
+ ";thrifttransport=2;ssl=1;authmech=3;uid=token;pwd="
+ dbxPAT;
- //test connection
+ //测试连接
OdbcConnection conn = new OdbcConnection(odbcConnStr);
try
{
@@ -409,34 +409,34 @@ foreach (var t in Selected.Tables)
}
catch
{
- // toggle the 'Running Macro' spinbox
+ //切换“正在运行宏”指示器
ScriptHelper.WaitFormVisible = false;
Interaction.MsgBox(
- @"Connection failed
+ @"连接失败
-Please check the following prequisites:
+请确认以下几点:
-- you must have the Simba Spark ODBC Driver installed
-(download from https://www.databricks.com/spark/odbc-drivers-download)
+- 你需要先安装 Simba Spark ODBC Driver
+(可从 https://www.databricks.com/spark/odbc-drivers-download 下载)
-- the ODBC driver must be installed in the path C:\Program Files\Simba Spark ODBC Driver
+- ODBC 驱动程序必须安装在路径 C:\Program Files\Simba Spark ODBC Driver 中
-- check that the Databricks server name "
+- 请检查 Databricks 服务器名称 "
+ serverHostname
- + @" is correct
+ + @" 是否正确
-- check that the Databricks SQL endpoint / HTTP Path "
+- 请检查 Databricks SQL 终结点 / HTTP 路径 "
+ httpPath
- + @" is correct
+ + @" 是否正确
-- check that you have used a valid Personal Access Token",
+- 请检查你使用的是有效的个人访问令牌",
MsgBoxStyle.Critical,
- "Connection Error"
+ "连接错误"
);
return;
}
- //get table metadata
+ //获取表元数据
var tableQuery =
"SELECT comment FROM "
+ databaseName
@@ -454,24 +454,24 @@ Please check the following prequisites:
}
catch
{
- // toggle the 'Running Macro' spinbox
+ //切换“正在运行宏”指示器
ScriptHelper.WaitFormVisible = false;
Interaction.MsgBox(
- @"Connection failed
+ @"连接失败
-Either:
- - the table "
+可能是以下原因:
+ - 表 "
+ schemaName
+ "."
+ tableName
- + " does not exist"
+ + " 不存在"
+ @"
- - you do not have permissions to query this table
+ - 你没有权限查询此表
- - the connection timed out. Please check that the SQL Endpoint cluster is running",
+ - 连接超时。请检查 SQL 终结点群集是否正在运行",
MsgBoxStyle.Critical,
- "Connection Error - Table Metadata"
+ "连接错误 - 表元数据"
);
return;
}
@@ -481,11 +481,11 @@ Either:
if (t.Description != row["comment"].ToString())
{
t.Description = row["comment"].ToString();
- tableUpdate = t.Name + " table description updated.";
+ tableUpdate = t.Name + " 的表说明已更新。";
}
}
- //get column metadata
+ //获取列元数据
var columnsQuery = @"DESCRIBE " + databaseName + "." + schemaName + "." + tableName;
OdbcDataAdapter da = new OdbcDataAdapter(columnsQuery, conn);
var dbxColumns = new sysData.DataTable();
@@ -496,29 +496,29 @@ Either:
}
catch
{
- // toggle the 'Running Macro' spinbox
+ //切换“正在运行宏”指示器
ScriptHelper.WaitFormVisible = false;
Interaction.MsgBox(
- @"Connection failed
+ @"连接失败
-Either:
- - the table "
+可能是以下原因:
+ - 表 "
+ schemaName
+ "."
+ tableName
- + " does not exist"
+ + " 不存在"
+ @"
- - you do not have permissions to query this table
+ - 你没有权限查询此表
- - the connection timed out. Please check that the SQL Endpoint cluster is running",
+ - 连接超时。请检查 SQL 终结点群集是否正在运行",
MsgBoxStyle.Critical,
- "Connection Error - Column Metadata"
+ "连接错误 - 列元数据"
);
return;
}
- //update column descriptions
+ //更新列说明
int counter = 0;
foreach (sysData.DataRow row in dbxColumns.Rows)
{
@@ -542,19 +542,20 @@ Either:
tableUpdate
+ @"
-"
+已更新 "
+ + t.Name
+ + " 中的 "
+ counter
- + " descriptions updated on "
- + t.Name;
+ + " 个说明";
}
else
{
- msg = counter + " descriptions updated on " + t.Name;
+ msg = "已更新 " + t.Name + " 中的 " + counter + " 个说明";
}
- // toggle the 'Running Macro' spinbox
+ //切换“正在运行宏”指示器
ScriptHelper.WaitFormVisible = false;
- Interaction.MsgBox(msg, MsgBoxStyle.Information, "Update Metadata Descriptions");
- // toggle the 'Running Macro' spinbox
+ Interaction.MsgBox(msg, MsgBoxStyle.Information, "更新元数据说明");
+ //切换“正在运行宏”指示器
ScriptHelper.WaitFormVisible = true;
conn.Close();
}
@@ -562,16 +563,16 @@ Either:
### 说明
-脚本使用 WinForms 提示输入 Databricks 个人访问令牌,用于对 Databricks 进行身份验证。 对于每个选中的表,脚本会从该表分区的 M 查询中提取 Databricks 连接字符串信息,以及架构名和表名。 然后脚本通过 Spark ODBC 驱动向 Databricks 发送 SQL 查询,查询 information_schema 表,返回在 Unity Catalog 中定义的表描述。 随后会将该描述更新到语义模型中的表描述。 脚本还会对所选表发送第二个使用 DESCRIBE 命令的 SQL 查询,以获取列描述。 这些结果会被循环遍历,并在模型中添加描述。 脚本在每个选定表上运行完成后,会显示一个对话框,告知已更新的描述数量。
+该脚本使用 WinForms 弹窗提示输入 Databricks 个人访问令牌,用于对 Databricks 进行身份验证。 对每个选中的表,脚本都会从其分区中的 M 查询提取 Databricks 连接字符串信息,以及架构名和表名。 随后脚本会通过 Spark ODBC 驱动程序向 Databricks 发送 SQL 查询,查询 information_schema 表,从而获取 Unity Catalog 中定义的表说明。 然后会将其更新到语义模型中的表说明。 还会对所选表再发送一条使用 DESCRIBE 命令的 SQL 查询,以获取列说明。 随后会遍历这些结果,并在模型中补充说明。 脚本在每个选定的表上运行完毕后,会弹出对话框,显示已更新的描述数量。
## 输出示例
- 图 1:脚本会提示你输入 Databricks 个人访问令牌,以便向 Databricks 验证身份。
+ 图 1:脚本会提示你输入 Databricks 个人访问令牌,以便向 Databricks 进行身份验证。
- 图 2:脚本在每个选定表上运行完成后,会显示已更新的描述条数。
+ 图 2:脚本对每个选定的表运行完毕后,会显示已更新的描述数量。
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 b8e0aaed..4e525ce9 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
@@ -1,6 +1,6 @@
---
uid: script-convert-dlol-to-import
-title: 将 OneLake 上的 Direct Lake 转换为导入模式
+title: 将 OneLake 上的 Direct Lake 表转换为导入模式
author: Morten Lønskov
updated: 2025-06-25
applies_to:
@@ -15,11 +15,11 @@ applies_to:
## 脚本用途
-此脚本将 OneLake 上的 Direct Lake(DL/OL)转换为导入模式表。 正如 [Direct Lake guidance article](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 门户中找到。
+你需要 **SQL Endpoint**,以及 Fabric **Warehouse** 或 **Lakehouse** 的 **名称**。 这两项都可以在 Fabric 门户中找到。
你还需要知道要连接的表/物化视图的 **Schema**。 对于 Lakehouse,默认值为 dbo。
@@ -31,8 +31,8 @@ applies_to:
// ===================================================================================
// 将 OneLake 上的 Direct Lake 表转换回导入模式
// ----------------------------------------
-// 此脚本会将选中的表或所有表从 OneLake 上的 Direct Lake 转换为导入模式
-// 它会添加名为 SQLEndpoint 的共享表达式,并在不再需要时删除现有的 DatabaseQuery
+// 此脚本会将选定的表或所有表从 OneLake 上的 Direct Lake 转换为导入模式
+// 它会添加一个名为 SQLEndpoint 的共享表达式,并在不再需要时删除现有的 DatabaseQuery
// ===================================================================================
using System;
using System.Linq;
@@ -62,7 +62,7 @@ public class ScopeSelectionDialog : Form
Controls.Add(layout);
layout.Controls.Add(new Label {
- Text = $"你已选择 {selectedCount} 个表,\n模型中共有 {totalCount} 个 Direct Lake 表。",
+ Text = $"你已选择 {selectedCount} 个表(s),\n并且模型中共有 {totalCount} 个 Direct Lake 表(s)。",
AutoSize = true, TextAlign = ContentAlignment.MiddleLeft
});
@@ -73,7 +73,7 @@ public class ScopeSelectionDialog : Form
};
var btnOnly = new Button {
- Text = "仅转换所选表", AutoSize = true,
+ Text = "仅选定的表", AutoSize = true,
DialogResult = DialogResult.OK
};
btnOnly.Click += (s, e) => SelectedOption = ScopeOption.OnlySelected;
@@ -99,7 +99,7 @@ public class ScopeSelectionDialog : Form
}
// -------------------------------------------------------------------
-// 2) SQL 导入对话框(现在需要 Schema)
+// 2) SQL 导入对话框(现需 Schema)
// -------------------------------------------------------------------
public class SqlImportDialog : Form
{
@@ -110,7 +110,7 @@ public class SqlImportDialog : Form
public SqlImportDialog(string endpoint, string db, string schema)
{
- Text = "转换 Direct Lake → 导入";
+ Text = "转换 Direct Lake → Import";
AutoSize = true; AutoSizeMode = AutoSizeMode.GrowAndShrink;
StartPosition = FormStartPosition.CenterParent;
Padding = new Padding(20);
@@ -162,7 +162,7 @@ public class SqlImportDialog : Form
AcceptButton = okButton;
CancelButton = cancel;
- // 仅当三个字段都非空时才启用 OK
+ // 仅当这三个字段都非空时才启用“OK”
SqlEndpoint.TextChanged += Validate;
DatabaseName.TextChanged += Validate;
Schema.TextChanged += Validate;
@@ -191,7 +191,7 @@ var allDirectLake = Model.Tables
&& t.Partitions[0].Mode == ModeType.DirectLake)
.ToList();
-// 3.2) 以及你已选择的 Direct Lake 表
+// 3.2) 以及你选中的表
var selectedDirect = Selected.Tables
.Cast
()
.Where(t => t.Partitions.Count == 1
@@ -199,7 +199,7 @@ var selectedDirect = Selected.Tables
&& t.Partitions[0].Mode == ModeType.DirectLake)
.ToList();
-// 3.3) 询问范围
+// 3.3) 询问转换范围
var scopeDialog = new ScopeSelectionDialog(selectedDirect.Count, allDirectLake.Count);
var dr = scopeDialog.ShowDialog();
if (dr == DialogResult.Cancel || scopeDialog.SelectedOption == ScopeSelectionDialog.ScopeOption.Cancel)
@@ -216,11 +216,11 @@ if (tablesToConvert.Count == 0)
return;
}
-// 3.4) 询问连接信息 + Schema
+// 3.4) 询问连接信息和 Schema
var sqlDialog = new SqlImportDialog("", "", "");
if (sqlDialog.ShowDialog() == DialogResult.Cancel) return;
-// 3.5) 新增或更新共享表达式 "SQLEndpoint"
+// 3.5) 创建或更新共享表达式 "SQLEndpoint"
const string sqlTemplate = @"let
endpoint = Sql.Database(""{0}"",""{1}"")
in
@@ -253,33 +253,33 @@ foreach (var table in tablesToConvert)
oldP.Delete();
}
-// 3.8) 如果转换的是**整个模型**,删除旧的 DatabaseQuery 表达式
+// 3.8) 如果转换的是**整个模型**,则删除旧的 DatabaseQuery 表达式
if (isAllTables)
{
var oldDbq = Model.Expressions.FirstOrDefault(e => e.Name == "DatabaseQuery");
if (oldDbq != null)
- oldDbq.Delete(); // TE3 API: Expression.Delete() removes it from the model
+ oldDbq.Delete(); // TE3 API:Expression.Delete() 会将其从模型中移除
}
-// 3.9) 确保默认模式为导入模式
+// 3.9) 确保默认模式为 Import
Model.DefaultMode = ModeType.Import;
-Info("转换完成:Direct Lake → 导入" +
- (isAllTables ? " (已删除 DatabaseQuery)" : "") + "。");
+Info("转换完成:Direct Lake → Import" +
+ (isAllTables ? " (DatabaseQuery 已移除)" : "") + ".");
```
### 说明
-脚本会先提示你选择转换范围:只转换所选表,或转换模型中的所有表。 然后,它会识别在所选范围内当前处于 Direct Lake 模式的表。 如果没找到符合条件的表,或者你取消了对话框,脚本就会停止运行。
+脚本首先会提示你确定转换范围:是只转换选定的表,还是转换模型中的所有表。 然后,脚本会识别所选范围内当前处于 Direct Lake 模式的表。 如果没找到适用的表,或者你取消了对话框,脚本就会终止。
-接着会提示你输入 SQL analytics endpoint、Lakehouse 或 Warehouse 的名称,以及必填的 Schema 名称。 脚本会确保这三个字段均已填写后,才允许你继续。
+接着,脚本会提示你输入 SQL analytics endpoint、Lakehouse 或 Warehouse 的名称,以及必填的 Schema 名称。 脚本会确保这三个字段都已填写后,才允许你继续。
-接下来,脚本会使用你提供的连接信息创建或更新名为 `SQLEndpoint` 的共享表达式。 该表达式使用 `Sql.Database` 连接器来访问 Lakehouse 或 Warehouse。
+接下来,脚本会使用提供的连接详细信息创建或更新一个名为 `SQLEndpoint` 的共享表达式。 此表达式使用 `Sql.Database` 连接器访问 Lakehouse 或 Warehouse。
-对于每个要转换的表,脚本会创建一个新的导入模式 M 分区:引用 `SQLEndpoint` 表达式,并使用指定的 Schema 和表名。 现有的 Direct Lake 分区会先被重命名,然后删除,最终仅保留新的导入分区。
+对于每个要转换的表,脚本都会创建一个新的导入模式 M 分区,该分区引用 `SQLEndpoint` 表达式,并使用指定的 Schema 和表名。 现有的 Direct Lake 分区会先被重命名,然后被删除,最终只保留新的导入分区。
-最后,如果你选择转换模型中的所有 Direct Lake 表,脚本会检查是否存在名为 `DatabaseQuery` 的共享表达式;若存在则删除。 然后把模型的默认存储模式设置为导入模式,并显示一条确认信息。
+最后,如果你选择转换模型中的所有 Direct Lake 表,脚本会检查是否存在名为 `DatabaseQuery` 的共享表达式;如果存在,就将其删除。 随后,模型的默认存储模式会设置为导入模式,并显示确认信息。
-## AI 使用免责声明
+## AI 使用声明
-此脚本在 LLM 的帮助下创建。
+此脚本在大语言模型的协助下创建。
diff --git a/localizedContent/zh/content/features/CSharpScripts/Advanced/script-convert-dlsql-to-dlol.md b/localizedContent/zh/content/features/CSharpScripts/Advanced/script-convert-dlsql-to-dlol.md
index dc7bb2ae..e0465c83 100644
--- a/localizedContent/zh/content/features/CSharpScripts/Advanced/script-convert-dlsql-to-dlol.md
+++ b/localizedContent/zh/content/features/CSharpScripts/Advanced/script-convert-dlsql-to-dlol.md
@@ -1,6 +1,6 @@
---
uid: script-convert-dlsql-to-dlol
-title: 将 Direct Lake on SQL 转换为 OneLake
+title: 将 SQL 上的 Direct Lake 转换到 OneLake
author: Daniel Otykier
updated: 2025-06-20
applies_to:
@@ -11,7 +11,7 @@ applies_to:
full: true
---
-# 将 Direct Lake on SQL 转换为 OneLake
+# 将 SQL 上的 Direct Lake 转换到 OneLake
## 脚本用途
diff --git a/localizedContent/zh/content/features/CSharpScripts/csharp-script-library-advanced.md b/localizedContent/zh/content/features/CSharpScripts/csharp-script-library-advanced.md
index 3591fe0f..8ac20578 100644
--- a/localizedContent/zh/content/features/CSharpScripts/csharp-script-library-advanced.md
+++ b/localizedContent/zh/content/features/CSharpScripts/csharp-script-library-advanced.md
@@ -1,6 +1,6 @@
---
uid: script-library-advanced
-title: 高级 C# 脚本
+title: 高级 C# Script
author: Morten Lønskov
updated: 2026-02-20
applies_to:
@@ -11,27 +11,27 @@ applies_to:
full: true
---
-# C# Script 库: 高级脚本
+# C# Script 库:高级脚本
-这些脚本更高级,功能更复杂,需要对 C# 语言和 TOM 有更深入的理解。 它们更难修改,因此建议在你已熟悉 Tabular Editor 中 C# Script 的基础之后再使用。
+这些脚本更加高级,功能也更复杂,需要对 C# 语言和 TOM 有更深入的理解。 这些脚本更难修改,因此建议你在熟悉 Tabular Editor 中的 C# Script 基础后再使用。
-|
脚本名称
| 用途 | 使用场景 |
-| ----------------------------------------------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------------------ |
-| [统计模型对象](xref:script-count-things) | 按类型统计模型中各类对象的数量。 | 当你需要概览模型内容,或想按类型统计对象数量时。 |
-| [在网格中输出对象详细信息](xref:script-output-things) | 以网格视图输出对象详细信息。 | 当你需要在网格视图中输出对象详细信息以便检查时。 |
-| [创建日期表](xref:script-create-date-table) | 基于模型中选定的日期列创建格式化的日期表。 | 当你需要基于模板创建新的日期表时。 |
-| [创建 M 参数(自动替换)](xref:script-create-and-replace-parameter) | 创建新的 M 参数,并自动将其添加到 M 分区。 | 当你想用动态 M 参数替换多个分区中的字符串(例如连接字符串)时。 |
-| [格式化 Power Query](xref:script-format-power-query) | 使用 powerqueryformatter.com API 格式化所选 M 分区中的 Power Query。 | 当 Power Query 很复杂,需要提高可读性以便阅读或修改时。 |
-| [实施增量刷新](xref:script-implement-incremental-refresh) | 通过 UI 对话框中的参数自动配置增量刷新。 | 当你需要实施增量刷新,但不太熟悉表设置中的配置方式时。 |
-| [删除包含错误的度量值](xref:script-remove-measures-with-error) | 创建新的 M 参数,并自动将其添加到 M 分区。 | 当你想用动态 M 参数替换多个分区中的字符串(例如连接字符串)时。 |
-| [在所选度量值中查找/替换](xref:script-find-replace) | 在所选度量值的 DAX 中搜索子字符串,并替换为另一个子字符串。 | 当你需要在多个 DAX 度量值中快速查找/替换值时(例如 `CALCULATE` 筛选器或失效的对象引用)。 |
-| [Databricks 语义模型设置](xref:script-databricks-semantic-model-set-up) | 为表和列指定友好名称,并设置列最佳实践 | 当你需要让 Databricks 对象名称更便于用户理解时。 |
-| [创建 Databricks 关系](xref:script-create-databricks-relationships) | 基于 Databricks Unity Catalog 中的主键和外键定义创建关系 | 当你想复用 Unity Catalog 中已定义的 Databricks 关系时。 |
-| [添加 Databricks 元数据说明](xref:script-add-databricks-metadata-descriptions) | 基于 Databricks Unity Catalog 更新表和列说明 | 当你想复用 Unity Catalog 中已定义的 Databricks 表和列注释时。 |
-| [将 DL/SQL 转换为 DL/OL](xref:script-convert-dlsql-to-dlol) | 将 Direct Lake over SQL 模型的分区更改为 Direct Lake over OneLake | 可用于轻松迁移到 Direct Lake over OneLake |
-| [将导入模式转换为 DL/OL](xref:script-convert-import-to-dlol) | 将 Import 模型的分区更改为基于 OneLake 的 Direct Lake | 有助于轻松迁移到基于 OneLake 的 Direct Lake |
-| [将 DL/OL 转换为导入模式](xref:script-convert-dlol-to-import) | 将 OneLake 上的 Direct Lake 模型分区切换到导入模式 | 便于从 OneLake 上的 Direct Lake 模式轻松迁移到导入模式 |
-| [实现用户定义的聚合](xref:script-implement-user-defined-aggregations) | 自动为所选事实表配置用户定义的聚合。 | 当需要实现用户定义的聚合模式,但又不想手动执行每个配置步骤时。 |
\ No newline at end of file
+|
脚本名称
| 用途 | 适用场景 |
+| ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | ------------------------------------------------------ |
+| [统计模型对象数量](xref:script-count-things) | 统计模型中各类对象的数量。 | 当你需要概览模型内容,或需要按类型统计对象数量时。 |
+| [在网格中输出对象详细信息](xref:script-output-things) | 在网格视图中输出对象详细信息。 | 当你需要在网格视图中输出对象详细信息以便检查时。 |
+| [创建日期表](xref:script-create-date-table) | 根据模型中选定的日期列创建带格式的日期表。 | 当你需要基于模板创建新的日期表时。 |
+| [创建 M 参数(自动替换)](xref:script-create-and-replace-parameter) | 创建新的 M 参数,并自动将其添加到 M 分区中。 | 当你想用动态 M 参数替换多个分区中的字符串(例如连接字符串)时。 |
+| [格式化 Power Query](xref:script-format-power-query) | 使用 powerqueryformatter.com API 格式化所选 M 分区的 Power Query。 | 当 Power Query 很复杂,需要让它更便于阅读或修改时。 |
+| [实现增量刷新](xref:script-implement-incremental-refresh) | 使用 UI 对话框中的参数自动配置增量刷新。 | 当你需要实现增量刷新,但不太熟悉表设置中的相关配置时。 |
+| [删除出错的度量值](xref:script-remove-measures-with-error) | 创建新的 M 参数,并自动将其添加到 M 分区。 | 当你想用动态 M 参数替换多个分区中的字符串(例如连接字符串)时。 |
+| [在所选度量值中查找/替换](xref:script-find-replace) | 在所选度量值的 DAX 中搜索子字符串,并将其替换为另一个子字符串。 | 当你需要在多个 DAX 度量值中快速查找/替换值时(例如 `CALCULATE` 筛选器或无效的对象引用)。 |
+| [设置 Databricks 语义模型](xref:script-databricks-semantic-model-set-up) | 为表和列设置更友好的名称,并应用列最佳实践 | 当需要让 Databricks 对象名称更友好、更易读时。 |
+| [创建 Databricks 关系](xref:script-create-databricks-relationships) | 根据 Databricks Unity Catalog 中的主键和外键定义创建关系 | 当你想复用已在 Unity Catalog 中定义的 Databricks 关系时。 |
+| [添加 Databricks 元数据描述](xref:script-add-databricks-metadata-descriptions) | 根据 Databricks Unity Catalog 更新表和列的描述 | 当你想重用已在 Unity Catalog 中定义的 Databricks 表和列注释时。 |
+| [将 Direct Lake over SQL 转换为 Direct Lake over OneLake](xref:script-convert-dlsql-to-dlol) | 将 Direct Lake over SQL 模型的分区更改为 Direct Lake over OneLake | 适用于轻松迁移到 Direct Lake over OneLake |
+| [将导入模式转换为 DL/OL](xref:script-convert-import-to-dlol) | 将导入模式模型的分区更改为 Direct Lake over OneLake | 便于轻松迁移到 OneLake 上的 Direct Lake |
+| [将 DL/OL 转换为导入模式](xref:script-convert-dlol-to-import) | 将 OneLake 上的 Direct Lake 模型分区切换为导入模式 | 便于轻松从 OneLake 上的 Direct Lake 迁移到导入模式 |
+| [实现用户自定义聚合](xref:script-implement-user-defined-aggregations) | 自动为所选事实表配置用户自定义聚合。 | 当您希望在不手动执行每个配置步骤的情况下实现用户自定义聚合模式时。 |
\ No newline at end of file
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..66c37b6b 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
@@ -11,7 +11,7 @@ applies_to:
editions:
- edition: Desktop
none: true
- - edition: Business
+ - edition: 商业版
none: true
- edition: Enterprise
full: true
diff --git a/localizedContent/zh/content/features/Useful-script-snippets.md b/localizedContent/zh/content/features/Useful-script-snippets.md
index dc383fb5..1972dfd5 100644
--- a/localizedContent/zh/content/features/Useful-script-snippets.md
+++ b/localizedContent/zh/content/features/Useful-script-snippets.md
@@ -18,16 +18,16 @@ applies_to:
# 实用脚本片段
-这里汇总了一些小脚本片段,帮助你开始使用 Tabular Editor 的 [高级脚本功能](/Advanced-Scripting)。 其中许多脚本都适合保存为 [自定义操作](/Custom-Actions),这样你就能从上下文菜单中轻松重复使用它们。'
+这里汇总了一些简短的脚本片段,帮助你快速上手 Tabular Editor 的 [高级脚本功能](/Advanced-Scripting)。 其中很多脚本都适合保存为 [自定义操作](/Custom-Actions),这样你就可以通过上下文菜单轻松复用它们。'
-另外,也别忘了看看我们的脚本库 @csharp-script-library,里面有更多贴近实战的示例,展示你可以用 Tabular Editor 的脚本能力做些什么。
+另外,也别忘了看看我们的脚本库 @csharp-script-library,里面有更多贴近实际场景的示例,展示了你可以如何利用 Tabular Editor 的脚本功能。
***
## 从列创建度量值
```csharp
-// 为每个当前选中的列创建一个 SUM 度量值,并隐藏该列。
+// 为当前选中的每一列创建一个 SUM 度量值,并隐藏该列。
foreach(var c in Selected.Columns)
{
var newMeasure = c.Table.AddMeasure(
@@ -39,21 +39,21 @@ foreach(var c in Selected.Columns)
// 为新度量值设置格式字符串:
newMeasure.FormatString = "0.00";
- // 提供一些说明文档:
- newMeasure.Description = "此度量值是对列求和 " + c.DaxObjectFullName;
+ // 添加一些说明:
+ newMeasure.Description = "这个度量值是列 " + c.DaxObjectFullName + " 的总和";
- // 隐藏基础列:
+ // 隐藏原始列:
c.IsHidden = true;
}
```
-此片段使用 `