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


Обработка навигации

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

Таблица навигации TripPin.

За кулисами таблица навигации — это просто обычное значение таблицы M с определенными полями метаданных, определенными в типе. Когда функция источника данных возвращает таблицу с этими полями, Power Query отобразит диалоговое окно навигатора. На самом деле базовые данные можно увидеть как значение таблицы, щелкнув правой кнопкой мыши корневой узел и выбрав "Изменить".

Table.ToNavigationTable

Функцию Table.ToNavigationTable можно использовать для добавления метаданных типа таблицы, необходимых для создания таблицы навигации.

Примечание.

В настоящее время необходимо скопировать и вставить эту функцию в расширение M. В будущем она, скорее всего, будет перенесена в стандартную библиотеку M.

В следующей таблице описаны параметры для этой функции:

Параметр Сведения
table Таблица навигации.
Keycolumns Список имен столбцов, которые служат первичным ключом для таблицы навигации.
nameColumn Имя столбца, который должен использоваться в качестве отображаемого имени в навигаторе.
Datacolumn Имя столбца, содержащего отображаемую таблицу или функцию.
itemKindColumn Имя столбца, используемого для определения типа отображаемого значка. Ниже приведен список допустимых значений для столбца.
itemNameColumn Имя столбца, используемого для определения поведения предварительного просмотра. Обычно это значение имеет то же значение, что и itemKind.
isLeafColumn Имя столбца, используемого для определения того, является ли это конечным узлом, или если узел можно развернуть, чтобы содержать другую таблицу навигации.

Функция добавляет следующие метаданные в тип таблицы:

Поле Параметр
NavigationTable.NameColumn nameColumn
NavigationTable.DataColumn Datacolumn
NavigationTable.ItemKindColumn itemKindColumn
NavigationTable.IsLeafColumn isLeafColumn
Preview.DelayColumn itemNameColumn

Значения для ItemKind

Каждое из следующих значений типа элемента предоставляет другой значок в таблице навигации.

  • Веб-канал
  • База данных
  • DatabaseServer
  • Измерение
  • Таблица
  • Папка
  • Function
  • Представления
  • Простыня
  • DefinedName
  • Запись

Примеры

Плоская таблица навигации

В следующем примере кода отображается плоская таблица навигации с тремя таблицами и функцией.

shared NavigationTable.Simple = () =>
    let
        objects = #table(
            {"Name",       "Key",        "Data",                           "ItemKind", "ItemName", "IsLeaf"},{
            {"Item1",      "item1",      #table({"Column1"}, {{"Item1"}}), "Table",    "Table",    true},
            {"Item2",      "item2",      #table({"Column1"}, {{"Item2"}}), "Table",    "Table",    true},
            {"Item3",      "item3",      FunctionCallThatReturnsATable(),  "Table",    "Table",    true},            
            {"MyFunction", "myfunction", AnotherFunction.Contents,       "Function", "Function", true}
            }),
        NavTable = Table.ToNavigationTable(objects, {"Key"}, "Name", "Data", "ItemKind", "ItemName", "IsLeaf")
    in
        NavTable;

shared FunctionCallThatReturnsATable = () =>
    #table({"DynamicColumn"}, {{"Dynamic Value"}});

Этот код приведет к отображению следующего навигатора в Power BI Desktop:

Пример плоской таблицы навигации.

Таблица навигации с несколькими уровнями

Для создания иерархического представления над набором данных можно использовать вложенные таблицы навигации. Для этого необходимо задать IsLeaf для этой строки false значение (которое помечает его как узел, который можно развернуть), а также отформатируйте Data столбец в другую таблицу навигации.

shared NavigationTable.Nested = () as table =>
    let
        objects = #table(
            {"Name",       "Key",  "Data",                "ItemKind", "ItemName", "IsLeaf"},{
            {"Nested A",   "n1",   CreateNavTable("AAA"), "Table",    "Table",    false},
            {"Nested B",   "n2",   CreateNavTable("BBB"), "Table",    "Table",    false},
            {"Nested C",   "n3",   CreateNavTable("CCC"), "Table",    "Table",    false}
        }),
        NavTable = Table.ToNavigationTable(objects, {"Key"}, "Name", "Data", "ItemKind", "ItemName", "IsLeaf")
    in
        NavTable;

CreateNavTable = (message as text) as table => 
    let
        objects = #table(
            {"Name",  "Key",   "Data",                           "ItemKind", "ItemName", "IsLeaf"},{
            {"Item1", "item1", #table({"Column1"}, {{message}}), "Table",    "Table",    true},
            {"Item2", "item2", #table({"Column1"}, {{message}}), "Table",    "Table",    true}
        }),
        NavTable = Table.ToNavigationTable(objects, {"Key"}, "Name", "Data", "ItemKind", "ItemName", "IsLeaf")
    in
        NavTable;

Этот код приведет к отображению следующего навигатора в Power BI Desktop:

Пример иерархической таблицы навигации.

Динамические таблицы навигации

Более сложные функциональные возможности можно создать на основе этих основных принципов. Во всех приведенных выше примерах отображаются жестко закодированные сущности в таблице навигации, легко увидеть, как таблицу навигации можно создавать динамически на основе сущностей, доступных конкретному пользователю. Ниже приведены некоторые ключевые аспекты для таблиц динамической навигации:

  • Обработка ошибок, чтобы обеспечить хороший интерфейс для пользователей, у которых нет доступа к определенным конечным точкам.
  • Оценка узла по умолчанию отложена; конечные узлы не оцениваются, пока родительский узел не будет развернут. Некоторые реализации динамических таблиц навигации на нескольких уровнях могут привести к активной оценке всего дерева. Не забудьте отслеживать количество вызовов, которые Выполняет Power Query, так как изначально отображает таблицу навигации. Например, Table.InsertRows является "ленивее", чем Table.FromRecords, так как не требуется оценивать его аргументы.