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

and*_*fox 25 filter parameter-passing powerbi powerbi-embedded

在我的应用程序中,我正在显示Power BI报告.它已经可以工作,因此通过其ID(guid)显示任何报告都没有问题.

但是有一些报告需要进行参数化,例如,当前年份或观看报告的人.这是我的问题:如何做到这一点?

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

报告定义:

{
  "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"
}
Run Code Online (Sandbox Code Playgroud)

用于加载报告的JavaScript代码:

function onFrameLoaded() {
    var m = {
        action: "loadReport",
        reportId: reportId,
        accessToken: accessToken
    };

    iframe.contentWindow.postMessage(JSON.stringify(m), "*");
}
Run Code Online (Sandbox Code Playgroud)

现在,我通过自定义应用程序中的参数来过滤报告.有没有办法在报告中发送或传递值来过滤数据集?

and*_*fox 31

首先,必须在报告中定义过滤器,以便用户可以手动设置过滤器.

有两种方法可以将参数(从而设置过滤器)从外部源传递到Power BI报告.

a)在Power BI应用程序中

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

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), "*");
}
Run Code Online (Sandbox Code Playgroud)

备注

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

  • 有没有办法用URL方法指定多个参数?我试过了?filter = Store/PostalCode eq'15012'&?filter = Store/State eq'IL'还有?filter = Store/PostalCode eq'15012'和Store/State eq'IL' (4认同)
  • @Markive - 不安全; 您可以将UserId作为过滤器传递,但用户可以清除它.有了这个要求,Power BI可能不适合你.在Power BI中,您必须向每个用户帐户(使用不同的查询)发布不同的报告. (2认同)

Sil*_*lko 7

微软创建了一个powerbi-client,除了应用一个过滤器之外,你还可以做更多的事情.您可以根据需要应用任意数量的过滤器,也可以选择默认页面,默认过滤器,隐藏过滤器窗格,隐藏页面导航等.

你可以在这里找到客户端:https: //microsoft.github.io/PowerBI-JavaScript/

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

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