TripPin del 3 – Navigationstabeller
Dette selvstudium i flere dele dækker oprettelsen af en ny datakildeudvidelse til Power Query. Selvstudiet er beregnet til at blive udført sekventielt – hver lektion bygger på den connector, der blev oprettet i tidligere lektioner, og føjer trinvist nye funktioner til din connector.
I denne lektion skal du:
- Opret en navigationstabel til et fast sæt forespørgsler
- Test navigationstabellen i Power BI Desktop
Denne lektion føjer en navigationstabel til den TripPin-connector, der blev oprettet i den forrige lektion. Da din connector brugte funktionen OData.Feed
(del 1), modtog du navigationstabellen "gratis" som afledt af OData-tjenestens $metadata dokument. Da du flyttede til funktionen Web.Contents
(del 2), mistede du den indbyggede navigationstabel. I denne lektion tager du et sæt faste forespørgsler, du har oprettet i Power BI Desktop, og tilføjer de relevante metadata for Power Query for at åbne dialogboksen Navigator for din datakildefunktion.
Du kan få flere oplysninger om brug af navigationstabeller i dokumentationen til navigationstabellen.
Definition af faste forespørgsler i connectoren
En simpel connector til en REST API kan opfattes som et fast sæt forespørgsler, der hver især returnerer en tabel. Disse tabeller kan registreres via connectorens navigationstabel. I bund og grund er hvert element i navigatoren knyttet til en bestemt URL-adresse og et sæt transformationer.
Du starter med at kopiere de forespørgsler, du skrev i Power BI Desktop (i den forrige lektion), til din connectorfil. Åbn TripPin-projektet i Visual Studio Code, og indsæt forespørgslerne airlines og lufthavne i filen TripPin.pq. Du kan derefter omdanne disse forespørgsler til funktioner, der tager en enkelt tekstparameter:
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";
Derefter skal du importere den modelforespørgsel i navigationstabellen, du skrev, og som opretter en fast tabel, der linker til disse datasætforespørgsler. Kald det TripPinNavTable
:
TripPinNavTable = (url as text) as table =>
let
source = #table({"Name", "Data"}, {
{ "Airlines", GetAirlinesTable(url) },
{ "Airports", GetAirportsTable(url) }
})
in
source;
Til sidst deklarerer du en ny delt funktion, , TripPin.Contents
der bruges som din primære datakildefunktion. Du fjerner også værdien Publish
fra TripPin.Feed
, så den ikke længere vises i dialogboksen Hent data .
[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);
Bemærk
Udvidelsen kan markere flere funktioner som shared
, med eller uden at knytte dem til en DataSource.Kind
. Men når du knytter en funktion til en bestemt DataSource.Kind
, skal hver funktion have det samme sæt påkrævede parametre med samme navn og type. Det skyldes, at parametrene for datakildefunktionen kombineres for at oprette en "nøgle", der bruges til at søge efter cachelagrede legitimationsoplysninger.
Byg din connector, når du har fuldført alle ændringerne, og test din TripPin.Contents
funktion ved hjælp af filen TripPin.query.pq. Du kan fortsætte med at bruge de tidligere oprettede legitimationsoplysninger, eller du kan angive en ny og derefter evaluere din aktuelle Power Query-fil.
TripPin.Contents("https://services.odata.org/v4/TripPinService/")
Oprettelse af en navigationstabel
Brug den praktiske tabel.ToNavigationTable til at formatere den statiske tabel til noget, som Power Query genkender som en navigationstabel. Da denne funktion ikke er en del af Power Querys standardbibliotek, skal du kopiere kildekoden til din .pq-fil.
Med denne hjælpefunktion på plads skal du opdatere din TripPinNavTable
funktion for at tilføje felterne i navigationstabellen.
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;
Når du kører testforespørgslen igen, når du har oprettet din connector igen, får du et lignende resultat som sidste gang – med nogle flere kolonner tilføjet.
Bemærk
Vinduet Navigator vises ikke i resultatvinduet PQTest i Visual Studio Code. Den underliggende tabel vises altid i vinduet M-forespørgselsoutput .
Hvis du kopierer udvidelsen til din brugerdefinerede connector i Power BI Desktop og aktiverer den nye funktion fra dialogboksen Hent data , vises din navigator.
Hvis du højreklikker på roden af navigationstræet og vælger Rediger, kan du se den samme tabel, som du gjorde i Visual Studio.
Konklusion
I dette selvstudium har du føjet en navigationstabel til din udvidelse. Navigationstabeller er en nøglefunktion, der gør det nemmere at bruge forbindelser. I dette eksempel har navigationstabellen kun et enkelt niveau, men Brugergrænsefladen i Power Query understøtter visning af navigationstabeller, der har flere dimensioner (også selvom de er ujævne).