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 焦棚子

163_技巧_Power BI 一键批量建立自定义字段参数的更多相关文章

  1. 160_技巧_Power BI 新函数-计算工作日天数

    160_技巧_Power BI 新函数-计算工作日天数 一.背景 Power BI 2022 年 7 月 14 日更新了最新版本的,版本号为:2.107.683.0 . 更多更新内容可以查看官方博客: ...

  2. thinkphp扩展 根据前端批量建立字段

    /*批量添加字段辅助*/ function add_colum($tabel){ foreach ($_POST as $key=>$value){ $array[] = "add & ...

  3. sharepoint2010问卷调查(2)-实现问卷的图片调查(采用自定义字段类型)

    1. 首先建立个图片库上传图片 并建立文件夹1和2,1下有1.1文件夹,2下2.1文件夹,2.1下有文件夹2.1.1. 在1文件夹下放如下图片: 2.建立自定义字段类型,如下图: 3.部署后建立栏目的 ...

  4. Log4net 自定义字段到数据库

    今天要求做个log4net自定义字段到数据库,在网上找了好多例子,都运行不成功.最后找了个国外的,很简单的就解决了. log4net它已经定义的字段有 <commandText value=&q ...

  5. 159_模型_Power BI 地理分析之形状地图

    159_模型_Power BI 地理分析之形状地图 声明以下地图元素仅供学习交流所用,如需地图公开使用请提前做好报审工作. 一.背景 当企业的体量达到一定体量的时候,保持稳定的增长是非常重要的事情.本 ...

  6. outscan 一键批量 get struct2 devMode (CNVD-2016-04656)

    之前写的一个玩意 下载地址:http://pan.baidu.com/s/1i5jmEwP 密码:v8v3 一键批量 get struct2 devMode 支持百度.google(google有访问 ...

  7. 傲游浏览器4,傲游浏览器5如何一键批量打开url链接。

    傲游浏览器批量打开网址的插件没用了.有很多网友发了方法也无法实现.实际上,是可以实现傲游浏览器4,傲游浏览器5一键批量打开url链接的.我来告诉大家如何来实现.最新的M5都能使用.在收藏夹添加一个收藏 ...

  8. 一键批量ping任意ip段的存活主机

    =======================by me===================================== @echo offecho.color FC for /f %%i ...

  9. 一键批量打印EXCEL、WORD文档

    一键批量打印EXCEL.WORD文档,本方法也可以打印同一个文档N份,可以批量打印A3.A4文档,包括单.双面打印等.希望能帮到广大朋友.请大家注重原创版权,不得在未经许可的下转载.传播,或者用来对同 ...

随机推荐

  1. Java高并发-概念

    一.为什么需要并行 业务要求 http处理多个客户端请求 java虚拟机启动多个线程 进程开销比线程大的多 性能 多线程在多核系统比单线程要好的多 摩尔定律失效 二.几个重要概念 2.1 同步和异步 ...

  2. RabitMQ 发布确认

    每日一句 军人天生就舍弃了战斗的意义! 概述 RabitMQ 发布确认,保证消息在磁盘上. 前提条件 1.队列必须持久化 队列持久化 2.队列中的消息必须持久化 消息持久化 使用 三种发布确认的方式: ...

  3. VueX数据持久化

    解决:Vue刷新时获取不到数据 解决方案:1.本地存储 2.Vuex数据持久化工具插件 本地存储 import Vue from "vue"; import Vuex from & ...

  4. JOISC2020 题解

    Day1T1 建筑装饰4 题目链接:Day1T1 建筑装饰4 Solution 我们先考虑朴素的\(dp\)方法: 设\(dp_{i,j,k}\)表示前\(i\)个数中,选了\(j\)个\(B\)数组 ...

  5. Linux版本的项目环境搭建

    项目环境docker及docker-compose文档 1.Linux环境介绍 centos7.6 16G以上内存空间(至少8G) 2.静态IP设置 1.找到配置文件 cd /etc/sysconfi ...

  6. 接口测试postman深度挖掘应用②

    上一篇文章我们已经介绍了postman的基本用法,以及接口测试原理.未关注博主的可以关注下博主,后期测试安全,以及各种工具用法,编程语言都会有讲解的 老样子:①先补习基础知识:  ②补充上一章节由于过 ...

  7. 【Java面试】为什么引入偏向锁、轻量级锁,介绍下升级流程

    Hi,我是Mic 一个工作了7年的粉丝来找我,他说最近被各种锁搞晕了. 比如,共享锁.排它锁.偏向锁.轻量级锁.自旋锁.重量级锁. 间隙锁.临键锁.意向锁.读写锁.乐观锁.悲观锁.表锁.行锁. 然后前 ...

  8. SAP OOALV 添加状态灯

    *&---------------------------------------------------------------------* INCLUDE <icon>. T ...

  9. UiPath存在图像Image Exists的介绍和使用

    一.Image Exists的介绍 检查是否在指定的UI元素中找到图像,输出的是一个布尔值 二.Image Exists在UiPath中的使用 1. 打开设计器,在设计库中新建一个Sequence,为 ...

  10. UiPath循环活动For Each的介绍和使用

    一.For Each的介绍 For Each:循环迭代一个列表.数组.或其他类型的集合, 可以遍历并分别处理每条信息 二.For Each在UiPath中的使用 1.  打开设计器,在设计库中新建一个 ...