DAX分享27:DAX控制URL实现report间带parameter的跳转

浏览: 1905

DAX基础21:Power BI中实现Cross report,其实是因为做了一个关于报表到报表跳转的需求。用的就是控制URL的方法。实际上来讲,是我们公司定制的power bi server上实现的,和下文中的通用版power bi server有些许不同,但是为了分享,还是用通用版power bi server上再实现一下。会不会报表在网页展示,最后都是Javascript...至少要会一些的。

需求:

我们已经完成了H performance,T performance,P performance,V performance的四张report,对于这四张report来说,dimension表基本上是一致的,但是由于fact的数据量比较大还有单个表的KPI的研究方向完全不同并且KPI多,所以分别创建的report。但是在report中的sclier基本上是一样的。用户提出,想选择一次filter,然后查看不同的performance表。

解决方案:

1. 建立一张filter page的power bi report。里面包含全部的维度表dimension的字段slicer。样张如下所示:

这个用来总控filters。不同的筛选完成之后,从不同的report button去访问不同的report。然后在report中设置button再回到总控的power bi report。

返回,但是不能去除filter page里面的filter。因为还要从这个页面到其他的performance report中。

2. 研究可以传递的URL格式。

Power BI report在power bi server上本身的URL就是share给大家用的URL

https://app.powerbi.com/groups/936c90a8-b8f3-47df-a85d-4e42d2768c4f/reports/e300f023-be44-4359-8314-e090a4887d35/ReportSection

Power BI server上接收的URL的规则是本来的URL?filter=table/column in ('','') and table1/column1 in ('','')

单选的话是eq,但是本例中都是多选。

column filter中Category来自于表名Product Category。空格算是特殊字符。这里table的表达式就是Prodcut_x0200_Category。

(如果column的名字是[Project] 则column的表达式是x005B_Project_x005D

如果名字是Project@Number则column的表达式是Project_x0040_Number

如果是Project+Number则column的表达式是Project_x002B_Number)

对于column中的内容value来说,要注意的就是上引号’,在选项中要双上点表达。比如Alice's address, URL?filter=table/column eq 'Alice''s address',还有’&‘,要换成%26.

多个filter用and来连接。

按照这个规则创建DAX,根据不同的筛选结果,得到动态的URL。

3. DAX创建相关的链接。

Filter的DAX还是比较简单的,Value里面没有特别的字符。但是要考虑,单选,多选和不选的情况。并且把Month filter放在最后面。

创建Measure内容如下:

Brand = 
VAr n2 = CONCATENATEX(VALUES('Product'[Brand]),'Product'[Brand],"','")
VAr n3 = COUNTX(VALUES('Product'[Brand]),'Product'[Brand])
return IF(ISFILTERED('Product'[Brand]),"Product/Brand in ('"&IF(n3>=2,n2,IF(n3=1,SELECTEDVALUE('Product'[Brand])))&"')",BLANK())

Manufacturer和Color,Brand来自同一张表Prodcut。来自同一张表,要注意会相互有影响

