diff --git a/_site/staticwebapp.config.json b/_site/staticwebapp.config.json index 172d8847..159bc3a1 100644 --- a/_site/staticwebapp.config.json +++ b/_site/staticwebapp.config.json @@ -2,7 +2,7 @@ "routes": [ { "route": "/te3/other/release-notes", - "redirect": "/te3/other/release-notes/3_12_1.html", + "redirect": "/te3/other/release-notes/3_13_0.html", "statusCode": 302 }, { diff --git a/bin/release/TOMWrapper.dll b/bin/release/TOMWrapper.dll index 373eb47f..a7baa61c 100644 Binary files a/bin/release/TOMWrapper.dll and b/bin/release/TOMWrapper.dll differ diff --git a/bin/release/TOMWrapper.xml b/bin/release/TOMWrapper.xml index 484d62e8..a0f3f5de 100644 --- a/bin/release/TOMWrapper.xml +++ b/bin/release/TOMWrapper.xml @@ -4,6 +4,97 @@ TOMWrapper + + + Represents a collection of Calculation Items. + This metadata object is only supported when the compatibility level of the database is at 1470 or above. + + + + The expression defined on this object will be applied to the selected measure in DAX queries, when multiple calculation items are applied. + + + + + The description of the CalculationGroupExpression, visible to developers at design time and to administrators in management tools, such as SQL Server Management Studio. + + + + + The format string expression defined on this object will be applied to the selected measure in DAX queries, when multiple calculation items are applied. + + + + + The expression defined on this object will be applied to the selected measure in DAX queries, when no calculation items are applied. + + + + + The description of the CalculationGroupExpression, visible to developers at design time and to administrators in management tools, such as SQL Server Management Studio. + + + + + The format string expression defined on this object will be applied to the selected measure in DAX queries, when no calculation items are applied. + + + + Removes all annotations from this object. + + + The collection of Annotations on the current Calculation Group. + + + Gets the value of the annotation with the given index, assuming it exists. + + + Returns true if an annotation with the given name exists. Otherwise false. + + + Gets the value of the annotation with the given name. Returns null if no such annotation exists. + + + Sets the value of the annotation with the given index, assuming it exists. + + + Returns a unique name for a new annotation. + + + Sets the value of the annotation having the given name. If no such annotation exists, it will be created. If value is set to null, the annotation will be removed. + + + Remove an annotation by the given name. + + + Gets the number of annotations on the current Calculation Group. + + + Gets a collection of all annotation names on the current Calculation Group. + + + + The description of the CalculationGroup, visible to developers at design time and to administrators in management tools, such as SQL Server Management Studio. + + + + + Defines an evaluation order of CalculationGroup objects. + + + + The parent table of the current Calculation Group. + + + + The collection of CalculationItem objects on this CalculationGroup. + + + + + CTOR - only called from static factory methods on the class + + Deploys the specified database to the specified target server and database ID, using the specified options. @@ -140,11 +231,21 @@ Return a list of tokens representing the DAX expression on the current object. + + + Return a list of tokens representing the DAX expression on the current object. + + Return a list of tokens representing the specified DAX property on the current object. + + + Return a list of tokens representing the specified DAX property on the current object. + + A DependsOnList holds a dictionary of all objects that a specific opject depends on. Each entry contains @@ -257,34 +358,10 @@ getting and setting the data model json, as well as saving the content back to a .pbit file. - - - When enabled, Tabular Editor uses the DAX Semantic Analyzer to infer static information (syntax errors, data types, calculated table columns). - - - - - Set to true to always add a PowerQuery (M) partition by default to newly created tables - - - - - Specifies whether an AS trace should be started to monitor the server for changes - made by other applications. - - - - - Specifies whether object name changes (tables, column, measures) should result in - automatic DAX expression updates to reflect the changed names. When set to true, - all expressions in the model are parsed, to build a dependency tree. - - - + - If this is set to TRUE, only features supported by Power BI may be browsed/edited - through the TOMWrapper. This is useful for example when a .pbit file has been loaded, - or when connected to a Power BI Desktop instance. + A base class for objects that can be displayed in a PropertyGrid, having properties which may be hidden + or set to read-only at runtime. @@ -825,9 +902,14 @@ - Allows support for dual mode of Import as well as DirectQuery. + Uses both Import and DirectQuery storage modes to support queries in composite models with high performance. This value is only supported when the compatibility level of the database is at 1455 or above. + + + Data will be loaded into memory from the data lake or queried dynamically if DirectLake fallback is enabled. + This value is only supported when the compatibility level of the database is at 1604 or above. + Determines which partitions are to be selected to run queries against the model. @@ -1248,6 +1330,26 @@ Basic refresh policy + + + Fallback behavior for Direct Lake models. + This enum is only supported when the compatibility level of the database is at 1604 or above. + + + + Adaptive fallback, shipped in public preview. + + + + + Disables fallback. Uses Direct Lake unconditionally. + + + + + Enforces fallback. Uses DirectQuery unconditionally. + + Variation object. @@ -1660,16 +1762,6 @@ Represents a base class of a column object of a Tabular model, used to specify a DataColumn, RowNumberColumn, CalculatedColumn, or CalculatedTableColumn. - - - For a DataColumn, specifies the data type. See for a list of supported data types. - - - - - A boolean value indicating whether the datatype is inferred. - - Removes all annotations from this object. @@ -1870,6 +1962,16 @@ Indicates that the column defining this property will be sorted by the values of the column referenced by this property. + + + For a DataColumn, specifies the data type. See for a list of supported data types. + + + + + A boolean value indicating whether the datatype is inferred. + + Collection of perspectives in which this Column is visible. @@ -2016,16 +2118,6 @@ Calling this method will populate the ColumnCollection with objects based on the MetadataObjects in the corresponding MetadataObjectCollection. - - - Sets the DataType property of all objects in the collection at once. - - - - - Sets the IsDataTypeInferred property of all objects in the collection at once. - - Sets the DataCategory property of all objects in the collection at once. @@ -2126,6 +2218,16 @@ Sets the SortByColumn property of all objects in the collection at once. + + + Sets the DataType property of all objects in the collection at once. + + + + + Sets the IsDataTypeInferred property of all objects in the collection at once. + + Represents a user culture. It is a child of a Model object, used for translating strings and formatting values. @@ -2851,166 +2953,309 @@ Gets the list of objects that reference this measure. - + - Represents a level in a hierarchy that provides a logical hierarchical drilldown path for client applications. It is a child of a Hierarchy object. The level is based on the values in a column. - + Represents an abstract RefreshPolicy object. It is a child of a Table object. + This metadata object is only supported when the compatibility level of the database is at 1450 or above. - + Removes all annotations from this object. - - The collection of Annotations on the current Level. + + The collection of Annotations on the current Refresh Policy. - + Gets the value of the annotation with the given index, assuming it exists. - + Returns true if an annotation with the given name exists. Otherwise false. - + Gets the value of the annotation with the given name. Returns null if no such annotation exists. - + Sets the value of the annotation with the given index, assuming it exists. - + Returns a unique name for a new annotation. - + Sets the value of the annotation having the given name. If no such annotation exists, it will be created. If value is set to null, the annotation will be removed. - + Remove an annotation by the given name. - - Gets the number of annotations on the current Level. + + Gets the number of annotations on the current Refresh Policy. - - Gets a collection of all annotation names on the current Level. + + Gets a collection of all annotation names on the current Refresh Policy. - + Removes all Extended Properties from this object. - - The collection of Extended Properties on the current Level. + + The collection of Extended Properties on the current Refresh Policy. - + Returns true if an ExtendedProperty with the given name exists. Otherwise false. - + Gets the type of the ExtendedProperty with the given index, assuming it exists. - + Gets the type of the ExtendedProperty with the given name, assuming it exists. - + Gets the value of the ExtendedProperty with the given index, assuming it exists. - + Gets the value of the ExtendedProperty with the given name. Returns null if no such ExtendedProperty exists. - + Sets the value of the ExtendedProperty with the given index, optionally specifiying the type (string or JSON) of the ExtendedProperty. - + Returns a unique name for a new ExtendedProperty. - + Sets the value of the ExtendedProperty having the given name. If no such ExtendedProperty exists, it will be created. If value is set to null, the ExtendedProperty will be removed. - + Remove an ExtendedProperty by the given name. - + Gets the number of ExtendedProperties on the current object. - + Gets a collection of all ExtendedProperty names on the current object. - - - The position of the level within the hierarchy. The levels in the hierarchy must be properly ordered, starting with 1 and increasing monotonically. - - - + - The description of the level, visible to developers at design time and to administrators in management tools, such as SQL Server Management Studio. + Specifies the type of the refresh policy - + - A tag that represents the lineage of the object. - This property is only supported when the compatibility level of the database is at 1540 or above. + Defines the mode of a refresh policy applied during incremental refresh. + This property is only supported when the compatibility level of the database is at 1565 or above. - - - 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. + + The parent table of the current Refresh Policy. - + - A reference to a Hierarchy object that owns this level. + CTOR - only called from static factory methods on the class - + - A reference to a Column object associated with this Level. + Represents a BasicRefreshPolicy object. It is a child of a Table object. + This metadata object is only supported when the compatibility level of the database is at 1450 or above. + + Represents a - + - Collection of localized descriptions for this Level. + Target granularity of the rolling window for the whole data set - + - Collection of localized names for this Level. + Number of periods for the rolling window for the whole data set - + - Collection of localized synonyms for this Level. + Granularity of the (most recent) incremental refresh range - + - Creates a new Level and adds it to the parent Hierarchy. - Also creates the underlying metadataobject and adds it to the TOM tree. + Number of periods for the incremental refresh range - + - Creates an exact copy of this Level object. + Lag or leading periods from Now() to the rolling window head - - The parent Hierarchy of the current Level. - - + - CTOR - only called from static factory methods on the class + If not null, M expression that is evaluated and stored for each partition upon each refresh or merge operation. Result is stored in Partition.RefreshBookmark - + - Collection class for Level. Provides convenient properties for setting a property on multiple objects at once. + M expression that is used as the source M expression for new partitions. It includes the date filter by referring to 2 M parameters named [RangeStart] and [RangeEnd], which can be dates or integers depending on IntegerDateKey below - - The number of items in this collection. - - - Returns an enumerator that iterates through the collection. - - + - Calling this method will populate the LevelCollection with objects based on the MetadataObjects in the corresponding MetadataObjectCollection. + CTOR - only called from static factory methods on the class - + - Sets the Description property of all objects in the collection at once. + Represents a level in a hierarchy that provides a logical hierarchical drilldown path for client applications. It is a child of a Hierarchy object. The level is based on the values in a column. + + + + Removes all annotations from this object. + + + The collection of Annotations on the current Level. + + + Gets the value of the annotation with the given index, assuming it exists. + + + Returns true if an annotation with the given name exists. Otherwise false. + + + Gets the value of the annotation with the given name. Returns null if no such annotation exists. + + + Sets the value of the annotation with the given index, assuming it exists. + + + Returns a unique name for a new annotation. + + + Sets the value of the annotation having the given name. If no such annotation exists, it will be created. If value is set to null, the annotation will be removed. + + + Remove an annotation by the given name. + + + Gets the number of annotations on the current Level. + + + Gets a collection of all annotation names on the current Level. + + + Removes all Extended Properties from this object. + + + The collection of Extended Properties on the current Level. + + + Returns true if an ExtendedProperty with the given name exists. Otherwise false. + + + Gets the type of the ExtendedProperty with the given index, assuming it exists. + + + Gets the type of the ExtendedProperty with the given name, assuming it exists. + + + Gets the value of the ExtendedProperty with the given index, assuming it exists. + + + Gets the value of the ExtendedProperty with the given name. Returns null if no such ExtendedProperty exists. + + + Sets the value of the ExtendedProperty with the given index, optionally specifiying the type (string or JSON) of the ExtendedProperty. + + + Returns a unique name for a new ExtendedProperty. + + + Sets the value of the ExtendedProperty having the given name. If no such ExtendedProperty exists, it will be created. If value is set to null, the ExtendedProperty will be removed. + + + Remove an ExtendedProperty by the given name. + + + Gets the number of ExtendedProperties on the current object. + + + Gets a collection of all ExtendedProperty names on the current object. + + + + The position of the level within the hierarchy. The levels in the hierarchy must be properly ordered, starting with 1 and increasing monotonically. + + + + + The description of the level, visible to developers at design time and to administrators in management tools, such as SQL Server Management Studio. + + + + + A tag that represents the lineage of the object. + This property is only supported when the compatibility level of the database is at 1540 or above. + + + + 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. + + + + A reference to a Hierarchy object that owns this level. + + + + + A reference to a Column object associated with this Level. + + + + + Collection of localized descriptions for this Level. + + + + + Collection of localized names for this Level. + + + + + Collection of localized synonyms for this Level. + + + + + Creates a new Level and adds it to the parent Hierarchy. + Also creates the underlying metadataobject and adds it to the TOM tree. + + + + + Creates an exact copy of this Level object. + + + + The parent Hierarchy of the current Level. + + + + CTOR - only called from static factory methods on the class + + + + + Collection class for Level. Provides convenient properties for setting a property on multiple objects at once. + + + + The number of items in this collection. + + + Returns an enumerator that iterates through the collection. + + + + Calling this method will populate the LevelCollection with objects based on the MetadataObjects in the corresponding MetadataObjectCollection. + + + + + Sets the Description property of all objects in the collection at once. @@ -3215,11 +3460,6 @@ - - - Returns a count indicating the number of children of this objects that have errors - - A string that explains the error state associated with the current object. It is set by the engine only when the state of the object is one of these three values: SemanticError, DependencyError, or EvaluationError. It is applicable only to columns of the type Calculated or CalculatedTableColumn. It will be empty for other column objects. @@ -3337,11 +3577,6 @@ A Tabular model created at compatibility level 1200 or above. - - - Returns the status of local changes made to the model, which haven't been saved to the server. - If the model is not connected, this value is always False. - Removes all annotations from this object. @@ -3504,11 +3739,21 @@ Disable system defined default expression behavior for calculation groups. This property is only supported when the compatibility level of the database is at Preview or above. + + + Define the fallback behavior of Direct Lake tables. + This property is only supported when the compatibility level of the database is at 1604 or above. + A reference to a default measure. This property is only supported when the compatibility level of the database is at 1400 or above. + + + Gets an indication if the model has local changes that have not been saved to the engine yet. + True, if the model has local changes; otherwise, false.A disconnected model, will always return a value of false. + Collection of localized descriptions for this Model. @@ -4064,11 +4309,6 @@ Represents a partition in a table. Partitions define the query against external data sources that return the rowsets of a . - - - The type of source used by the Partition. This is either a query against a DataSource, or for calculated tables, an expression. - - Removes all annotations from this object. @@ -4174,6 +4414,11 @@ QueryGroup associated with the partition. This property is only supported when the compatibility level of the database is at 1480 or above. + + + The type of source used by the Partition. This is either a query against a DataSource, or for calculated tables, an expression. + + Creates a new Partition and adds it to the parent Table. @@ -4644,16 +4889,6 @@ Represents a logical relationship between two Table objects. It is a child of a Model object. - - - Gets the destination table in a directional table relationship. - - - - - Gets the starting table in a directional table relationship. - - Removes all annotations from this object. @@ -4761,6 +4996,16 @@ 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. + + + Gets the starting table in a directional table relationship. + + + + + Gets the destination table in a directional table relationship. + + The parent Model of the current Relationship. @@ -4825,24 +5070,24 @@ SingleColumnRelationship object. - + - Gets or sets the starting column in a single column relationship. + Indicates whether the "From" end of the relationship has a cardinality of One (1) or Many (2). - + - Gets or sets the destination column in a single column relationship. + Indicates whether the "To" end of the relationship has a cardinality of One (1) or Many (2). - + - Indicates whether the "From" end of the relationship has a cardinality of One (1) or Many (2). + Gets or sets the starting column in a single column relationship. - + - Indicates whether the "To" end of the relationship has a cardinality of One (1) or Many (2). + Gets or sets the destination column in a single column relationship. @@ -5115,7 +5360,7 @@ - Adds a new Entity (DQ over AS) partition to the table and returns a reference to the partition. + Adds a new Entity (DQ over AS or DirectLake) partition to the table and returns a reference to the partition. The name of the partition The name of the entity (source table) to assign to the partition. @@ -5256,6 +5501,22 @@ A DAX expression specifying default detail rows for this table (drill-through in client tools). + + + Gets or sets the Refresh Policy of the Table. + + + + + Adds a to this measure. + + + + + + Removes the from this measure. + + Defines the mode of a refresh policy applied during incremental refresh. @@ -5614,67 +5875,6 @@ Sets the ExpressionSource property of all objects in the collection at once. - - - Represents a collection of Calculation Items. - This metadata object is only supported when the compatibility level of the database is at 1470 or above. - - - Removes all annotations from this object. - - - The collection of Annotations on the current Calculation Group. - - - Gets the value of the annotation with the given index, assuming it exists. - - - Returns true if an annotation with the given name exists. Otherwise false. - - - Gets the value of the annotation with the given name. Returns null if no such annotation exists. - - - Sets the value of the annotation with the given index, assuming it exists. - - - Returns a unique name for a new annotation. - - - Sets the value of the annotation having the given name. If no such annotation exists, it will be created. If value is set to null, the annotation will be removed. - - - Remove an annotation by the given name. - - - Gets the number of annotations on the current Calculation Group. - - - Gets a collection of all annotation names on the current Calculation Group. - - - - The description of the CalculationGroup, visible to developers at design time and to administrators in management tools, such as SQL Server Management Studio. - - - - - Defines an evaluation order of CalculationGroup objects. - - - - The parent table of the current Calculation Group. - - - - The collection of CalculationItem objects on this CalculationGroup. - - - - - CTOR - only called from static factory methods on the class - - A Tabular Calculation Item. @@ -5729,11 +5929,6 @@ A string that explains the error state associated with the current object. It is set by the engine only when the state of the object is one of these three values: SemanticError, DependencyError, or EvaluationError. It is applicable only to columns of the type Calculated or CalculatedTableColumn. It will be empty for other column objects. - - - Indicates if this object needs validation - - A DAX expression that returns a Format String for this calculation item. @@ -6060,6 +6255,11 @@ + + + Gets the error message currently reported on this calculation group table. + + Set to true, when multiple calculation items are going to be re-ordered as one action. @@ -6090,24 +6290,44 @@ The collection of items on the of this table. - + - Executes the specified TMSL script against the connected instance of Analysis Services. + The expression defined on this object will be applied to the selected measure in DAX queries, when multiple calculation items are aplied. - + - Executes the specified DAX query against the connected database and returns an AmoDataReader object that enumerates the result + The format string expression defined on this object will be applied to the selected measure in DAX queries, when multiple calculation items are aplied. - + - Executes the specified DAX query against the connected database and returns a data set containing the result + The description of the CalculationGroupExpression, visible to developers at design time and to administrators in management tools, such as SQL Server Management Studio. - + - Evaluates the specified DAX expression against the connected database and returns a data table or scalar value containing the result + The expression defined on this object will be applied to the selected measure in DAX queries, when no calculation items are applied. + + + + + The format string expression defined on this object will be applied to the selected measure in DAX queries, when no calculation items are applied. + + + + + The description of the CalculationGroupExpression, visible to developers at design time and to administrators in management tools, such as SQL Server Management Studio. + + + + + Executes the specified TMSL script against the connected instance of Analysis Services. + + + + + Executes the specified DAX query against the connected database and returns an AmoDataReader object that enumerates the result @@ -6120,6 +6340,16 @@ Return false if automatic undo of the property change is not needed. Return true if the property change should not apply. + + + Executes the specified DAX query against the connected database and returns a data set containing the result + + + + + Evaluates the specified DAX expression against the connected database and returns a data table or scalar value containing the result + + Additional metadata that may be added to the model annotations during deployment @@ -6152,7 +6382,12 @@ - IntelliSense("The Expression Source used by this partition.") + The Expression Source used by this partition. + + + + + Reserved for future use. @@ -6307,7 +6542,8 @@ - Objects that can have error messages in TOM + Objects that can have error messages in TOM. These are only shown for objects that are not IDaxDependantObjects, + as we do our own error handling for objects with DAX expressions. @@ -6320,6 +6556,36 @@ Objects that have an expression (measure, calculated column, partition, etc.) + + + Gets all supported expression properties on the current object. + + + + + Gets the specified expression from the current object. + + Thrown when the current object does not support the specified + + + + + Sets the specified expression on the current object. + + Thrown when the current object does not support the specified + + + + + + Gets the default expression property on the current object. + + + + + Gets the expression of the current object (which is the value of its default expression property). + + Objects that can depend on one or more DAXObjects through expression dependencies @@ -6391,14 +6657,6 @@ of the type held by the array. - - - Sanitize a string to turn it into a valid file name - - - Set to true when the name represents a folder (which cannot end with a blank char) - - Saves the model to the specified folder using the specified serialize options. @@ -6462,6 +6720,23 @@ + + + Determines whether a table can be refreshed using the specified refresh type. + + + + + Gets the of a partition, considering also the of the . + + + + + + + Determines whether a partition can be refreshed using the specified refresh type. + + Provide a lambda statement that is executed once for each object in the collection. @@ -6669,14 +6944,14 @@ Saves the Model Schema to an existing .pbit (Power BI Template) file - + - Saves the Model Schema together with a Visual Studio Tabular Project file and user settings file + Saves the Model Schema as a Tabular Editor folder structure - + - Saves the Model Schema as a Tabular Editor folder structure + Tabular Model Definition Language @@ -6694,11 +6969,51 @@ Model.bim exploded into a folder structure by Tabular Editor + + + Tabular Model Definition Language + + Power BI Template file (.pbit) + + + When enabled, Tabular Editor uses the DAX Semantic Analyzer to infer static information (syntax errors, data types, calculated table columns). + + + + + Set to true to always add a PowerQuery (M) partition by default to newly created tables + + + + + Specifies whether an AS trace should be started to monitor the server for changes + made by other applications. + + + + + Specifies whether object name changes (tables, column, measures) should result in + automatic DAX expression updates to reflect the changed names. When set to true, + all expressions in the model are parsed, to build a dependency tree. + + + + + If this is set to TRUE, only features supported by Power BI may be browsed/edited + through the TOMWrapper. This is useful for example when a .pbit file has been loaded, + or when connected to a Power BI Desktop instance. + + + + + When this is set to true, the TOMWrapper will not allow you to create DirectLake partitions. + + A TabularObject is a wrapper for the Microsoft.AnalysisServices.Tabular.NamedMetadataObject class. @@ -6784,6 +7099,12 @@ The name of this object. Warning: Changing the name can break formula logic, if Automatic Formula Fix-up is disabled. + + + Classes that can have an error state, in addition to the error message provided by the TOM, should implement this interface, + to communicate to the UI that the object has an error state. + + TabularObjects that can contain other objects should use this interface, to allow easy enumerator of child objects. @@ -6892,6 +7213,19 @@ The number of items in this collection. + + + Various helper (extension) methods, for working with objects. + + + + + Returns a list of all children of the specified container, including all children of child containers. + + The object to iterate + Indicates whether the current object should be included in the iteration output + + The TabularTree represents the logical structure of objects in the TOM, that we are going to @@ -7016,6 +7350,24 @@ interaction when these interactions are expected to happen in short succession. + + + Sanitize a string to turn it into a valid file name + + + Set to true when the name represents a folder (which cannot end with a blank char) + + + + + Formats the specified expression using VB6 format strings (which are also used by Analysis Services) + Returns true if formatting succeeds, otherwise false (for example, when the format string is invalid) + + + + + + A strongly-typed resource class, for looking up localized strings, etc. @@ -7034,7 +7386,7 @@ - Looks up a localized string similar to Adding a {0} to a Power BI Data Model is not allowed.. + Looks up a localized string similar to Adding a {0} to a Power BI semantic model is not allowed.. @@ -7049,7 +7401,7 @@ - Looks up a localized string similar to Deleting a {0} from a Power BI Data Model is not allowed.. + Looks up a localized string similar to Deleting a {0} from a Power BI semantic ,odel is not allowed.. @@ -7117,6 +7469,27 @@ Looks up a localized string similar to A table must have at least one partition.. + + + Looks up a localized string similar to Unable to perform insert. + + + + + Looks up a localized string similar to There was en error inserting objects from the clipboard. Most likely, the copied objects originate from a model that has a different CompatibilityLevel and/or CompatibilityMode, than the current model. Consider upgrading the current model to match the CompatibilityLevel of the source. + + Error message: + + {0}. + + + + + Looks up a localized string similar to There was an error inserting objects from the clipboard: + + {0}. + + This Collection Editor for Cultures takes care of removing unassigned cultures @@ -7199,23 +7572,11 @@ the drop down. - + - Implement this interface on objects that should be able to show/hide or change readonly - state of properties at runtime. For example, an object that has a DataType and a FormatString - property, might not want the FormatString property to show up whenever a certain DataType is - in use. - - Make sure that the implementing class uses the DynamicPropertyConverter as its TypeConverter, - by decorating the class with: - - [TypeConverter(typeof(DynamicPropertyConverter))] - - - - - - This TypeConverter + Apply this attribute to properties that should not be shown in the property grid, when more than object is selected + For example, a 'Name' or 'ID' property may be unique across all objects - therefore, it doesn't make sense to + show that property when multiple objects are selected. @@ -7364,6 +7725,13 @@ + + + Returns a list of all XMLA warnings encountered. + + + + Provides various extension methods to make it easier to work with the Tabular Object Model diff --git a/bin/release/TabularEditor3.Shared.dll b/bin/release/TabularEditor3.Shared.dll index be029b19..1d9e2851 100644 Binary files a/bin/release/TabularEditor3.Shared.dll and b/bin/release/TabularEditor3.Shared.dll differ diff --git a/bin/release/TabularEditor3.Shared.xml b/bin/release/TabularEditor3.Shared.xml index 2cb4aea2..ae009ac6 100644 --- a/bin/release/TabularEditor3.Shared.xml +++ b/bin/release/TabularEditor3.Shared.xml @@ -4,6 +4,42 @@ TabularEditor3.Shared + + Provides a scheduler that uses STA threads. + + + Stores the queued tasks to be executed by our pool of STA threads. + + + The STA threads used by the scheduler. + + + Initializes a new instance of the StaTaskScheduler class with the specified concurrency level. + The number of threads that should be created and used by this scheduler. + + + Queues a Task to be executed by this scheduler. + The task to be executed. + + + Provides a list of the scheduled tasks for the debugger to consume. + An enumerable of all tasks currently scheduled. + + + Determines whether a Task may be inlined. + The task to be executed. + Whether the task was previously queued. + true if the task was successfully inlined; otherwise, false. + + + Gets the maximum concurrency level supported by this scheduler. + + + + Cleans up the scheduler by indicating that no more tasks will be queued. + This method blocks until all threads successfully shutdown. + + Indicates whether this rule should be ignored on this particular object @@ -21,12 +57,15 @@ - + + + This object must be constructed on the UI thread, as it uses the WindowsFormsSynchronizationContext. + + + - Call this method from the main thread, to set up a pointer to the main window handle - and to store the synchronization context for later use + This object must be created on the UI thread, as it captures the synchronization context for use when the custom web UI is invoked. - @@ -164,6 +203,18 @@ Set to true to perform a case-sensitive search Set to true to search for whole words only + + + Specify a search pattern and a replacement value, that will be applied to the Names of the objects in the collection. + + Search pattern (i.e. what to find) + Replacement (the text to replace) + Set to true if the search pattern and replacement strings use regular expressions + Set to true if the replacement should be performed in the metadata name translations as well + Set to true to perform a case-sensitive search + Set to true to search for whole words only + + Specify a search pattern and a replacement value, that will be applied to the Expression of the objects in the collection. @@ -408,6 +459,11 @@ Indicates where in the Explorer Tree the current selection has been made. + + + The name of the current table group (if exactly one table group is selected, or if one or more tables within a single table group is selected) + + Iterates through the passed list of nodes, to return the combined context of the items represented by the nodes. @@ -1293,6 +1349,77 @@ 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 + + + + + Extension for calling the ODBC low-level GetTablesW method directly. + + + + + Extension for calling the ODBC low-level GetColumnsW method directly. + + + + + Extension for calling the ODBC low-level GetColumnsW method directly. + + + + + Extension for calling the ODBC low-level GetColumnsW method directly. + + + + + Gets the ODBC driver names from the SQLGetInstalledDrivers function. + + a string array containing the ODBC driver names, if the call to SQLGetInstalledDrivers was successfull; null, otherwise. + + + + Method that gives one ODBC DSN object + + + + + ODBC DSN object + + + + Method that returns the registry key for a complex string that + represents the key that is to be returned. The 'baseKey' parameter + passed to this method is the root registry key on which the + complex sub key has to be created. The 'complexKeyStr' is the + stirng representation of the key to be created over the 'baseKey'. + The syntax of the 'complexKeyStr' is "KEY1//KEY2//KEY3//...//". + The "..." in the above syntax represents the repetetion. This + method parses the 'compleKeyStr' parameter value and keep building + the keys following the path of the keys listed in the string. Each + key is built upon its previous key. First Key (KEY1) is built based + on the 'basKey' parameter. Second key (KEY2) is based on the first + key (Key creatd for KEY1) and so on... . The writable parameter + represents whether final key has to be writable or not. + + + + + 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. @@ -1359,6 +1486,31 @@ Any other extension + + + True to allow DAX debugging. + + + + + True to allow XMLA connectivity. + + + + + True to allow Enterprise features, such as DirectLake in Power BI, or Perspectives/Multi-partitions in SSAS/Azure AS + + + + + True to allow PBI Desktop connectivity. + + + + + True to allow opening/saving semantic models from/to files. + + When this feature switch is enabled, end users may enable the Git Integration Preview feature (through the preferences dialog) @@ -1390,6 +1542,11 @@ Indicates that the model is loaded from a PBIT (Power BI Template) file + + + Indicates that the model is loaded from a TMDL folder structure + + Indicates that the model has been created in Tabular Editor and not yet saved to disk @@ -1415,6 +1572,11 @@ Model is saved to a Tabular Editor folder structure + + + Model is saved to a TMDL folder structure + + Model is not yet saved to disk @@ -1466,6 +1628,13 @@ + + + This method handles M object references to other M objects - for example, an M expression may refer to a shared expression or an explicit data source. + + + + Indicate whether the system credentials of the application are sent with requests. @@ -1501,16 +1670,6 @@ - - - Extension for calling the ODBC low-level GetTablesW method directly. - - - - - Extension for calling the ODBC low-level GetColumnsW method directly. - - Indicates that every identifier must be enclosed in a pair of backticks diff --git a/te3/other/downloads.md b/te3/other/downloads.md index b49dc99c..6b1eb58d 100644 --- a/te3/other/downloads.md +++ b/te3/other/downloads.md @@ -2,7 +2,7 @@ uid: downloads title: All downloads author: Daniel Otykier -updated: 2023-12-01 +updated: 2023-12-15 --- # Tabular Editor 3 Downloads @@ -10,12 +10,12 @@ This page provides download and installation instructions for Tabular Editor 3. ## Production builds -- Latest production release (x64): [TabularEditor.3.12.1.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.Installer.x64.exe) -- Latest production release (x86): [TabularEditor.3.12.1.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.Installer.x86.exe) -- Portable version: [TabularEditor.3.12.1.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.x64.zip), [TabularEditor.3.12.1.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.x86.zip) -- MSI version: [TabularEditor.3.12.1.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.x64.msi), [TabularEditor.3.12.1.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.x86.msi) +- Latest production release (x64): [TabularEditor.3.13.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.Installer.x64.exe) +- Latest production release (x86): [TabularEditor.3.13.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.Installer.x86.exe) +- Portable version: [TabularEditor.3.13.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x64.zip), [TabularEditor.3.13.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x86.zip) +- MSI version: [TabularEditor.3.13.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x64.msi), [TabularEditor.3.13.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x86.msi) -Read the [latest release notes](release-notes/3_12_1.md). +Read the [latest release notes](release-notes/3_13_0.md). ## Installation Instructions @@ -27,6 +27,13 @@ It is not necessary to remove previous installations when upgrading to a newer v ## History +- 2023-12-15 **Tabular Editor 3.13.0** (*[Release notes](release-notes/3_13_0.md)*) + - [TabularEditor.3.13.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.Installer.x64.exe) + - [TabularEditor.3.13.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.Installer.x86.exe) + - [TabularEditor.3.13.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x64.zip) + - [TabularEditor.3.13.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x86.zip) + - [TabularEditor.3.13.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x64.msi) + - [TabularEditor.3.13.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x86.msi) - 2023-12-01 **Tabular Editor 3.12.1** (*[Release notes](release-notes/3_12_1.md)*) - [TabularEditor.3.12.1.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.Installer.x64.exe) - [TabularEditor.3.12.1.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.Installer.x86.exe) @@ -48,26 +55,5 @@ It is not necessary to remove previous installations when upgrading to a newer v - [TabularEditor.3.11.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.11.0.x86.zip) - [TabularEditor.3.11.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.11.0.x64.msi) - [TabularEditor.3.11.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.11.0.x86.msi) -- 2023-08-30 **Tabular Editor 3.10.1** (*[Release notes](release-notes/3_10_1.md)*) - - [TabularEditor.3.10.1.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.10.1.Installer.x64.exe) - - [TabularEditor.3.10.1.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.10.1.Installer.x86.exe) - - [TabularEditor.3.10.1.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.10.1.x64.zip) - - [TabularEditor.3.10.1.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.10.1.x86.zip) - - [TabularEditor.3.10.1.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.10.1.x64.msi) - - [TabularEditor.3.10.1.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.10.1.x86.msi) -- 2023-07-20 **Tabular Editor 3.9.0** (*[Release notes](release-notes/3_9_0.md)*) - - [TabularEditor.3.9.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.9.0.Installer.x64.exe) - - [TabularEditor.3.9.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.9.0.Installer.x86.exe) - - [TabularEditor.3.9.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.9.0.x64.zip) - - [TabularEditor.3.9.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.9.0.x86.zip) - - [TabularEditor.3.9.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.9.0.x64.msi) - - [TabularEditor.3.9.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.9.0.x86.msi) -- 2023-06-23 **Tabular Editor 3.8.0** (*[Release notes](release-notes/3_8_0.md)*) - - [TabularEditor.3.8.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.8.0.Installer.x64.exe) - - [TabularEditor.3.8.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.8.0.Installer.x86.exe) - - [TabularEditor.3.8.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.8.0.x64.zip) - - [TabularEditor.3.8.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.8.0.x86.zip) - - [TabularEditor.3.8.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.8.0.x64.msi) - - [TabularEditor.3.8.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.8.0.x86.msi) For earlier builds, see the [full release history](release-history.md). diff --git a/te3/other/release-history.md b/te3/other/release-history.md index 8f0e33aa..65a871d1 100644 --- a/te3/other/release-history.md +++ b/te3/other/release-history.md @@ -1,5 +1,12 @@ # Full release history +- 2023-12-15 **Tabular Editor 3.13.0** (*[Release notes](release-notes/3_13_0.md)*) + - [TabularEditor.3.13.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.Installer.x64.exe) + - [TabularEditor.3.13.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.Installer.x86.exe) + - [TabularEditor.3.13.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x64.zip) + - [TabularEditor.3.13.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x86.zip) + - [TabularEditor.3.13.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x64.msi) + - [TabularEditor.3.13.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x86.msi) - 2023-12-01 **Tabular Editor 3.12.1** (*[Release notes](release-notes/3_12_1.md)*) - [TabularEditor.3.12.1.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.Installer.x64.exe) - [TabularEditor.3.12.1.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.12.1.Installer.x86.exe) diff --git a/te3/other/release-notes/3_12_1.md b/te3/other/release-notes/3_12_1.md index 1f70914f..4b8b6780 100644 --- a/te3/other/release-notes/3_12_1.md +++ b/te3/other/release-notes/3_12_1.md @@ -1,5 +1,5 @@ --- -uid: release--10 +uid: release-2-12-1 --- # Tabular Editor 3.12.1 diff --git a/te3/other/release-notes/3_13_0.md b/te3/other/release-notes/3_13_0.md new file mode 100644 index 00000000..632591a7 --- /dev/null +++ b/te3/other/release-notes/3_13_0.md @@ -0,0 +1,85 @@ +--- +uid: release-3-13-0 +--- +# Tabular Editor 3.13.0 + +# [**Downloads**](#tab/downloads) + +Tabular Editor 3.13.0 downloads: + +- Download [Tabular Editor 3.13.0 (64 bit)](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.Installer.x64.exe) *(recommended)* +- Download [Tabular Editor 3.13.0 (32 bit)](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.Installer.x86.exe) +- Portable versions: [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x64.zip), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x86.zip) +- MSI version: [x64](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x64.msi), [x86](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x86.msi) + +*If you haven't used Tabular Editor 3 before, you are eligible to a 30 day trial, which can be requested after installation. You can also [purchase a license](https://tabulareditor.com/licensing).* + +# [**SHA-256 checksums**](#tab/checksums) + +| File | SHA-256 | +| -- | -- | +| [TabularEditor.3.13.0.Installer.x64.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.Installer.x64.exe) | `7C22DC330D8F1F83C30FB4F84E6A038C1F4E08128BEA293E0559D6C5C2F80671` | +| [TabularEditor.3.13.0.x64.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x64.msi) | `582DA8393AE8C51CA0DAC5B6980534957AAF2E729B5E0ECDB2ED943181A5860D` | +| [TabularEditor.3.13.0.x64.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x64.zip) | `F7B0CCB25B3CEA478F921AF7C0FDA6979910D17F8BAF321E23986C800978811F` | +| [TabularEditor.3.13.0.Installer.x86.exe](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.Installer.x86.exe) | `B851EE5B994F69B8BB0D806FA8147D2196D17D395D8D1601CC338E8D343526B1` | +| [TabularEditor.3.13.0.x86.msi](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x86.msi) | `30B15436DD7FB1BA8B9FFBEFBAB366A70B3EB21422ACEFE442EFF464E6E7E361` | +| [TabularEditor.3.13.0.x86.zip](https://cdn.tabulareditor.com/files/TabularEditor.3.13.0.x86.zip) | `CED68ECC4821B9A21AB022AD61AB693A1FD4988F8C6D66BEC1B08E941295C7B3` | + +*** + +### Prerequisites + +Tabular Editor 3.3.0 (and newer) uses .NET 6. You may have to install the [.NET 6.0 Runtime for Desktop](https://dotnet.microsoft.com/en-us/download/dotnet/6.0/runtime) before you can launch Tabular Editor 3.3.0 (or newer). Starting from 3.3.1, the Tabular Editor 3 installer will download and install these prerequisites, if they are missing. + +## New in 3.13.0 + +Check out our [release blog](https://blog.tabulareditor.com/) to get a brief overview of the most important updates in this release. + +## Improvements in 3.13.0 + +- Unused variable warnings are now only shown when the variable declaration block is complete, and only the variable name itself is highlighted. Moreover, there is a new option where you can toggle off these warnings under **Tools > Preferences > DAX Editor > Code Assist**. +- VertiPaq Analyzer in TE3 now uses the same default settings as in DAX Studio. You can also configure the "Read statistics from DirectQuery tables" option now, under **Tools > Preferences > VertiPaq Analyzer**. +- We've made a small change to how the Refresh Policy on a table appears in the **Properties** view, to better align with [TOM](https://learn.microsoft.com/en-us/dotnet/api/microsoft.analysisservices.tabular.table.refreshpolicy?view=analysisservices-dotnet). This change also lets you add annotations/extended properties to Refresh Policies, which previously wasn't possible. C# scripts can still use the Refresh Policy properties directly on the `Table` object, but we recommend updating scripts to access these properties through the `Table.RefreshPolicy` object instead. +- When selecting a table or column in the TOM Explorer, we now highlight (with **bold** font) any relationships the object is involved in, see [#865](https://github.com/TabularEditor/TabularEditor3/issues/865). This feature can be disabled under **Tools > Preferences > TOM Explorer**. +- We now display the main storage mode (Import, DirectQuery, DirectLake, etc.) of the model, in the title bar. +- In addition to tables, it is now possible to view relationships starting from a specific column in the "Dependencies" view. Right-click on a column and choose "Show dependencies", then choose the "Show relationships starting from this column" option, see [this comment](https://github.com/TabularEditor/TabularEditor3/issues/865#issuecomment-1490782086). +- We now show a warning in the **Messages** view when objects are in an unprocessed state. This applies to both tables, columns and partitions. It also solves [#1153](https://github.com/TabularEditor/TabularEditor3/issues/1153). +- We now show a warning in the **Messages** view when a column uses a sort-by-column that has `IsAvailableInMDX` set to **false** (as this would otherwise produce an error when the model is saved/deployed). See [#868](https://github.com/TabularEditor/TabularEditor3/issues/868). +- We've updated AMO/TOM to use the latest version [19.72.0](https://www.nuget.org/packages/Microsoft.AnalysisServices.retail.amd64/). This library also includes an updated version of TMDL, which should fix a deserialization issue, when a table has incremental refresh policy applied. +- When serializing a model using TMDL, we now also output a `database.tmdl` file, which contains metadata at the database level (name, compatibility mode, compatibility level, etc.), which should improve the overall TMDL experience. + +> [!NOTE] +> **TMDL is still in preview and should not be used in production, as you may be impacted by breaking changes between updates.** + If you encounter any issues opening a model that was saved as TMDL with an earlier version of Tabular Editor, a possible fix is to open the model from TMDL using the same earlier version of Tabular Editor, save it as a Model.bim file, and then use the latest version of Tabular Editor to open the Model.bim file and save it back to the TMDL format. + +## Bugfixes in 3.13.0 + +- Fixed an issue where undo'ing (Ctrl+Z) the removal of a Refresh Policy from a table, would not restore the configuration of that Refresh Policy. +- Fixed an issue where the DAX editor auto-complete would suggest incorrect items for window function parameters, when the window function was used as a filter argument for [`CALCULATE`](https://dax.guide/calculate/) or [`CALCULATETABLE`](https://dax.guide/calculatetable/). +- Fixed a bug that prevented adding/removing levels to hierarchies, when connected to an instance of Power BI Desktop, even though this is a [supported modeling operation](https://learn.microsoft.com/en-us/power-bi/transform-model/desktop-external-tools#data-modeling-operations). +- Fixed an issue where the "Calculate" refresh option did not appear for regular tables. +- Fixed an issue where evaluating only the current selection of a DAX Query would not work, if a line comment was directly above the first `EVALUATE` statement in the selection, see [#912](https://github.com/TabularEditor/TabularEditor3/issues/912). +- Tabular Editor should now let you "Open from folder", when the folder contains ".tmdl" files (previous versions of TMDL used the ".tmd" extension). See [#1175](https://github.com/TabularEditor/TabularEditor3/issues/1175). +- The logic for determining if a table is a "Date Table" was a bit too restrictive, which could cause false circular dependency errors in some cases, or incorrect display of overridden filter contexts in the DAX debugger (due to the implicit filter removal associated with date tables). + +--- +## Coming from Tabular Editor 2.x? + +Watch [this video](https://www.youtube.com/watch?v=pt3DdcjfImY) to get an idea of the new 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 + +*=Only while connected to an instance of Analysis Services or Power BI + +---