TripPin Deel 3 - Navigatietabellen
In deze meerdelige zelfstudie wordt het maken van een nieuwe gegevensbronextensie voor Power Query. De zelfstudie is bedoeld om opeenvolgend te worden uitgevoerd voor elke les die is gebaseerd op de connector die in de vorige lessen is gemaakt, en incrementeel nieuwe mogelijkheden toe te voegen — aan uw connector.
In deze les gaat u het volgende doen:
- Een navigatietabel maken voor een vaste set query's
- De navigatietabel testen in Power BI Desktop
In deze les wordt een navigatietabel toegevoegd aan de TripPin-connector die in de vorige les is gemaakt. Toen uw connector de functie ( deel 1) gebruikte, hebt u de navigatietabel gratis ontvangen, zoals afgeleid van het document $metadata OData.Feed OData-service. Wanneer u naar de functie ( deel 2 ) bent Web.Contents gegaan, bent u de ingebouwdenavigatietabel kwijt. In deze les neemt u een set vaste query's die u hebt gemaakt in Power BI Desktop en voegt u de juiste metagegevens voor Power Query toe om het dialoogvenster Navigator voor uw gegevensbronfunctie weer te geven.
Zie de documentatie voor navigatietabel voor meer informatie over het gebruik van navigatietabellen.
Vaste query's definiëren in de connector
Een eenvoudige connector voor een REST API kan worden zien als een vaste set query's, die elk een tabel retourneren. Deze tabellen worden detecteerbaar gemaakt via de navigatietabel van de connector. In wezen is elk item in de navigator gekoppeld aan een specifieke URL en set transformaties.
U begint met het kopiëren van de query's die u in Power BI Desktop (in de vorige les) naar uw connectorbestand hebt geschreven. Open het project TripPin Visual Studio en plak de Query's van Luchtvaart en luchthaven in het bestand TripPin.pq. U kunt deze query's vervolgens wijzigen in functies die één tekstparameter gebruiken:
GetAirlinesTable = (url as text) as table =>
let
source = TripPin.Feed(url & "Airlines"),
value = source[value],
toTable = Table.FromList(value, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
expand = Table.ExpandRecordColumn(toTable, "Column1", {"AirlineCode", "Name"}, {"AirlineCode", "Name"})
in
expand;
GetAirportsTable = (url as text) as table =>
let
source = TripPin.Feed(url & "Airports"),
value = source[value],
#"Converted to Table" = Table.FromList(value, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"Name", "IcaoCode", "IataCode", "Location"}, {"Name", "IcaoCode", "IataCode", "Location"}),
#"Expanded Location" = Table.ExpandRecordColumn(#"Expanded Column1", "Location", {"Address", "Loc", "City"}, {"Address", "Loc", "City"}),
#"Expanded City" = Table.ExpandRecordColumn(#"Expanded Location", "City", {"Name", "CountryRegion", "Region"}, {"Name.1", "CountryRegion", "Region"}),
#"Renamed Columns" = Table.RenameColumns(#"Expanded City",{{"Name.1", "City"}}),
#"Expanded Loc" = Table.ExpandRecordColumn(#"Renamed Columns", "Loc", {"coordinates"}, {"coordinates"}),
#"Added Custom" = Table.AddColumn(#"Expanded Loc", "Latitude", each [coordinates]{1}),
#"Added Custom1" = Table.AddColumn(#"Added Custom", "Longitude", each [coordinates]{0}),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom1",{"coordinates"}),
#"Changed Type" = Table.TransformColumnTypes(#"Removed Columns",{{"Name", type text}, {"IcaoCode", type text}, {"IataCode", type text}, {"Address", type text}, {"City", type text}, {"CountryRegion", type text}, {"Region", type text}, {"Latitude", type number}, {"Longitude", type number}})
in
#"Changed Type";
Vervolgens importeert u de mock-navigatietabelquery die u hebt geschreven, die een vaste tabel maakt die is gekoppeld aan deze gegevenssetquery's. Roep deze TripPinNavTable aan:
TripPinNavTable = (url as text) as table =>
let
source = #table({"Name", "Data"}, {
{ "Airlines", GetAirlinesTable(url) },
{ "Airports", GetAirportsTable(url) }
})
in
source;
Ten slotte declareert u een nieuwe gedeelde functie, TripPin.Contents , die wordt gebruikt als uw belangrijkste gegevensbronfunctie. U verwijdert ook de waarde uit , zodat deze niet meer wordt Publish weergegeven in het dialoogvenster TripPin.Feed Gegevens verzamelen.
[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);
Notitie
Uw extensie kan meerdere functies markeren als , met of zonder shared deze te koppelen aan een DataSource.Kind . Wanneer u echter een functie aan een specifieke koppelt, moet elke functie dezelfde set vereiste DataSource.Kind parameters hebben, met dezelfde naam en hetzelfde type. Dit komt doordat de functieparameters van de gegevensbron worden gecombineerd om een 'sleutel' te maken die wordt gebruikt om referenties in de cache op te zoeken.
U kunt uw functie TripPin.Contents testen met behulp van het bestand TripPin.query.pq. Als u de volgende testquery uitvoert, krijgt u een referentieprompt en een eenvoudige tabeluitvoer.
TripPin.Contents("https://services.odata.org/v4/TripPinService/")

