Dela via


TripPin del 3 – Navigeringstabeller

Den här självstudien i flera delar beskriver hur du skapar ett nytt datakällans tillägg för Power Query. Självstudien är avsedd att utföras sekventiellt – varje lektion bygger på anslutningsappen som skapades i föregående lektioner och lägger stegvis till nya funktioner i anslutningsappen.

I den här lektionen kommer du att:

  • Skapa en navigeringstabell för en fast uppsättning frågor
  • Testa navigeringstabellen i Power BI Desktop

Den här lektionen lägger till en navigeringstabell i TripPin-anslutningsappen som skapades i föregående lektion. När anslutningsappen OData.Feed använde funktionen (del 1) fick du navigeringstabellen "kostnadsfritt", som härledd från OData-tjänstens $metadata dokument. När du flyttade till Web.Contents funktionen (del 2) förlorade du den inbyggda navigeringstabellen. I den här lektionen tar du en uppsättning fasta frågor som du skapade i Power BI Desktop och lägger till lämpliga metadata för Power Query för att öppna dialogrutan Navigatör för din datakällsfunktion.

Mer information om hur du använder navigeringstabeller finns i dokumentationen för navigeringstabeller.

Definiera fasta frågor i anslutningsappen

En enkel anslutningsapp för ett REST-API kan betraktas som en fast uppsättning frågor som var och en returnerar en tabell. Dessa tabeller kan identifieras via anslutningsappens navigeringstabell. I princip är varje objekt i navigatören associerat med en specifik URL och uppsättning transformeringar.

Du börjar med att kopiera frågorna du skrev i Power BI Desktop (i föregående lektion) till anslutningsfilen. Öppna TripPin-projektet i Visual Studio Code och klistra in frågorna För flygbolag och flygplatser i filen TripPin.pq. Du kan sedan omvandla dessa frågor till funktioner som tar en enskild textparameter:

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";

Därefter importerar du frågan för den falska navigeringstabellen som du skrev som skapar en fast tabell som länkar till dessa datamängdsfrågor. Anropa det TripPinNavTable:

TripPinNavTable = (url as text) as table =>
    let
        source = #table({"Name", "Data"}, {
            { "Airlines", GetAirlinesTable(url) },
            { "Airports", GetAirportsTable(url) }
        })
    in
        source;

Slutligen deklarerar du en ny delad funktion, TripPin.Contents, som används som huvudfunktion för datakällan. Du tar också bort Publish värdet från TripPin.Feed så att det inte längre visas i dialogrutan Hämta 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);

Kommentar

Tillägget kan markera flera funktioner som shared, med eller utan att associera dem med en DataSource.Kind. Men när du associerar en funktion med en specifik DataSource.Kindmåste varje funktion ha samma uppsättning obligatoriska parametrar med samma namn och typ. Det beror på att datakällans funktionsparametrar kombineras för att skapa en nyckel som används för att söka efter cachelagrade autentiseringsuppgifter.

Skapa anslutningsappen när du har slutfört alla ändringar och testa funktionen TripPin.Contents med filen TripPin.query.pq. Du kan fortsätta att använda den tidigare skapade autentiseringsuppgiften eller så kan du ange en ny och sedan utvärdera din aktuella Power Query-fil.

TripPin.Contents("https://services.odata.org/v4/TripPinService/")

TripPin-tabell.

Skapa en navigeringstabell

Använd den praktiska funktionen Table.ToNavigationTable för att formatera den statiska tabellen till något som Power Query identifierar som en navigeringstabell. Eftersom den här funktionen inte ingår i Power Querys standardbibliotek måste du kopiera källkoden till .pq-filen.

När den här hjälpfunktionen är på plats uppdaterar du sedan funktionen TripPinNavTable för att lägga till fälten i navigeringstabellen.

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ör testfrågan igen, när du har skapat anslutningsappen igen, får du ett liknande resultat som förra gången – med några fler kolumner tillagda. TripPin Table2.

Kommentar

Fönstret Navigatör visas inte i PQTest-resultatfönstret i Visual Studio Code. Fönstret M-frågeutdata visar alltid den underliggande tabellen.

Om du kopierar tillägget till din anpassade Anslutningsapp för Power BI Desktop och anropar den nya funktionen från dialogrutan Hämta data visas navigatören.

TripPin Navigator.

Om du väljer rätt i roten i navigeringsträdet och väljer Redigera ser du samma tabell som du gjorde i Visual Studio.

TripPin-fråga.

Slutsats

I den här självstudien har du lagt till en navigeringstabell i tillägget. Navigeringstabeller är en viktig funktion som gör anslutningsappar enklare att använda. I det här exemplet har navigeringstabellen bara en enda nivå, men Power Query-användargränssnittet stöder visning av navigeringstabeller som har flera dimensioner (även när de är ojämna).

Nästa steg

TripPin del 4 – Sökvägar för datakälla