Color = 
VAr n2 = CONCATENATEX(VALUES('Product'[Color]),'Product'[Color],"','")
VAr n3 = COUNTX(VALUES('Product'[Color]),'Product'[Color])
VAR n4 = "Product/Color in ('"&IF(n3>=2,n2,IF(n3=1,SELECTEDVALUE('Product'[Color])))&"')"
VAR n5 = " and Product/Color in ('"&IF(n3>=2,n2,IF(n3=1,SELECTEDVALUE('Product'[Color])))&"')"
VAr n6 = IF(ISBLANK([Category])&&ISBLANK([Brand]),n4,n5)
return IF(ISFILTERED('Product'[Color]),n6,BLANK()
Manufacturer = 
VAr n2 = CONCATENATEX(VALUES('Product'[Manufacturer]),'Product'[Manufacturer],"','")
VAr n3 = COUNTX(VALUES('Product'[Manufacturer]),'Product'[Manufacturer])
VAr n4 = "Product/Manufacturer in ('"&IF(n3>=2,n2,IF(n3=1,SELECTEDVALUE('Product'[Manufacturer])))&"')"
VAr n5 = " and Product/Manufacturer in ('"&IF(n3>=2,n2,IF(n3=1,SELECTEDVALUE('Product'[Manufacturer])))&"')"
VAR n6 = IF(ISBLANK([Color])&&ISBLANK([Brand])&&ISBLANK([Category]),n4,n5)
return IF(ISFILTERED('Product'[Manufacturer]),n6,BLANK())

Subcategory,Category的table name中有个空格,所以稍微有点不同。

Subcategory的value有的带有特殊字符’&‘,需要替换成’%26‘

Subcategory = 
VAr n2 = CONCATENATEX(VALUES('Product Subcategory'[Subcategory]),'Product Subcategory'[Subcategory],"','")
VAR n1 = IF(ISERROR(FIND("&",n2)),n2,REPLACE(n2,FIND("&",n2),1,"%26"))
VAr n3 = COUNTX(VALUES('Product Subcategory'[Subcategory]),'Product Subcategory'[Subcategory])
VAr n4 = "Product_x0020_Subcategory/Subcategory in ('"&IF(n3>=2,n1,IF(n3=1,SELECTEDVALUE('Product Subcategory'[Subcategory])))&"')"
VAr n5 = " and Product_x0020_Subcategory/Subcategory in ('"&IF(n3>=2,n1,IF(n3=1,SELECTEDVALUE('Product Subcategory'[Subcategory])))&"')"
VAr n6 = IF(ISBLANK([Month filter])&&ISBLANK([Manufacturer])&&ISBLANK([Color])&&ISBLANK([Brand])&&ISBLANK([Category]),n4,n5)
return IF(ISFILTERED('Product Subcategory'[Subcategory]),n6,BLANK())
Category = 
VAr n2 = CONCATENATEX(VALUES('Product Category'[Category]),'Product Category'[Category],"','")
VAr n3 = COUNTX(VALUES('Product Category'[Category]),'Product Category'[Category])
VAr n4 = "Product_x0020_Category/Category in ('"&IF(n3>=2,n2,IF(n3=1,SELECTEDVALUE('Product Category'[Category])))&"')"
VAr n5 = " and Product_x0020_Category/Category in ('"&IF(n3>=2,n2,IF(n3=1,SELECTEDVALUE('Product Category'[Category])))&"')"
VAr n6 = IF(ISBLANK([Brand]),n4,n5)
return
IF(ISFILTERED('Product Category'[Category]),n6,BLANK())
Year = 
VAr n2 = CONCATENATEX(VALUES('Date'[Year]),'Date'[Year],"','")
VAr n3 = COUNTX(VALUES('Date'[Year]),'Date'[Year])
VAr n4 = "Date/Year in ('"&IF(n3>=2,n2,IF(n3=1,SELECTEDVALUE('Date'[Year])))&"')"
VAR n5 = " and Date/Year in ('"&IF(n3>=2,n2,IF(n3=1,SELECTEDVALUE('Date'[Year])))&"')"
VAr n6 = IF(ISBLANK([Subcategory])&&ISBLANK([Month filter])&&ISBLANK([Manufacturer])&&ISBLANK([Color])&&ISBLANK([Brand])&&ISBLANK([Category]),n4,n5)
return IF(ISFILTERED('Date'[Year]),n6,BLANK())

Month filter = 
VAr n2 = CONCATENATEX(VALUES('Date'[Month Name]),'Date'[Month Name],"','")
VAr n3 = COUNTX(VALUES('Date'[Month Name]),'Date'[Month Name])
VAr n4 = "Date/Month_x0200_Name in ('"&IF(n3>=2,n2,IF(n3=1,SELECTEDVALUE('Date'[Month Name])))&"')"
VAR n5 = " and Date/Month_x0200_Name in ('"&IF(n3>=2,n2,IF(n3=1,SELECTEDVALUE('Date'[Month Name])))&"')"
VAr n6 = IF(ISBLANK([Manufacturer])&&ISBLANK([Color])&&ISBLANK([Brand])&&ISBLANK([Category]),n4,n5)
return IF(ISFILTERED('Date'[Month Name]),n6,BLANK())

因为有四个不同的report的URL需要用这个组合filter,所以创建一个共有filters.

这里filters中的measures的顺序是固定好的。这个和我在各个measures里面的isblack的判断有相关性。在URL里面,多写一个空格都会出问题,所以有没有空格,要搞清楚,不要随手加空格~~别问我咋知道的,宝宝心里苦~~

filters = [Brand]&[Category]&[Color]&[Manufacturer]&[Month filter]&[Subcategory]&[Year]

最终URL如下

H URL = 
VAr n1 = "https://app.powerbi.com/groups/936c90a8-b8f3-47df-a85d-4e42d2768c4f/reports/47c14fd6-280f-48d8-80df-4bfd2fbd1e55/ReportSection"
VAR n2 = "?filter="
return n1&IF(ISBLANK([filters]),n1,n2&[filters]

设置到相应的button就可以了。

随便做个测试~~其实我已经测了很多遍了。。。

那个大的返回button里面设置如下。

measures我都不想写了。直接贴原始的report URL就可以。从被选择之后的Performance表返回到filter page表,不会影响filter page表上的选择了的filter。上面那些DAX弄得我头都大了。建议点赞收藏,下次直接套用~~我自己反正是不想再费脑子了。下次直接来找。

谢谢关注

05m.jpg

推荐 0
本文由 懒胖子 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册