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.
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.
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.Feed
elementu 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.
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.
Wprowadzisz następujące zmiany:
- Definiowanie listy elementów do pokazania w tabeli nawigacji
- Odejście od funkcji specyficznych dla jednostki (
GetAirlineTables
iGetAirportsTable
)
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ę parametrubaseUri
relativeUri
Jeśli parametr nie zaczyna się od / ibaseUri
kończy się /, ścieżka jest dołączanarelativeUri
Jeśli parametr nie zaczyna się od / ibaseUri
nie kończy się na /, ostatni segment ścieżki zostanie zastąpiony
Na poniższej ilustracji przedstawiono przykłady tego:
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.