此内容由人工智能翻译,尚未经过人工编辑审核。图像和图表保持其原始语言。
动态度量值选择器
对于某些类型的 Report,有时让用户通过勾选维度上的成员来选择要显示的度量值,会比从字段列表中逐个加入度量值更合理。 网上有很多博客和文章对这种模式做了更详细的介绍。 你可以通过搜索 dynamic measure selector switch来找到它们!
基于我最近在 GitHub 上收到的一个问题,本文将演示如何自动生成一个用于选择的断开连接表,并创建一个与该表配合使用的 SWITCH 度量值。 这里的技术使用一个 Tabular Editor 脚本,当你在对象资源管理器树中多选若干度量值时执行该脚本。
脚本
在执行下面的脚本之前,你需要先确定几件事:
- 你希望这个断开连接的 1 列选择器表叫什么名字?
- 你希望断开连接的选择器表中的列叫什么名字?
- 你希望将动态 switch 度量值命名为什么?
- 动态 switch 度量值应放在哪个表中?
- 如果选择器表上未筛选任何值,或筛选了多个值,动态度量值应返回什么?
对于每个问题,将脚本顶部的字符串替换为你决定的值。
// (1) Name of disconnected selector table:
var selectorTableName = "Measure Selector";
// (2) Name of column on selector table:
var selectorTableColumnName = "Measure";
// (3) Name of dynamic switch measure:
var dynamicMeasureName = "Dynamic Measure";
// (4) Name of dynamic switch measure's parent table:
var dynamicMeasureTableName = "Measure Selector";
// (5) Fallback DAX expression:
var fallbackDax = "BLANK()";
// ----- Do not modify script below this line -----
if(Selected.Measures.Count == 0) {
Error("Select one or more measures");
return;
}
// Get or create selector table:
CalculatedTable selectorTable;
if(!Model.Tables.Contains(selectorTableName)) Model.AddCalculatedTable(selectorTableName);
selectorTable = Model.Tables[selectorTableName] as CalculatedTable;
// Get or create dynamic measure:
Measure dynamicMeasure;
if(!Model.Tables[dynamicMeasureTableName].Measures.Contains(dynamicMeasureName))
Model.Tables[dynamicMeasureTableName].AddMeasure(dynamicMeasureName);
dynamicMeasure = Model.Tables[dynamicMeasureTableName].Measures[dynamicMeasureName];
// Generate DAX for disconnected table:
// SELECTCOLUMNS({"Measure 1", "Measure 2", ...}, "Measure", [Value])
var selectorTableDax = "SELECTCOLUMNS(\n {\n " +
string.Join(",\n ", Selected.Measures.Select(m => "\"" + m.Name + "\"").ToArray()) +
"\n },\n \"" + selectorTableColumnName + "\", [Value]\n)";
// Generate DAX for dynamic metric:
// VAR _s = SELECTEDVALUE('Metric Selection'[Value]) RETURN SWITCH(_s, ...)
var dynamicMeasureDax =
"VAR _s =\n SELECTEDVALUE('" + selectorTableName + "'[" + selectorTableColumnName + "])\n" +
"RETURN\n SWITCH(\n _s,\n " +
string.Join(",\n ", Selected.Measures.Select(m => "\"" + m.Name + "\", " + m.DaxObjectFullName).ToArray()) +
",\n " + fallbackDax + "\n )";
// Assign DAX expressions:
selectorTable.Expression = selectorTableDax;
dynamicMeasure.Expression = dynamicMeasureDax;
使用脚本
只需将脚本粘贴到 Tabular Editor 中,然后在资源管理器树里选择多个度量值(按住 SHIFT 或 CTRL 进行多选)。 如果你的度量值分散在多个表中,Tabular Editor 将不允许你对它们进行多选(因为无法同时选择树中不同分支的对象)。 不过,有个变通办法:使用筛选功能,并将搜索结果以扁平列表显示(点击屏幕最右侧的按钮)。 例如,你可以在筛选框中输入通配符 *,或者输入 :ObjectType = "Measure" 来将搜索范围限定为只显示度量值。
选好你要包含在度量值选择器和动态度量值中的度量值后,按 F5 执行脚本。 如果有误,你随时可以按 CTRL+Z 撤销运行脚本所做的更改。
例如,如果我在选择了以下这些度量值的情况下运行脚本:

脚本会将计算表格的表达式设置为:

…并将动态 SWITCH 度量值表达式设置为:
