Lire l'article
Vous ajoutez un segment sur vos produits, vous déroulez la liste… et tout en bas, un élément (Vide) que personne n'a jamais saisi. Vous le décochez, il revient sur la page suivante. Vous le retrouvez sur l'axe d'un visuel, dans un total qui ne tombe pas juste.
Bonne nouvelle : ce n'est pas un bug, c'est un signal. Power BI vous prévient qu'une partie de vos ventes ne trouve pas sa correspondance dans le référentiel. Cet article part de ce symptôme, vous aide à trouver la cause en deux minutes, puis à la résoudre à la source plutôt que de la cacher.
Deux situations très différentes produisent le même libellé.
La clé orpheline, de loin le cas le plus fréquent. Votre table de faits (Ventes) contient un code produit que la table de dimension (Produits) ne connaît pas. Plutôt que de perdre ces ventes, le moteur ajoute automatiquement à la dimension une ligne sans nom et y rattache tous les montants orphelins. C'est elle que le segment vous montre. Dans le jargon, on parle d'un défaut d'intégrité référentielle.
La case réellement non renseignée. Le libellé lui-même est vide dans la source : un produit créé sans nom, un client sans région. Cette fois, la ligne existe bel et bien dans la dimension.
Le correctif n'est pas le même, d'où l'intérêt de commencer par le diagnostic.
Vidéo MYPE : les différentes relations entre les tables dans la vue modèle
Si le tableau montre des codes bien remplis, vous êtes dans le cas de la clé orpheline. S'il montre une clé non renseignée, c'est la source qu'il faut reprendre.
Pour garder un œil permanent sur le problème, créez dans la table Ventes une colonne calculée en DAX, à saisir dans la barre de formule :
| Nom | Formule | Résultat |
|---|---|---|
| Statut clé | IF ( ISBLANK ( RELATED ( Produits[ProduitID] ) ), "Orpheline", "OK" ) | « Orpheline » si le code produit est introuvable dans Produits, « OK » sinon |
La fonction RELATED va chercher la clé dans la dimension. Quand elle ne trouve rien, elle renvoie BLANK et la vente est marquée « Orpheline ». Pas besoin de formules plus complexes. Utilisez ensuite ce statut comme règle de couleur de fond dans le visuel : chaque vente orpheline ressort en rouge à chaque actualisation.
C'est la cause numéro un. Un nouveau produit est vendu avant d'avoir été créé dans le référentiel, un code client est saisi avec une faute, une famille a été renommée d'un côté mais pas de l'autre.
Le calendrier n'y échappe pas : si votre table de dates s'arrête au 31 décembre et que les commandes de janvier arrivent, elles tombent toutes dans la ligne sans nom. Notre guide pour créer une table de dates montre comment la faire couvrir toute la période, années futures comprises.
Dans notre livre (p. 121) : « Les tables de dimension », trois bonnes raisons de les utiliser et trois façons de les créer.
Parfois, la clé manque dès l'origine : vente saisie sans code produit, export d'ERP avec des null. Pour le vérifier, ouvrez l'éditeur de requêtes et, parmi les options du ruban, cochez Qualité de la colonne. Toutes les colonnes indiquent alors leur pourcentage d'éléments valides, en erreur ou non renseignés.
Attention : cet aperçu ne porte que sur les 1 000 premières lignes. Cliquez en bas de l'écran sur « Profilage de colonne basé sur l'ensemble du jeu de données » pour obtenir un résultat exact.
Dans notre livre (p. 49) : les trois outils de profilage de l'éditeur de requêtes.
« FR » d'un côté, « FR » suivi d'un espace insécable de l'autre : à l'œil, c'est la même valeur ; pour le moteur, ce sont deux clés différentes. Les coupables habituels : espaces en début de texte, espaces insécables copiés depuis une page web, retours à la ligne, zéros en tête (« 0012 » contre « 12 »).
La casse, elle, ne gêne pas le modèle, qui compare les textes sans tenir compte des majuscules. Elle compte en revanche dans les fusions de requêtes, qui y sont sensibles.
Dans notre livre (p. 51) : les caractères spéciaux à connaître, dont l'espace insécable #(00A0).
La relation relie un horodatage (jour et heure) à un calendrier au jour : une commande passée le 3 mars à 14 h 30 ne retrouve pas le 3 mars à minuit. Même piège avec un code converti en nombre d'un côté, qui perd ses zéros en tête, puis repassé en texte : « 12 » ne retrouve plus « 0012 ». Les paramètres régionaux mal choisis lors d'une conversion, qui inversent jour et mois, produisent le même effet.
Vérifiez le type des deux côtés dans la vue Table, en cliquant sur les champs concernés.
| Cause | Où corriger |
|---|---|
| Clé absente du référentiel | Dans le référentiel source ; à défaut, ajout d'une ligne « À compléter » à la dimension |
| Clé non renseignée à l'origine | Dans la source ; à défaut, remplacement des null par « Non renseigné » |
| Espaces, caractères invisibles | Étapes de nettoyage du texte, des deux côtés de la relation |
| Types différents | Même type des deux côtés, horodatage ramené au jour |
La meilleure solution reste de corriger le référentiel lui-même : créer le produit manquant, rectifier le code fautif. Si vous n'avez pas la main sur la source, faites-le dans l'éditeur :
Résultat : plus de ligne fantôme, et une liste « À compléter » que l'équipe business peut traiter. Si les écarts viennent de libellés mal orthographiés, une table de correspondance fera gagner du temps : voyez comment corriger des dizaines de libellés d'un coup.
Quand la clé manque dès l'origine, deux cas se présentent.
| Situation | Geste dans l'éditeur |
|---|---|
| La ligne n'a aucun intérêt (total intermédiaire, séparateur d'un export) | La retirer avec le menu Réduire de l'onglet Accueil |
| La vente est réelle | Remplacer null par « Non renseigné » (clic droit sur l'en-tête, Remplacer les valeurs), puis ajouter ce même libellé dans la dimension |
Pour les caractères invisibles, la commande Transformer > Format > Découper retire les espaces en début et en fin de texte, et la commande voisine retire les caractères non imprimables. L'espace insécable résiste souvent : remplacez-le par rien en cochant Insérer un caractère spécial dans la boîte de remplacement.
Pour les types, donnez le même aux deux côtés de la relation, et ajoutez une colonne ramenée au jour pour tout horodatage avant de le relier au calendrier.
Tous ces gestes sont détaillés dans nos bonnes pratiques de préparation des requêtes.
Vidéo MYPE : les bases de l'éditeur de requêtes, pas à pas
C'est le pansement, pour livrer aujourd'hui. Cliquez sur le segment, ouvrez le volet Filtres et, sur ce sélecteur, choisissez le filtrage avancé « n'est pas vide ».
Deux limites. Ce filtre ne masque l'élément que dans ce sélecteur : les données affichées ailleurs restent complètes, ce qui est plutôt sain. Mais si vous posez le même réglage dans les filtres de page, les ventes orphelines disparaissent de tous les totaux de la page, et vos chiffres deviennent faux sans que personne ne s'en aperçoive.
Sur un axe, la ligne fantôme se comporte comme dans la liste de sélection et se corrige de la même manière. Un cas à part : un élément réellement sans nom dans la dimension, mais sans aucune vente, ne devrait pas apparaître. S'il est là, vérifiez si l'option « Afficher les éléments sans données » est cochée (clic droit sur le libellé posé sur l'axe, dans le volet de construction). Décochez-la si elle n'a pas de raison d'être.
Une fois la correction faite dans Desktop, cliquez sur le bouton Actualiser, vérifiez que la liste de sélection ne propose plus d'intrus, puis republiez. Dans le service Power BI, une tuile épinglée sur un tableau de bord se met à jour à la prochaine actualisation planifiée. Pensez à prévenir l'utilisateur qui avait signalé le problème.
Pour une utilisation partagée entre plusieurs rapports, placez ces corrections dans un flux de données : tous les rapports qui s'y connectent en profitent, sans avoir à modifier chaque fichier.
Les valeurs vides faussent-elles mes totaux ? Non, au contraire : les montants rattachés à la ligne fantôme sont bien comptés dans le total général. C'est en les masquant au niveau de la page qu'on fausse les chiffres.
Une carte affiche (Vide). Même cause ? Non. Une carte qui ne montre rien signale une mesure qui ne renvoie aucun résultat pour la sélection en cours. Ajoutez + 0 à la mesure, ou utilisez COALESCE, pour obtenir 0.
Un sélecteur construit sur un paramètre de champ peut-il présenter ce défaut ? Le paramètre lui-même, non : sa table est générée par le moteur. Mais l'attribut qu'il place sur l'axe peut porter une clé orpheline. Le diagnostic ci-dessus s'applique tel quel.
Et en DirectQuery ? Attention à l'option « Supposer l'intégrité référentielle » d'une relation : si des clés orphelines existent, elle fait disparaître ces ventes au lieu de les rassembler sous une ligne sans nom. Ne l'activez que si la source garantit la correspondance.
