Передача параметров в фильтр Power BI программно
В моем приложении отображается отчет Power BI. Он уже работает, поэтому нет проблем с отображением какого-либо отчета по его идентификатору (guid).
Но есть некоторые отчеты, которые необходимо параметризовать, например, с текущим годом или человеком, который рассматривает отчет. Что мой вопрос: как это сделать?
Чтобы быть более конкретным, я встраиваю отчет в элемент HTML <iframe>
. Я установил URL-адрес iframe для URL-адреса, полученного из определения отчета embedUrl
(полученного от REST API). Я управляю им кодом 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"
}
JavaScript-код для загрузки отчета:
function onFrameLoaded() {
var m = {
action: "loadReport",
reportId: reportId,
accessToken: accessToken
};
iframe.contentWindow.postMessage(JSON.stringify(m), "*");
}
Теперь я подаю, чтобы отфильтровать отчет по параметру из моего пользовательского приложения. Есть ли способ отправить или передать значение для фильтрации набора данных в отчете?
Ответы
Ответ 1
Прежде всего, фильтр должен быть определен в отчете, поэтому пользователь может установить его вручную.
Существует два возможных способа передать параметры (таким образом, фильтр настройки) в отчет 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" является идентификатором отчета, а "Хранить" - это набор данных, а 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 (сторона клиента браузера) контролирует загруженный отчет BI сообщениями postMessage()
с параметрами (как в вопросе выше). Существует дополнительная опция 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 отклоняет его молча как недопустимые имена;
Ответ 2
Microsoft создала powerbi-клиент, с помощью которого вы можете сделать гораздо больше, чем просто применить один фильтр. Вы можете применить столько фильтров, сколько хотите, и вы также можете выбрать страницу по умолчанию, фильтры по умолчанию, скрыть панель фильтров, скрыть навигацию по страницам и т.д.
Здесь вы можете найти клиента: https://microsoft.github.io/PowerBI-JavaScript/
Вот демонстрационное приложение: https://microsoft.github.io/PowerBI-JavaScript/demo/index.html
Вот документация: https://github.com/Microsoft/PowerBI-JavaScript/wiki