Partager via


Gestion de la navigation

Les tables de navigation font partie intégrante de la fourniture d’une interface conviviale pour votre connecteur. L’interface Power Query les affiche à l’utilisateur une fois que celui-ci a entré tous les paramètres requis pour votre fonction de source de données, et qu’il s’est authentifié auprès de la source de données.

Table de navigation TripPin.

En arrière-plan, une table de navigation n’est qu’une valeur Table M ordinaire avec des champs de métadonnées spécifiques définis sur son Type. Quand votre fonction de source de données retourne une table avec ces champs définis, Power Query affiche la boîte de dialogue du navigateur. Vous pouvez réellement voir les données sous-jacentes sous forme de valeur Table en cliquant avec le bouton droit sur le nœud racine et en sélectionnant Modifier.

Table.ToNavigationTable

Vous pouvez utiliser la fonction Table.ToNavigationTable pour ajouter les métadonnées de type de table nécessaires pour créer une table de navigation.

Remarque

Vous devez actuellement copier et coller cette fonction dans votre extension M. À l’avenir, elle sera probablement déplacée dans la bibliothèque M standard.

La table suivante décrit les paramètres pour cette fonction :

Paramètre Détails
table Votre table de navigation.
keyColumns Liste des noms de colonnes qui agissent comme clé primaire pour votre table de navigation.
nameColumn Nom de la colonne à utiliser comme nom complet dans le navigateur.
dataColumn Nom de la colonne qui contient la table ou la fonction à afficher.
itemKindColumn Nom de la colonne à utiliser pour déterminer le type d’icône à afficher. Consultez ci-dessous la liste des valeurs valides pour la colonne.
itemNameColumn Nom de la colonne à utiliser pour déterminer le comportement d’aperçu. Il est généralement défini sur la même valeur que itemKind.
isLeafColumn Nom de la colonne utilisée pour déterminer s’il s’agit d’un nœud feuille ou si le nœud peut être développé pour contenir une autre table de navigation.

La fonction ajoute les métadonnées suivantes au type de table :

Champ Paramètre
NavigationTable.NameColumn nameColumn
NavigationTable.DataColumn dataColumn
NavigationTable.ItemKindColumn itemKindColumn
NavigationTable.IsLeafColumn isLeafColumn
Preview.DelayColumn itemNameColumn

Valeurs de ItemKind

Chacune des valeurs suivantes de genre d’élément a une icône distincte dans la table de navigation.

  • Flux
  • Base de données
  • DatabaseServer
  • Dimension
  • Table
  • Dossier
  • Fonction
  • Affichage
  • Feuille
  • DefinedName
  • Enregistrer

Exemples

Table de navigation plate

L’exemple de code suivant affiche une table de navigation plate avec trois tables et une fonction.

shared NavigationTable.Simple = () =>
    let
        objects = #table(
            {"Name",       "Key",        "Data",                           "ItemKind", "ItemName", "IsLeaf"},{
            {"Item1",      "item1",      #table({"Column1"}, {{"Item1"}}), "Table",    "Table",    true},
            {"Item2",      "item2",      #table({"Column1"}, {{"Item2"}}), "Table",    "Table",    true},
            {"Item3",      "item3",      FunctionCallThatReturnsATable(),  "Table",    "Table",    true},            
            {"MyFunction", "myfunction", AnotherFunction.Contents,       "Function", "Function", true}
            }),
        NavTable = Table.ToNavigationTable(objects, {"Key"}, "Name", "Data", "ItemKind", "ItemName", "IsLeaf")
    in
        NavTable;

shared FunctionCallThatReturnsATable = () =>
    #table({"DynamicColumn"}, {{"Dynamic Value"}});

Ce code entraînera l’affichage du Navigateur suivant dans Power BI Desktop :

Échantillon de table de navigation plate.

Table de navigation à plusieurs niveaux

Il est possible d’utiliser des tables de navigation imbriquées pour créer une vue hiérarchique de votre jeu de données. Pour cela, définissez la valeur IsLeaf pour cette ligne sur false (qui la marque comme un nœud qui peut être développé) et mettez en forme la colonne Data pour en faire une autre table de navigation.

shared NavigationTable.Nested = () as table =>
    let
        objects = #table(
            {"Name",       "Key",  "Data",                "ItemKind", "ItemName", "IsLeaf"},{
            {"Nested A",   "n1",   CreateNavTable("AAA"), "Table",    "Table",    false},
            {"Nested B",   "n2",   CreateNavTable("BBB"), "Table",    "Table",    false},
            {"Nested C",   "n3",   CreateNavTable("CCC"), "Table",    "Table",    false}
        }),
        NavTable = Table.ToNavigationTable(objects, {"Key"}, "Name", "Data", "ItemKind", "ItemName", "IsLeaf")
    in
        NavTable;

CreateNavTable = (message as text) as table => 
    let
        objects = #table(
            {"Name",  "Key",   "Data",                           "ItemKind", "ItemName", "IsLeaf"},{
            {"Item1", "item1", #table({"Column1"}, {{message}}), "Table",    "Table",    true},
            {"Item2", "item2", #table({"Column1"}, {{message}}), "Table",    "Table",    true}
        }),
        NavTable = Table.ToNavigationTable(objects, {"Key"}, "Name", "Data", "ItemKind", "ItemName", "IsLeaf")
    in
        NavTable;

Ce code produirait l’affichage de Navigateur suivant dans Power BI Desktop :

Échantillon de table de navigation hiérarchique.

Tables de navigation dynamiques

Des fonctionnalités plus complexes peuvent être créées sur ces bases. Bien que tous les exemples ci-dessus montrent des entités codées en dur dans la table de navigation, il est facile de voir comment une table de navigation pourrait être générée de façon dynamique sur la base d’entités disponibles pour un utilisateur donné. Voici quelques éléments clés à prendre en compte pour les tables de navigation dynamiques :

  • Gestion des erreurs pour garantir une bonne expérience pour les utilisateurs qui n’ont pas accès à certains points de terminaison.
  • Par défaut, l’évaluation des nœuds est paresseuse. Les nœuds de terminal ne sont pas évalués tant que le nœud parent n’est pas développé. Certaines implémentations de tables de navigation dynamiques à plusieurs niveaux peuvent entraîner une évaluation précipitée de l’arborescence entière. Veillez à surveiller le nombre d’appels que Power Query effectue lors de l’affichage initial de la table de navigation. Par exemple, Table.InsertRows est « plus paresseux » que Table.FromRecords, car il n’a pas besoin d’évaluer ses arguments.