Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.
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.
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“.
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.
Sie werden die folgenden Änderungen vornehmen:
- Definieren einer Liste von Elementen, die in ihrer Navigationstabelle angezeigt werden sollen
- Entfernen Sie die entitätsspezifischen Funktionen (
GetAirlineTablesundGetAirportsTable)
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
relativeUriParameter mit einem /beginnt, ersetzt er den gesamten Pfad desbaseUriParameters. - Wenn der
relativeUriParameter nicht mit einem /beginnt undbaseUrimit einem /endet, wird der Pfad angefügt. - Wenn der
relativeUriParameter nicht mit einem /beginnt undbaseUrinicht mit einem /endet, wird das letzte Segment des Pfads ersetzt.
Die folgende Abbildung zeigt Beispiele für diese Regeln:
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.