在这篇文章中,我们将创建一个DAX公式,根据报表中的过滤器生成超链接。
该度量包含2个部分,第一部分是使用DAX生成目标报告的正确URL,第二部分是将过滤器传递给该报告。
浏览器支持的MAX网址长度定义为2040,但我认为2020年是安全的。
动态网址测量 =
// 将MAX URL长度设置为2020是安全的。
var maxURLLength = 2020
现在我们确定URL,我们以两种方式执行此操作,一次我们对URL进行硬编码,然后根据模型中的过滤器确定URL。因此,我们可以根据过滤器跳转到不同的页面。
为了结束URL,我们使用了一个虚假的过滤器,可以让以后更容易地将其他过滤器附加到URL,否则你将不得不做很多魔术:)。伪过滤器是指为此目的而创建的模型中的表和列,它与任何其他表无关,因此设置它没有任何效果,除了使URL更容易制作。如果您不将这些字段添加到模型中,则URL将返回错误。
现在让我们创建度量的URL部分:
01
我们为每个页面使用一个硬编码的URL:
VAR reportURl =
“https://app.powerbi.com/groups/a4969cce-a7ed-4868-82c9-0c8901ab83c2/reports/6c48c42d-ec49-472c-a34f-3491ebdf7052/ReportSection1? filter = a / a = 1“
我们观察到在这里添加了a / a = 1只是为了启动过滤器,现在我们要做的就是追加。
在第二个选项中,我们根据报表中过滤器的选择构建URL,每个选项生成一个不同的URL。
我们使用DAX switch语句来测试设置了哪些过滤器。使用ISFILTERED函数,我们可以检查是否已在列上设置过滤器。在这种情况下,我们将URL基于报表中设置的某些过滤器,以便我们可以根据用户的选择引导用户。每个过滤器组合都针对不同的URL。
这看起来像这样:
var reportURl = SWITCH(TRUE(),
//是否有关于教育和货币的过滤器?
AND(ISFILTERED('顾客'[英语教育]), ISFILTERED('Currency'[货币名称]))
//链接到从Power BI复制的URL
, "https://app.powerbi.com/groups/a4969cce-a7ed-4868-82c9-0c8901ab83c2/reports/5g4tc42d-ec49-472c-a34f-3491ebdf4321/ReportSection1?"
//销售地区国家/地区和货币是否有过滤器?
,AND(ISFILTERED(SalesTerritory[销售地区国家]), ISFILTERED('Currency'[货币名称]))
,"https://app.powerbi.com/groups/a4969cce-a7ed-4868-82c9-0c8901ab83c2/reports/7c48c42d-ec49-472c-a34f-3491ebdf6543/ReportSection1?"
//如果他们都没有移动到默认URL
,"https://app.powerbi.com/groups/a4969cce-a7ed-4868-82c9-0c8901ab83c2/reports/8r65c42d-ec49-472c-a34f-3491ebdf7564/ReportSection1?"
) //打开过滤器并使用模型中隐藏的表列来使用过滤器,以便更容易添加其他过滤器
& "filter=a/a=1"
02
最后,当定义URL时,我们需要根据屏幕上的选择传入所有过滤器。我们检查设置了哪些过滤器并创建了URL的一部分。每个过滤器的URL语法是“表/列IN('value1','value2')。
要构造过滤器URL,我们使用ISFILTERED检查已设置过滤器,如果是这种情况,我们创建一个以相应的表/列名称开头的URL过滤器和IN子句,以传递我们需要过滤的值列表上。我们使用CONCATENATEX和VALUES函数连接所有选定的值。
这将为这些选定的过滤器生成URL过滤器。在此示例中,我们添加了一些不同的过滤器。我们开始查看Country并生成查询字符串:
//过滤色谱柱时,请制作过滤器部件并添加该列的所有选定值
var countryfilter = IF(ISFILTERED(SalesTerritory[销售地区国家]), "Store/Territory in ('" & CONCATENATEX(VALUES('SalesTerritory'[销售地区国家]), 'SalesTerritory'[销售地区国家], "','") & "')")
我们对日期范围也这样做,在这种情况下,我们使用MIN和MAX来获得选择值的范围,我们使用le表示<=,ge表示>=。
//过滤色谱柱时,请制作过滤器部件并添加该列的所有选定值
var datefilter = IF(ISFILTERED('Date'[FullDateAlternateKey]), "Date/FullDateAlternateKey le " & MAX('Date'[FullDateAlternateKey]) & " and Date/FullDateAlternateKey gt " & MIN('Date'[FullDateAlternateKey]))
我们对要传递给新报告的所有过滤器重复此操作。
生成所有过滤器后,我们将它们全部添加到URL。由于最大URL长度设置为2020,我们希望创建一些回退过滤器,以防所有过滤器都不符合最大长度。我们首先创建一些过滤器,然后在列表中添加更多过滤器。如果过滤器不为空,我们需要在URL中添加“and”以启动新过滤器。每个过滤器列表都会越来越长。
//创建URL,添加备份URL以防长度过长而过滤器较少
var URLfilter4 = reportURl & IF(LEN(countryfilter)>0, " and ") & countryfilter & IF(LEN(datefilter)>0, " and ") & datefilter
//B在短过滤器的基础上进行扩展,直到我们达到URL限制
var URLfilter3 = URLfilter4 & IF(LEN(educationFilter)>0, " and ") & educationFilter
var URLfilter2 = URLfilter3 & IF(LEN(promotionFilter)>0, " and ") & promotionFilter
var URLfilter1 = URLfilter2 & IF(LEN(currencyFilter)>0, " and ") & currencyFilter
最后,我们返回要在报告上使用的度量的完整URL。根据过滤器URL的长度,我们确定需要返回哪一个。如果我们没有符合条件的任何网址,我们会向用户抛出错误。在这种情况下,他不会看到URL,而是报告中的错误,他可以使用提供的消息单击该错误。
//根据URL的长度将URL返回到度量
return SWITCH(TRUE(),
//URLfilter1是否小于最大URL长度?
AND(LEN(URLfilter1)>=0, LEN(URLfilter1)<=maxURLLength) , URLfilter1 ,
//URLfilter2是否小于最大URL长度?
AND(LEN(URLfilter2)>=0, LEN(URLfilter2)<=maxURLLength) , URLfilter2 ,
//URLfilter3是否小于最大URL长度?
AND(LEN(URLfilter3)>=0, LEN(URLfilter3)<=maxURLLength) , URLfilter3 ,
//URLfilter4是否小于最大URL长度?
AND(LEN(URLfilter4)>=0, LEN(URLfilter4)<=maxURLLength) , URLfilter4 ,
//如果它们都不适合URL长度则向用户抛出错误
"" & ERROR("我们无法创建链接,请删除一些过滤器值,然后重试")
)
在这里我们可以观察做的“”和错误内容,这将确保度量的数据类型是一个文本,这是使度量返回TEXT所需的,因此我们可以将其标记为web url。
最终结果将是这样的URL:
https://app.powerbi.com/groups/a4969cce-a7ed-4868-82c9-0c8901ab83c2/reports/8r65c42d-ec49-472c-a34f-3491ebdf7564/ReportSection1?filter=a/a=1 and Store/Territory in ('加拿大') and Customer/English_x0020_Education in ('中学')
最后,我们需要将度量的数据类别设置为Web URL 就大功告成了
根据过滤器在Power BI中生成可单击的超链接:
1.Power BI免费下载:http://www.yeacer.com/
Microsoft Power BI Desktop中文最新版:下载地址
2.欢迎加入的Power BI技术群,目前正在学习阶段,有兴趣的朋友可以一起学习讨论。
Power Data技术交流群:702966126 (验证注明:博客园Power BI)
更多精彩内容请关注微信公众号:悦策PowerBI
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,作者博客:https://www.cnblogs.com/yeacer/