以编程方式向Power BI过滤器传递参数

29

在我的应用中,我正在显示一个 Power BI 报告。它已经可以正常工作了,所以通过其 ID(guid)显示任何报告都没有问题。

但是有一些需要参数化的报告,例如使用当前年份或查看报告的人员。 这就是我的问题:如何做到呢?

更具体来说,我将报告嵌入 HTML 的 <iframe> 元素中。我将 iframe 的 URL 设置为从报告定义的 embedUrl 获取的 URL(从 REST API 接收)。我通过调用 postMessage() 的 JavaScript 代码来控制它。

报告定义:

{
  "id":"12345678-6418-4b47-ac7c-f8ac7791a0aa",
  "name":"Retail Analysis Sample",
  "webUrl":"https://app.powerbi.com/reports/12345678-6418-4b47-ac7c-f8ac7791a0aa",
  "embedUrl":"https://app.powerbi.com/reportEmbed?reportId=12345678-6418-4b47-ac7c-f8ac7791a0aa"
}
JavaScript代码加载报告:
function onFrameLoaded() {
    var m = {
        action: "loadReport",
        reportId: reportId,
        accessToken: accessToken
    };

    iframe.contentWindow.postMessage(JSON.stringify(m), "*");
}

现在我需要根据自定义应用程序中的参数过滤报告。是否有一种方法可以发送或传递值以过滤报告中的数据集?


可能是Power BI嵌入URL-多个筛选器的重复问题。 - Matt Mazzola
4
它怎么可能成为之后提出且关注点不同的问题的副本? - andrew.fox
2个回答

38

首先,在报表中必须定义筛选器,以便用户可以手动设置它。

有两种可能的方式可以从外部源将参数(因此设置筛选器)传递到Power BI报告中。

a) 在Power BI应用程序中

您可以通过在报告URL(浏览器地址栏中)设置filter参数来指定筛选器。参数采用自定义筛选查询:

https://app.powerbi.com/groups/me/reports/12345678-6418-4b47-ac7c-f8ac7791a0a7?filter=Store/PostalCode eq '15012'

其中,“12345678-6418-4b47-ac7c-f8ac7791a0a7”是报告ID,“Store”是数据集,“PostalCode”是要筛选的参数。“eq”是等于运算符。

URL应进行编码,因此最终的URL看起来像这样:

https://app.powerbi.com/groups/me/reports/12345678-6418-4b47-ac7c-f8ac7791a0a7?filter=Store/PostalCode%20eq%20%2715012%27

b) JavaScript sendMessage oDataFilter参数

JavaScript(浏览器客户端)通过带有参数的postMessage()调用控制加载的BI报告(就像上面的问题中一样)。有一个额外选项oDataFilter,可以设置为过滤报告。

像这样设置它:oDataFilter: "Store/PostalCode eq '15012'"

完整代码看起来像这样:

function onFrameLoaded() {
    var m = {
        action: "loadReport",
        reportId: reportId,
        accessToken: accessToken,
        oDataFilter: "Store/PostalCode eq '15012'"
    };

    iframe.contentWindow.postMessage(JSON.stringify(m), "*");
}

注意事项

  • 过滤器参数(数据源或参数名称)中不得有任何点号,因为 Power BI 代码会默默地将其拒绝为无效名称;

能否使用这种方法基于UserID来过滤数据呢?例如,假设我有50个用户,他们对他们可以看到的数据具有不同的权限。如果我正在使用DirectConnect连接到SQL服务器,那么我是否可以使用参数方法仅拉取/显示用户可以查看的数据? - Markive
2
@Markive - 这种方式并不安全;你可以将 UserId 作为过滤器传递,但用户可以清除它。有了这个要求,Power BI 可能不适合你。在 Power BI 中,您必须为每个用户帐户(使用不同查询的帐户)发布不同的报告。 - andrew.fox
4
有没有一种方法可以使用URL方法指定多个参数?我尝试过使用"?filter=Store/PostalCode eq '15012'&?filter=Store/State eq 'IL'"和"?filter=Store/PostalCode eq '15012' and Store/State eq 'IL'",但都不行。 - Travis
1
只是提醒您,如果您在筛选器中设置了要过滤的值并发布报告,则此方法将无法正常工作。您必须在发布 PBIX 时不设置任何筛选器。 - freethinker6
我正在编写一个程序来构建嵌入式URL,URL已经被编码,但是在编码的符号过滤器未应用的情况下。如果不进行编码,则可以正常工作...为什么会这样? - demo
显示剩余3条评论

10

Microsoft创建了一个powerbi-client,您可以在其中执行的操作远不止应用一个过滤器。您可以应用尽可能多的过滤器,并且您还可以选择默认页面、默认过滤器、隐藏过滤器窗格、隐藏页面导航等。

您可以在此处找到客户端: https://microsoft.github.io/PowerBI-JavaScript/

这是一个演示应用程序: https://microsoft.github.io/PowerBI-JavaScript/demo/index.html

以下是文档: https://github.com/Microsoft/PowerBI-JavaScript/wiki


快速问题,使用API将报告筛选器传递给Power BI时,是否存在值的数量限制? - Vishnu Suresh
我不确定。需要进行一些研究。但我认为,如果有限制,那是因为可以发送到API的数据长度或者可能是由于某些JavaScript限制。但是数字应该很大。 - Silko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接