Dans mon application, j'affiche un rapport Power BI. Il fonctionne déjà, il n'y a donc aucun problème à afficher un rapport par son ID (guid).
Mais certains rapports doivent être paramétrés, par exemple, avec l'année en cours ou la personne qui consulte le rapport. C'est ma question: comment faire?
Pour être plus précis, j'incorpore le rapport à l'intérieur de l'élément HTML <iframe>
. J'ai défini l'URL iframe sur une URL reçue de la définition de rapport embedUrl
(reçue de REST). Je la contrôle par du code JavaScript qui appelle postMessage()
.
Définition du rapport:
{
"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"
}
Code JavaScript pour charger le rapport:
function onFrameLoaded() {
var m = {
action: "loadReport",
reportId: reportId,
accessToken: accessToken
};
iframe.contentWindow.postMessage(JSON.stringify(m), "*");
}
Maintenant, je nourris pour filtrer le rapport par un paramètre de mon application personnalisée. Existe-t-il un moyen d'envoyer ou de transmettre une valeur pour filtrer l'ensemble de données dans le rapport?
Tout d'abord, le filtre doit être défini dans le rapport, afin que l'utilisateur puisse le définir manuellement.
Il existe deux façons possibles de transmettre des paramètres (donc de définir un filtre) au rapport Power BI à partir d'une source externe.
a) Dans l'application Power BI
Vous pouvez spécifier le filtre en définissant le paramètre filter
dans l'URL du rapport (dans la barre d'adresse du navigateur). Le paramètre prend une requête de filtre personnalisé:
https://app.powerbi.com/groups/me/reports/12345678-6418-4b47-ac7c-f8ac7791a0a7?filter=Store/PostalCode eq '15012'
où "12345678-6418-4b47-ac7c-f8ac7791a0a7" est un identifiant de rapport et "Store" est un ensemble de données et PostalCode est un paramètre à filtrer. "eq" est un opérateur d'égalité.
L'URL doit être codée, donc l'URL finale ressemble à ceci:
https://app.powerbi.com/groups/me/reports/12345678-6418-4b47-ac7c-f8ac7791a0a7?filter=Store/PostalCode%20eq%20%2715012%27
b) paramètre sendMessage oDataFilter JavaScript
JavaScript (côté client du navigateur) contrôle le rapport BI chargé par des appels à postMessage()
avec des paramètres (comme dans la question ci-dessus). Il existe une option supplémentaire oDataFilter
qui peut être définie pour filtrer le rapport.
Réglez-le comme ceci: oDataFilter: "Store/PostalCode eq '15012'"
Le code complet ressemblerait à ceci:
function onFrameLoaded() {
var m = {
action: "loadReport",
reportId: reportId,
accessToken: accessToken,
oDataFilter: "Store/PostalCode eq '15012'"
};
iframe.contentWindow.postMessage(JSON.stringify(m), "*");
}
Remarques
Microsoft a créé un client powerbi avec lequel vous pouvez faire bien plus que simplement appliquer un filtre. Vous pouvez appliquer autant de filtres que vous le souhaitez et vous pouvez également choisir la page par défaut, les filtres par défaut, masquer le volet de filtre, masquer la navigation des pages, etc.
Vous pouvez trouver le client ici: https://Microsoft.github.io/PowerBI-JavaScript/
Voici une application de démonstration: https://Microsoft.github.io/PowerBI-JavaScript/demo/index.html
Voici la documentation: https://github.com/Microsoft/PowerBI-JavaScript/wiki