Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added content/assets/images/advanced-refresh-menu.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added content/assets/images/advanced-refresh.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added content/assets/images/common/WorkspaceGitSync.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified content/assets/images/impersonation-dropdown.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified content/assets/images/select-impersonation.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
104 changes: 104 additions & 0 deletions content/features/advanced-refresh.md
Original file line number Diff line number Diff line change
@@ -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
194 changes: 194 additions & 0 deletions content/features/built-in-bpa-rules.md
Original file line number Diff line number Diff line change
@@ -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
<!--
![Placeholder: Screenshot showing BPA preferences with global enable/disable toggle and per-rule checkboxes](~/content/assets/images/features/bpa-built-in-rules-preferences.png)
-->
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
<!--<!--
![Placeholder: Screenshot of first-run notification dialog introducing built-in BPA rules](~/content/assets/images/features/bpa-built-in-rules-notification.png)
-->
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

<!--
![Placeholder: Screenshot showing BPA window with rule selected and "View Documentation" button highlighted](~/content/assets/images/features/bpa-built-in-rules-kb-link.png)
-->
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.

<!--
![Placeholder: Screenshot showing built-in rule with read-only badge/icon in BPA window](~/content/assets/images/features/bpa-built-in-rules-readonly.png)
-->
### 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:

<!--
### Error Prevention Rules
- [Avoid Invalid Characters in Object Names](xref:kb.bpa-avoid-invalid-characters-names)
- [Avoid Invalid Characters in Descriptions](xref:kb.bpa-avoid-invalid-characters-descriptions)
- [Expression Required for Calculated Objects](xref:kb.bpa-expression-required)
- [Data Column Must Have Source](xref:kb.bpa-data-column-source)
- [Relationship Columns Must Have Same Data Type](xref:kb.bpa-relationship-same-datatype)
- [Avoid Provider Partitions with Structured Data Sources](xref:kb.bpa-avoid-provider-partitions-structured)

### Performance Rules
- [Many-to-Many Relationships Should Use Single Direction](xref:kb.bpa-many-to-many-single-direction)
- [Hide Foreign Key Columns](xref:kb.bpa-hide-foreign-keys)
- [Set SummarizeBy to None for Numeric Columns](xref:kb.bpa-do-not-summarize-numeric)
- [Remove Auto Date Tables](xref:kb.bpa-remove-auto-date-table)
- [Remove Unused Data Sources](xref:kb.bpa-remove-unused-data-sources)

### Formatting Rules
- [Provide Format String for Measures](xref:kb.bpa-format-string-measures)
- [Provide Format String for Numeric and Date Columns](xref:kb.bpa-format-string-columns)
- [Visible Objects Should Have Descriptions](xref:kb.bpa-visible-objects-no-description)
- [Trim Object Names](xref:kb.bpa-trim-object-names)
- [Date Table Should Exist](xref:kb.bpa-date-table-exists)

### Maintenance Rules
- [Calculation Groups Should Contain Items](xref:kb.bpa-calculation-groups-no-items)
- [Perspectives Should Contain Objects](xref:kb.bpa-perspectives-no-objects)
- [Use Latest Power BI Compatibility Level](xref:kb.bpa-powerbi-latest-compatibility)
-->

## 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)
2 changes: 0 additions & 2 deletions content/features/save-to-folder.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Loading