Udostępnij za pośrednictwem


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

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:

  • Uproszczenie logiki połączenia dla łącznika
  • Ulepszanie środowiska tabeli nawigacji

Ta lekcja upraszcza łącznik wbudowany w poprzedniej lekcji , usuwając jego wymagane parametry funkcji i poprawiając środowisko użytkownika, przechodząc do dynamicznie generowanej tabeli nawigacji.

Szczegółowe wyjaśnienie sposobu identyfikowania poświadczeń można znaleźć w sekcji Ścieżki źródła danych w temacie Obsługa uwierzytelniania.

Ścieżki źródła danych

Podczas wywoływania funkcji źródła danych aparat języka M identyfikuje poświadczenia do użycia podczas oceny, wykonując wyszukiwanie na podstawie wartości Rodzaj źródła danych i Ścieżka źródła danych.

W poprzedniej lekcji udostępniono dwie funkcje źródła danych, obie z pojedynczym parametrem Uri.Type .

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

Przy pierwszym uruchomieniu zapytania korzystającego z jednej z funkcji zostanie wyświetlony monit o podanie poświadczeń z listami rozwijanymi, które umożliwiają wybranie ścieżki i typu uwierzytelniania.

Poświadczenia ze ścieżkami.

Jeśli ponownie uruchomisz to samo zapytanie, z tymi samymi parametrami aparat języka M będzie mógł zlokalizować buforowane poświadczenia i nie zostanie wyświetlony żaden monit o podanie poświadczeń. Jeśli zmodyfikujesz url argument funkcji tak, aby ścieżka podstawowa nie odpowiadała, zostanie wyświetlony nowy monit o podanie nowej ścieżki poświadczeń.

Wszystkie buforowane poświadczenia są widoczne w tabeli Credentials (Poświadczenia) w oknie Dane wyjściowe zapytania języka M.

Karta Poświadczenia.

W zależności od typu zmiany modyfikowanie parametrów funkcji prawdopodobnie spowoduje błąd poświadczeń.

Upraszczanie łącznika

Teraz uprościsz łącznik, usuwając parametry funkcji źródła danych (TripPin.Contents). Usuniesz również shared kwalifikator dla TripPin.Feedelementu i pozostawisz go jako funkcję tylko wewnętrzną.

Jedną z filozofii projektowych dodatku Power Query jest zapewnienie możliwie prostego okna dialogowego początkowego źródła danych. Jeśli w ogóle jest to możliwe, należy podać użytkownikowi opcje na poziomie Nawigator, a nie na oknie dialogowym połączenia. Jeśli wartość podana przez użytkownika można określić programowo, rozważ dodanie jej jako najwyższego poziomu tabeli nawigacji, a nie parametru funkcji.

Na przykład podczas nawiązywania połączenia z relacyjną bazą danych może być konieczne utworzenie nazw serwerów, baz danych i tabel. Gdy znasz serwer do nawiązania połączenia i podano poświadczenia, możesz użyć interfejsu API bazy danych, aby pobrać listę baz danych oraz listę tabel zawartych w każdej bazie danych. W takim przypadku, aby okno dialogowe połączenia początkowego było tak proste, jak to możliwe, tylko nazwa serwera powinna być wymaganym parametrem —Database i Table będzie to poziomy tabeli nawigacji.

Ponieważ usługa TripPin ma stały punkt końcowy adresu URL, nie musisz monitować użytkownika o żadne wartości. Usuniesz parametr adresu URL z funkcji i zdefiniujesz zmienną BaseUrl w łączniku.

BaseUrl = "https://services.odata.org/v4/TripPinService/";

[DataSource.Kind="TripPin", Publish="TripPin.Publish"]
shared TripPin.Contents = () => TripPinNavTable(BaseUrl) as table;

Zachowasz funkcję, ale nie udostępnisz TripPin.Feed jej, nie skojarzysz jej już z typem źródła danych i uprościsz jego deklarację. Od tego momentu będziesz używać go tylko wewnętrznie w tym dokumencie sekcji.

TripPin.Feed = (url as text) =>
    let
        source = Web.Contents(url, [ Headers = DefaultRequestHeaders ]),
        json = Json.Document(source)
    in
        json;

