在 2022 年 5 月開始,Power BI 新增了一個非常有用的功能欄位引數。再也不用寫一串的 SWITCH
了。欄位引數的效果請參閱如下:
Power BI 公共 web 效果:https://demo.jiaopengzi.com/pbi/163-full.html
但筆者在做模型的時候,發現每次都需要手動拉取欄位,特別是重度 Power BI 使用者;另外當前存在的一個問題就是手動在 Power BI DAX 編輯器中寫的 NAMEOF
函數無法實現欄位引數效果;具體可以參考如下文章:
URL1:https://twitter.com/markbdi/status/1526558841172893696
URL2:https://github.com/TabularEditor/TabularEditor3/issues/541
URL3:https://p3adaptive.com/2022/05/completing-the-set-up-field-parameters-using-tabular-editor/
URL4:https://dobbsondata.co.uk/2022/05/17/field-parameters-in-tabular-editor/
在 Tabular Editor 的作者的 GitHub 問題回答中,找到了方法,通過 C# 指令碼實現自定義批次建立欄位引數。
動圖效果:
在 Power BI 選項設定中,勾選欄位引數。
特別注意,文章釋出的時間是 2022 年 8 月,後續 Power BI 把欄位引數正式加入更新中就不選當前步驟了。
在 Tabular Editor 中,File > Preferences >Features
勾選 Allow unsupported Power BI features(experimental)
當前 Tabular Editor 版本 2.16.7
在附件中,開啟 C# 指令碼 自定義欄位引數_多表.csx
程式碼如下:
/*=============================================自定義引數開始*/
/*欄位參數列名稱 list*/
var tableNameList = new string[]
{
"度量值組","維度組"
};
/*欄位引數名稱 list*/
var parameterNameList = new string[]
{
"度量值","維度"
};
/*
自定義引數元素
{"銷售金額","[0001_銷售金額]"} ,其中 銷售金額 為引數列名稱, [0001_銷售金額] 為度量值名稱.
{"大區","'D00_大區表'[F_02_大區]"} ,其中 大區 引數列名稱, 'D00_大區表'[F_02_大區] 為表的列名稱.
注意:度量值可以不需要字首表名稱,列名稱必須要有表名稱。
*/
var nameList = new string[][,]
{
new string[,]
{
{ "銷售金額" ,"[0001_銷售金額]" },
{ "銷售數量" ,"[0002_訂單數量]" },
{ "成本金額" ,"[0003_成本金額]" },
{ "毛利潤" ,"[0004_毛利潤]" },
{ "毛利率" ,"[0005_毛利率_%]"}
},
new string[,]
{
{ "大區" ,"'D00_大區表'[F_02_大區]" },
{ "省份" ,"'D01_省份表'[F_05_省簡稱2]"},
{ "產品" ,"'T00_產品表'[F_02_產品分類]"}
}
};
/*是否隱藏欄位參數列的其它列, true:不顯示; false:顯示*/
var tf = true;
/*=============================================自定義引數結束*/
/*=============================================以下程式碼勿修改*/
var listDaxRow = new List<string>{};
var count = 0;
var daxItem = "";
var dax ="";
for(int dim0 = 0; dim0 < tableNameList.GetLength(0); dim0++)
{
listDaxRow = new List<string>{};
count = 0;
for(int dim1 = 0; dim1 < nameList[dim0].GetLength(0); dim1++)
{
count += 1;
daxItem = "";
daxItem += "( \"";
daxItem += nameList[dim0][dim1,0];
daxItem += "\" ";
daxItem += ", NAMEOF ( ";
daxItem += nameList[dim0][dim1,1];
daxItem += " ) , ";
daxItem += count;
daxItem += " )";
listDaxRow.Add(daxItem);
}
dax ="";
dax += "{\n";
dax += string.Join(",\n",listDaxRow);
dax += "\n}";
var tableParameter = Model.AddCalculatedTable(tableNameList[dim0],dax);
var columnName = tableParameter.AddCalculatedTableColumn(parameterNameList[dim0], "[Value1]");
var columnField = tableParameter.AddCalculatedTableColumn(parameterNameList[dim0] + "_欄位", "[Value2]");
var columnOrder = tableParameter.AddCalculatedTableColumn(parameterNameList[dim0] + "_ID" , "[Value3]");
columnName.SortByColumn = columnOrder;
columnName.GroupByColumns.Add(columnField);
columnField.SetExtendedProperty("ParameterMetadata", "{\"version\":3,\"kind\":2}", ExtendedPropertyType.Json);
columnField.IsHidden = tf;
columnOrder.IsHidden = tf;
}
使用前,請認真閱讀指令碼裡面的註釋說明;更改 tableNameList
、parameterNameList
、nameList
三個引數為自己模型的對應元素。
上述都設定好以後,點選執行即可自定義建立欄位引數的計算表;注意及時在 Tabular Editor 中點選儲存;回到 Power BI 點選立即重新整理,此時可以看到我們的欄位參數列已經建立好了,拖動到 Power BI 畫布中即可。
1、手動新增欄位引數說明,請參考官方檔案(https://docs.microsoft.com/zh-cn/power-bi/create-reports/power-bi-field-parameters),欄位引數還是有一定限制,如下:
2、在使用上述方法前,請提前做好備份。
3、可能有部分朋友會覺得沒有必要搞的這麼複雜,手動建立即可,但是在 Power BI 重度使用者中,這樣的自定義是完全有必要的。
4、附件中 自定義欄位引數_多表_註釋.csx
含有註釋的 C# 指令碼,可以根據需要自取。
5、附件中 單表
的寫法和 多表
的寫法可以簡單對比下,主要是照顧下新手朋友。
https://jiaopengzi.com/2853.html
https://jiaopengzi.com/all-course
by 焦棚子