Een navigatietabel maken
U gebruikt de handige functie Table.ToNavigationTable om uw statische tabel op te maken in iets dat Power Query wordt herkend als een navigatietabel.
Table.ToNavigationTable = (
table as table,
keyColumns as list,
nameColumn as text,
dataColumn as text,
itemKindColumn as text,
itemNameColumn as text,
isLeafColumn as text
) as table =>
let
tableType = Value.Type(table),
newTableType = Type.AddTableKey(tableType, keyColumns, true) meta
[
NavigationTable.NameColumn = nameColumn,
NavigationTable.DataColumn = dataColumn,
NavigationTable.ItemKindColumn = itemKindColumn,
Preview.DelayColumn = itemNameColumn,
NavigationTable.IsLeafColumn = isLeafColumn
],
navigationTable = Value.ReplaceType(table, newTableType)
in
navigationTable;
Nadat u dit naar het extensiebestand hebt kopieert, werkt u de functie bij om de velden in de TripPinNavTable navigatietabel toe te voegen.
TripPinNavTable = (url as text) as table =>
let
source = #table({"Name", "Data", "ItemKind", "ItemName", "IsLeaf"}, {
{ "Airlines", GetAirlinesTable(url), "Table", "Table", true },
{ "Airports", GetAirportsTable(url), "Table", "Table", true }
}),
navTable = Table.ToNavigationTable(source, {"Name"}, "Name", "Data", "ItemKind", "ItemName", "IsLeaf")
in
navTable;
Als u de testquery opnieuw uitvoert, krijgt u een vergelijkbaar resultaat als de laatste keer, met — nog een paar kolommen toegevoegd.

Notitie
Het venster Navigator wordt niet weergegeven in Visual Studio. In het venster Uitvoer van M-query wordt altijd de onderliggende tabel weergegeven.
Als u de extensie naar uw aangepaste connector Power BI Desktop en de nieuwe functie aanroept vanuit het dialoogvenster Gegevens downloaden, ziet u dat uw navigator wordt weergegeven.

Als u met de rechtermuisknop op de hoofdmap van de navigatiestructuur klikt en Bewerken selecteert, ziet u dezelfde tabel als in de Visual Studio.

Conclusie
In deze zelfstudie hebt u een navigatietabel toegevoegd aan uw extensie. Navigatietabellen zijn een belangrijke functie die het gebruik van connectors eenvoudiger maakt. In dit voorbeeld heeft uw navigatietabel slechts één niveau, maar de Power Query-gebruikersinterface ondersteunt het weergeven van navigatietabellen met meerdere dimensies (zelfs wanneer ze niet aan elkaar zijn vastgemaakt).