使用 DAX脚本功能
在上一篇文章中,你学习了如何在模型中添加和编辑计算对象,例如度量值、计算列等。
随着模型越来越复杂,在编写和维护业务逻辑时,你可能会发现,在 TOM Explorer 中导航或在各个度量值之间来回切换变得十分繁琐。 度量值之间出现很长的依赖链并不少见。因此,有时把构成业务逻辑的所有 DAX 代码集中到一个文档中会更方便。
这正是 Tabular Editor 3 新增 DAX脚本 功能的目的。
要使用此功能,请在 TOM Explorer 中找到你希望生成单一文档的对象。 多选这些对象,然后右键选择 Script DAX。 会创建一个新文档,其中包含所有选定对象的 DAX 表达式和基本属性。 你也可以分别选择某个表对象或模型对象,从而为表内的所有对象或整个模型内的所有对象生成 DAX脚本。

通过 DAX脚本编辑对象,与通过 表达式编辑器 编辑略有不同。 使用后者时,当你切换到另一个对象时,更改会立即生效。 而在 DAX脚本中,只有在你明确使用 Script > Apply (F5) 选项后,改动才会生效。 如果你已连接到 Analysis Services 实例,则可以使用 Script > Apply & Sync (SHIFT+F5) 选项,在应用更改的同时,将更新后的模型元数据保存到 Analysis Services。
使用 DAX脚本文件
DAX脚本可以保存为文本文件,文件扩展名为 .te3daxs。 要将 DAX脚本保存为文件,只需选择 文件 > 保存 (Ctrl+S)。 要从文本文件打开 DAX脚本,只需选择 文件 > 打开 > 文件... (Ctrl+O)。
Note
DAX脚本并不针对特定模型;但由于 DAX 表达式可能引用模型中定义的度量值、列和表,因此无法保证任何 DAX脚本都能应用于任意模型。 DAX脚本主要用于在特定 Data model 的上下文中,在单个文档中处理多个 DAX 对象。
DAX脚本编辑器
DAX脚本编辑器具备 Tabular Editor 3 中其他位置使用的 DAX 编辑器的全部功能。 具体包括:自动补全、自动格式化、参数提示等。
此外,为了更轻松地管理较大的 DAX脚本,DAX脚本视图顶部会显示两个下拉列表。 左侧下拉列表可让你在脚本中定义的对象之间快速跳转;右侧下拉列表可让你在当前对象的各个属性之间快速跳转。

定义度量值
如果你想在脚本中包含某个被引用、但尚未在脚本中定义的度量值定义,可以在度量值引用上右键,然后选择“定义度量值”或“定义度量值及其依赖项”选项。

快捷键
要将脚本应用到模型,可以使用以下快捷键:
- F5:将整个脚本应用到本地模型元数据
- Shift+F5:将整个脚本应用到本地模型元数据,然后将模型元数据保存回源
- F8:将脚本中当前选中的部分应用到本地模型元数据
- Shift+F8:将脚本中当前选中的部分应用到本地模型元数据,然后将模型元数据保存回源
支持的 DAX 对象
Tabular Editor 3 支持使用 DAX脚本编辑以下类型的对象:
- 度量值(包括 KPI)
- 计算列
- 计算表格
- 计算组(包括计算项)
DAX脚本语法
DAX脚本的语法如下:
<DAX script>:
MEASURE 'Table name'[度量值名称] = <DAX expression>
[<Measure properties>]
COLUMN 'Table name'[Column name] = <DAX expression>
[<Column properties>]
TABLE 'Table name' = <DAX expression>
[<Table properties>]
CALCULATIONGROUP 'Table name'[Column name]
[<Calculation Group properties>]
CALCULATIONITEM "Item 1" = <DAX expression>
[<Calculation Item properties>]
CALCULATIONITEM "Item 2" = <DAX expression>
[<Calculation Item properties>]
...
<Measure properties>:
DetailRows = <DAX expression>
DisplayFolder = "string"
FormatString = "string"
Description = "string"
Visible = TRUE/FALSE
KpiStatusExpression = <DAX expression>
KpiStatusDescription = "string"
KpiStatusGraphic = "string"
KpiTrendExpression = <DAX expression>
KpiTrendDescription = "string"
KpiTrendGraphic = "string"
KpiTargetExpression = <DAX expression>
KpiTargetDescription = "string"
KpiTargetFormatString = "string"
<Column properties>:
DisplayFolder = "string"
FormatString = "string"
Description = "string"
Visible = TRUE / FALSE
Datatype = BOOLEAN / DOUBLE / INTEGER / DATETIME / CURRENCY / STRING
<Table properties>:
Description = "string"
Visible = TRUE / FALSE
DetailRows = <DAX expression>
<Calculation Group properties>:
Description = "string"
Visible = TRUE / FALSE
Precedence = <integer value>
<Calculation Item properties>
Description = "string"
Ordinal = <integer value>
FormatString = <DAX expression>
示例 1:度量值
例如,下面的脚本在 'Internet Sales' 表上定义了 [Internet Total Sales] 度量值。 除了度量值的 DAX 表达式外,该脚本还包括度量值的说明和格式字符串。
----------------------------------
-- 度量值: [Internet Total Sales]
----------------------------------
MEASURE 'Internet Sales'[Internet Total Sales] = SUM('Internet Sales'[Sales Amount])
Description = "Returns the sum of all Internet Sales"
FormatString = "\$#,0.00;(\$#,0.00);\$#,0.00"
示例 2:带状态与目标 KPI 的度量值
下面的 DAX 脚本定义了 [Internet Current Quarter Sales Performance] 度量值,其中包含一个带状态表达式和目标表达式的 KPI。 状态 KPI 使用“Shapes”图形。
--------------------------------------------------------
-- 度量值: [Internet Current Quarter Sales Performance]
--------------------------------------------------------
MEASURE 'Internet Sales'[Internet Current Quarter Sales Performance] =
IFERROR(
[Internet Current Quarter Sales] / [Internet Previous Quarter Sales Proportion to QTD],
BLANK()
)
, KpiStatusExpression =
VAR x = [Internet Current Quarter Sales Performance]
RETURN
IF(
ISBLANK( x ),
BLANK(),
IF(x < 1, -1, IF(x < 1.07, 0, 1))
)
, KpiStatusGraphic = "Shapes"
, KpiTargetExpression = 1.1
示例 3:计算组
下面的 DAX 脚本定义了包含 [Period] 列的 'Time Intelligence' 计算组。 该计算组包含 6 个计算项,用于执行不同的时间计算。 注意,"YoY %" 计算项使用了不同的格式字符串。
-----------------------------------------
-- 计算组: 'Time Intelligence'
-----------------------------------------
CALCULATIONGROUP 'Time Intelligence'[Period]
Description = "Use this table to perform time calculations"
CALCULATIONITEM "Current" = SELECTEDMEASURE()
Ordinal = 0
CALCULATIONITEM "MTD" = TOTALMTD(SELECTEDMEASURE(), 'Calendar'[Date])
Ordinal = 1
CALCULATIONITEM "YTD" = TOTALYTD(SELECTEDMEASURE(), 'Calendar'[Date])
Ordinal = 2
CALCULATIONITEM "PY" = CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR('Calendar'[Date]))
Ordinal = 3
CALCULATIONITEM "YoY" =
SELECTEDMEASURE()
- CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR('Calendar'[Date]))
Ordinal = 4
CALCULATIONITEM "YoY %" =
VAR lastYear =
CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR('Calendar'[Date]))
RETURN
DIVIDE(
SELECTEDMEASURE() - lastYear,
lastYear
)
FormatString = "Percent"
Ordinal = 5