Power BI — flux OData avec vos droits Odoo
Power BI Connector for Odoo — a native OData v4 feed Power BI Desktop and Excel read directly, with the tables and columns you choose, one revocable token per feed, every read executed with a real Odoo account's access rights, a served-rows diagnostic, and CSV / Excel exports as a fallback.
Captures d'écran
Power BI Connector for Odoo 20 — native OData v4 feed
Une adresse à coller dans Power BI, et vos droits d'accès Odoo qui s'appliquent vraiment
Ce que vous payez, et ce qui existe gratuitement
Des connecteurs OData gratuits existent, et ils servent des données. Ce module coûte 69 € pour trois choses qu'aucun d'eux ne fait :
| Un journal de ce qui a été servi | Lignes, rejets, durée, compte appliqué, colonnes écartées. Sans lui, un rapport qui affiche des chiffres faux ne se dépanne pas. |
| Un jeton faux qui rend 404, pas 403 | On ne confirme pas à qui essaie des adresses au hasard qu'il en a trouvé une bonne. |
| Une colonne lisible à côté de chaque lien | Sans elle, il faut reconstruire à la main chaque relation dans Power BI avant le premier graphique. |
Si ces trois points ne vous manquent pas, un connecteur gratuit suffira.
Le format que Power BI attend déjà
Power BI Desktop livre en standard un connecteur Flux OData. On colle une adresse, on choisit « Anonyme », et les tables apparaissent.
Rien à installer côté Windows. Aucun connecteur personnalisé à faire approuver. Aucune inscription d'application Azure.
Excel lit le même flux, ainsi que Tableau, Looker Studio et tout outil qui parle OData.
Le compte dont les droits s'appliquent, l'adresse à coller, et les tables avec leurs colonnes et leur filtre.
Les droits d'Odoo s'appliquent — vraiment
Chaque flux porte le nom d'un compte Odoo réel, et chaque lecture s'exécute avec les droits de ce compte. Jamais en superutilisateur. Groupes, règles d'enregistrement, multi-société : ce que ce compte ne voit pas dans le client web, le flux ne le sert pas.
Le compte technique OdooBot est refusé comme porteur : un flux qui a tous les droits n'en filtre aucun, et la promesse tomberait sans que personne s'en aperçoive.
Les champs dont le nom évoque un secret — mot de passe, jeton, clé — sont refusés à la configuration, quelle que soit la volonté de l'administrateur.
Trois tests le vérifient sur un serveur réel, et la contre-épreuve a été faite : exécuter le flux en superutilisateur fait tomber exactement ces trois tests.
Un jeton par flux, et un jeton faux ne dit rien
Chaque flux a son jeton, révocable seul, sans toucher aux autres.
Un jeton inconnu, un flux désactivé, une table inconnue : la réponse est 404. Pas 403.
Un 403 confirmerait à qui essaie des adresses au hasard qu'il en a trouvé une bonne. Sonder des jetons ne laisse d'ailleurs aucune trace dans le journal d'un flux : on ne peut pas saturer le diagnostic depuis l'extérieur.
Les tables et les colonnes sont les vôtres
On choisit le modèle, les champs, et un filtre Odoo facultatif. Pas une liste figée décidée par l'éditeur.
La colonne lisible à côté du lien. Chaque champ de liaison peut donner
deux colonnes : partner_id pour lier les tables entre elles, et
partner_id_libelle pour les axes et les légendes. Sans elle, il faut
reconstruire à la main chaque relation dans Power BI avant le premier
graphique.
Les champs non stockés sont permis — sur un produit, le nom et le prix en sont — mais signalés : ils se recalculent ligne par ligne et ne peuvent servir ni au filtre ni au tri.
$top, $skip et $count sont pris en compte, et le
@odata.nextLink permet à Power BI d'enchaîner les pages tout seul —
sans lui, il s'arrête à la première page et le rapport ment.
Chaque flux affiche ses appels, ses lignes servies et ses rejets. Ici, un flux dont le compte n'a pas le droit de lire le stock.
Le diagnostic : ce qui a été servi, à qui, en combien de temps, et ce qui a été refusé.
Un flux muet ne se dépanne pas
Chaque appel laisse une trace : table, format, lignes servies, rejets, durée, adresse d'appel et compte dont les droits ont été appliqués.
Quand un rapport affiche des chiffres faux, la première question est toujours la même : combien de lignes le flux a-t-il réellement rendues ? On le voit tout de suite.
Le journal se purge tout seul au-delà de soixante jours.
CSV et Excel en secours
La même table, en fichier, pour qui n'a pas Power BI : ajoutez
.csv ou .xlsx à la fin de l'adresse.
Le fichier est complet, pas paginé : personne ne recolle vingt CSV à la main. Le CSV sort avec le point-virgule et le BOM qu'Excel attend en français.
L’application en mouvement
Le module en marche, enregistré dans le vrai client Odoo 19 : flux, flux (fiche) puis journal. Ce n’est pas un montage — ce sont les trames du navigateur sur le module livré, pris sur sa propre base.
Vidéo MP4 — 223 ko, 1280 px, 2.5 s, 3 écrans. Une amorce animée est aussi livrée en GIF (245 ko, 560 px) pour les contextes qui n’affichent pas la balise vidéo.
Ce que le module ne fait pas
Il ne pousse rien vers le service Power BI et ne crée aucun jeu de données dans le nuage de Microsoft : c'est Power BI qui vient lire.
Le flux est en lecture seule : pas d'écriture ni de retour depuis Power BI.
Il n'ouvre pas la base PostgreSQL. Une vue SQL exposée à l'extérieur ignorerait tous les droits d'accès d'Odoo — la base ne connaît ni les groupes, ni les règles d'enregistrement, ni le multi-société. C'est exactement ce que ce module refuse de faire.
Ce qui a été vérifié, et ce qui ne l'a pas été
44 tests automatiques, dont des appels HTTP réels : conformité OData v4
(racine du service, $metadata, pagination), respect des droits
d'accès, 404 sur jeton faux, exports CSV et Excel.
Le rendu dans Power BI Desktop lui-même n'a pas été éprouvé sur un poste Windows. La conformité est vérifiée contre la spécification OData v4, que le connecteur natif de Power BI implémente ; si votre version se comporte autrement, écrivez-nous et nous corrigerons.
Odoo Online : ce module expose un contrôleur, il n'est donc pas portable en ligne. Odoo.sh et installation auto-hébergée, oui.
Odoo 19 Community et Enterprise. Français et anglais.
DYONYSOS — welcome@dyonysos.fr
Ce que l'application ne fait pas
- Il ne pousse rien vers le service Power BI et ne crée aucun jeu de données dans le nuage de Microsoft : c'est Power BI qui vient lire.
- Le flux est en lecture seule : pas d'écriture ni de retour depuis Power BI.
- Il n'ouvre pas la base PostgreSQL. Une vue SQL exposée à l'extérieur ignorerait tous les droits d'accès d'Odoo — la base ne connaît ni les groupes, ni les règles d'enregistrement, ni le multi-société. C'est exactement ce que ce module refuse de faire.
Applications du magasin nécessaires
Aucune.
Modules Odoo Community utilisés
basebase_setup
| Série | Version | État | Publiée le |
|---|---|---|---|
| 20.0 | 20.0.1.0.0 | Disponible | 02/10/2026 |
| 19.0 | 19.0.1.0.0 | Disponible |
Fiche générée depuis le code de l'éditeur (dépôt privé, branche 20.0) : le code source n'est pas publié.
Contrôle automatique du magasin (distinct de l'éditeur), appliqué à toutes les applications. Conforme.
| Contrôle | Résultat | Effet si absent |
|---|---|---|
| Manifeste lisible sans exécution | conforme | bloquant |
| Licence reconnue (OPL-1) | conforme | bloquant |
| Aucune dépendance vers Odoo Enterprise | conforme | bloquant |
| Aucun import de code Enterprise | conforme | bloquant |
| Aucun en-tête de licence Enterprise | conforme | bloquant |
| Icône static/description/icon.png | conforme | déclasse |
| Description (static/description/index.html ou README) | conforme | déclasse |
| Tests automatisés (tests/test_*.py) | conforme | déclasse |
| Traduction française (i18n/fr.po) | conforme | info |
| Section « Ce que le module ne fait pas » | conforme | info |
| Titre de 70 caractères au plus (42 actuellement) | conforme | info |
| Résumé en français | absent | info |
Guide utilisateur — Power BI, flux OData
1. Créer le compte qui lira
Faites-le en premier. Le flux s'exécute avec les droits d'un compte Odoo réel : c'est ce compte qui décide de ce que Power BI verra.
Paramètres ▸ Utilisateurs ▸ Nouveau
Créez un compte dédié — « Lecture décisionnelle », par exemple — et donnez-lui exactement les droits de lecture nécessaires, pas un de plus. Si ce compte ne voit pas les salaires dans le client web, le tableau de bord ne pourra pas les montrer non plus.
Le compte technique OdooBot est refusé : il a tous les droits, et un flux qui a tous les droits n'en filtre aucun.
2. Créer le flux
Décisionnel ▸ Flux ▸ Nouveau
| Champ | Ce qu'on y met |
|---|---|
| Nom | Ce que verra la personne qui branche Power BI |
| Lu avec les droits de | Le compte de l'étape 1 |
| Lignes par page | 5 000 convient à presque tout. Power BI enchaîne les pages seul |
| Plafond absolu | Le maximum qu'un client peut réclamer d'un coup |
| Export CSV / Excel | Pour qui n'a pas Power BI |
Le jeton est engendré à l'enregistrement. L'adresse à coller dans Power BI apparaît juste en dessous, avec un bouton de copie.
3. Choisir les tables et les colonnes
Onglet Tables exposées.
| Champ | Ce qu'il fait |
|---|---|
| Libellé | Pour vous, dans Odoo |
| Nom de la table | Ce que Power BI affichera. Lettres, chiffres et soulignés, commençant par une lettre |
| Modèle | Le modèle Odoo : commandes, factures, produits… |
| Champs exposés | Choisissez-les. Laissé vide, le flux sert tous les champs stockés — une table de cent colonnes ralentit Power BI et personne ne les utilise |
| Filtre | Un domaine Odoo, par exemple [('state', '=', 'posted')]. Il s'ajoute aux règles d'accès, il ne les remplace pas |
| Ajouter le libellé des liens | Recommandé. Voir ci-dessous |
La colonne « libellé »
Cochée, chaque champ de liaison donne deux colonnes :
partner_id— l'identifiant, pour lier les tables entre elles dans Power BI ;partner_id_libelle— le nom lisible, pour les axes et les légendes.
Sans elle, il faut recréer à la main chaque relation dans Power BI avant de pouvoir faire un seul graphique.
La colonne « Avertissement »
Elle apparaît quand vous choisissez un champ non stocké — sur un produit, le nom et le prix en sont. Ces champs fonctionnent, mais ils se recalculent ligne par ligne et ne peuvent servir ni au filtre ni au tri. Sur une table de cent mille lignes, c'est la différence entre deux secondes et un rapport qui n'aboutit jamais.
4. Brancher Power BI
Power BI Desktop ▸ Accueil ▸ Obtenir les données ▸ Flux OData
- Collez l'adresse du flux.
- Méthode d'authentification : Anonyme. Le jeton est déjà dans l'adresse.
- Le navigateur affiche vos tables. Cochez celles qu'il vous faut, Transformer les données ou Charger.
Excel : Données ▸ Obtenir des données ▸ À partir d'autres sources ▸ Flux OData. Même adresse, même méthode.
L'adresse doit être joignable depuis le poste qui exécute Power BI. Si Odoo est derrière un pare-feu, c'est là qu'il faut regarder en premier.
5. Les fichiers de secours
Ajoutez .csv ou .xlsx à la fin de l'adresse d'une table :
https://votre-odoo/dyo/bi/<jeton>/Ventes.csv
https://votre-odoo/dyo/bi/<jeton>/Ventes.xlsx
Le fichier est complet, pas paginé : personne ne recolle vingt CSV à la main. Le CSV utilise le point-virgule et le BOM qu'Excel attend en français.
6. Lire le diagnostic
Décisionnel ▸ Diagnostic, ou le bouton Appels sur un flux.
Chaque ligne dit la table, le format, les lignes servies, les rejets, la durée, l'adresse d'appel et le compte dont les droits ont été appliqués. Les lignes en rouge sont les rejets.
C'est la première chose à regarder quand un rapport affiche des chiffres faux : on voit tout de suite si le flux a rendu trois lignes ou trois mille.
Le journal se purge tout seul au-delà de soixante jours.
7. Couper un accès
Bouton Régénérer le jeton sur le flux. L'ancienne adresse cesse de fonctionner immédiatement, pour tout le monde. Les autres flux ne sont pas touchés — c'est tout l'intérêt d'un jeton par flux.
Pour couper temporairement sans changer l'adresse, archivez le flux : il répond alors 404, comme s'il n'existait pas.
Questions qui reviennent
Power BI dit « 404 introuvable ». Le jeton, le nom de la table ou l'état du flux. Vérifiez que le flux n'est pas archivé, que la table est active, et recopiez l'adresse depuis la fiche plutôt que de la retaper. Le module répond 404 dans tous ces cas, délibérément : il ne confirme pas à un curieux qu'une adresse existe.
Power BI dit « 403 » avec un message d'accès refusé. L'adresse est bonne ; c'est le compte porteur du flux qui n'a pas le droit de lire ce modèle. Le message nomme ce qui manque. Donnez le droit de lecture à ce compte, ou retirez la table du flux.
Une table revient vide alors qu'il y a des données. Trois causes, dans cet ordre : le filtre de la table, une règle d'enregistrement qui s'applique au compte porteur, ou le multi-société. Le journal vous dit combien de lignes ont été servies — comparez avec ce que le compte porteur voit en se connectant au client web.
Peut-on écrire depuis Power BI vers Odoo ? Non. Le flux est en lecture seule, délibérément.
Le rapport ne charge que les 5 000 premières lignes.
Power BI devrait suivre le @odata.nextLink tout seul. Si vous avez écrit une
requête M à la main, assurez-vous d'utiliser OData.Feed et non Web.Contents,
qui ne suit pas les liens de pagination.
DYONYSOS — welcome@dyonysos.fr
Avis des clients connectés. Un avis noté par client ; l'éditeur peut y répondre. Connectez-vous pour laisser un avis.
- Éditeur
- DYONYSOS
- contact@omnifloo.com
- Clients Omnifloo
- Support inclus selon votre formule : centre d'aide.