Jeśli zaktualizujesz wywołanie TripPin.Contents() w TripPin.query.pq pliku i uruchomisz je w programie Visual Studio Code, zostanie wyświetlony nowy monit o poświadczenia. Zwróć uwagę, że istnieje teraz jedna wartość ścieżki źródła danych — TripPin.

Poświadczenia bez ścieżki.

Ulepszanie tabeli nawigacji

W pierwszym samouczku użyto wbudowanych OData funkcji do nawiązania połączenia z usługą TripPin. To dało ci ładnie wyglądającą tabelę nawigacji opartą na dokumencie usługi TripPin bez więcej kodu po twojej stronie. Funkcja OData.Feed automatycznie wykonała ci ciężką pracę. Ponieważ "szorstkie" jest używane przy użyciu biblioteki Web.Contents , a nie OData.Feed, musisz ponownie utworzyć tę tabelę nawigacji samodzielnie.

Nawigator OData.

Wprowadzisz następujące zmiany:

  1. Definiowanie listy elementów do pokazania w tabeli nawigacji
  2. Odejście od funkcji specyficznych dla jednostki (GetAirlineTables i GetAirportsTable)

Generowanie tabeli nawigacji z listy

Wyświetlisz listę jednostek, które chcesz uwidocznić w tabeli nawigacji, i utworzysz odpowiedni adres URL, aby uzyskać do nich dostęp. Ponieważ wszystkie jednostki znajdują się w tej samej ścieżce głównej, można dynamicznie tworzyć te adresy URL.

Aby uprościć ten przykład, uwidocznisz tylko trzy zestawy jednostek (Linie lotnicze, lotniska, osoby), które zostaną ujawnione jako tabele w języku M, i pominiesz singleton (Me), który będzie uwidoczniony jako Rekord. Do późniejszej lekcji pominiesz dodawanie funkcji.

RootEntities = {
    "Airlines",
    "Airports",
    "People"
};

Następnie zaktualizujesz TripPinNavTable funkcję, aby skompilować tabelę w danym momencie. Kolumna [Data] dla każdej jednostki jest pobierana przez wywołanie TripPin.Feed pełnego adresu URL jednostki.

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;

Podczas dynamicznego tworzenia ścieżek adresów URL upewnij się, że jest jasne, gdzie znajdują się ukośniki (/). Należy pamiętać, że funkcja Uri.Combine używa następujących reguł podczas łączenia ścieżek:

  • relativeUri Gdy parametr zaczyna się od /, zastąpi całą ścieżkę parametru baseUri
  • relativeUri Jeśli parametr nie zaczyna się od / i baseUri kończy się /, ścieżka jest dołączana
  • relativeUri Jeśli parametr nie zaczyna się od / i baseUri nie kończy się na /, ostatni segment ścieżki zostanie zastąpiony

Na poniższej ilustracji przedstawiono przykłady tego:

Przykład Uri.Combine.

Usuwanie funkcji specyficznych dla jednostki

Aby ułatwić obsługę łącznika, usuniesz funkcje formatowania specyficzne dla jednostki użyte w poprzedniej lekcji —GetAirlineTables i GetAirportsTable. Zamiast tego zaktualizujesz TripPin.Feed proces przetwarzania odpowiedzi JSON w sposób, który będzie działać dla wszystkich jednostek. W szczególności należy podjąć value pole zwróconego ładunku OData JSON i przekonwertować je z listy rekordów na tabelę.

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;

Uwaga

Wadą stosowania ogólnego podejścia do przetwarzania jednostek jest utrata miłych informacji o formatowaniu i typie jednostek. W dalszej części tego samouczka pokazano, jak wymusić schemat wywołań interfejsu API REST.

Podsumowanie

W tym samouczku wyczyściliśmy i uprościliśmy łącznik, naprawiając wartość ścieżki źródła danych i przechodząc do bardziej elastycznego formatu dla tabeli nawigacji. Po wykonaniu tych kroków (lub przy użyciu przykładowego kodu w tym katalogu TripPin.Contents ) funkcja zwraca tabelę nawigacji w programie Power BI Desktop.

Nawigator.

Następne kroki

TripPin — część 5 — stronicowanie