Udostępnij za pośrednictwem


TripPin — część 3 — tabele nawigacji

Ten wieloczęściowy samouczek obejmuje tworzenie nowego rozszerzenia źródła danych dla dodatku Power Query. Samouczek ma być wykonywany sekwencyjnie — każda lekcja opiera się na łączniku utworzonym w poprzednich lekcjach, przyrostowo dodając nowe możliwości do łącznika.

W tej lekcji wykonasz następujące lekcji:

  • Tworzenie tabeli nawigacji dla stałego zestawu zapytań
  • Testowanie tabeli nawigacji w programie Power BI Desktop

Ta lekcja dodaje tabelę nawigacji do łącznika TripPin utworzonego w poprzedniej lekcji. Gdy łącznik używał OData.Feed funkcji (część 1), otrzymano tabelę nawigacji "bezpłatnie", pochodzącą z dokumentu usługi OData $metadata. Po przeniesieniu Web.Contents do funkcji (część 2) utracono wbudowaną tabelę nawigacji. W tej lekcji wykonasz zestaw stałych zapytań utworzonych w programie Power BI Desktop i dodasz odpowiednie metadane dla dodatku Power Query, aby wyskakować okno dialogowe Nawigator dla funkcji źródła danych.

Aby uzyskać więcej informacji na temat używania tabel nawigacji, zobacz dokumentację tabeli nawigacji.

Definiowanie stałych zapytań w łączniku

Prosty łącznik dla interfejsu API REST można traktować jako stały zestaw zapytań, z których każda zwraca tabelę. Te tabele są odnajdywalne za pośrednictwem tabeli nawigacji łącznika. Zasadniczo każdy element w nawigatorze jest skojarzony z określonym adresem URL i zestawem przekształceń.

Zacznij od skopiowania zapytań napisanych w programie Power BI Desktop (w poprzedniej lekcji) do pliku łącznika. Otwórz projekt TripPin w programie Visual Studio Code i wklej zapytania Airlines and Airports do pliku TripPin.pq. Następnie można przekształcić te zapytania w funkcje, które przyjmują pojedynczy parametr tekstowy:

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

Następnie zaimportujesz zapytanie w tabeli nawigacji makiety, które tworzy stałą tabelę łączącą się z tymi zapytaniami zestawu danych. Wywołaj go TripPinNavTable:

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

Na koniec zadeklarujesz nową funkcję udostępnioną , TripPin.Contentsktóra jest używana jako główna funkcja źródła danych. Możesz również usunąć Publish wartość z TripPin.Feed elementu , aby nie była już wyświetlana w oknie dialogowym Pobieranie danych .

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

Uwaga

Rozszerzenie może oznaczać wiele funkcji jako shared, z lub bez skojarzenia ich z elementem DataSource.Kind. Jednak po skojarzeniu funkcji z określoną DataSource.Kindfunkcją każda funkcja musi mieć ten sam zestaw wymaganych parametrów o tej samej nazwie i typie. Dzieje się tak, ponieważ parametry funkcji źródła danych są łączone w celu utworzenia "klucza" używanego do wyszukiwania buforowanych poświadczeń.

Skompiluj łącznik po zakończeniu wszystkich zmian i przetestuj TripPin.Contents funkcję przy użyciu pliku TripPin.query.pq. Możesz nadal używać wcześniej utworzonych poświadczeń lub ustawić nowy, a następnie ocenić bieżący plik Dodatku Power Query.

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

Tabela TripPin.

Tworzenie tabeli nawigacji

Użyj przydatnej funkcji Table.ToNavigationTable , aby sformatować tabelę statyczną w coś, co dodatek Power Query rozpoznaje jako tabelę nawigacji. Ponieważ ta funkcja nie jest częścią standardowej biblioteki dodatku Power Query, należy skopiować kod źródłowy do pliku pq.

Po skonfigurowaniu tej funkcji pomocniczej zaktualizuj funkcję TripPinNavTable , aby dodać pola tabeli nawigacji.

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;

Ponowne uruchomienie zapytania testowego po ponownym utworzeniu łącznika daje podobny wynik po raz ostatni — z kilkoma dodanymi kolumnami. Tabela TripPin2.

Uwaga

Nie widzisz okna Nawigatora w oknie wyników PQTest programu Visual Studio Code. W oknie Dane wyjściowe zapytania języka M zawsze jest wyświetlana tabela bazowa.

Jeśli skopiujesz rozszerzenie do łącznika niestandardowego programu Power BI Desktop i wywołasz nową funkcję w oknie dialogowym Pobieranie danych , zostanie wyświetlony nawigator.

Nawigator TripPin.

Jeśli wybierzesz prawym przyciskiem myszy katalog główny drzewa nawigacji i wybierzesz pozycję Edytuj, zobaczysz tę samą tabelę, co w programie Visual Studio.

Zapytanie TripPin.

Podsumowanie

W tym samouczku dodano tabelę nawigacji do rozszerzenia. Tabele nawigacji to kluczowa funkcja, która ułatwia korzystanie z łączników. W tym przykładzie tabela nawigacji ma tylko jeden poziom, ale interfejs użytkownika dodatku Power Query obsługuje wyświetlanie tabel nawigacji, które mają wiele wymiarów (nawet jeśli są poszarpane).

Następne kroki

TripPin — część 4 — ścieżki źródła danych