写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弄得我头都大了。建议点赞收藏,下次直接套用~~我自己反正是不想再费脑子了。下次直接来找。
谢谢关注
