163_技巧_Power BI 一鍵批次建立自定義欄位引數

2022-08-05 12:00:20

163_技巧_Power BI 一鍵批次建立自定義欄位引數

一、背景

在 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 設定

在 Power BI 選項設定中,勾選欄位引數。

特別注意,文章釋出的時間是 2022 年 8 月,後續 Power BI 把欄位引數正式加入更新中就不選當前步驟了。

Ⅱ、Tabular Editor 設定

在 Tabular Editor 中,File > Preferences >Features 勾選 Allow unsupported Power BI features(experimental)

當前 Tabular Editor 版本 2.16.7

Ⅲ、C# 指令碼

在附件中,開啟 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;
}

Ⅳ、修改自定義引數

使用前,請認真閱讀指令碼裡面的註釋說明;更改 tableNameListparameterNameListnameList 三個引數為自己模型的對應元素。

Ⅴ、執行程式碼

上述都設定好以後,點選執行即可自定義建立欄位引數的計算表;注意及時在 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 焦棚子