Поделиться через


Часть 3 TripPin — таблицы навигации

В этом руководстве рассматривается создание нового расширения источника данных для Power Query. Это руководство предназначено для последовательного выполнения каждого урока— каждый урок, созданный на основе соединителя, созданного на предыдущих уроках, постепенно добавляя новые возможности в соединитель.

В этом уроке вы научитесь:

  • Создание таблицы навигации для фиксированного набора запросов
  • Тестирование таблицы навигации в Power BI Desktop

Этот урок добавляет таблицу навигации в соединитель TripPin, созданный на предыдущем занятии. Когда соединитель использовал OData.Feed функцию (часть 1), вы получили таблицу навигации "бесплатно" в качестве производных от $metadata документа службы OData. При перемещении в функцию Web.Contents (часть 2) вы потеряли встроенную таблицу навигации. На этом занятии вы принимаете набор фиксированных запросов, созданных в Power BI Desktop, и добавьте соответствующие метаданные Для Power Query, чтобы открыть диалоговое окно "Навигатор " для функции источника данных.

Дополнительные сведения об использовании таблиц навигации см. в документации по таблице навигации.

Определение фиксированных запросов в соединителе

Простой соединитель для REST API можно рассматривать как фиксированный набор запросов, каждый возвращающий таблицу. Эти таблицы доступны для обнаружения с помощью таблицы навигации соединителя. По сути, каждый элемент в навигаторе связан с определенным URL-адресом и набором преобразований.

Начните с копирования запросов, которые вы написали в Power BI Desktop (на предыдущем занятии) в файл соединителя. Откройте проект TripPin в Visual Studio Code и вставьте запросы авиакомпаний и аэропортов в файл TripPin.pq. Затем эти запросы можно преобразовать в функции, которые принимают один текстовый параметр:

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

Затем вы импортируете запрос таблицы навигации макета, который вы написали, что создает фиксированную таблицу, связанную с этими запросами набора данных. Вызовите его TripPinNavTable:

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

Наконец, вы объявляете новую общую функцию, TripPin.Contentsкоторая используется в качестве основной функции источника данных. Вы также удалите значение, TripPin.Feed чтобы оно больше не отображалось в диалоговом окне "Получение данных".Publish

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

Примечание.

Расширение может пометить несколько функций как shared, с или без связывания их с .DataSource.Kind Однако при связывании функции с определенной DataSource.Kindфункцией каждая функция должна иметь одинаковый набор обязательных параметров с одинаковым именем и типом. Это связано с тем, что параметры функции источника данных объединяются для создания ключа, используемого для поиска кэшированных учетных данных.

Создайте соединитель после завершения всех изменений и протестируйте TripPin.Contents функцию с помощью файла TripPin.query.pq. Вы можете продолжать использовать ранее созданные учетные данные или задать новый, а затем оценить текущий файл Power Query.

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

Таблица TripPin.

Создание таблицы навигации

Используйте функцию Table.ToNavigationTable , чтобы отформатировать статическую таблицу в то, что Power Query распознает как таблицу навигации. Так как эта функция не является частью стандартной библиотеки Power Query, необходимо скопировать его исходный код в PQ-файл.

После этого вспомогательной функции обновите TripPinNavTable функцию, чтобы добавить поля таблицы навигации.

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;

После повторного создания соединителя выполнение тестового запроса дает аналогичный результат, как и в последний раз, с несколькими дополнительными столбцами. TripPin Table2.

Примечание.

Окно навигатора не отображается в окне результатов PQTest Visual Studio Code. В окне вывода запроса M всегда отображается базовая таблица.

При копировании расширения в настраиваемый соединитель Power BI Desktop и вызовите новую функцию из диалогового окна "Получить данные ", появится навигатор.

TripPin Navigator.

Если выбрать правой кнопкой мыши корень дерева навигации и выбрать "Изменить", вы увидите ту же таблицу, что и в Visual Studio.

Запрос TripPin.

Заключение

В этом руководстве вы добавили таблицу навигации в расширение. Таблицы навигации — это ключевая функция, которая упрощает использование соединителей. В этом примере таблица навигации имеет только один уровень, но пользовательский интерфейс Power Query поддерживает отображение таблиц навигации с несколькими измерениями (даже если они удалены).

Следующие шаги

Часть 4 TripPin — пути к источнику данных