diff --git a/content/assets/images/advanced-refresh-edit-profile.png b/content/assets/images/advanced-refresh-edit-profile.png new file mode 100644 index 00000000..5575b6fc Binary files /dev/null and b/content/assets/images/advanced-refresh-edit-profile.png differ diff --git a/content/assets/images/advanced-refresh-incremental-effective-date.png b/content/assets/images/advanced-refresh-incremental-effective-date.png new file mode 100644 index 00000000..6a1e33f9 Binary files /dev/null and b/content/assets/images/advanced-refresh-incremental-effective-date.png differ diff --git a/content/assets/images/advanced-refresh-menu.png b/content/assets/images/advanced-refresh-menu.png new file mode 100644 index 00000000..a58d3aa9 Binary files /dev/null and b/content/assets/images/advanced-refresh-menu.png differ diff --git a/content/assets/images/advanced-refresh.png b/content/assets/images/advanced-refresh.png new file mode 100644 index 00000000..33a38334 Binary files /dev/null and b/content/assets/images/advanced-refresh.png differ diff --git a/content/assets/images/common/SaveWithSupportingFilesDialog.png b/content/assets/images/common/SaveWithSupportingFilesDialog.png new file mode 100644 index 00000000..dd2b380a Binary files /dev/null and b/content/assets/images/common/SaveWithSupportingFilesDialog.png differ diff --git a/content/assets/images/common/SaveWithSupportingFilesSetName.png b/content/assets/images/common/SaveWithSupportingFilesSetName.png new file mode 100644 index 00000000..cd4f5adf Binary files /dev/null and b/content/assets/images/common/SaveWithSupportingFilesSetName.png differ diff --git a/content/assets/images/common/WorkspaceGitSync.png b/content/assets/images/common/WorkspaceGitSync.png new file mode 100644 index 00000000..8139f672 Binary files /dev/null and b/content/assets/images/common/WorkspaceGitSync.png differ diff --git a/content/assets/images/impersonation-customdata.png b/content/assets/images/impersonation-customdata.png new file mode 100644 index 00000000..52956eb2 Binary files /dev/null and b/content/assets/images/impersonation-customdata.png differ diff --git a/content/assets/images/impersonation-dropdown.png b/content/assets/images/impersonation-dropdown.png index 293b7fc2..4c39c080 100644 Binary files a/content/assets/images/impersonation-dropdown.png and b/content/assets/images/impersonation-dropdown.png differ diff --git a/content/assets/images/select-impersonation.png b/content/assets/images/select-impersonation.png index 8a3331fe..c7d064da 100644 Binary files a/content/assets/images/select-impersonation.png and b/content/assets/images/select-impersonation.png differ diff --git a/content/assets/images/user-interface/chaning-language-preferences.png b/content/assets/images/user-interface/chaning-language-preferences.png new file mode 100644 index 00000000..272ecf0c Binary files /dev/null and b/content/assets/images/user-interface/chaning-language-preferences.png differ diff --git a/content/assets/images/user-interface/chaning-language-restart-pop-up.png b/content/assets/images/user-interface/chaning-language-restart-pop-up.png new file mode 100644 index 00000000..6f92975b Binary files /dev/null and b/content/assets/images/user-interface/chaning-language-restart-pop-up.png differ diff --git a/content/assets/images/user-interface/chaning-language-windows-ui.png b/content/assets/images/user-interface/chaning-language-windows-ui.png new file mode 100644 index 00000000..01db3ea3 Binary files /dev/null and b/content/assets/images/user-interface/chaning-language-windows-ui.png differ diff --git a/content/features/advanced-refresh.md b/content/features/advanced-refresh.md new file mode 100644 index 00000000..ada83b0e --- /dev/null +++ b/content/features/advanced-refresh.md @@ -0,0 +1,104 @@ +--- +uid: advanced-refresh +title: Advanced Refresh Dialog +author: Daniel Otykier +updated: 2026-01-15 +applies_to: + products: + - product: Tabular Editor 2 + none: true + - product: Tabular Editor 3 + since: 3.25.0 + editions: + - edition: Desktop + full: true + - edition: Business + full: true + - edition: Enterprise + full: true +--- +# Advanced Refresh Dialog + +The **Advanced Refresh** dialog provides fine-grained control over data refresh operations, allowing you to configure refresh type, parallelism, incremental refresh settings, and override profiles. This is useful when you need more control than the standard refresh menu options provide. + +To open the Advanced Refresh dialog, go to **Model > Refresh model > Advanced...** or use the keyboard shortcut **Ctrl+Shift+F5**. + +![Advanced Refresh Menu](~/content/assets/images/advanced-refresh-menu.png) + +## Refresh scope + +The refresh scope indicates which objects will be refreshed. The scope depends on what is selected in the TOM Explorer when you open the dialog: + +- **Entire model**: When no specific tables or partitions are selected +- **Selected tables**: When one or more tables are selected +- **Selected partitions**: When one or more partitions are selected + +## General Settings + +![Advanced Refresh Dialog](~/content/assets/images/advanced-refresh.png) + +### Refresh Type + +The **Refresh Type** dropdown lets you choose the type of refresh operation to perform. Available options depend on the refresh scope: + +| Refresh Type | Description | Availability | +|--------------|-------------|--------------| +| **Automatic** | Lets Analysis Services determine the optimal refresh type based on the current state of objects | All scopes | +| **Full** | Drops all data and reloads from the data source, then recalculates all dependent objects | All scopes | +| **Clear** | Drops all data from the selected objects without reloading | All scopes | +| **DataOnly** | Loads data from the data source without recalculating dependent objects | All scopes | +| **Calculate** | Recalculates the selected objects and all their dependents without reloading data | All scopes | +| **Defrag** | Defragments the dictionaries for all columns in the scope | Model and table scope only | +| **Add** | Adds new data to partitions without processing existing data | Partition scope only | + +### Max Parallelism + +The **Max Parallelism** setting controls how many objects can be processed simultaneously during the refresh operation. A value of **0** means unlimited parallelism, allowing Analysis Services to process as many objects in parallel as resources permit. Set a specific value to limit parallel operations, which can be useful when you want to reduce resource consumption on the server. + +## Incremental Refresh Settings + +![Incremental Refresh Settings](~/content/assets/images/advanced-refresh-incremental-effective-date.png) + +The **Incremental Refresh Settings** section appears when the refresh scope includes at least one table with an [incremental refresh policy](xref:incremental-refresh-about) configured. This section is not available at partition scope. + +- **Apply Refresh Policy**: When checked, the refresh operation will honor the incremental refresh policy defined on the table(s), creating and managing partitions according to the policy's rolling window settings. +- **Effective Date**: Specifies the date to use when evaluating the incremental refresh policy. By default, this is the current date, but you can select a different date to simulate how the refresh would behave at a different point in time. This is useful for testing incremental refresh configurations. + +## Refresh Override Settings + +Refresh overrides allow you to temporarily modify certain properties for the duration of a refresh operation without changing the actual model metadata. This eliminates the risk of accidentally leaving temporary modifications in your model. + +### Use cases for refresh overrides + +- **Limiting data during development**: Override partition queries to load only a subset of rows (e.g., using TOP or WHERE clauses), speeding up refresh operations while developing and testing +- **Refreshing from alternative sources**: Load data from a test or development database instead of the production source configured in the model +- **Testing with modified expressions**: Override shared expressions (M parameters) to test different configurations + +### Override profiles + +Override profiles store named configurations of TMSL overrides that you can reuse across refresh operations. + +![Override Profile Editor](~/content/assets/images/advanced-refresh-edit-profile.png) + +- **New...**: Creates a new override profile. You provide a profile name and the TMSL definition specifying the overrides. +- **Edit...**: Modifies the selected override profile. +- **Delete**: Removes the selected override profile. + +The TMSL definition follows the [TMSL refresh command specification](https://learn.microsoft.com/en-us/analysis-services/tmsl/refresh-command-tmsl?view=asallproducts-allversions), allowing you to override properties on: + +- Data sources +- Shared expressions +- Partitions +- Data columns + +### Profile storage + +Override profiles are stored per-model in the `UserOptions.tmuo` file. When working with model metadata saved on disk, the `.tmuo` file is stored alongside the model files. When connected directly to a model through the XMLA endpoint, the `.tmuo` files are stored under `%LocalAppData%\TabularEditor3\UserOptions`. + +## Export TMSL script + +The **Export TMSL script...** button opens a dialog where you can view and copy the generated TMSL refresh command. This is useful when you want to: + +- Execute the refresh command through other tools (such as SQL Server Management Studio) +- Include the refresh command in automation scripts or CI/CD pipelines +- Review the exact TMSL that will be sent to Analysis Services \ No newline at end of file diff --git a/content/features/built-in-bpa-rules.md b/content/features/built-in-bpa-rules.md new file mode 100644 index 00000000..8e71913d --- /dev/null +++ b/content/features/built-in-bpa-rules.md @@ -0,0 +1,194 @@ +--- +uid: built-in-bpa-rules +title: Built-in BPA Rules +author: Morten Lønskov +updated: 2026-01-09 +applies_to: + products: + - product: Tabular Editor 2 + none: true + - product: Tabular Editor 3 + since: 3.24.0 + editions: + - edition: Desktop + none: true + - edition: Business + none: true + - edition: Enterprise + full: true +description: Enterprise Edition feature providing 27 curated best practice rules hardcoded into Tabular Editor 3 with knowledge base integration. +--- + +# Built-in BPA Rules + +## Overview + +Tabular Editor 3 Enterprise Edition includes 27 built-in best practice rules. These rules cover common issues in semantic model development and are updated automatically with each release. + +Unlike custom rules stored in JSON files, built-in rules: +- Are integrated directly into the application +- Update automatically with new releases +- Link to knowledge base documentation +- Are read-only to ensure consistency across teams +- Work immediately without configuration + +## Key Features + +### Rule Categories + +The 27 built-in rules cover four areas: +- **Error Prevention**: Invalid characters, missing expressions, data type mismatches +- **Performance**: Relationships, partitions, aggregations +- **Formatting**: Format strings, visibility, naming conventions +- **Maintenance**: Descriptions, calculation groups, unused objects + +### Global and Per-Rule Control + +You can enable or disable built-in rules globally or individually. Settings persist across sessions and work independently from your custom rules. + +To manage built-in rules: +1. Go to **Tools** > **Preferences** > **Best Practice Analyzer** +2. Find the **Built-in Rules** section +3. Toggle **Enable Built-in Rules** to turn the entire collection on or off +4. Use the BPA Manager to enable or disable individual rules + +### Enterprise-Only Access + +Built-in BPA Rules require Enterprise Edition. If you're using Desktop or Business Edition, you can still use custom BPA rules but won't see the built-in rules. + +### First-Run Notification + +The first time you open a model after upgrading to a version with built-in rules, you'll see a notification explaining the feature with a link to preferences. This notification only appears once. + +### Knowledge Base Integration + + +Every built-in rule links to a knowledge base article through the `KnowledgeBaseArticle` property. Each article explains what the rule checks, why it matters, and how to fix violations. + +To view documentation, select a rule in the Best Practice Analyzer window. + + +### Read-Only Protection + +Built-in rules can't be edited, cloned, or deleted. This ensures all users have the same rule definitions. You can disable individual rules, but the rule definitions themselves remain unchanged. + + +### ID Collision Prevention + +Built-in rules use reserved ID prefixes. When you create a custom rule, Tabular Editor validates that your ID doesn't conflict with built-in rules and shows an error if it does. + +## Built-in Rules Catalog + +The initial release includes the following rules: + + + +## Working with Built-in and Custom Rules + +Built-in and custom rules work side by side: + +| Feature | Built-in Rules | Custom Rules | +|---------|---------------|--------------| +| **Storage** | Hardcoded in application | JSON files or model annotations | +| **Updates** | Automatic with releases | Manual editing required | +| **Modification** | Read-only | Fully editable | +| **Documentation** | Integrated KB articles | User-provided descriptions | +| **Availability** | Enterprise Edition only | All editions | +| **Sharing** | Consistent across teams | Requires manual distribution | + +### Recommended Workflow + +1. Enable built-in rules for immediate coverage +2. Review violations and apply fixes +3. Disable rules that don't apply to your conventions +4. Add custom rules for organization-specific requirements +5. Use the "Ignore" feature for intentional violations + +## Best Practices + +### Onboarding Teams + +When rolling out built-in rules to your team: +- Start with all rules enabled to establish a baseline +- Review violations together and agree on which rules apply +- Document why specific rules are disabled +- Add custom rules for organization-specific requirements + +### Model Maintenance + +- Run BPA before committing changes to version control +- Fix high-severity violations immediately +- Review medium and low-severity issues regularly +- Use automatic fixes where available + +### Custom Rules + +- Don't duplicate built-in rule functionality +- Use different ID prefixes to avoid conflicts +- Document your custom rules +- Share rule collections within your team + +## Troubleshooting + +### Built-in Rules Not Appearing + +If built-in rules don't show in the BPA window: +1. Check that you're using Tabular Editor 3 Enterprise Edition +2. Verify that built-in rules are enabled in **Tools** > **Preferences** > **Best Practice Analyzer** +3. Restart Tabular Editor if you just changed preferences +4. Confirm your license is active + +### Cannot Modify Built-in Rule + +This is expected. Built-in rules are read-only. If you need different logic, create a custom rule with your expression and disable the corresponding built-in rule. + +### ID Collision Error + +Built-in rules reserve certain ID prefixes. Choose a different ID that doesn't start with `TE3_BUILT_IN`. + +## Compatibility + +- Requires Tabular Editor 3.24.0 or later +- Enterprise Edition only +- Works with all compatibility levels (1200+) + +## Next Steps + +- [Using the Best Practice Analyzer](xref:using-bpa) +- [BPA sample rules and expressions](xref:using-bpa-sample-rules-expressions) +- [Custom BPA rules](xref:best-practice-analyzer) \ No newline at end of file diff --git a/content/features/save-to-folder.md b/content/features/save-to-folder.md index 30ee426d..cb0ff125 100644 --- a/content/features/save-to-folder.md +++ b/content/features/save-to-folder.md @@ -34,8 +34,6 @@ To save your model to folder, follow these steps: ## Serialization settings The serialization settings defines how the model objects are split into separate files. In these settings you can also define if you wish to use JSON or TMDL formats. -> [!NOTE] ->JSON is the default format as TMDL is currently in preview. ### [Tabular Editor 2 Preferences](#tab/TE2Preferences) diff --git a/content/features/save-with-supporting-files.md b/content/features/save-with-supporting-files.md new file mode 100644 index 00000000..b186fd44 --- /dev/null +++ b/content/features/save-with-supporting-files.md @@ -0,0 +1,137 @@ +--- +uid: save-with-supporting-files +title: Save with supporting files +author: Peer Grønnerup +updated: 2026-01-19 +applies_to: + products: + - product: Tabular Editor 2 + none: true + - product: Tabular Editor 3 + editions: + - edition: Desktop + none: true + - edition: Business + full: true + - edition: Enterprise + full: true +--- +# Save with supporting files + +Save with supporting files is a feature that enables saving of semantic models with additional supporting files that follow the source code format required for Git Integration in Microsoft Fabric. This feature ensures that your Tabular Editor models are fully compatible with Fabric's Git integration capabilities, allowing seamless version control and deployment workflows. + +When you save a semantic model with supporting files, Tabular Editor creates a folder structure that includes all necessary metadata files required by Microsoft Fabric's Git integration. This allows you to use Fabric Git integration to synchronize your semantic models between Fabric workspaces and Git repositories. + +> [!NOTE] +> Saving with supporting files is only available when saving to .bim (TMSL) or when Save to Folder is set to TMDL as serialization mode. + +## File structure and model properties + +When you save with supporting files, Tabular Editor creates a new folder in the save path using the following naming convention: **Database Name.SemanticModel**. The folder name is derived from the `Name` property of the Database object in the TOM Explorer, with the **.SemanticModel** suffix appended. This suffix is required by Microsoft Fabric to recognize the folder as a semantic model item. + +The Database `Name` property is also synchronized to the `displayName` property in the .platform metadata file, which is used by Microsoft Fabric. + +> [!TIP] +> The `Name` property of the Database object in the TOM Explorer serves two purposes: +> 1. Determines the folder name (with .SemanticModel suffix added) +> 2. Sets the displayName in the .platform metadata file +> +> The property `Description` is also synchronized to the .platform metadata file. + +### Files included + +Every saved model includes these core files: +- **.platform** - Metadata about the item including its type, display name, and description. Also contains a logicalId property, an automatically generated cross-workspace identifier. +- **definition.pbism** - Overall definition and core settings of the semantic model. + +The model file structure within the created folder depends on your serialization format: + +| Format | Model storage | +|--------|------------------| +| **TMDL** | `definition` folder containing TMDL files with the model metadata | +| **TMSL (.bim)** | `model.bim` file (automatically saved with a fixed filename) | + +Example folder structure for a database named "Sales": + +``` +Sales.SemanticModel/ +├── .platform +├── definition.pbism +├── model.bim (if saved as TMSL) +└── definition/ (if saved as TMDL) + ├── database.tmdl + ├── tables.tmdl + └── ... +``` + +## How to save with supporting files + +To save your model with supporting files: + +1. Create a new or open an existing semantic model in Tabular Editor 3 +2. **Configure the model name** - Set the `Name` property of the Database object in the TOM Explorer + - This sets the folder name (with .SemanticModel suffix) and displayName in the .platform file + ![Set Database Name property](~/content/assets/images/common/SaveWithSupportingFilesSetName.png) +3. Ensure your serialization mode is set to either TMDL or that you're saving as a .bim file + - Go to **Tools > Preferences > File Formats** to configure serialization settings +4. Click on **File > Save As** or **File > Save to Folder** +5. Choose a folder where you want to save your model + - Check the checkbox **Save with supporting files** + ![Save with supporting files dialog](~/content/assets/images/common/SaveWithSupportingFilesDialog.png) +6. Click **Save** + +Tabular Editor will create a new folder using the Database name with a **.SemanticModel** suffix (e.g., `Sales.SemanticModel`) in the save location and populate it with all necessary files in the format compatible with Microsoft Fabric Git integration. + +## Git Integration in Microsoft Fabric + +The **Save with supporting files** feature is designed to work seamlessly with Microsoft Fabric's Git integration capabilities. Git Integration is available on workspaces assigned to Microsoft Fabric F-SKU capacity, Power BI Premium capacity, or Power BI Premium Per User (PPU). + +> [!WARNING] +> Git Integration for the Semantic Model item is currently in preview. For the latest information on supported items for Fabric Git Integration, see [Supported items in Fabric Git Integration](https://learn.microsoft.com/en-us/fabric/cicd/git-integration/intro-to-git-integration#supported-items). + +> [!CAUTION] +> Do **not** enable Git integration on the Fabric workspace that you use to host your Tabular Editor workspace databases. +Maintaining semantic models in both the hosted workspace and in repository files simultaneously while Git integration is enabled creates risks of uncommitted changes and conflicts. When a model is synchronized between Tabular Editor and the workspace, changes may not align properly with the Git repository state, resulting in out-of-sync uncommitted changes and potential Git conflicts. +> +> +> Instead, use deployment workflows to deploy semantic models to workspaces via Tabular Editor, the Fabric REST APIs, Fabric CLI, or the fabric-cicd Python library. This ensures clean separation between your Git repository and workspace. + +### Using Git integration with Tabular Editor + +When your semantic model is saved with supporting files and synchronized to your Git repository, you can then sync it to Microsoft Fabric using the following workflow: + +1. **Save your model** in Tabular Editor using the Save with supporting files option +2. **Commit the changes** to your Git repository +3. **Connect your Fabric workspace** to the Git repository +4. **Synchronize** your model between Fabric and Git using the **Update all** button in the workspace source control pane + ![Synchronize workspace with Git](~/content/assets/images/common/WorkspaceGitSync.png) + +When your model is synchronized to Microsoft Fabric/Power BI, the semantic model name displayed in the workspace is based on the `displayName` property in the .platform file, which is automatically set from the Database `Name` property in Tabular Editor. This means the name you configure in Tabular Editor will be the name displayed in Fabric/Power BI. + +Tabular Editor automatically sets the model culture to **en-US** when saving with supporting files. This ensures the model culture is present when synchronizing with Fabric, preventing uncommitted changes that can occur if the culture is not set during the initial synchronization. + +For more information, see: +- [Microsoft Fabric Git integration documentation](https://learn.microsoft.com/en-us/fabric/cicd/git-integration/intro-to-git-integration?tabs=azure-devops) +- [Tabular Editor and Fabric Git Integration blog post](https://tabulareditor.com/blog/tabular-editor-and-fabric-git-integration) + +## Comparing serialization formats + +When using Save with supporting files, you can choose between two serialization formats: + +### TMDL (Tabular Model Definition Language) +- Human-readable text format +- Easier to review changes in Git diffs +- Better for code reviews and collaboration +- Learn more: [TMDL documentation](tmdl.md) + +### TMSL/JSON (.bim) +- JSON-based format +- Single file representation +- Compatible with older tools and workflows + +Both formats are supported by Microsoft Fabric Git integration, and the choice depends on your team's preferences and workflow requirements. + +## See also + +- [Save to folder](save-to-folder.md) +- [TMDL - Tabular Model Definition Language](tmdl.md) diff --git a/content/features/toc.md b/content/features/toc.md index b84b5325..e16805db 100644 --- a/content/features/toc.md +++ b/content/features/toc.md @@ -28,6 +28,7 @@ # Model Analysis and Quality ## @best-practice-analyzer +### @built-in-bpa-rules ### @using-bpa ### @using-bpa-sample-rules-expressions ## @dax-optimizer-integration @@ -54,6 +55,8 @@ ## @workspace-mode ## @tmdl ## @save-to-folder +## @save-with-supporting-files +## @advanced-refresh # Command Line and Integration ## @command-line-options \ No newline at end of file diff --git a/content/getting-started/refresh-preview-query.md b/content/getting-started/refresh-preview-query.md index c8e73e6d..ea2123f1 100644 --- a/content/getting-started/refresh-preview-query.md +++ b/content/getting-started/refresh-preview-query.md @@ -2,7 +2,7 @@ uid: refresh-preview-query title: Refreshing, previewing and querying data author: Daniel Otykier -updated: 2021-09-30 +updated: 2026-01-08 applies_to: products: - product: Tabular Editor 2 @@ -141,6 +141,23 @@ Once the impersonation is enabled, the **Impersonation..** button is checked, an When auto-refresh is enabled on a data view, changing the impersonation will immediately refresh the view. +## CustomData + +The CustomData feature allows you to pass a custom string value that can be used in DAX expressions, typically for implementing dynamic row-level security scenarios. This feature can be combined with any of the impersonation options described above, including **No Impersonation**. + +![Select Impersonation](~/content/assets/images/impersonation-customdata.png) + +When you enter a value in the **CustomData** input field, Tabular Editor 3 adds the [`CustomData` property](https://docs.microsoft.com/en-us/analysis-services/instances/connection-string-properties-analysis-services?view=asallproducts-allversions#customdata) to the connection string. This value can then be retrieved within your DAX expressions using the [`CUSTOMDATA()` function](https://dax.guide/customdata/). + +CustomData is commonly used in implementing dynamic row-level security when an application uses custom authentication. The value you provide can be leveraged in role filter expressions to control which rows users can see based on the custom data passed through the connection string. + +This feature is particularly useful in **Power BI Embedded** scenarios, where you can natively utilize CustomData to add row filters that pass free text (strings) to leverage dynamic row-level security in embedded reports, dashboards, and tiles. + +**Example use case:** You might pass a user's department or region as CustomData, and then use that value in a role's filter expression like: +```dax +'Department'[DepartmentCode] = CUSTOMDATA() +``` + # VertiPaq Analyzer Tabular Editor 3 includes a version of the open-source [VertiPaq Analyzer](https://www.sqlbi.com/tools/vertipaq-analyzer/) tool, created by [SQLBI](https://sqlbi.com). VertiPaq Analyzer is useful to analyze VertiPaq storage structures for your Power BI or Tabular data model. diff --git a/content/kb/DI005.md b/content/kb/DI005.md index 430b83c9..a824b872 100644 --- a/content/kb/DI005.md +++ b/content/kb/DI005.md @@ -4,7 +4,7 @@ category: Code actions sub-category: Improvements title: Rewrite table filter as scalar predicate author: Daniel Otykier -updated: 2024-12-19 +updated: 2026-01-12 --- Code action `DI005` (Improvement) **Rewrite table filter as scalar predicate** @@ -66,4 +66,45 @@ For example, an expression such as `FILTER(Sales, < condition >)` will iterate o By using scalar predicates, you also make your code more concise and easier to read. -Behind the scenes, scalar predicates are syntax sugar for a table expression that also uses the `FILTER` function. However, the `FILTER` function is applied to a single column, which is more efficient than filtering the entire table. \ No newline at end of file +Behind the scenes, scalar predicates are syntax sugar for a table expression that also uses the `FILTER` function. However, the `FILTER` function is applied to a single column, which is more efficient than filtering the entire table. + +## When this suggestion is not shown + +Starting with Tabular Editor 3.25.0, this code action is **not suggested** when [table expansion](https://www.sqlbi.com/articles/expanded-tables-in-dax/) occurs in the `FILTER` expression. This is because rewriting a table filter into a scalar predicate can change the semantics of the filter and produce different results in such cases. + +### Table expansion scenario + +Table expansion happens when DAX automatically includes related tables on the "one" side of a relationship. For example, if you filter the `Sales` table, DAX automatically expands the filter to include related dimension tables like `Product`, `Customer`, etc. + +When you write: + +```dax +CALCULATE( + [Total Sales], + FILTER(Sales, Sales[Quantity] > 10) +) +``` + +The filter operates on the expanded `Sales` table, which includes all related dimension tables. This means the filter context includes not only the `Sales` table but also any tables on the "one" side of relationships from `Sales`. + +### Why rewriting can change results + +Converting a table filter to a scalar predicate changes which tables are affected: + +**Original (with table expansion):** +```dax +CALCULATE([Total Sales], FILTER(Sales, Sales[Quantity] > 10)) +``` +This filters the *expanded* `Sales` table, affecting `Sales` and all related dimension tables. + +**After rewrite (scalar predicate):** +```dax +CALCULATE([Total Sales], Sales[Quantity] > 10) +``` +This filters only the `Sales[Quantity]` column, which does not trigger table expansion to related dimension tables. + +In most cases, this difference doesn't matter because the related dimension tables don't affect the calculation. However, in certain scenarios, particularly when relationships or calculated tables are involved, the two expressions can produce different results. To ensure correctness, Tabular Editor avoids suggesting this rewrite when table expansion is detected. + +### Further reading + +- [SQLBI: Expanded tables in DAX](https://www.sqlbi.com/articles/expanded-tables-in-dax/) - A comprehensive explanation of how table expansion works and its implications for filter context. \ No newline at end of file diff --git a/content/references/Application Language.md b/content/references/Application Language.md new file mode 100644 index 00000000..9568e42c --- /dev/null +++ b/content/references/Application Language.md @@ -0,0 +1,101 @@ +--- +uid: references-application-language +title: Application Language +author: Morten Lønskov +updated: 2026-01-12 +applies_to: + products: + - product: Tabular Editor 2 + none: true + - product: Tabular Editor 3 + since: 3.25.0 + editions: + - edition: Desktop + full: true + - edition: Business + full: true + - edition: Enterprise + full: true +description: Change the display language for Tabular Editor 3's user interface. +--- + +# Application Language + +Tabular Editor 3 supports multiple UI languages. You can switch between them at any time. + +> [!NOTE] +Tabular Editor 3 is still not fully localized. Specifically we have so far not localized the individual TOM properties. + +## Supported Languages + +| Language | Status | +|----------|--------| +| English | Fully supported | +| Spanish | Preview | +| Chinese | Preview | +| French | Beta | +| German | Beta | +| Japanese | Beta | + +> [!NOTE] +> **Preview** languages have core UI elements translated but may have incomplete coverage. **Beta** languages are experimental and may have significant gaps or inconsistencies. Report issues on [GitHub](https://github.com/TabularEditor/TabularEditor3/issues). + +### Preview Languages +The languages under Beta support means that they have been verified by an human translator, but that Tabular Editor 3 may still not be fully localized. Specifically we have so far not localized the individual TOM properties. + +### Beta Languages +Beta languages are have been translated exclusively through AI and as not been verified by human translators. We plan to bring beta languages into Preview in Q2 2026. + +## Changing the Language + +There are two ways to change the application language: + +### Via Window Menu + +1. Click **Window** > **Language** +2. Select your desired language +3. Click **OK** when prompted to restart +4. Restart Tabular Editor 3 manually + +[Change Language via Window Menu](~/content/assets/images/user-interface/chaning-language-windows-ui.png) + +### Via Preferences + +1. Click **Tools** > **Preferences** +2. Navigate to **UI** section +3. Select your desired language from the **Language** dropdown +4. Click **OK** when prompted to restart +5. Restart Tabular Editor 3 manually + +[Change Language via Window Menu](~/content/assets/images/user-interface/chaning-language-preferences.png) + +## Restart Requirement + +**You must restart Tabular Editor 3** for language changes to take effect. The application prompts you to restart but does not restart automatically. Save your work before changing the language. + +[Change Language via Window Menu](~/content/assets/images/user-interface/chaning-language-restart-pop-up.png) + +## Installation Language + +During installation, the installer prompts you to select a language (English, Spanish, or Chinese). This sets your initial language preference, and Tabular Editor 3 displays in that language on first launch. + +The installer writes your selection to the preferences file in your LocalAppData folder. You can change this later using either method above. + +## Language Persistence + +Your language preference is stored in `UiPreferences.json` in your user profile. The setting persists across application updates and restarts. + +## Providing Feedback + +### Translation Issues + +If you find incorrect translations or missing text: + +- Open an issue on [GitHub](https://github.com/TabularEditor/TabularEditor3/issues) +- Include the language, the incorrect text, and where it appears in the UI +- Suggest the correct translation if possible + +## See Also + +- [Preferences](xref:preferences-index) +- [User Interface Overview](xref:ui-overview) diff --git a/content/references/preferences.md b/content/references/preferences.md index 93c70aa0..1ee557a3 100644 --- a/content/references/preferences.md +++ b/content/references/preferences.md @@ -2,7 +2,7 @@ uid: preferences title: Controlling preferences author: Daniel Otykier -updated: 2021-09-08 +updated: 2026-01-12 applies_to: products: - product: Tabular Editor 2 @@ -27,62 +27,797 @@ To access the preferences dialog, go to **Tools > Preferences**. > [!NOTE] > All Tabular Editor preferences are stored for each Windows user profile, in the `%localappdata%\TabularEditor3` folder. It is possible to migrate your settings to another machine by simply copying the contents of this folder. +> [!TIP] +> Use the search box at the top of the Preferences dialog to quickly find specific settings. + ## Tabular Editor > Features -![image](https://user-images.githubusercontent.com/8976200/104600495-5ad6f300-5679-11eb-9572-af99f0895859.png) +![Pref General Features](~/content/assets/images/pref-general-features.png) ### Power BI -- **Allow unsupported editing**: This option is only relevant when Tabular Editor 3 is used as an external tool for Power BI Desktop. When checked, all TOM data modeling properties are available for editing when connected to an instance of Power BI Desktop. It's generally recommended to leave this unchecked, to make sure that you do not accidentally make changes to your Power BI file, [that are not supported by Power BI Desktop](xref:desktop-limitations). +##### *Allow unsupported editing* (disabled) + +This option is only relevant when Tabular Editor 3 is used as an external tool for Power BI Desktop. When checked, all TOM data modeling properties are available for editing when connected to an instance of Power BI Desktop. It's generally recommended to leave this unchecked, to make sure that you do not accidentally make changes to your Power BI file, [that are not supported by Power BI Desktop](xref:desktop-limitations). + +##### *Hide auto date/time warnings* (disabled) + +When checked, warnings about Power BI auto date/time tables will be suppressed. These warnings appear when the "Auto date/time" setting in Power BI Desktop is enabled, which creates calculated tables that trigger warnings in Tabular Editor 3's built-in DAX analyzer. + +##### *Line break on first line of DAX* (disabled) + +In Power BI Desktop it is common to insert a line break on the first line of a DAX expression, due to the way the formula bar displays the DAX code. If you often switch back and forth between Tabular Editor and Power BI Desktop, consider enabling this option to have Tabular Editor 3 insert the line break automatically. + +##### *Default Power BI authentication mode* (Integrated) + +Select the default authentication method (Integrated, ServicePrincipal, or MasterUser) to use when connecting to Power BI datasets. ### Metadata Synchronization -- **Warn when local metadata is out-of-sync with deployed model**: When checked, an information bar is displayed inside Tabular Editor, whenever you have made local changes to the model that have not yet been saved to Analysis Services. For example, if you're wondering why a DAX query or a Pivot Grid does not produce the expected result, this could be due to a measure expression being changed in Tabular Editor without saving the change to Analysis Services. The bar disappears when you hit save (Ctrl+S). Uncheck this if you get tired of seeing the information bar. -- **Track external model changes**: Just like Power BI Desktop can detect when an external tool makes a change to the data model, so too can Tabular Editor. In other words, when this is checked, and another user or application makes a change to the model *on a local instance of Analysis Services*, Tabular Editor will receive a notification. - - **Refresh local Tabular Object Model metadata automatically**: Check this if you want the notification from above to actually trigger a refresh of the metadata inside Tabular Editor. +These settings control the behavior of Tabular Editor 3 when model metadata is loaded from a database on an instance of Analysis Services. The settings specify how Tabular Editor 3 should deal with metadata changes applied to the database from outside the application. + +##### *Warn when local metadata is out-of-sync with deployed model* (enabled) + +When checked, an information bar is displayed inside Tabular Editor, whenever you have made local changes to the model that have not yet been saved to Analysis Services. For example, if you're wondering why a DAX query or a Pivot Grid does not produce the expected result, this could be due to a measure expression being changed in Tabular Editor without saving the change to Analysis Services. The bar disappears when you hit save (Ctrl+S). + +##### *Track external model changes* (enabled) + +Just like Power BI Desktop can detect when an external tool makes a change to the data model, so too can Tabular Editor. This option is only relevant for local instances of Analysis Services (i.e. msmdsrv.exe processes running on the same machine as Tabular Editor). When checked, Tabular Editor starts a trace on Analysis Services and notifies you if external changes are made. + +##### *Refresh local Tabular Object Model metadata automatically* (enabled) + +When the tracing mechanism as described above is enabled, this option allows Tabular Editor to automatically refresh the model metadata when an external change is detected. This is useful if you often switch back and forth between Power BI Desktop and Tabular Editor 3. + +##### *Cleanup orphaned Tabular Editor traces* + +Normally, Tabular Editor 3 should automatically stop and remove any AS traces started due to the settings above. However, if the application was shut down prematurely, the traces may never be stopped. By clicking this button, all AS traces started by any instance of Tabular Editor will be removed. + +> [!NOTE] +> The cleanup button is only available when Tabular Editor is connected to an instance of Analysis Services. ### Best Practice Analyzer -- **Scan for Best Practice violations in the background** If unchecked, you will have to explicitly run a Best Practice Analysis from inside the Best Practice Analyzer tool window, to view if there are any violations. If checked, the scan happens continuously on a background thread whenever changes are made. For very large models, or models with very complex Best Practice rules, this may cause issues. +##### *Scan for Best Practice violations in the background* (enabled) + +If unchecked, you will have to explicitly run a Best Practice Analysis from inside the Best Practice Analyzer tool window, to view if there are any violations. If checked, the scan happens continuously on a background thread whenever changes are made. For very large models, or models with very complex Best Practice rules, this may cause issues. + +##### *Built-in BPA rules* (enabled for new users) + +Choose whether to enable, disable, or be prompted about using Tabular Editor's built-in Best Practice Analyzer rules. The built-in rules cover key best practices across formatting, metadata, model layout, DAX expressions, and translations. New installations will have built-in rules enabled by default. + +### DAX Formula Fix-up + +##### *Enable formula fix-up* (enabled) + +Automatically adjusts references in DAX expressions when objects are renamed or moved. This feature ensures that your DAX code remains valid when you reorganize your model. + +##### *Enable formula fix-up on paste* (enabled) + +Automatically adjusts references in DAX expressions when pasting objects. This is useful when copying measures or calculated columns between tables or models. + +### Direct Lake + +##### *Auto-refresh on save* (enabled) + +Automatically refresh Direct Lake tables when saving changes to ensure data is current. This ensures that your Direct Lake model stays in sync with the underlying data source. ## Tabular Editor > Updates and Feedback -![image](https://user-images.githubusercontent.com/8976200/104601469-92926a80-567a-11eb-9499-1d1c8d967c72.png) +![Placeholder: Screenshot of Updates and Feedback preferences page] + +##### *Check for updates on start-up* (enabled) + +When checked, Tabular Editor will check for new versions when the application starts. This ensures you stay up to date with the latest features and bug fixes. + +##### *Check for major updates only* (disabled) + +When checked, only major version updates will trigger notifications. Minor and patch updates will be ignored. + +##### *Help improve Tabular Editor by collecting anonymous usage data* (enabled) + +Data does not contain any personally identifiable information, nor any information about the structure or content of your data models. If you would still like to opt out of telemetry, uncheck this. + +##### *Send error reports* (enabled) + +In cases of crashes, Tabular Editor displays an option for sending a crash report when this is checked. Crash reports are very helpful when debugging, so please leave this checked if you don't mind! + +## Tabular Editor > Deployment + +![Placeholder: Screenshot of Deployment preferences page] + +Configure which types of objects are deployed by default when using the deployment wizard: + +##### *Deploy data sources* (disabled) + +Include data source definitions when deploying. Enable this if you want data source connection strings and settings to be deployed along with your model changes. + +##### *Deploy partitions* (disabled) + +Include partition definitions when deploying. Enable this if you want partition configurations to be deployed along with your model changes. + +##### *Deploy refresh policy partitions* (disabled) -- **Check for updates on start-up**: Pretty self-explanatory. Update notifications will not be sent during the public preview period, and the "Check for updates" button below also does not work at the moment. -- **Help improve Tabular Editor by collecting anonymous usage data**: Data does not contain any personally identifiable information, nor any information about the structure or content of your data models. If you would still like to opt out of telemetry, uncheck this. -- **Send error reports**: In cases of crashes, Tabular Editor displays an option for sending a crash report when this is checked. Crash reports are very helpful when debugging, so please leave this checked if you don't mind! +Include incremental refresh policy partitions when deploying. This controls whether partitions created by incremental refresh policies are deployed. + +##### *Deploy model roles* (disabled) + +Include role definitions when deploying. Enable this if you want Row-Level Security (RLS) and Object-Level Security (OLS) roles to be deployed. + +##### *Deploy model role members* (disabled) + +Include role member assignments when deploying. Enable this if you want user and group assignments to security roles to be deployed. + +##### *Deploy shared expressions* (disabled) + +Include shared expressions (M expressions) when deploying. Enable this if you want Power Query shared expressions to be deployed. + +### Deployment Metadata + +##### *Annotate deployment metadata* (disabled) + +Add deployment timestamp and user information as annotations on deployed objects. This can be useful for tracking when and by whom model changes were deployed. + +### Backup Settings + +##### *Backup on save* (enabled) + +Create a backup of the model when saving changes locally. This provides a safety net in case you need to revert changes. + +##### *Save backup location* + +Specify the folder where save backups are stored. By default, backups are not created unless a location is specified. + +##### *Backup on deploy* (enabled) + +Create a backup of the target model before deploying changes. This allows you to restore the previous version if needed. + +##### *Backup location* + +Specify the folder where deployment backups are stored. By default, backups are not created unless a location is specified. + +## Tabular Editor > Defaults + +![Placeholder: Screenshot of Defaults preferences page] + +##### *New model compatibility level* (1600) + +Set the default compatibility level for newly created models. Compatibility level 1600 corresponds to SQL Server 2022 and Power BI. + +##### *Use latest compatibility level as default* (enabled) + +Automatically use the latest available compatibility level for new models. When enabled, this overrides the specific compatibility level setting above. + +##### *New models use workspace database* (enabled) + +When creating a new model, automatically create a workspace database on Analysis Services. This allows you to immediately test and query your model during development. + +##### *Default save mode* (AlwaysAsk) + +Choose whether to always save as a file (.bim), folder (multiple JSON files), TMDL (Tabular Model Definition Language), or always ask when saving. Options: AlwaysAsk, File, Folder, TMDL. + +##### *Use PBIX file name when saving to disk* (enabled) + +When saving a model loaded from a PBIX file, use the PBIX filename as the default. This maintains naming consistency between Power BI files and saved model metadata. + +##### *Create user options for new models* (enabled) + +Automatically create .tmuo (Tabular Model User Options) files for new models. These files store user-specific settings like diagram layouts and window positions. ## Tabular Editor > Keyboard -![image](~/content/assets/images/keyboard-mappings.png) +![Keyboard mappings](~/content/assets/images/keyboard-mappings.png) + +Configure keyboard shortcuts for all Tabular Editor commands. Use the search functionality to quickly find specific commands and assign or modify their keyboard shortcuts to match your preferred workflow. + +## Tabular Editor > TOM Explorer View + +![Tom Explorer Settings](~/content/assets/images/tom-explorer-settings.png) + +Control which objects and properties are visible in the TOM (Tabular Object Model) Explorer: + +##### *Display folders* (enabled) + +Show or hide display folder groupings. When enabled, objects are organized into their display folder hierarchy. + +##### *Hidden objects* (disabled) + +Show or hide objects marked as hidden in the model. Enable this if you need to work with hidden tables, columns, or measures. + +##### *All object types* (enabled) + +Show all object types in the explorer tree. When disabled, only the most common object types are shown. + +##### *Sort alphabetically* (enabled) + +Sort objects alphabetically instead of by creation order. This makes it easier to find specific objects in large models. + +##### *Show measures* (enabled) + +Display measures in the explorer tree. + +##### *Show columns* (enabled) + +Display columns in the explorer tree. + +##### *Show hierarchies* (enabled) + +Display hierarchies in the explorer tree. + +##### *Show partitions* (enabled) + +Display partitions in the explorer tree. + +##### *Show metadata information* (disabled) + +Display additional metadata properties in tooltips and property grid. This includes information like lineage tags, creation timestamps, and other technical metadata. + +##### *Show full branch* (disabled) + +When filtering the TOM Explorer, by default Tabular Editor 3 shows all items in the hierarchy that matches the filter string, including their parents. If you want to see all child items as well (even though these might not match the filter string), enable this option. + +##### *Always show delete warnings* (disabled) + +If you prefer Tabular Editor 3 to prompt you to confirm all object deletions, enable this setting. Otherwise, Tabular Editor 3 will only prompt you to confirm multi-object deletions, or deletions of objects that are referenced by other objects. + +> [!NOTE] +> All delete operations in Tabular Editor 3 can be undone by hitting CTRL+Z. + +### Column Preferences + +Configure which columns are visible in multi-column views and their display order. + +## Tabular Editor > Copy/Paste + +![Placeholder: Screenshot of Copy/Paste preferences page] + +Control what metadata is included when copying objects: + +##### *Include translations* (enabled) + +Copy translation metadata with objects. When enabled, any translations defined for the copied object will also be copied. + +##### *Include perspectives* (enabled) + +Copy perspective membership with objects. When enabled, the copied object will belong to the same perspectives as the original. + +##### *Include RLS* (enabled) + +Copy Row-Level Security expressions with objects. This applies when copying tables that have RLS rules defined. + +##### *Include OLS* (enabled) + +Copy Object-Level Security settings with objects. This applies when copying objects that have OLS restrictions. + +## Tabular Editor > Perspectives + +![Placeholder: Screenshot of Perspectives preferences page] + +Control how perspective membership is handled: + +##### *Inherit perspective membership for new objects* (disabled) + +Newly created objects automatically inherit perspective membership from their parent. For example, a new measure would automatically be added to the same perspectives as its parent table. + +##### *Inherit perspective membership for relocated objects* (disabled) + +Objects that are moved inherit perspective membership from their new parent. This is useful when reorganizing your model structure. + +##### *Inherit when adding table to perspective* (enabled) + +Automatically add all table objects (columns, measures, hierarchies) when a table is added to a perspective. + +##### *Inherit when removing table from perspective* (enabled) + +Automatically remove all table objects when a table is removed from a perspective. + +## Tabular Editor > Schema Compare + +![Placeholder: Screenshot of Schema Compare preferences page] + +Configure which changes are ignored during schema comparison when updating table schemas: + +##### *Ignore Import mode changes* (disabled) + +Don't flag changes to Import mode properties. Enable this if you want to ignore changes between Import, DirectQuery, and Dual modes during schema comparison. + +##### *Ignore data type changes* (disabled) + +Don't flag column data type changes. Enable this if you want to ignore data type changes during schema comparison. + +##### *Ignore description changes* (disabled) + +Don't flag changes to object descriptions. Enable this if you don't want to see description changes in the schema comparison. + +##### *Ignore decimal to double changes* (disabled) + +Don't flag changes between decimal and double data types. This is useful when working with data sources that don't distinguish between these types. + +##### *Prioritize Analysis Services schema detector* (disabled) + +Use Analysis Services metadata as the source of truth for schema detection. When enabled, Tabular Editor will query the Analysis Services instance directly instead of using the data source provider's schema information. + +## Tabular Editor > Save to Folder/File + +![Placeholder: Screenshot of Save to Folder preferences page] + +### Serialization Mode + +##### *Use TMDL format* (disabled) + +Save model metadata using the Tabular Model Definition Language (TMDL) format instead of JSON. TMDL is the modern format recommended for version control and collaboration. + +##### *Use recommended serialization settings* (enabled) + +Apply recommended settings for folder-based serialization (overrides custom settings). When enabled, Tabular Editor uses best practices for saving models to folders, optimized for version control. + +### Legacy (JSON) Serialization Settings + +##### *Prefix filenames* (disabled) + +Add numeric prefixes to filenames for ordering. This can help maintain a consistent file order in file explorers. + +##### *Local relationships* (enabled) + +Store relationship definitions with individual tables instead of in a central location. This makes it easier to see which relationships belong to each table when using version control. + +##### *Local perspectives* (enabled) + +Store perspective membership with individual objects instead of in a central location. This reduces merge conflicts in version control. + +##### *Local translations* (enabled) + +Store translations with individual objects instead of in a central location. This reduces merge conflicts in version control. + +##### *Levels* + +Select which object types to serialize at different folder levels. This allows you to organize your model files into a hierarchical structure. + +##### *Ignore inferred objects* (enabled) + +Don't serialize objects that are automatically inferred by the engine. This reduces clutter in saved metadata. + +##### *Ignore inferred properties* (enabled) + +Don't serialize properties that are automatically inferred by the engine. This keeps saved metadata clean and focused on explicitly set values. + +##### *Ignore timestamps* (enabled) + +Don't serialize timestamp metadata. This is highly recommended for version control as it prevents unnecessary changes in every commit. + +##### *Ignore lineage tags* (disabled) + +Don't serialize Power BI lineage tag metadata. Enable this if you don't want lineage information in your saved metadata. + +##### *Ignore privacy settings* (disabled) + +Don't serialize data source privacy settings. Enable this if you manage privacy settings separately. + +##### *Include sensitive data* (disabled) + +Include sensitive information like passwords in serialized metadata. This is not recommended for security reasons. + +##### *Ignore incremental refresh partitions* (disabled) + +Don't serialize partitions created by incremental refresh policies. Enable this if you want incremental refresh to be managed separately from your saved metadata. + +##### *Split multiline strings* (enabled) + +Split long string values across multiple lines for better readability in version control. This makes it easier to see changes in DAX expressions and other long text properties. + +##### *Sort arrays* (disabled) -## Data Browsing > Pivot Grid / DAX Query +Sort array elements alphabetically for consistent serialization. This can reduce meaningless differences in version control, but may change the logical order of some elements. -![image](https://user-images.githubusercontent.com/8976200/104601874-0df41c00-567b-11eb-8ba1-41a992e5664f.png) +### TMDL Serialization Settings -More configuration options will certainly follow at some point, but this setting allows you to indicate whether new Pivot Grids or DAX Query windows will automatically be refreshed, by default, when model changes are saved to Analysis Services. You can change this behavior on a per-window basis by toggling the "Auto-execute" button as seen on the screenshot below: +##### *Indentation mode* (tabs) -![image](https://user-images.githubusercontent.com/8976200/104602109-56abd500-567b-11eb-9e8f-32ab58390449.png) +Choose between tabs or spaces for indentation in TMDL files. Tabs are the default and recommended option. -This feature is super-useful when debugging a measure for example: Update the measure expression in one window, while having a Pivot Grid or a DAX query that uses that measure open in another window. Whenever you hit CTRL+S, the Pivot Grids or DAX Queries are automatically refreshed to immediately show the impact of the change you made. +##### *Indentation spaces* (4) + +When using spaces, specify the number of spaces per indentation level. + +## Data Browsing > General + +![Placeholder: Screenshot of Data Browsing General preferences page] + +##### *Auto-refresh data preview* (enabled) + +Automatically refresh table preview windows when model changes are saved. This feature is super-useful when debugging - update an expression in one window while having a data preview open in another. Whenever you hit CTRL+S, the preview is automatically refreshed. + +##### *Auto-execute DAX queries* (enabled) + +Automatically execute DAX queries when model changes are saved. Similar to auto-refresh data preview, this allows you to see the immediate impact of changes to measures or calculated columns. + +##### *DAX query smart selection* (enabled) + +When executing a partial selection in a DAX query, intelligently determine the query context. This allows you to execute just a portion of your query for testing. + +##### *Keep filtering and sorting in DAX query results* (WhenQueryUnchanged) + +Control whether to preserve grid filters and sorting when re-executing queries: +- **Never**: Sorting and filtering are always reset when a query is executed +- **WhenQueryUnchanged**: Sorting and filtering are reset only when the query is modified +- **Always**: Sorting and filtering are never reset if the columns still exist + +##### *Direct query max rows* (100) + +Maximum number of rows to retrieve in Direct Query mode. Adjust this if you need to preview more data, but be mindful of performance. + +##### *DAX query max rows* (1000) + +Maximum number of rows to retrieve for DAX queries. Increase this if you need to analyze larger result sets. + +## Data Browsing > Pivot Grid + +![Placeholder: Screenshot of Pivot Grid preferences page] + +##### *Auto-refresh pivot grid* (enabled) + +Automatically refresh pivot grids when model changes are saved. Just like with DAX queries, this allows you to immediately see the impact of changes to measures. + +##### *Pivot grid customization default layout* (StackedDefault) + +Choose the default layout for the pivot grid field list. Options include: +- **StackedDefault**: Fields and areas in a single stacked panel +- **StackedSideBySide**: Fields and areas in side-by-side panels +- **TopPanelOnly**: Field list at the top only +- **BottomPanelOnly2by2**: Field list in a 2x2 grid at the bottom +- **BottomPanelOnly1by4**: Field list in a 1x4 layout at the bottom + +##### *Show all fields in pivot customization* (enabled) + +Display all available fields in the pivot grid field list by default, including hidden fields. + +##### *Pivot header word wrap* (enabled) + +Enable word wrapping in pivot grid headers. This makes long field names more readable. + +##### *Warn if pivot grid fields mismatch* (enabled) + +Show a warning when pivot grid field definitions don't match the current model. This can happen if you've deleted or renamed fields used in a saved pivot grid. + +##### *Always show pivot grid field list* (enabled) + +Keep the pivot grid field list visible by default. Disable this if you prefer more screen space for the pivot grid itself. ## DAX Editor > General -![image](https://user-images.githubusercontent.com/8976200/104602381-a7233280-567b-11eb-8151-cf810b7cb748.png) +![Dax Editor General](~/content/assets/images/dax-editor-general.png) + +Tabular Editor 3's DAX editor is highly configurable. This page provides settings for general configuration of the DAX editor: + +##### *Line numbers* (enabled) + +Display line numbers in the left margin of the editor. + +##### *Code folding* (enabled) + +Enable collapsible regions in DAX code for better readability. Make sure you try out this feature! + +##### *Visible whitespace* (disabled) + +Show dots for spaces and arrows for tabs. This can be helpful when diagnosing indentation issues. + +##### *Indentation guides* (enabled) + +Display vertical lines to show indentation levels. + +##### *Use tabs* (disabled) + +When checked, a tab character (`\t`) is inserted whenever the TAB button is hit. Otherwise, a number of spaces corresponding to the *Indent width* setting is inserted. + +##### *Comment style* (slashes) + +DAX supports line comments that use slashes (`//`) or hyphens (`--`). This setting determines which style of comment is used when Tabular Editor 3 generates DAX code. + +##### *DAX function documentation* + +Use this setting to specify which URL to launch in the default web browser, whenever you hit F12 while the cursor is on a DAX function. Options include https://dax.guide (recommended) and Microsoft's official documentation. -Now we're starting to get to the good stuff! This page provides a number of settings for general configuration of the DAX editor. Make sure you try out the "Code folding" feature! +### DAX Settings -- **DAX function documentation**: Use this setting to specify which URL to launch in the default web browser, whenever you hit F12 while the cursor is on a DAX function. I recommend using https://dax.guide but some people tend to like Microsoft's official documentation (which is available in the drop down). +##### *Locale* + +Specify the locale for DAX functions and formatting. + +##### *Analysis Services version settings* + +These settings are relevant only when Tabular Editor 3 cannot determine the version of Analysis Services used, as is the case when a Model.bim file is loaded directly. In this case, Tabular Editor tries to guess which version the model will be deployed to, based on the compatibility level. If Tabular Editor reports incorrect semantic/syntax errors, you may need to tweak these settings. ## DAX Editor > Auto Formatting -![image](https://user-images.githubusercontent.com/8976200/104602767-084b0600-567c-11eb-88ea-018e3d436f68.png) +![Auto Formatting Settings](~/content/assets/images/auto-formatting-settings.png) + +The DAX Editor is **very** powerful and helps you produce beautiful, readable DAX code as you type. + +##### *Auto format code as you type* (enabled) + +This option will automatically apply certain formatting rules whenever certain keystrokes occur. For example, when a parenthesis is closed, this feature will ensure that everything within the parentheses is formatted according to the other settings on this page. + +##### *Auto-format function calls* (enabled) + +This option specifically controls whether automatic formatting of function calls (spacing between arguments and parentheses) should happen when a parenthesis is closed. + +##### *Auto-indent* (enabled) + +This option automatically indents function arguments when a line break is inserted within a function call. + +##### *Auto-brace* (enabled) + +This option automatically inserts the closing brace or quote whenever an opening brace or quote is entered. + +##### *Wrap selection* (enabled) + +When enabled, this option automatically wraps the current selection with the closing brace, when an opening brace is entered. + +### Formatting Rules + +These settings control how DAX code whitespace is formatted, both when auto-formatting occurs and when code is manually formatted. + +##### *Space after functions* (disabled) + +# [Enabled](#tab/space-after-function-on) + +```DAX +SUM ( 'Sales'[Amount] ) +``` + +# [Disabled](#tab/space-after-function-off) + +```DAX +SUM( 'Sales'[Amount] ) +``` + +*** + +##### *Newline after functions* (disabled) + +Applies only when a function call needs to be broken across multiple lines. + +# [Enabled](#tab/newline-after-function-on) + +```DAX +SUM +( + 'Sales'[Amount] +) +``` + +# [Disabled](#tab/newline-after-function-off) + +```DAX +SUM( + 'Sales'[Amount] +) +``` + +*** + +##### *Pad parentheses* (enabled) + +# [Enabled](#tab/pad-parentheses-on) + +```DAX +SUM( Sales[Amount] ) +``` + +# [Disabled](#tab/pad-parentheses-off) + +```DAX +SUM(Sales[Amount]) +``` + +*** + +##### *Long format line limit* (120) + +The maximal number of characters to keep on a single line before an expression is broken across multiple lines, when using the **Format DAX (long lines)** option. + +##### *Short format line limit* (60) + +The maximal number of characters to keep on a single line before an expression is broken across multiple lines, when using the **Format DAX (short lines)** option. + +### Casings and Quotes + +In addition to formatting the DAX code whitespace, Tabular Editor 3 can also fix object references and function/keyword casings. + +##### *Fix measure/column qualifiers* (enabled) + +When checked, table prefixes are automatically removed from measure references, and automatically inserted on column references. + +##### *Preferred keyword casing* (UPPER) -As can be seen from the screenshot above, the new DAX Editor is **very** powerful and helps you produce beautiful, readable DAX code, as you type. Feel free to experiment with these settings to figure out what editor behavior works best for you, and don't forget to provide [feedback](https://github.com/TabularEditor3/PublicPreview/issues/new) if something does not work as you expect, or if you have any ideas for additional improvements. +This setting allows you to change the casing used for keywords, such as `ORDER BY`, `VAR`, `EVALUATE`, etc. + +##### *Preferred function casing* (UPPER) + +This setting allows you to change the casing used for functions, such as `CALCULATE(...)`, `SUM(...)`, etc. + +##### *Fix keyword/function casing* (enabled) + +When checked, casing of keywords and functions is automatically corrected whenever code is auto-formatted or manually formatted. + +##### *Fix object reference casing* (enabled) + +DAX is a case-insensitive language. When this is enabled, references to tables, columns and measures are automatically corrected such that the casing matches the physical name of the referenced objects. + +##### *Always quote tables* (disabled) + +Referencing certain table names do not require surrounding single quotes in DAX. However, if you prefer table references to always be quoted, you can check this option. + +##### *Always prefix extension columns* (disabled) + +Extension columns can be defined without a table name. When checked, the DAX editor will always add the table prefix to an extension column. ## DAX Editor > Code Assist -![image](https://user-images.githubusercontent.com/8976200/104603313-90311000-567c-11eb-853d-6ca6e0f0ed07.png) +![Placeholder: Screenshot of DAX Editor Code Assist preferences page] + +On this page, you can configure the two most important Code Assist features, namely calltips (aka. "parameter info") and auto-complete. + +##### *Auto-complete trigger* + +Control when the auto-complete list appears. Options include automatic triggering after typing a certain number of characters, or manual triggering with CTRL+Space. + +##### *Calltip trigger* + +Control when parameter information appears. Options include automatic triggering when opening a function parenthesis, or manual triggering. + +##### *Incremental search* (enabled) + +Enable fuzzy/incremental searching in auto-complete. This allows you to find items by typing parts of their name, not just the beginning. + +##### *Suggest table names* (enabled) + +Include table names in auto-complete suggestions. + +##### *Always quote table names* (disabled) + +Automatically quote table names in suggestions, even when not required. + +##### *Show first letter only* (disabled) + +Only show items starting with the typed letter. Disable this to use incremental search instead. + +## DAX Editor > Code Actions + +![Placeholder: Screenshot of DAX Editor Code Actions preferences page] + +Configure automatic code improvement suggestions: + +##### *Variable prefixes* + +Define acceptable prefixes for variable names (e.g., `_`, `__`, `$`, `var_`, `var`, `v_`, `v`, `VAR_`). Code actions will suggest adding these prefixes to variable names that don't follow the convention. + +##### *Column prefixes* + +Define acceptable prefixes for temporary column names (e.g., `@`, `$`, `_`, `x`, `x_`). Code actions will suggest adding these prefixes to temporary column names that don't follow the convention. + +## SQL Editor / M Editor / C# Editor + +![Placeholder: Screenshot of SQL/M/C# Editor preferences pages] + +Similar configuration options are available for SQL, M (Power Query), and C# script editors, including: +- Syntax highlighting and color schemes +- Auto-formatting options +- Code assist and auto-complete features +- Comment styles and indentation preferences + +Each editor can be customized independently to match your preferred coding style. + +## DAX Formatter + +![Placeholder: Screenshot of DAX Formatter preferences page] + +##### *DAX formatter consent* (disabled) + +Agree to send DAX code to the external DAX formatting service (www.daxformatter.com). When enabled, you can use this service to format DAX code according to community standards. + +##### *DAX formatter request timeout* (5000) + +Timeout in milliseconds for DAX formatter requests. Increase this if you frequently get timeout errors when using the DAX formatter. + +## DAX Optimizer Integration + +![Placeholder: Screenshot of DAX Optimizer Integration preferences page] + +Configure integration with DAX Optimizer (Enterprise Edition only): + +##### *Connect automatically* (null/prompt) + +Automatically connect to DAX Optimizer when available. When not set, you will be prompted the first time. + +##### *Obfuscate VPAX files* (enabled) + +Anonymize model metadata when sending to DAX Optimizer. This protects sensitive information like table and column names while still allowing analysis. + +##### *Obfuscation dictionary directory* (`%LocalAppData%\TabularEditor3\DaxOptimizer`) + +Specify where obfuscation dictionaries are stored. The dictionary maintains consistent obfuscation across multiple analyses. + +## VertiPaq Analyzer + +![Placeholder: Screenshot of VertiPaq Analyzer preferences page] + +##### *Include TOM metadata* (enabled) + +Include Tabular Object Model metadata in VertiPaq Analyzer statistics. This provides richer information about your model structure. + +##### *Read stats from data* (enabled) + +Read statistics by scanning actual data (more accurate but slower). When disabled, only metadata is used. + +##### *Direct Lake extraction mode* (ResidentOnly) + +How to extract statistics from Direct Lake models: +- **ResidentOnly**: Only analyze data currently loaded in memory +- **All**: Include non-resident data (slower, may trigger data loading) + +##### *Read stats from Dynamic Management Views* (disabled) + +Use DMVs to gather statistics (faster but less accurate). This is an alternative to reading from data. + +##### *Relationship sample rows* (3) + +Number of rows to sample when analyzing relationships. Higher values provide more accuracy but take longer. + +##### *Column batch size* (50) + +Number of columns to analyze in each batch. Adjust this based on your model size and performance requirements. + +## Power BI Integration + +![Placeholder: Screenshot of Power BI Integration preferences page] + +##### *Power BI endpoint base URL* (`https://api.powerbi.com`) + +The base URL for Power BI API calls. Change this if you're working with a sovereign cloud or custom environment. + +##### *Fabric endpoint base URL* (`https://api.fabric.microsoft.com`) + +The base URL for Microsoft Fabric API calls. Change this if you're working with a sovereign cloud or custom environment. + +##### *Use embedded browser for authentication* (enabled) + +Use the embedded browser for OAuth authentication instead of the system browser. This provides a more integrated experience. + +## Proxy Settings + +![Placeholder: Screenshot of Proxy Settings preferences page] + +##### *Proxy type* (None) + +Choose between: +- **None**: No proxy configuration +- **System**: Use system proxy settings +- **Custom**: Specify custom proxy configuration + +##### *Proxy address* + +The address of the proxy server (e.g., `http://proxy.company.com:8080`). + +##### *Proxy user* + +Username for proxy authentication if required. + +##### *Proxy password* + +Password for proxy authentication (stored encrypted). + +##### *Use default credentials* (enabled) + +Use the current Windows credentials for proxy authentication. This implements the [same behavior as Power BI Desktop](https://docs.microsoft.com/en-us/power-bi/connect-data/desktop-troubleshooting-sign-in#using-default-system-credentials-for-web-proxy). + +##### *Bypass proxy on local* (enabled) + +Bypass the proxy for local addresses. This is recommended for performance. + +##### *Proxy bypass list* + +List of addresses that should bypass the proxy (e.g., `localhost;*.company.local`). + +## Next Steps -On this page, you can configure the two most important Code Assist features, namely calltips (aka. "parameter info") and auto-complete. The settings mostly control under what circumstances the calltips and auto-complete box appears on the screen. However, for the auto-complete, there are a number of features for controlling which items are suggested, whether table names should always be quoted, incremental search, etc. +For a user-friendly guide to the most commonly adjusted preferences, see the getting started guide (Personalizing TE3)[xrefid: personalizing-te3].