Série : Automatiser Power BI avec Claude AI — Épisode 8/12 Temps de lecture : 13 min Public cible : BI Engineers avancés, Power BI Developers
TL;DR : Les bookmarks sont la fonctionnalité Power BI la moins bien documentée et la plus sujette aux bugs silencieux. Sur le projet client, 4 problèmes critiques ont été détectés : un bookmark ne ciblant qu’1 visuel sur 17, des groupes absents des bookmarks, 9 boutons cachés dans tous les états, et des conflits de z-order rendant des visuels invisibles. Le plan de correction en 4 étapes et le script Python d’audit sont réutilisables sur n’importe quel rapport PBIR.
Pourquoi les bookmarks Power BI sont-ils si complexes ?
Les bookmarks Power BI semblent simples — ils capturent et restaurent l’état d’un rapport. En pratique, c’est la fonctionnalité la moins bien documentée de Power BI et celle qui génère le plus de bugs silencieux. Un bookmark mal configuré ne produit pas d’erreur : il produit un comportement incorrect que l’utilisateur ne remarque pas toujours.
Sur le projet client, la page Vue d’ensemble avait un système de filtrage par signet à 3 états :
- Chiffrage : affiche les KPIs en mode avant-projet / estimation
- En cours : affiche les KPIs des projets actifs
- Terminés : affiche les KPIs des projets achevés
L’UX attendue : trois boutons en haut de page. Un clic sur “Terminés” masque les visuels “En cours” et “Chiffrage”, et affiche les visuels “Terminés”.
Quels problèmes l’audit a-t-il révélés ?
Problème #1 : Le bookmark “Terminés” ne ciblait qu’1 visuel sur 17
python# Résultat du scan Bookmark "Chiffrage" : targetVisualNames: [17 IDs] OK Bookmark "En cours" : targetVisualNames: [17 IDs] OK Bookmark "Terminés" : targetVisualNames: ["visual_abc123"] 1 seul ID
Cliquer sur “Terminés” masquait et affichait correctement… un seul visuel. Les 16 autres restaient dans l’état où ils étaient.
Problème #2 : Les groupes de visuels manquaient dans les bookmarks
On avait créé des groupes de visuels dans Power BI Desktop après avoir créé les bookmarks. Les groupes n’apparaissaient pas dans la section
visualContainerGroups des bookmarks existants.Problème #3 : 9 boutons “Active Menu” cachés inconditionnellement
9 boutons d’état “Active” étaient définis avec
display: "hidden" dans tous les bookmarks — y compris dans celui qui devrait les rendre visibles.Problème #4 : Conflits de z-order entre couches de visuels
Couche | z-order | Rôle |
Boutons navigation permanents | 54 000 | Toujours visibles |
Groupe “En cours” (visible par défaut) | 53 000 | Contenu principal |
Groupe “Terminés” (masqué par défaut) | 38 000 | Contenu alternatif |
Quand on “affichait” le groupe Terminés (z=38 000), il apparaissait derrière le groupe En cours (z=53 000) si ce dernier n’était pas correctement masqué.
Comment corriger les bookmarks en 4 étapes ?
Étape 1 : Créer le groupe “Terminés Signet Overview”
- ID : “termin00000000000000”
- displayName : “Terminés Signet Overview”
- z-order : 52 000
- Enfants : 16 IDs de visuels Terminés
Étape 2 : Corriger le bookmark “Chiffrage”
Ajouter le masquage du groupe Terminés + corriger l’état des boutons actifs.
Étape 3 : Corriger le bookmark “En cours”
Ajouter la section
visualContainerGroups complète + corriger les boutons actifs.Étape 4 : Reconstruire le bookmark “Terminés” de zéro
json{ "id": "3d929e68c755368d281a", "displayName": "Terminés", "explorationState": { "sections": { "overview": { "visualContainers": { "visual_001": {"display": "hidden"}, "termin00000000000000": {"display": "visible"} }, "visualContainerGroups": { "termin00000000000000": {"display": "visible"}, "en_cours_group": {"display": "hidden"}, "chiffrage_group": {"display": "hidden"} } } } }, "options": { "applyOnlyToTargetVisuals": true, "targetVisualNames": [ "termin00000000000000", "visual_001", "visual_002" ] } }
Comment Claude a-t-il contribué à la correction ?
On a fourni à Claude le plan en 4 étapes, les fichiers JSON actuels, la liste des 17 IDs de visuels, et la liste des 9 IDs de boutons actifs.
Claude a signalé une incohérence qu’on avait manquée : dans l’étape 4, on n’avait pas inclus les boutons actifs/inactifs dans la liste
targetVisualNames. Sans eux, le bookmark “Terminés” ne remettrait pas les boutons dans le bon état.Correction intégrée. Fichiers générés. Application dans le rapport.
Résultat : Les 3 bookmarks fonctionnent correctement. Temps total de correction : 0,25 jour au lieu de 1 jour en méthode manuelle.
Quelles règles retenir sur les bookmarks PBIR ?
Règle #1 : Créez les groupes AVANT les bookmarks.
Règle #2 :
applyOnlyToTargetVisuals est obligatoire.
Règle #3 : Auditez les bookmarks après chaque ajout de visuel.
Règle #4 : Testez les transitions, pas seulement les états.Quel script Python utiliser pour auditer les bookmarks ?
pythonimport json from pathlib import Path def audit_bookmarks(report_path: str): report_dir = Path(report_path) bookmarks_dir = report_dir / "definition" / "bookmarks" if not bookmarks_dir.exists(): print("Aucun bookmark trouvé") return # Collecter tous les IDs de visuels du rapport all_visual_ids = set() pages_dir = report_dir / "definition" / "pages" for page_dir in pages_dir.iterdir(): if page_dir.is_dir(): visuals_dir = page_dir / "visuals" if visuals_dir.exists(): for visual_dir in visuals_dir.iterdir(): all_visual_ids.add(visual_dir.name) print(f"Visuels dans le rapport :{len(all_visual_ids)}\n") for bm_file in sorted(bookmarks_dir.iterdir()): with open(bm_file) as f: bm = json.load(f) name = bm.get("displayName", bm_file.name) targets = set(bm.get("options", {}).get("targetVisualNames", [])) apply_only = bm.get("options", {}).get("applyOnlyToTargetVisuals", False) orphan_targets = targets - all_visual_ids print(f"==={name} ===") print(f" Targets :{len(targets)}") print(f" applyOnlyToTargetVisuals :{apply_only}") if not apply_only: print(f" RISQUE : applyOnlyToTargetVisuals = false") if orphan_targets: print(f" Targets orphelins :{orphan_targets}") if len(targets) <= 1: print(f" Probablement incomplet") print() audit_bookmarks("./App-Infra-Report.Report")
FAQ — Bookmarks Power BI et automatisation PBIR
Pourquoi les bookmarks Power BI ne fonctionnent-ils pas après une duplication de page ?
Les bookmarks référencent les visuels par leurs IDs. Après une duplication de page, les nouveaux IDs n’existent pas dans les bookmarks existants. Il faut mettre à jour les
targetVisualNames de chaque bookmark.Qu’est-ce que
applyOnlyToTargetVisuals et pourquoi est-ce critique ?
Si applyOnlyToTargetVisuals est false, le bookmark affecte TOUS les visuels de la page — pas seulement ceux listés dans targetVisualNames. C’est la source de la majorité des bugs silencieux de bookmarks.Comment détecter un bookmark incomplet sans ouvrir Power BI ?
Le script Python ci-dessus vérifie automatiquement : nombre de targets, flag
applyOnlyToTargetVisuals, et targets orphelins (IDs référencés mais absents du rapport).Les groupes de visuels sont-ils automatiquement ajoutés aux bookmarks ?
Non. Un groupe créé dans l’UI après la création d’un bookmark n’est pas automatiquement ajouté à la section
visualContainerGroups. C’est un piège fréquent — c’est pourquoi la règle #1 est : créez les groupes AVANT les bookmarks.