处理导航

导航表(或导航表)是为连接器提供用户友好体验的核心部分。 Power Query 体验在用户输入数据源函数的所有必需参数并通过数据源完成身份验证后,将这些信息显示给用户。

TripPin 导航表。

在后台,导航表只是一个常规的 M 表值,其中包含在其类型上定义的特定元数据字段。 当数据源函数返回定义了这些字段的表时,Power Query 将显示导航器对话框。 实际上,可以通过右键单击根节点并选择 “编辑”,将基础数据视为表值。

Table.ToNavigationTable

可以使用函数 Table.ToNavigationTable 添加创建导航表所需的表类型元数据。

注释

当前需要将此函数复制并粘贴到 M 扩展中。 将来,它可能会移动到 M 标准库。

下表描述了此函数的参数:

参数 详细信息
导航表。
keyColumns 充当导航表主键的列名列表。
nameColumn 应在导航器中用作显示名称的列的名称。
dataColumn 包含要显示的表或函数的列的名称。
itemKindColumn 用于确定要显示的图标类型的列的名称。 有关列 的有效值列表 ,请参阅下文。
itemNameColumn 用于确定预览行为的列名称。 这通常设置为与 itemKind 相同的值。
isLeafColumn 用于确定这是叶节点的列的名称,或者该节点是否可以展开以包含另一个导航表。

该函数将以下元数据添加到表类型:

领域 参数
导航表.名称列 nameColumn
导航表.数据列 (NavigationTable.DataColumn) dataColumn
导航表.项目种类列 itemKindColumn
NavigationTable.IsLeafColumn isLeafColumn
Preview.延迟列 itemNameColumn

ItemKind 的值

以下每个项类型值都提供导航表中的不同图标。

  • 数据库
  • 数据库服务器
  • 尺寸
  • Table
  • 文件夹
  • 功能
  • 查看
  • Sheet
  • 定义名称
  • 记录

例子

平面导航表

下面的代码示例显示包含三个表和一个函数的平面导航表。

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.InsertRowsTable.FromRecords “lazier”,因为它不需要计算其参数。