• 163_技巧_Power BI 一键批量建立自定义字段参数


    163_技巧_Power BI 一键批量建立自定义字段参数

    一、背景

    在 2022 年 5 月开始,Power BI 新增了一个非常有用的功能字段参数。再也不用写一串的 SWITCH 了。字段参数的效果请参阅如下:

    163-0

    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# 脚本实现自定义批量建立字段参数。

    动图效果:

    163-1

    二、如何实现

    Ⅰ、Power BI 设置

    在 Power BI 选项设置中,勾选字段参数。

    163-2

    特别注意,文章发布的时间是 2022 年 8 月,后续 Power BI 把字段参数正式加入更新中就不选当前步骤了。

    Ⅱ、Tabular Editor 设置

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

    163-3

    当前 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 三个参数为自己模型的对应元素。

    163-4

    Ⅴ、运行代码

    上述都配置好以后,点击运行即可自定义建立字段参数的计算表;注意及时在 Tabular Editor 中点击保存;回到 Power BI 点击立即刷新,此时可以看到我们的字段参数表已经建立好了,拖动到 Power BI 画布中即可。

    三、总结

    1、手动添加字段参数说明,请参考官方文档(https://docs.microsoft.com/zh-cn/power-bi/create-reports/power-bi-field-parameters),字段参数还是有一定限制,如下:

    163-5

    2、在使用上述方法前,请提前做好备份。

    3、可能有部分朋友会觉得没有必要搞的这么复杂,手动建立即可,但是在 Power BI 重度用户中,这样的自定义是完全有必要的。

    4、附件中 自定义字段参数_多表_注释.csx 含有注释的 C# 脚本,可以根据需要自取。

    163-6

    5、附件中 单表 的写法和 多表 的写法可以简单对比下,主要是照顾下新手朋友。

    附件下载

    https://jiaopengzi.com/2853.html

    视频课

    https://jiaopengzi.com/all-course

    by 焦棚子

  • 相关阅读:
    NLP中的数据增强方法!
    总是莫名其妙的发生段错误
    简易的Python小游戏,上班可玩一天,零基础小白可练手
    AI 驱动的医疗变革:迈向未来医疗新生态
    14.在SpringBoot框架集成MyBatis(mapper、mapperscan、xml和dao分离)
    学C第四天(简单题目)
    C++内存管理:其四、使用链表实现简易版内存池
    ss-2.子项目互相访问(order80 -> payment8001)
    zoj 1465 Wall
    js 如何去除字符串里两端的符号
  • 原文地址:https://www.cnblogs.com/jiaopengzi/p/16553659.html