diff --git a/content/_apiSource/TOMWrapper.dll b/content/_apiSource/TOMWrapper.dll index 36c2c28f..9cc2ad66 100644 Binary files a/content/_apiSource/TOMWrapper.dll and b/content/_apiSource/TOMWrapper.dll differ diff --git a/content/_apiSource/TOMWrapper.xml b/content/_apiSource/TOMWrapper.xml index a04f9644..e7b5b25f 100644 --- a/content/_apiSource/TOMWrapper.xml +++ b/content/_apiSource/TOMWrapper.xml @@ -343,6 +343,13 @@ + + + Scripts the specified objects as TMDL (only produces meaningful output when all objects belong to the same parent) + + + + Scripts the specified object as TMDL, with an option to use spaces or tabs for indentation. @@ -351,6 +358,14 @@ True to use spaces for indentation, otherwise tabs + + + Scripts the specified objects as TMDL (only produces meaningful output when all objects belong to the same parent) + + + True to use spaces for indentation, otherwise tabs + + Scripts the entire database as a CreateOrReplace @@ -532,6 +547,9 @@ CTOR - only called from static factory methods on the class + + + Removes all annotations from the model, that are used by Tabular Editor to serialize metadata in a way different from the TOM. For example, @@ -1053,6 +1071,51 @@ Do not reference this member directly in your code. It supports the Analysis Services infrastructure. + + + Column index's building behavior. + This enum is only supported when the compatibility level of the database is at Preview or above. + + + + Default behavior - the server will not build string column's suffix index + + + + + The server will build but not persist string column's suffix index + + + + + The server will build and persist string column's suffix index by RefreshIndex command + + + + + The server will build and persist string column's suffix index by either RefreshRecalc, RefreshFull or RefreshIndex command + + + + + Defines categories of metadata elements. + This enum is only supported when the compatibility level of the database is at 1703 or above. + + + + Inherit the value from the system defined behavior. + + + + + Read-only users cannot access sensitive metadata in the model, such as measure definitions or other calculation expressions. + + + + + Allow read of metadata elements related to definitions of calculations. + + Access control to a data defined by a metadata object. @@ -1450,7 +1513,7 @@ - No filtering will occur from either end of the relationship. + Blocks RLS filter propagation from the One side to the Many side of a table relationship. This only applies to limited relationships in which at least one table is from a Power BI semantic model or Analysis Services database and the other table is from a different data source. This value is only supported when the compatibility level of the database is at 1561 or above. @@ -2032,11 +2095,6 @@ Also creates the underlying metadataobject and adds it to the TOM tree. - - - Creates an exact copy of this CalculatedTableColumn object. - - The parent Table of the current Calculated Table Column. @@ -2251,6 +2309,11 @@ A tag that represents the lineage of the source for the object. This property is only supported when the compatibility level of the database is at 1550 or above. + + + This property allows building and persisting of string column's index. A column may use one of the following values: Off, Auto, Explicit or Full. Default value for the property is Auto. Setting it to Auto will build an index but not persist it. Setting it to Explicit will build and persist an index by running command RefreshIndex. Setting it to Full will build and persist an index by running either RefreshRecalc, RefreshFull or RefreshIndex command. + This property is only supported when the compatibility level of the database is at Preview or above. + The parent table of the current Column. @@ -2385,6 +2448,11 @@ Enumerates all hierarchy levels that are based on this column. + + + Enumerates all the calendars in which the column is used, either mapped to a time unit or as a time related column + + Enumerates all columns where this column is used as the SortBy column. @@ -2510,6 +2578,11 @@ Sets the SourceLineageTag property of all objects in the collection at once. + + + Sets the StringIndex property of all objects in the collection at once. + + Sets the SortByColumn property of all objects in the collection at once. @@ -4225,6 +4298,11 @@ Determines Selection Expression behavior for Calculation Groups This property is only supported when the compatibility level of the database is at 1609 or above. + + + The policy that applies to the users with read permissions only and controls their access to various metadata elements. + This property is only supported when the compatibility level of the database is at 1703 or above. + A reference to a default measure. @@ -5530,7 +5608,7 @@ - Indicates how relationships influence filtering of data when evaluating row-level security expressions. Possible values are as follows. OneDirection (1): The rows selected in the 'To' end of the relationship will automatically filter scans of the table in the 'From' end of the relationship. BothDirections (2): Filters on either end of the relationship will automatically filter the other table. + Indicates how relationships influence filtering of data when evaluating row-level security expressions. See SecurityFilteringBehavior enumeration for possible values and their descriptions. @@ -7271,6 +7349,27 @@ + + + Finds the time unit association for the specified time unit. Returns null if no association exists for the specified time unit. + + + + + + + Gets the time unit mapping for the specified column. Returns if the column is not mapped to any time units. + + + + + + + Removes the specified column from this calendar. Returns true if the column was removed, false otherwise. + + + + Removes the specified time unit association from the calendar. @@ -7278,6 +7377,94 @@ + + + Adds a new time-related column group to the calendar. + + The newly created TimeRelatedColumnGroup + + + + Returns all time-related column groups in the calendar. + + An enumerable collection of TimeRelatedColumnGroup objects + + + + Removes the specified time-related column group from the calendar. + + The TimeRelatedColumnGroup to remove + True if the group was found and removed; otherwise, false + Thrown when group is null + + + + Adds a column to a time-related column group. If no groups exist, creates a new one. + If multiple groups exist, adds to the first group. + + The column to add + The TimeRelatedColumnGroup that contains the added column + Thrown when column is null + Thrown when column does not belong to the same table as the calendar + + + + Removes a column from all time-related column groups in the calendar. + + The column to remove + True if the column was found and removed from at least one group; otherwise, false + Thrown when column is null + + + + Gets all time-related columns across all time-related column groups in this calendar. + + An enumerable collection of all time-related columns + + + + Checks if a column is part of any time-related column group in this calendar. + + The column to check + True if the column is in a time-related column group; otherwise, false + + + + Moves this calendar to a different table by deleting it and recreating it on the target table. + All time unit mappings, associated columns, and time-related columns are cleared because + columns typically differ between tables. + + The table to move this calendar to + Thrown when destinationTable is null + Thrown when attempting to move to the same table + + + + Moves this calendar to a different table by name. + + The name of the table to move this calendar to + Thrown when the table is not found + + + + Gets the list of objects that reference this calendar based on their DAX expressions. + + + + + Gets a string that may be used for referencing the calendar in a DAX expression. + + + + + Gets a string that may be used for referencing the caæemdar in a DAX expression. + + + + + Gets a string that may be used for referencing the calendar in a DAX expression. + + Collection class for Calendar. Provides convenient properties for setting a property on multiple objects at once. @@ -7304,6 +7491,13 @@ Sets the SourceLineageTag property of all objects in the collection at once. + + + This property points to the CalendarCollection itself. It is used only to display a clickable + "Calendar" property in the Property Grid, which will open the CalendarCollectionEditor when + clicked. + + The Expression of this Calculated Table. @@ -7496,6 +7690,9 @@ Gets or sets the Name of the underlying referenced object used to query and populate current partition. + + + Represents a Folder in the TreeView. Does not correspond to any object in the TOM. @@ -7514,9 +7711,9 @@ Display Folders are not represented as individual objects in TOM. Instead, an object that can be shown in a Display Folder, has a DisplayFolder (string) property. However, due to the way most TreeView-style UI components work, it is beneficial - to construct a cache of display folder objects for each table. Each folder object has a list of child objects. The cache - needs to be reconstructured when objects are moved around, or when the display culture is changed (as display folders are - translatable). + to construct a cache of display folder objects for each object container (tables). Each folder object has a list of child + objects. The cache needs to be reconstructured when objects are moved around, or when the display culture is changed (as + display folders are translatable). @@ -7699,7 +7896,7 @@ - Objects that can be referenced in a DAX expression (table, column, measure) + Objects that can be referenced in a DAX expression (table, column, measure, calendar) @@ -7816,6 +8013,16 @@ of the type held by the array. + + + + + + + + Indicates that a dummy partition to replace any PolicyRange partitions that were removed during serialization + + Converts an array of culture names into an equivalent TOM representation of the Culture @@ -8361,6 +8568,13 @@ The type of this object (Folder, Measure, Table, etc.). + + + Gives implementations a chance to resolve missing references after deserializing from JSON, but before adding the object to the collection. + + + + Fired after a property is changed @@ -8644,6 +8858,11 @@ Looks up a localized string similar to Columns. + + + Looks up a localized string similar to This column is used in one or more calendars. Deleting it will also remove the column from those calendars.. + + Looks up a localized string similar to This column is used in one or more hierarchies. The corresponding levels will also be deleted.. @@ -8664,6 +8883,11 @@ Looks up a localized string similar to Structured Data Sources can only be added to Compatibility Level 1400 or higher models.. + + + Looks up a localized string similar to Server does not support compatibility level {0}. Save the model as a .bim file if you need to set the compatibility level to a value that is not supported by this server.. + + Looks up a localized string similar to Culture for '{0}' is specified more than once.. @@ -8794,6 +9018,16 @@ Looks up a localized string similar to User-Defined Functions cannot contain the character '{0}' in their name.. + + + Looks up a localized string similar to '{0}' is a reserved word and cannot be used as the name of a User-Defined Function.. + + + + + Looks up a localized string similar to '{0}' is a reserved word and cannot be used as part of the name of a User-Defined Function.. + + Looks up a localized string similar to Unable to perform insert. @@ -9150,7 +9384,12 @@ - When the name of a measure is changed, DAX formulas referencing the measure has to be updated. + When the name of a UDF is changed, DAX formulas referencing the UDF has to be updated. + + + + + When the name of a calendar is changed, DAX formulas referencing the calendar has to be updated. @@ -9170,6 +9409,11 @@ When the expression of a measure is changed, the resulting data type of the measure might change, potentially causing cascasdes. + + + When the column mappings of a calendar is changed, it may become incompatible/compatible with certain time-intel DAX functions, potentially causing cascades. + + When the expression of a KPI is changed, the resulting data type of the KPI might change, potentially causing cascasdes. diff --git a/content/_apiSource/TabularEditor3.Shared.dll b/content/_apiSource/TabularEditor3.Shared.dll index 9e5284f6..ae411f2e 100644 Binary files a/content/_apiSource/TabularEditor3.Shared.dll and b/content/_apiSource/TabularEditor3.Shared.dll differ diff --git a/content/_apiSource/TabularEditor3.Shared.xml b/content/_apiSource/TabularEditor3.Shared.xml index 0af3acce..0b8594c6 100644 --- a/content/_apiSource/TabularEditor3.Shared.xml +++ b/content/_apiSource/TabularEditor3.Shared.xml @@ -4,6 +4,13 @@ TabularEditor3.Shared + + + Custom JsonConverter for OverrideCollection from Microsoft.AnalysisServices.Tabular + This will be automatically applied when OverrideCollection instances are serialized + within collections (List, Dictionary, etc.) if registered in JsonSerializerSettings. + + Provides a scheduler that uses STA threads. @@ -50,6 +57,11 @@ Base path when the analyzer searches for rule files (typically the same path as the Model.bim or database.json file is stored in) + + + Apply user's disabled rule state from preferences. This is called from BpaService. + + Replaces object, object name and object type tokens in the given description @@ -78,12 +90,18 @@ - + - This object must be constructed on the UI thread, as it uses the WindowsFormsSynchronizationContext. + Contains Azure AD client IDs and scopes used for authentication. - + + + Gets the Power BI scopes based on the Power BI REST API endpoint URL. + Different cloud environments (commercial, government, Germany, China) require different scopes. + + + Gets an ExtendedFabricClient object - either from the cache (i.e. the most recently used one) or by creating a new one if the cache is empty. User will be prompted for credentials if no cached client is available. @@ -95,9 +113,10 @@ - + - This object must be created on the UI thread, as it captures the synchronization context for use when the custom web UI is invoked. + Checks if the given exception represents an authentication cancellation by the user. + Handles Azure.Identity, MSAL (used by TOM), SqlClient, and OleDb authentication cancellations. @@ -570,6 +589,16 @@ The currently selected column (if exactly one column is selected in the explorer tree). + + + The currently selected calendars. + + + + + The currently selected calendar (if exactly one calendar is selected in the explorer tree). + + The currently selected object (if exactly one object is selected in the explorer tree). @@ -778,6 +807,383 @@ Looks up a localized string similar to Username and password. + + + Looks up a localized string similar to {0} B. + + + + + Looks up a localized string similar to Error Prevention. + + + + + Looks up a localized string similar to Formatting. + + + + + Looks up a localized string similar to Governance. + + + + + Looks up a localized string similar to Maintenance. + + + + + Looks up a localized string similar to Model Layout. + + + + + Looks up a localized string similar to Naming Conventions. + + + + + Looks up a localized string similar to Performance. + + + + + Looks up a localized string similar to Object descriptions must not contain control characters (except whitespace). Invalid characters will prevent model deployment and cause errors. The fix expression automatically replaces invalid characters with spaces.. + + + + + Looks up a localized string similar to Avoid invalid characters in descriptions. + + + + + Looks up a localized string similar to Object names must not contain control characters (except whitespace). Invalid characters will prevent model deployment and cause errors. The fix expression automatically replaces invalid characters with spaces.. + + + + + Looks up a localized string similar to Avoid invalid characters in names. + + + + + Looks up a localized string similar to Power BI does not support legacy provider partitions that reference structured data sources. Partitions using structured data sources must use M expressions, or the structured data source should be converted to a provider data source to avoid deployment failures. + + Reference: https://docs.microsoft.com/power-bi/admin/service-premium-connect-tools#data-source-declaration + . + + + + + Looks up a localized string similar to Avoid structured data sources with provider partitions. + + + + + Looks up a localized string similar to Calculation groups without calculation items are non-functional and should be removed. A calculation group must contain at least one calculation item to provide any value.. + + + + + Looks up a localized string similar to Calculation groups with no calculation items. + + + + + Looks up a localized string similar to Every data column must reference a source column from the data source. Missing source column mappings will cause processing failures when refreshing the model.. + + + + + Looks up a localized string similar to Data columns must have a source column. + + + + + Looks up a localized string similar to Models should include a date table marked with DataCategory 'Time' to enable time intelligence functions and provide proper date filtering capabilities. Without a date table, time-based calculations and analysis may not work correctly.. + + + + + Looks up a localized string similar to Model should have a date table. + + + + + Looks up a localized string similar to Visible numeric columns should have SummarizeBy set to 'None' to prevent automatic aggregation in Power BI. Use explicit measures instead of implicit column aggregation to ensure correct calculations and better performance.. + + + + + Looks up a localized string similar to Do not summarize numeric columns. + + + + + Looks up a localized string similar to Measures, calculated columns, and calculation items require a DAX expression to function. Objects without expressions will not return any values and may cause errors in reports.. + + + + + Looks up a localized string similar to Expression-reliant objects must have an expression. + + + + + Looks up a localized string similar to Visible numeric and date columns should have a format string defined to ensure consistent and appropriate display formatting in reports. This improves user experience and data readability.. + + + + + Looks up a localized string similar to Provide format string for visible numeric columns. + + + + + Looks up a localized string similar to Visible numeric and date measures should have a format string defined to ensure consistent and appropriate display formatting in reports. This improves user experience and data readability.. + + + + + Looks up a localized string similar to Provide format string for visible numeric measures. + + + + + Looks up a localized string similar to Columns used on the many side of relationships should be hidden from end users. These foreign key columns are typically only needed for relationships and should not be used directly in reports.. + + + + + Looks up a localized string similar to Hide foreign keys. + + + + + Looks up a localized string similar to Hidden columns that are not used for sorting or in hierarchies should have their IsAvailableInMdx property set to false. This prevents unnecessary attribute hierarchy creation, reducing processing time and memory consumption. + + Reference: https://blog.crossjoin.co.uk/2018/07/02/isavailableinmdx-ssas-tabular/. + + + + + Looks up a localized string similar to Set IsAvailableInMdx to false on non-attribute columns. + + + + + Looks up a localized string similar to Columns used for sorting, in hierarchies, in variations, or that have a sort-by column must have IsAvailableInMdx set to true. Disabling attribute hierarchies on these columns will cause errors or unexpected behavior.. + + + + + Looks up a localized string similar to Set IsAvailableInMdx to true on necessary columns. + + + + + Looks up a localized string similar to Bi-directional filtering on many-to-many relationships can cause performance issues and ambiguous filter context. Use single-direction filtering unless bi-directional filtering is specifically required for your scenario.. + + + + + Looks up a localized string similar to Many-to-many relationships should be single-direction. + + + + + Looks up a localized string similar to Perspectives without any tables serve no purpose and should be removed. Empty perspectives add unnecessary complexity without providing any value to end users.. + + + + + Looks up a localized string similar to Perspectives with no objects. + + + + + Looks up a localized string similar to Power BI models should use the latest generally available compatibility level (currently {0}) to access the newest features, performance improvements, and ensure ongoing support.. + + + + + Looks up a localized string similar to Power BI models should use latest compatibility level. + + + + + Looks up a localized string similar to Both columns in a relationship must have matching data types to ensure proper functionality. Mismatched data types can cause relationship failures, unexpected results, or performance degradation. Integer data types are recommended for optimal performance.. + + + + + Looks up a localized string similar to Relationship columns should be of the same data type. + + + + + Looks up a localized string similar to Auto-generated date tables (DateTableTemplate_ or LocalDateTable_) should be removed from the model. Disable auto-date tables in Power BI Desktop settings and use explicit date tables instead to reduce memory consumption and improve model performance. + + Reference: https://www.youtube.com/watch?v=xu3uDEHtCrg. + + + + + Looks up a localized string similar to Remove auto-date table. + + + + + Looks up a localized string similar to Data sources that are not referenced by any partition or table expression can be safely removed from the model. Removing unused data sources helps keep the model clean and easier to maintain.. + + + + + Looks up a localized string similar to Remove data sources not referenced by any partitions. + + + + + Looks up a localized string similar to Rules for the local user. + + + + + Looks up a localized string similar to Rules on the local machine. + + + + + Looks up a localized string similar to SQL Server connection strings should include an Application Name parameter to help database administrators identify the source of connections. Use a descriptive name like 'AnalysisServicesTabular [ServerName] [ModelName]' for easier troubleshooting and monitoring.. + + + + + Looks up a localized string similar to Specify Application Name in connection string. + + + + + Looks up a localized string similar to When your model supports multiple languages, object descriptions should be translated for each culture. This ensures all users can understand the purpose and content of objects regardless of their language preference.. + + + + + Looks up a localized string similar to Translate Object Descriptions. + + + + + Looks up a localized string similar to When your model supports multiple languages, display folders should be translated for each culture. Without translations, users viewing the model in different languages will not see the intended folder organization.. + + + + + Looks up a localized string similar to Translate Display Folders. + + + + + Looks up a localized string similar to When your model supports multiple languages, hierarchy level names should be translated for each culture. This ensures users can understand the hierarchy structure in their preferred language.. + + + + + Looks up a localized string similar to Translate Hierarchy Levels. + + + + + Looks up a localized string similar to When your model supports multiple languages, the model and perspective names should be translated for each culture. This provides a fully localized experience for users in different regions.. + + + + + Looks up a localized string similar to Translate Perspectives. + + + + + Looks up a localized string similar to When your model supports multiple languages, visible object names should be translated for each culture. This provides a localized experience for users working in different languages.. + + + + + Looks up a localized string similar to Translate Visible Object Names. + + + + + Looks up a localized string similar to Object names should not have leading or trailing spaces. These unintentional spaces commonly occur when copying or duplicating objects and can cause confusion and inconsistency.. + + + + + Looks up a localized string similar to Trim object names. + + + + + Looks up a localized string similar to Visible calculation groups should have descriptions to explain their purpose and how the calculation items modify measure behavior. Descriptions appear in tooltips in Power BI Desktop and can be used to generate automated data documentation.. + + + + + Looks up a localized string similar to Visible calculation groups with no description. + + + + + Looks up a localized string similar to Visible columns should have descriptions to help users understand what data they contain. Descriptions appear in tooltips in Power BI Desktop and can be used to generate automated data documentation.. + + + + + Looks up a localized string similar to Visible columns with no description. + + + + + Looks up a localized string similar to Visible measures should have descriptions to explain what they calculate and how they should be used. Descriptions appear in tooltips in Power BI Desktop and can be used to generate automated data documentation.. + + + + + Looks up a localized string similar to Visible measures with no description. + + + + + Looks up a localized string similar to Visible tables should have descriptions to help users understand their purpose and content. Descriptions appear in tooltips in Power BI Desktop and can be used to generate automated data documentation.. + + + + + Looks up a localized string similar to Visible tables with no description. + + + + + Looks up a localized string similar to User-defined functions should have descriptions documenting their purpose, parameters, and return values. This helps developers understand how to use these custom functions correctly.. + + + + + Looks up a localized string similar to User-defined functions with no description. + + + + + Looks up a localized string similar to {0} Bytes. + + + + + Looks up a localized string similar to Cannot perform processing on a disconnected model.. + + Looks up a localized string similar to Column values. @@ -788,6 +1194,21 @@ Looks up a localized string similar to Datamart. + + + Looks up a localized string similar to Data refresh complete.. + + + + + Looks up a localized string similar to Data refresh failed.. + + + + + Looks up a localized string similar to Data refresh started.... + + Looks up a localized string similar to DAX Optimizer account registration incomplete. Please visit <href="{0}">{1}</href> to finalize.. @@ -798,15 +1219,25 @@ Looks up a localized string similar to File upload to the DAX Optimizer service is disabled by a local policy.. + + + Looks up a localized string similar to Disabled due to low model compatibility level ({0} < {1}). + + Looks up a localized string similar to Semantic Model (Default). + + + Looks up a localized string similar to Error. + + Looks up a localized string similar to An error occurred while trying to deserialize the User Options (.tmuo) file: - + {0}. @@ -820,6 +1251,11 @@ Looks up a localized string similar to External browser. + + + Looks up a localized string similar to {0} GB. + + Looks up a localized string similar to Always. @@ -850,16 +1286,41 @@ Looks up a localized string similar to Sorting and filtering is reset when the query is modified, ignoring whitespace/comment modifications.. + + + Looks up a localized string similar to {0} KB. + + Looks up a localized string similar to Lakehouse. + + + Looks up a localized string similar to {0} MB. + + + + + Looks up a localized string similar to {0} M. + + + + + Looks up a localized string similar to Mirrored Azure Databricks catalog. + + Looks up a localized string similar to Mirrored Database. + + + Looks up a localized string similar to {0} model refresh. + + Looks up a localized string similar to My Workspace. @@ -875,6 +1336,11 @@ Looks up a localized string similar to OAuth. + + + Looks up a localized string similar to {0} refresh of {1:partition {2}|{} partitions}. + + Looks up a localized string similar to Custom. @@ -890,11 +1356,54 @@ Looks up a localized string similar to System. + + + Looks up a localized string similar to (Relationships). + + + + + Looks up a localized string similar to sales@tabulareditor.com. + + + + + Looks up a localized string similar to Save changes before processing?. + + + + + Looks up a localized string similar to You have made changes to the model metadata which has not yet been saved. Do you want to save these changes before starting the refresh job?. + + Looks up a localized string similar to Scalar expression. + + + Looks up a localized string similar to SemanticBridge service failed to initialize. + {0} + Please contact {1} with this information for assistance. + + Exception: + {2}. + + + + + Looks up a localized string similar to SemanticBridge service is not available due to your license level. + {0} + Please contact {1} with this information for assistance.. + + + + + Looks up a localized string similar to SemanticBridge service is not available for an unknown reason. + This is an unexpected error. Please contact {0} for assistance. + + Looks up a localized string similar to Semantic Model. @@ -915,26 +1424,76 @@ Looks up a localized string similar to SQL Database. + + + Looks up a localized string similar to Start processing when metadata are out-of-sync?. + + + + + Looks up a localized string similar to You have made changes to the model metadata which has not yet been saved, and a refresh job is currently in progress. Would you like to queue a new refresh job anyway?. + + + + + Looks up a localized string similar to support@tabulareditor.com. + + Looks up a localized string similar to Table expression. + + + Looks up a localized string similar to {0} refresh of {1:table {2}|{} tables}. + + + + + Looks up a localized string similar to {0} K. + + Looks up a localized string similar to Unable to find a warehouse, lakehouse, SQL database, or Mirrored Database with the specified workspaceId {0} and objectId {1}. + + + Looks up a localized string similar to Unable to process partition '{0}'. The partition is not available on the deployed database.. + + + + + Looks up a localized string similar to Unable to process table '{0}'. The table is not available on the deployed database.. + + Looks up a localized string similar to (Unknown). + + + Looks up a localized string similar to View refresh queue. + + Looks up a localized string similar to Warehouse. + + + Looks up a localized string similar to Warning. + + + + + This class ensures that a connection string is encrypted/decrypted in case it contains sensitive data. + + Contains various extension methods which are commonly used in scripts @@ -1185,6 +1744,61 @@ An object that represents the current selection in the TOM Explorer. + + + SemanticBridge service for cross-platform semantic model operations. + + + + State Persistence: The service maintains state (e.g., currently loaded MetricView) + that persists across multiple script executions, allowing workflows like: + + // Script 1: Load and validate + SemanticBridge.MetricView.Load(@"C:\data.yaml"); + var diag = SemanticBridge.MetricView.Validate(); + + // Script 2 (later): Use the same loaded view + SemanticBridge.MetricView.ImportToTabular(Model, "host", "path", out var diag); + + + + Availability: This service requires an appropriate license. If + the feature is disabled, accessing it will throw a + with guidance. + + + + Load and validate a Databricks MetricView: + + SemanticBridge.MetricView.Load(@"C:\path\to\metricview.yaml"); + var diagnostics = SemanticBridge.MetricView.Validate(); + foreach (var diag in diagnostics) + { + Output($"{diag.Severity}: {diag.Message}"); + } + + + Import a MetricView into the current Tabular model: + + SemanticBridge.MetricView.Load(@"C:\path\to\metricview.yaml"); + var success = SemanticBridge.MetricView.ImportToTabular( + Model, + "databricks-host.cloud.databricks.com", + "/sql/1.0/warehouses/abc123", + out var diagnostics); + if (!success) + { + foreach (var error in diagnostics) + Output($"Import failed: {error.Message}"); + } + + + + Thrown when the SemanticBridge service is not available (feature not enabled for license tier) + + + + Collects VertiPaq Analyzer statistics for the currently loaded model. @@ -1595,16 +2209,6 @@ TODO: Handle DirectQuery / user-delegated credentials - - - This object must be constructed on the UI thread, as it uses the WindowsFormsSynchronizationContext. - - - - - This object must be constructed on the UI thread, as it uses the WindowsFormsSynchronizationContext - - This object must be constructed on the UI thread, as it uses the WindowsFormsSynchronizationContext @@ -1672,11 +2276,6 @@ RegistryKey For the complex Subkey. - - - This object must be constructed on the UI thread, as it uses the WindowsFormsSynchronizationContext. - - Returns the directory of the provided filePath. @@ -1753,6 +2352,12 @@ True to allow DAX debugging. + + + True to allow use of the SemanticBridge library for cross-platform + model migrations + + True to allow XMLA connectivity. @@ -1763,6 +2368,11 @@ True to allow Enterprise features, such as DirectLake in Power BI, or Perspectives/Multi-partitions in SSAS/Azure AS + + + Show Built-in BPA rules + + True to allow the client to connect to any XMLA endpoint, skipping the check for and the type of @@ -1784,6 +2394,16 @@ When this feature switch is enabled, end users may enable the Git Integration Preview feature (through the preferences dialog) + + + True to allow saving semantic models with Fabric supporting files (.platform and definition.pbism). + + + + + True to allow access to the Advanced Refresh dialog. + + Checks if the currently loaded model (if any) has unsaved chanages, and prompt the user if they want to save it. @@ -1850,6 +2470,17 @@ Model is not yet saved to disk + + + Manages lifecycle of Semantic Bridge service; initialization and + re-initialization on license state changes. + + + + + Gets the current initialization result, re-evaluating if license state changed. + + Corresponds to MessageBoxIcon @@ -1865,6 +2496,22 @@ Corresponds to Windows.Forms.MessageBoxButtons + + + Loads UserOptions for a model connected via XMLA endpoint. + + The server name or connection string. + The database name. + The loaded UserOptions or a new instance if none exists. + + + + Saves UserOptions for a model connected via XMLA endpoint. + + The server name or connection string. + The database name. + The UserOptions to save. + @@ -1944,6 +2591,41 @@ Always: Sorting and filtering are never reset if the columns still exist. + + + Provides additional configuration options for data refresh operations. + + + + + + + + + + Provides additional configuration options for data refresh operations. + + + + + + + + + + + + + + + + + + + + + + This method performs the specified data operation in a safe manner. @@ -1958,6 +2640,74 @@ + + + Adapter that bridges IFeatureSwitchService (internal to + TabularEditor3.Shared) to ISemanticBridgeFeatureCheck (internal to + SemanticBridge). This allows SemanticBridge to check feature flags + without creating circular dependencies. + TabularEditor3.Shared needs to depend on SemanticBridge to set up the + C# scripting environment, so we can't use IFeatureSwitchService + directly in SemanticBridge. + + + + + Adapter that bridges IFeatureSwitchService (internal to + TabularEditor3.Shared) to ISemanticBridgeFeatureCheck (internal to + SemanticBridge). This allows SemanticBridge to check feature flags + without creating circular dependencies. + TabularEditor3.Shared needs to depend on SemanticBridge to set up the + C# scripting environment, so we can't use IFeatureSwitchService + directly in SemanticBridge. + + + + + Returns true if the SemanticBridge feature is enabled based on the + current license tier. + + + + + Used by Main.cs during application startup to preserve failure context. + The Result contains the service instance in the Success case. + + + + Smart Setter Behavior: The setter only updates the backing + field if the result type changes. + This preserves state if we see multiple events which would enable + the service, e.g. Trial -> Enterprise + + + License Transition Examples: + + + Not Enterprise → Enterprise: Service becomes available + + + Enterprise → Not Enterprise: Service becomes unavailable + + + Enterprise → Enterprise: No-op, existing service preserved + + + + + + + + Logs telemetry for unexpected initialization failures. + Success and LicenseFailure are expected outcomes and do not trigger logging. + + The initialization result to evaluate for telemetry logging. + + + + Checks if the given exception represents an authentication cancellation by the user. + + Indicates that every identifier must be enclosed in a pair of backticks @@ -1985,6 +2735,12 @@ Process telemetry exceptions to ensure that the exception message does not contain sensitive data + + + Gets the file path for storing UserOptions for a server model. + Format: %LocalAppData%\TabularEditor3\UserOptions\{sanitizedServerName}.{databaseName}.{userName}.tmuo + + Can be a folder or a file @@ -2023,11 +2779,6 @@ the expression in a TOPN. - - - This class ensures that a connection string is encrypted/decrypted in case it contains sensitive data. - - Represents fixed or ignored recommendations at the model level 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..9a05242f --- /dev/null +++ b/content/features/advanced-refresh.md @@ -0,0 +1,110 @@ +--- +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 + none: 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**. + +> [!Note] +> The Advanced Refresh dialog is available on the Business and Enterprise Edition. + +![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 + +> [!TIP] +> See [Refresh Override Profiles](xref:refresh-overrides) for detailed examples and TMSL code snippets you can use as starting points for your own override profiles. + +### 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..29bca6f9 --- /dev/null +++ b/content/features/built-in-bpa-rules.md @@ -0,0 +1,190 @@ +--- +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 + full: true + - edition: Business + full: 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 + +### 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/refresh-overrides.md b/content/features/refresh-overrides.md new file mode 100644 index 00000000..ff2e75df --- /dev/null +++ b/content/features/refresh-overrides.md @@ -0,0 +1,314 @@ +--- +uid: refresh-overrides +title: Refresh Override Profiles +author: Daniel Otykier +updated: 2026-01-20 +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 +--- +# Refresh Override Profiles + +Refresh override profiles allow you to temporarily modify certain model properties during a refresh operation without changing the actual model metadata. This is configured through the [Advanced Refresh dialog](xref:advanced-refresh). + +## Why use refresh overrides? + +When developing and testing semantic models, you often need to refresh data with different configurations than what's defined in the model metadata. Common scenarios include: + +- **Loading a subset of data** to speed up development refresh operations +- **Connecting to a different data source** (e.g., a development or test database) +- **Testing with different parameter values** before committing changes to the model + +Without refresh overrides, you would need to temporarily modify the model metadata, perform the refresh, and then remember to revert the changes. This approach is error-prone—it's easy to forget to revert a change, potentially resulting in incorrect metadata being deployed to production. + +Refresh overrides solve this problem by keeping temporary refresh configurations separate from the model metadata. + +## Override profile structure + +Override profiles use JSON that follows the [TMSL refresh command specification](https://learn.microsoft.com/en-us/analysis-services/tmsl/refresh-command-tmsl?view=asallproducts-allversions). The JSON is an array of override objects, where each object can contain one or more of the following: + +- `scope` - Limit the override to a specific table or partition (optional) +- `dataSources` - Override data source connection properties +- `expressions` - Override shared expressions (M parameters) +- `partitions` - Override partition source queries +- `columns` - Override column source mappings (DataColumns only) + +Each override within `dataSources`, `expressions`, `partitions`, or `columns` must include an `originalObject` property that identifies which model object to override. + +### Override scope + +By default, overrides apply globally to the refresh operation. However, you can use the `scope` property to limit an override to only affect a specific table or partition. This is useful when you want to refresh the entire model but need specific tables to source data differently than what's configured in the model metadata. + +The `scope` object can contain: +- `database` - The database name +- `table` - The table name (applies override only when refreshing this table) +- `partition` - The partition name (applies override only when refreshing this partition) + +## Examples + +Below are examples you can copy directly into a new override profile and modify for your needs. + +### Limiting rows with a SQL query override + +This example overrides a partition to load only the top 10,000 rows, useful for faster refresh during development: + +```json +[ + { + "partitions": [ + { + "originalObject": { + "database": "AdventureWorks", + "table": "FactInternetSales", + "partition": "FactInternetSales" + }, + "source": { + "query": "SELECT TOP 10000 * FROM [dbo].[FactInternetSales]" + } + } + ] + } +] +``` + +### Filtering data by date range + +Load only recent data by adding a WHERE clause: + +```json +[ + { + "partitions": [ + { + "originalObject": { + "database": "AdventureWorks", + "table": "FactInternetSales", + "partition": "FactInternetSales" + }, + "source": { + "query": "SELECT * FROM [dbo].[FactInternetSales] WHERE OrderDate >= '2024-01-01'" + } + } + ] + } +] +``` + +### Overriding multiple partitions + +You can override multiple partitions in a single profile: + +```json +[ + { + "partitions": [ + { + "originalObject": { + "database": "AdventureWorks", + "table": "FactInternetSales", + "partition": "FactInternetSales" + }, + "source": { + "query": "SELECT TOP 1000 * FROM [dbo].[FactInternetSales]" + } + }, + { + "originalObject": { + "database": "AdventureWorks", + "table": "FactResellerSales", + "partition": "FactResellerSales" + }, + "source": { + "query": "SELECT TOP 1000 * FROM [dbo].[FactResellerSales]" + } + } + ] + } +] +``` + +### Overriding a data source connection string + +Connect to a different server or database during refresh: + +```json +[ + { + "dataSources": [ + { + "originalObject": { + "database": "AdventureWorks", + "dataSource": "SqlServer localhost AdventureWorksDW" + }, + "connectionString": "Data Source=devserver;Initial Catalog=AdventureWorksDW_Dev;Integrated Security=True" + } + ] + } +] +``` + +### Overriding a shared expression (M parameter) + +Override an M parameter value, such as a server name parameter: + +```json +[ + { + "expressions": [ + { + "originalObject": { + "database": "AdventureWorks", + "expression": "ServerName" + }, + "expression": "\"devserver\" meta [IsParameterQuery=true, Type=\"Text\", IsParameterQueryRequired=true]" + } + ] + } +] +``` + +### Combining multiple override types + +You can combine data source, expression, and partition overrides in a single profile: + +```json +[ + { + "dataSources": [ + { + "originalObject": { + "database": "AdventureWorks", + "dataSource": "SqlServer localhost AdventureWorksDW" + }, + "connectionString": "Data Source=devserver;Initial Catalog=AdventureWorksDW_Dev;Integrated Security=True" + } + ], + "partitions": [ + { + "originalObject": { + "database": "AdventureWorks", + "table": "FactInternetSales", + "partition": "FactInternetSales" + }, + "source": { + "query": "SELECT TOP 5000 * FROM [dbo].[FactInternetSales]" + } + } + ] + } +] +``` + +### Overriding a Power Query partition + +For partitions that use M (Power Query), override the expression: + +```json +[ + { + "partitions": [ + { + "originalObject": { + "database": "AdventureWorks", + "table": "DimCustomer", + "partition": "DimCustomer" + }, + "source": { + "expression": "let\n Source = Sql.Database(\"devserver\", \"AdventureWorksDW_Dev\"),\n dbo_DimCustomer = Source{[Schema=\"dbo\",Item=\"DimCustomer\"]}[Data],\n #\"Kept First Rows\" = Table.FirstN(dbo_DimCustomer, 1000)\nin\n #\"Kept First Rows\"" + } + } + ] + } +] +``` + +### Using scope to target a specific table + +When refreshing the entire model, you can use the `scope` property to apply an override only to a specific table. This example overrides the data source connection string, but only when refreshing the "Sales" table: + +```json +[ + { + "scope": { + "database": "AdventureWorks", + "table": "Sales" + }, + "dataSources": [ + { + "originalObject": { + "dataSource": "SqlServer localhost AdventureWorksDW" + }, + "connectionString": "Provider=SQLNCLI11;Data Source=devserver;Initial Catalog=AdventureWorksDW_Dev;Integrated Security=SSPI;Persist Security Info=false" + } + ] + } +] +``` + +With this configuration, when you refresh the entire model, all tables will use the default data source except for the "Sales" table, which will load data from the connection specified in the override. + +### Multiple scoped overrides + +You can combine multiple scoped overrides in a single profile. This example uses different data sources for different tables: + +```json +[ + { + "scope": { + "database": "AdventureWorks", + "table": "FactInternetSales" + }, + "dataSources": [ + { + "originalObject": { + "dataSource": "SqlServer localhost AdventureWorksDW" + }, + "connectionString": "Data Source=salesdb;Initial Catalog=SalesData_Test;Integrated Security=True" + } + ] + }, + { + "scope": { + "database": "AdventureWorks", + "table": "DimCustomer" + }, + "dataSources": [ + { + "originalObject": { + "dataSource": "SqlServer localhost AdventureWorksDW" + }, + "connectionString": "Data Source=customerdb;Initial Catalog=CustomerData_Test;Integrated Security=True" + } + ] + } +] +``` + +## Tips for creating override profiles + +1. **Find object names**: The `originalObject` property requires exact names of databases, tables, partitions, data sources, and expressions as they appear in your model. You can find these names in the TOM Explorer. + +2. **Start simple**: Begin with a single override and test it before adding more complexity. + +3. **Use Export TMSL script**: After configuring an override profile, use the **Export TMSL script...** button in the Advanced Refresh dialog to see the complete TMSL command that will be generated. This helps verify your overrides are correctly applied. + +4. **Database name**: The database name in the `originalObject` should match the name of your semantic model as it appears on the server (or will appear after deployment). + +## Profile storage + +Override profiles are stored per-model in the `UserOptions.tmuo` file: + +- **For models saved on disk**: The `.tmuo` file is stored alongside the model files (e.g., in the same folder as your `.bim` file or Database.tmdl) +- **For XMLA-connected models**: The `.tmuo` files are stored under `%LocalAppData%\TabularEditor3\UserOptions` + +This means override profiles are preserved across Tabular Editor sessions. As it's not recommended to add the .tmuo files to source control, you can share override profiles among team members by manually editing the .tmuo files. \ 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..964fd566 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,9 @@ ## @workspace-mode ## @tmdl ## @save-to-folder +## @save-with-supporting-files +## @advanced-refresh +## @refresh-overrides # 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..60cd8756 --- /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) +- [User Interface Overview](xref:user-interface) diff --git a/content/references/downloads.md b/content/references/downloads.md index edef45d5..6aefba49 100644 --- a/content/references/downloads.md +++ b/content/references/downloads.md @@ -10,14 +10,14 @@ This page provides download and installation instructions for Tabular Editor 3. ## Latest version -Tabular Editor 3.24.2 **.NET 8** downloads: +Tabular Editor 3.25.0 **.NET 8** downloads: -- Download [Tabular Editor 3.24.2 (64 bit)](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.x64.Net8.exe) *(recommended)* -- Download [Tabular Editor 3.24.2 (ARM64)](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.ARM64.Net8.exe) -- Portable versions: [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.ARM64.Net8.zip) -- MSI version: [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.ARM64.Net8.msi) +- Download [Tabular Editor 3.25.0 (64 bit)](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.Installer.x64.Net8.exe) *(recommended)* +- Download [Tabular Editor 3.25.0 (ARM64)](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.Installer.ARM64.Net8.exe) +- Portable versions: [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.ARM64.Net8.zip) +- MSI version: [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.ARM64.Net8.msi) -Read the [latest release notes](release-notes/3_24_2.md). +Read the [latest release notes](release-notes/3_25_0.md). > [!NOTE] > As of Tabular Editor 3.23.0, we now provide native [ARM64](https://learn.microsoft.com/en-us/windows/arm/overview) builds. 32-bit (x86) builds have been discontinued. @@ -32,6 +32,10 @@ It is not necessary to remove previous installations when upgrading to a newer v ## History +- 2026-01-22 **Tabular Editor 3.25.0** (*[Release notes](release-notes/3_25_0.md)*) + - .NET 8 installer (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.Installer.ARM64.Net8.exe) + - .NET 8 portable (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.ARM64.Net8.zip) + - .NET 8 installer (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.ARM64.Net8.msi) - 2025-11-11 **Tabular Editor 3.24.2** (*[Release notes](release-notes/3_24_2.md)*) - .NET 8 installer (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.ARM64.Net8.exe) - .NET 8 portable (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.ARM64.Net8.zip) 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]. diff --git a/content/references/release-history.md b/content/references/release-history.md index b603c3a1..f7cde5dd 100644 --- a/content/references/release-history.md +++ b/content/references/release-history.md @@ -4,6 +4,10 @@ title: Full release history --- # Full release history +- 2026-01-22 **Tabular Editor 3.25.0** (*[Release notes](release-notes/3_25_0.md)*) + - .NET 8 installer (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.Installer.ARM64.Net8.exe) + - .NET 8 portable (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.ARM64.Net8.zip) + - .NET 8 installer (.msi): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.ARM64.Net8.msi) - 2025-11-11 **Tabular Editor 3.24.2** (*[Release notes](release-notes/3_24_2.md)*) - .NET 8 installer (.exe): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.x64.Net8.exe), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.Installer.ARM64.Net8.exe) - .NET 8 portable (.zip): [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.24.2.ARM64.Net8.zip) diff --git a/content/references/release-notes/3_25_0.md b/content/references/release-notes/3_25_0.md new file mode 100644 index 00000000..8e563f6d --- /dev/null +++ b/content/references/release-notes/3_25_0.md @@ -0,0 +1,98 @@ +--- +uid: release-3-25-0 +--- +# Tabular Editor 3.25.0 + +# [**Downloads**](#tab/downloads) + +Tabular Editor 3.25.0 downloads: + +- Download [Tabular Editor 3.25.0 (x64)](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.Installer.x64.Net8.exe) *(recommended)* +- Download [Tabular Editor 3.25.0 (ARM64)](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.Installer.ARM64.Net8.exe) +- Portable versions: [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.x64.Net8.zip), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.ARM64.Net8.zip) +- MSI version: [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.x64.Net8.msi), [ARM64](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.ARM64.Net8.msi) + +*If you haven't used Tabular Editor 3 before, you are eligible to a 30 day trial, which can be activated after installation. You can also [purchase a license](https://tabulareditor.com/licensing).* + +# [**SHA-256 checksums**](#tab/checksums) + +| File | .NET runtime | Platform | SHA-256 | +| -- | -- | -- | -- | +| [TabularEditor.3.25.0.Installer.x64.Net8.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.Installer.x64.Net8.exe) | .NET 8 | x64 | `C8EB3FCF6886F22071ACD211E430E6EE47B19095A2C3832B91EFEAA0CF153156` | +| [TabularEditor.3.25.0.x64.Net8.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.x64.Net8.msi) | .NET 8 | x64 | `64381E8D394C3871B718C3C3222FA7BD724B950AE7F8F3539CB27D8F3B1F8DFA` | +| [TabularEditor.3.25.0.x64.Net8.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.x64.Net8.zip) | .NET 8 | x64 | `8FA9CDED173E61ED7D916B36C327C24C3645D638ABF2949AE000D9814A2651DD` | +| [TabularEditor.3.25.0.Installer.ARM64.Net8.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.Installer.ARM64.Net8.exe) | .NET 8 | ARM64 | `4F80E7CB314CFE213B7125AADE873D1C1A7115BD525A9A4CCC0ADD92068CD21F` | +| [TabularEditor.3.25.0.ARM64.Net8.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.ARM64.Net8.msi) | .NET 8 | ARM64 | `D14E09ED3EFE7967020EE4DA528B49161BFC446DFD42372B3906D5AF0FC62F38` | +| [TabularEditor.3.25.0.ARM64.Net8.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.25.0.ARM64.Net8.zip) | .NET 8 | ARM64 | `3AFC82AA4F53C8FF918E74528EC27728787AC3472C90A86F92DA7BF0A681431B` | + +*** + +> [!NOTE] +> We are now providing native [ARM64](https://learn.microsoft.com/en-us/windows/arm/overview) builds in addition to regular 64-bit (x64) builds. 32-bit (x86) builds have been discontinued. + +## New in 3.25.0 +Check out our [release blog](https://blog.tabulareditor.com/) to get a brief overview of the most important updates in this release. + +- Tabular Editor is now available in [**Chinese and Spanish (Preview)**](xref:references-application-language). All translations have initially been done with AI, with human proofreading. Japanese, German and French are also available as experimental languages, which are not yet reviewed. +- Tabular Editor now includes a set of [**built-in Best Practice Analyzer (BPA) rules**](xref:built-in-bpa-rules) covering key best practices across formatting, metadata, model layout, DAX expressions, and translations. +- Tabular Editor now includes the **Semantic Bridge** feature, which lets you easily create semantic models from Databricks [Metric Views](https://docs.databricks.com/aws/en/metric-views/) (*Tabular Editor 3 Enterprise Edition only*). +- Added an option to save semantic models with [**supporting files for Fabric**](xref:save-with-supporting-files). When enabled, Tabular Editor can create and update the .platform and definition.pbism files alongside the model metadata to match Fabric repository structure. +- This release also adds a new **Calendar Editor**, that makes it easy to manage the calendar objects used for Calendar-based time intelligence. +- Last but not least, we've added an [**Advanced Refresh**](xref:advanced-refresh) dialog, through which you can configure advanced refresh options like parallelism and effective date for incremental refresh. You can also specify [refresh override profiles](xref:refresh-overrides) (*Tabular Editor 3 Business Edition and Enterprise Edition only*). + +## Improvements in 3.25.0 + +- Added support for setting the CustomData property of the connection string directly from the Impersonation dialog. +- DAX Package Manager View now downloads and shows DaxLib package icons. +- DAX Package Manager now caches package metadata which allows it to show package info without needing internet connection. +- We've updated the AS client library to the latest version [19.108.5](https://www.nuget.org/packages/Microsoft.AnalysisServices/19.108.5). This update lets you control the new [UnicodeCharacterBehavior](https://learn.microsoft.com/en-us/dotnet/api/microsoft.analysisservices.tabular.database.unicodecharacterbehavior?view=analysisservices-dotnet#microsoft-analysisservices-tabular-database-unicodecharacterbehavior) property on the Database object. +- Added Power BI specific Column Data Categories Longitude, Latitude and Place. +- We now show an error message if you attempt to set the Compatibility Level of a model to a value that is not supported by the server. This is to prevent unexpected errors later on when saving changes to the model. If you need to set an unsupported Compatibility Level for migration purposes, save your model metadata to disk (in .bim or TMDL format), then open the metadata with no workspace database attached. +- User Options (.tmuo) files, are now also saved when you open a model directly from a server / XMLA-endpoint. The files are stored in your %LocalAppData%\TabularEditor3\UserOptions folder. +- Added a "Refresh full (ignore policy)" option to the data refresh context menu, so that you can easily refresh data into existing partitions, without triggering partition add/delete/merge operations on the server, when a table is governed by incremental refresh policy. +- Reorganized the options in the data refresh context menu, to bring the most commonly used options to the top. +- Added Start time to refresh pane making it possible to sort the refresh after when they started e.g. seeing the latest refresh first. +- Added a search pane to the Preferences dialog to quickly search for individual preferences. +- Added "User Defined Functions" and "Calendars" to Best Practice Rule editor list. +- Added a `UsedInCalendars` property to columns, making it easy to check inside a C# script, if a column is used in any calendar objects. +- "File > Close" menu action is renamed to "Close Document" and is now capable of closing any panel or document in the main document area. **Ctrl + W** is assigned as the default shortcut. +- Added Semantic Analyzer support for the new `ENDALIGNED` keyword of the [`DATEADD`](https://dax.guide/DATEADD) parameter. [More information](https://learn.microsoft.com/en-us/dax/dateadd-function-dax#extension-parameter-for-small--large-period-shifts). +- When saving to a model.bim or TMDL folder structure with the **Ignore incremental refresh partitions** serialization option enabled, we now add a dummy partition to replace the PolicyRange partitions. This ensures that the model can still be loaded in Power BI Desktop, as no tables are saved without partitions. + +## Bugfixes in 3.25.0 + +- Fixed a critical issue preventing some customers from connecting to the Power BI REST API or Databricks using Azure AD authentication. +- Fixed an unhandled exception that would occur when deleting a column that was also used in a calendar object. +- Fixed relationship editor column dropdown so it automatically shows the whole column names. +- When a table containing one or more calendars is duplicated, calendars are now automatically renamed to ensure unique names across the model. +- Multiple errors/warnings encountered during a data refresh operation should no longer trigger an unhandled exception. +- Fixed DAX package list showing stale info after performing "Update All". +- Fixed a bug with the `SchemaName` property of Entity Partitions not being undoable. +- Code Action [DI005 - Rewrite table filter as scalar predicate](https://docs.tabulareditor.com/kb/DI005.html) is no longer suggested when [table expansion](https://www.sqlbi.com/articles/expanded-tables-in-dax/) takes place, as rewriting such a filter into a column filter would not necessarily produce the same result. +- Clicking the ellipsis button next to the Connection String property should no longer cause an unhandled exception when the connection string specifies an OLE DB provider that is not installed on the current system. +- TMDL exports now correctly exclude incremental refresh partitions when the relevant preference is enabled, matching JSON behavior. +- Fixed an issue where clicking the "Sign in..." button when attempting to update or import from Dataflows, would show the following error message: `This page is not normally shown and could be a sign of a phishing attempt.` + +--- +## Coming from Tabular Editor 2.x? + +Watch [this video](https://youtu.be/O4ATwdzCvWc) to get a quick tour of the main features in Tabular Editor 3. Also, make sure to check our [onboarding guide](https://docs.tabulareditor.com/onboarding/index.html). + +**Tabular Editor 3 major features overview:** +- Fully customizable IDE, with multi-monitor, Hi-DPI support and themes +- New powerful DAX code editor with auto-complete, syntax checking, code folding and much, much more +- *Workspace mode, allowing you to save your changes to disk and synchronise model metadata to Analysis Services simultaneously +- *Preview table data with infinite scrolling, create PivotGrids or write DAX queries to browse the model or test calculation logic +- *Schedule data refreshes +- Update Table Schemas on both Provider and Structured Data Sources (yes, even for M queries!) +- Create data model diagrams +- Create DAX scripts that allow you to edit multiple measures or other calculated objects in a single document +- Record C# scripts and save as macros (formerly known as "Custom Actions") +- VertiPaq Analyzer integration +- DAX debugger +- DAX Optimizer integration +- Code Actions to easily refactor you DAX. + +*=Only while connected to an instance of Analysis Services or Power BI + +--- diff --git a/content/troubleshooting/licensing-activation.md b/content/troubleshooting/licensing-activation.md index 76556916..1739bcdd 100644 --- a/content/troubleshooting/licensing-activation.md +++ b/content/troubleshooting/licensing-activation.md @@ -47,6 +47,11 @@ Once you purchase a license for Tabular Editor 3, you should receive an e-mail w > [!NOTE] > For multi-user license types, you will need to enter your e-mail address in addition to the license key. Tabular Editor 3 will prompt you to do so, if the license key you enter represents a multi-user license. +#### Changing seats on Enterprise Edition +To change an Enterprise seat the existing user will have to be deregistered from the seat through the [Tabular Editor Self-Service portal](https://tabulareditor.com/my-account/). The subscription owner or license administrator can create an account or login with an existing to administrate the license seats. + +> [!NOTE] +> Changing a user is only possible on the Enterprise Edition. ### Requesting a trial license If you haven't used Tabular Editor 3 before, you are eligible to a free 30-day trial. When choosing this option, you will be prompted for an e-mail address. We use the e-mail address to validate whether or not you have an existing activation of Tabular Editor 3. diff --git a/content/whats-new/3-25-0.html b/content/whats-new/3-25-0.html new file mode 100644 index 00000000..a7990a27 --- /dev/null +++ b/content/whats-new/3-25-0.html @@ -0,0 +1,13 @@ +

Tabular Editor 3.25.0

+

Release blog: January 2026 (v. 3.25.0, release notes)

+
    +
  • New languages: Chinese and Spanish (Preview). Japanese, German and French available as experimental.
  • +
  • Built-in BPA rules: Tabular Editor 3 now includes best practice rules covering formatting, metadata, model layout, DAX expressions, and translations.
  • +
  • Semantic Bridge: Create semantic models from Databricks Metric Views (Enterprise Edition).
  • +
  • Fabric supporting files: Option to save models with .platform and definition.pbism files for Fabric repository structure (Business/Enterprise).
  • +
  • Calendar Editor: New editor for managing calendar objects used in time intelligence.
  • +
  • Advanced Refresh dialog: Configure parallelism, effective date for incremental refresh, and refresh override profiles (Business/Enterprise).
  • +
  • Preferences dialog now includes a search pane.
  • +
  • Impersonate with Custom Data property.
  • +
  • Various bugfixes, see release notes for more details.
  • +