Partager via


TripPin partie 4 - Chemins de source de données

Ce tutoriel en plusieurs parties traite de la création d’une nouvelle extension de source de données pour Power Query. Le didacticiel est destiné à être effectué de manière séquentielle : chaque leçon s’appuie sur le connecteur créé dans les leçons précédentes, en ajoutant de manière incrémentielle de nouvelles fonctionnalités à votre connecteur.

Dans cette leçon, vous allez :

  • Simplifier la logique de connexion pour votre connecteur
  • Améliorer l’expérience de la table de navigation

Cette leçon simplifie le connecteur intégré à la leçon précédente en supprimant ses paramètres de fonction requis et en améliorant l’expérience utilisateur en passant à une table de navigation générée dynamiquement.

Pour obtenir une explication détaillée de la façon dont les informations d’identification sont identifiées, accédez à la section Chemins de source de données de la gestion de l’authentification.

Chemins d’accès à la source de données

Lorsque vous appelez une fonction de source de données, le moteur M identifie les informations d’identification à utiliser pendant une évaluation en effectuant une recherche basée sur les valeurs type de source de données et chemin de source de données .

Dans la leçon précédente , vous avez partagé deux fonctions de source de données, à la fois avec un seul paramètre Uri.Type .

[DataSource.Kind="TripPin"]
shared TripPin.Feed = Value.ReplaceType(TripPinImpl, type function (url as Uri.Type) as any);

[DataSource.Kind="TripPin", Publish="TripPin.Publish"]
shared TripPin.Contents =  Value.ReplaceType(TripPinNavTable, type function (url as Uri.Type) as any);

La première fois que vous exécutez une requête qui utilise l’une des fonctions, vous recevez une invite d'authentification avec des menus déroulants. Cette invite vous permet de sélectionner un chemin d’accès et un type d’authentification.

Capture d’écran de l’onglet Erreurs de la sortie de requête M montrant le message d’informations d’identification.

Si vous réexécutez la même requête, avec les mêmes paramètres, le moteur M est en mesure de localiser les informations d’identification mises en cache et aucune invite d’informations d’identification n’est affichée. Si vous modifiez l’argument url de votre fonction afin que le chemin de base ne correspond plus, une nouvelle invite d’informations d’identification s’affiche pour le nouveau chemin d’accès.

Toutes les informations d’identification mises en cache sont affichées dans la table Credentials dans la fenêtre Sortie de requête M .

Capture d’écran de la sortie de la requête M montrant les informations d’identification mises en cache dans l’onglet Informations d’identification.

Selon le type de modification, la modification des paramètres de votre fonction entraîne probablement une erreur d’informations d’identification.

Simplification du connecteur

Simplifiez maintenant votre connecteur en supprimant les paramètres de votre fonction de source de données (TripPin.Contents). Vous devez également supprimer le shared qualificateur pour TripPin.Feed, et le laisser en tant que fonction interne uniquement.

L’une des philosophies de conception de Power Query consiste à conserver la boîte de dialogue de source de données initiale aussi simple que possible. Si possible, vous devez fournir à l’utilisateur des choix au niveau du navigateur, plutôt que dans la boîte de dialogue de connexion. Si une valeur fournie par l’utilisateur peut être déterminée par programmation, envisagez de l’ajouter comme niveau supérieur de votre table de navigation plutôt qu’un paramètre de fonction.

Par exemple, lors de la connexion à une base de données relationnelle, vous avez peut-être besoin de noms de serveur, de base de données et de table. Une fois que vous savez que le serveur se connecte et que les informations d’identification sont fournies, vous pouvez utiliser l’API de la base de données pour extraire une liste de bases de données et une liste de tables contenues dans chaque base de données. Dans ce cas, pour que votre boîte de dialogue de connexion initiale soit aussi simple que possible, seul le nom du serveur doit être un paramètre requis,Database et Table il s’agit de niveaux de votre table de navigation.

Étant donné que le service TripPin a un point de terminaison d’URL fixe, vous n’avez pas besoin d’inviter l’utilisateur à entrer des valeurs. Vous devez supprimer le paramètre d’URL de votre fonction et définir une variable BaseUrl dans votre connecteur.

BaseUrl = "https://services.odata.org/v4/TripPinService/";

[DataSource.Kind="TripPin", Publish="TripPin.Publish"]
shared TripPin.Contents = () => TripPinNavTable(BaseUrl) as table;

Vous conservez la TripPin.Feed fonction, mais ne la partagez plus, ne l’associez plus à un type de source de données et simplifiez sa déclaration. À partir de ce stade, vous l’utilisez uniquement en interne dans ce document de section.

TripPin.Feed = (url as text) =>
    let
        source = Web.Contents(url, [ Headers = DefaultRequestHeaders ]),
        json = Json.Document(source)
    in
        json;

Si vous mettez à jour l’appel TripPin.Contents() dans votre fichier TripPin.query.pq et que vous l’exécutez dans Visual Studio Code, une nouvelle invite d'identifiants apparaît. En outre, il existe désormais une valeur unique de chemin d’accès à la source de données : TripPin.

Capture d’écran de l’onglet Erreurs de la sortie de requête M montrant le message d’informations d’identification référençant uniquement le chemin TripPin.

Amélioration de la table de navigation

