Freigeben über


TripPin Teil 4 – Datenquellenpfade

In diesem mehrteiligen Lernprogramm wird die Erstellung einer neuen Datenquellenerweiterung für Power Query behandelt. Das Lernprogramm soll sequenziell durchgeführt werden – jede Lektion baut auf dem connector auf, der in früheren Lektionen erstellt wurde, und fügt Ihrem Connector inkrementell neue Funktionen hinzu.

In dieser Lektion lernen Sie:

  • Vereinfachen Sie die Verbindungslogik für Ihren Steckverbinder
  • Verbessern der Navigationstabellenerfahrung

Diese Lektion vereinfacht den in der vorherigen Lektion integrierten Connector, indem seine erforderlichen Funktionsparameter entfernt und die Benutzererfahrung verbessert wird, indem er zu einer dynamisch generierten Navigationstabelle wechselt.

Für eine ausführliche Erläuterung zur Identifizierung von Anmeldeinformationen gehen Sie zum Abschnitt "Datenquellenpfade" von Behandlung der Authentifizierung.

Datenquellenpfade

Wenn Sie eine Datenquellenfunktion aufrufen, identifiziert die M-Engine, welche Anmeldeinformationen während der Auswertung verwendet werden sollen, indem ein Nachschlagevorgang basierend auf den Werten Datenquellenart und Datenquellenpfad ausgeführt wird.

In der vorherigen Lektion haben Sie zwei Datenquellenfunktionen freigegeben, beide mit einem einzigen Uri.Type-Parameter .

[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);

Wenn Sie eine Abfrage zum ersten Mal ausführen, die eine der Funktionen verwendet, erhalten Sie eine Eingabeaufforderung mit Anmeldeinformationen mit Dropdowns. Mit dieser Eingabeaufforderung können Sie einen Pfad und einen Authentifizierungstyp auswählen.

Screenshot der Registerkarte

Wenn Sie dieselbe Abfrage erneut ausführen, mit denselben Parametern kann das M-Modul die zwischengespeicherten Anmeldeinformationen finden, und es wird keine Eingabeaufforderung für Anmeldeinformationen angezeigt. Wenn Sie das url Argument in Ihre Funktion ändern, sodass der Basispfad nicht mehr übereinstimmt, wird eine neue Eingabeaufforderung für anmeldeinformationen für den neuen Pfad angezeigt.

Alle zwischengespeicherten Anmeldeinformationen werden in der Tabelle "Anmeldeinformationen" im Fenster "M-Abfrageausgabe " angezeigt.

Screenshot der M-Abfrageausgabe mit den zwischengespeicherten Anmeldeinformationen auf der Registerkarte

Je nach Änderungstyp führt das Ändern der Parameter Ihrer Funktion wahrscheinlich zu einem Anmeldeinformationsfehler.

Vereinfachen des Verbinders

Vereinfachen Sie nun den Connector, indem Sie die Parameter für die Datenquellenfunktion (TripPin.Contents) entfernen. Außerdem müssen Sie den shared-Qualifizierer von TripPin.Feed entfernen und ihn als ausschließlich interne Funktion belassen.

Eine der Entwurfsphilosophien von Power Query besteht darin, das anfängliche Datenquellendialogfeld so einfach wie möglich zu halten. Wenn möglich, sollten Sie dem Benutzer auswahlmöglichkeiten auf Navigator-Ebene statt im Verbindungsdialogfeld bereitstellen. Wenn ein vom Benutzer bereitgestellter Wert programmgesteuert bestimmt werden kann, sollten Sie ihn als oberste Ebene der Navigationstabelle anstelle eines Funktionsparameters hinzufügen.

Wenn Sie beispielsweise eine Verbindung mit einer relationalen Datenbank herstellen, benötigen Sie möglicherweise Server-, Datenbank- und Tabellennamen. Sobald Sie den Server kennen, mit dem eine Verbindung hergestellt werden soll, und Anmeldeinformationen bereitgestellt werden, können Sie die API der Datenbank verwenden, um eine Liste von Datenbanken abzurufen, und eine Liste der Tabellen, die in jeder Datenbank enthalten sind. In diesem Fall sollte nur der Servername ein erforderlicher Parameter sein, um das anfängliche Verbindungsdialogfeld so einfach wie möglich zu halten—Database und Table könnten die Ebenen der Navigationstabelle sein.

Da der TripPin-Dienst über einen festen URL-Endpunkt verfügt, müssen Sie den Benutzer nicht zur Eingabe von Werten auffordern. Sie müssen den URL-Parameter aus Ihrer Funktion entfernen und eine BaseUrl-Variable in Ihrem Connector definieren.

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

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

Sie behalten die TripPin.Feed Funktion bei, nutzen sie jedoch nicht mehr gemeinsam, ordnen sie nicht mehr einer Datenquelle zu und vereinfachen die Deklaration. Ab diesem Zeitpunkt verwenden Sie sie nur intern in diesem Abschnittsdokument.

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

Wenn Sie den TripPin.Contents() Aufruf in Ihrer TripPin.query.pq Datei aktualisieren und in Visual Studio Code ausführen, wird eine neue Eingabeaufforderung für Anmeldeinformationen angezeigt. Außerdem gibt es jetzt einen einzelnen Wert für den Datenquellenpfad – „TripPin“.

Screenshot der Registerkarte „Fehler“ der M-Abfrageausgabe mit einer Meldung zu den Anmeldeinformationen, die nur auf den TripPin-Pfad verweist.

Verbessern der Navigationstabelle

Im ersten Lernprogramm haben Sie die integrierten Funktionen verwendet, um eine Verbindung mit dem TripPin-Dienst OData herzustellen. Diese Funktionen haben Ihnen eine attraktive Navigationsübersichtstabelle, basierend auf dem TripPin-Dienstdokument, ohne dass mehr Code von Ihrer Seite erforderlich ist. Die OData.Feed-Funktion hat automatisch die harte Arbeit für Sie geleistet. Da Sie "Web.Contents" anstelle von "OData.Feed" verwenden und somit eine einfachere Methode wählen, müssen Sie die Navigationstabelle selbst manuell erstellen.

Screenshot des Power Query Navigators, der bei Verwendung der integrierten OData-Funktionen angezeigt wird.

Sie werden die folgenden Änderungen vornehmen:

  1. Definieren einer Liste von Elementen, die in ihrer Navigationstabelle angezeigt werden sollen
  2. Entfernen Sie die entitätsspezifischen Funktionen (GetAirlineTables und GetAirportsTable)

Generieren einer Navigationstabelle aus einer Liste

Sie müssen die Entitäten auflisten, die Sie in der Navigationstabelle verfügbar machen möchten, und die entsprechende URL erstellen, um auf sie zuzugreifen. Da sich alle Entitäten unter demselben Stammpfad befinden, können Sie diese URLs dynamisch erstellen.

Um das Beispiel zu vereinfachen, machen Sie nur die drei Entitätssätze (Airlines, Airports, People) verfügbar, die als Tabellen in M verfügbar gemacht werden, und überspringen Sie den Singleton (Me), der als Datensatz verfügbar gemacht wird. Sie können das Hinzufügen der Funktionen bis zu einer späteren Lektion überspringen.

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

Anschließend aktualisieren Sie Ihre TripPinNavTable Funktion, um die Tabelle Spalte für Spalte zu erstellen. Die Spalte [Daten] für jede Entität wird abgerufen, indem TripPin.Feed mit der vollständigen URL zur Entität aufgerufen wird.

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;

Stellen Sie beim dynamischen Erstellen von URL-Pfaden sicher, dass Sie klar sind, wo sich Die Schrägstriche (/) befinden! Uri.Combine verwendet beim Kombinieren von Pfaden die folgenden Regeln:

  • Wenn der relativeUri Parameter mit einem /beginnt, ersetzt er den gesamten Pfad des baseUri Parameters.
  • Wenn der relativeUri Parameter nicht mit einem /beginnt und baseUri mit einem /endet, wird der Pfad angefügt.
  • Wenn der relativeUri Parameter nicht mit einem /beginnt und baseUri nicht mit einem /endet, wird das letzte Segment des Pfads ersetzt.

Die folgende Abbildung zeigt Beispiele für diese Regeln:

Screenshot der URL-Pfade mit den Regeln für Schrägstriche beim Kombinieren von Pfaden.

Entfernen der entitätsspezifischen Funktionen

Damit der Connector einfacher verwaltet werden kann, müssen Sie die objektspezifischen Formatierungsfunktionen entfernen, die Sie in der vorherigen Lektion verwendet haben. GetAirlineTablesGetAirportsTable Stattdessen aktualisieren Sie TripPin.Feed, um die JSON-Antwort so zu verarbeiten, dass sie für alle Ihre Entitäten funktioniert. Insbesondere nehmen Sie das value Feld der zurückgegebenen OData-JSON-Nutzlast und konvertieren es aus einer Liste von Datensätzen in eine Tabelle.

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;

Hinweis

Ein Nachteil der Verwendung eines generischen Ansatzes zur Verarbeitung Ihrer Entitäten besteht darin, dass Sie die schönen Formatierungs- und Typinformationen für Ihre Entitäten verlieren. Ein späterer Abschnitt in diesem Lernprogramm zeigt, wie Sie das Schema für REST-API-Aufrufe erzwingen.

Conclusion

In diesem Tutorial haben Sie Ihren Connector bereinigt und vereinfacht, indem Sie den Datenquellenpfad-Wert korrigiert und zu einem flexibleren Format für Ihre Navigationstabelle gewechselt haben. Nachdem Sie diese Schritte ausgeführt haben (oder den Beispielcode in diesem Verzeichnis verwenden), gibt die TripPin.Contents Funktion eine Navigationstabelle in Power BI Desktop zurück.

Screenshot der Navigationstabelle, die von der Funktion TripPin.Contents zurückgegeben wird.

Nächste Schritte

TripPin Teil 5 - Paging