Dans le premier tutoriel, vous avez utilisé les fonctions intégrées OData pour vous connecter au service TripPin. Ces fonctions vous ont donné une table de navigation agréable, basée sur le document de service TripPin, sans plus de code de votre côté. La fonction OData.Feed a automatiquement fait le travail dur pour vous. Étant donné que vous effectuez une « mise en forme » à l’aide de Web.Contents plutôt que d’OData.Feed, vous devez recréer vous-même cette table de navigation.

Capture d’écran du navigateur Power Query affiché lors de l’utilisation des fonctions OData intégrées.

Vous allez apporter les modifications suivantes :

  1. Définir une liste d’éléments à afficher dans votre table de navigation
  2. Ne plus utiliser les fonctions spécifiques à l’entité (GetAirlineTables et GetAirportsTable)

Génération d’une table de navigation à partir d’une liste

Vous devez répertorier les entités que vous souhaitez exposer dans la table de navigation et générer l’URL appropriée pour y accéder. Étant donné que toutes les entités se trouvent sous le même chemin racine, vous pouvez générer ces URL de manière dynamique.

Pour simplifier l’exemple, vous n’exposez que les trois ensembles d’entités (Airlines, Airports, People), qui seraient exposés sous forme de tables dans M, et ignorez le singleton (Me) qui serait exposé en tant qu’enregistrement. Vous pouvez ignorer l’ajout des fonctions jusqu’à une leçon ultérieure.

RootEntities = {
    "Airlines",
    "Airports",
    "People"
};

Vous mettez ensuite à jour votre TripPinNavTable fonction pour générer la table une colonne à la fois. La colonne [Données] de chaque entité est récupérée en appelant TripPin.Feed avec l’URL complète de l’entité.

TripPinNavTable = (url as text) as table =>
    let
        entitiesAsTable = Table.FromList(RootEntities, Splitter.SplitByNothing()),
        rename = Table.RenameColumns(entitiesAsTable, {{"Column1", "Name"}}),
        // Add Data as a calculated column
        withData = Table.AddColumn(rename, "Data", each TripPin.Feed(Uri.Combine(url, [Name])), Uri.Type),
        // Add ItemKind and ItemName as fixed text values
        withItemKind = Table.AddColumn(withData, "ItemKind", each "Table", type text),
        withItemName = Table.AddColumn(withItemKind, "ItemName", each "Table", type text),
        // Indicate that the node should not be expandable
        withIsLeaf = Table.AddColumn(withItemName, "IsLeaf", each true, type logical),
        // Generate the nav table
        navTable = Table.ToNavigationTable(withIsLeaf, {"Name"}, "Name", "Data", "ItemKind", "ItemName", "IsLeaf")
    in
        navTable;

Lorsque vous créez dynamiquement des chemins d'URL, assurez-vous d'être clair sur l'emplacement de vos barres obliques (/) ! Uri.Combine utilise les règles suivantes lors de la combinaison de chemins :

  • Lorsque le relativeUri paramètre commence par un /, il remplace l’intégralité du chemin d’accès du baseUri paramètre
  • Si le relativeUri paramètre ne commence pas par un / et se termine par un /, le chemin baseUri est ajouté
  • Si le relativeUri paramètre ne commence pas par un / et baseUri ne se termine pas par un /, le dernier segment du chemin d’accès est remplacé

L’image suivante montre des exemples de ces règles :

Capture d’écran des chemins d’URL montrant les règles des barres obliques lors de la combinaison de chemins.

Supprimer les fonctions spécifiques à l’entité

Pour faciliter la maintenance de votre connecteur, vous devez supprimer les fonctions de mise en forme spécifiques à l’entité que vous avez utilisées dans la leçon précédente—GetAirlineTables et GetAirportsTable. Au lieu de cela, vous effectuez une mise à jour TripPin.Feed pour traiter la réponse JSON d’une manière qui fonctionne pour toutes vos entités. Plus précisément, vous prenez le value champ de la charge utile OData retournée au format JSON et le convertissez à partir d'une liste d'enregistrements en un tableau.

TripPin.Feed = (url as text) =>
    let
        source = Web.Contents(url, [ Headers = DefaultRequestHeaders ]),
        json = Json.Document(source),
        // The response is a JSON record - the data we want is a list of records in the "value" field
        value = json[value],
        asTable = Table.FromList(value, Splitter.SplitByNothing()),
        // expand all columns from the record
        fields = Record.FieldNames(Table.FirstValue(asTable, [Empty = null])),
        expandAll = Table.ExpandRecordColumn(asTable, "Column1", fields)
    in
        expandAll;

Note

Un inconvénient de l’utilisation d’une approche générique pour traiter vos entités est que vous perdez la mise en forme et les informations de type intéressantes pour vos entités. Une section ultérieure de ce tutoriel montre comment appliquer le schéma sur les appels d’API REST.

Conclusion

Dans ce tutoriel, vous avez nettoyé et simplifié votre connecteur en corrigeant la valeur de votre chemin de source de données et en passant à un format plus flexible pour votre table de navigation. Une fois ces étapes terminées (ou utilisez l’exemple de code dans ce répertoire), la TripPin.Contents fonction retourne une table de navigation dans Power BI Desktop.

Capture d’écran de la table de navigation retournée par la fonction TripPin.Contents.

Étapes suivantes

TripPin Partie 5 - Pagination