ナビゲーションの処理

ナビゲーション テーブル (または nav テーブル) は、コネクタに対してユーザーフレンドリなエクスペリエンスを提供するための中心的な部分です。 Power Query エクスペリエンスでは、データ ソース関数に必要なパラメーターを入力し、データ ソースで認証された後に、それらがユーザーに表示されます。

TripPin ナビゲーション テーブル。

実際には、nav テーブルは、その型で定義された特定のメタデータ フィールドを持つ通常の M テーブルの値にすぎません。 データ ソース関数からこれらのフィールドが定義されたテーブルが返されると、Power Query によってナビゲーター ダイアログが表示されます。 ルート ノードを右クリックし、[編集] を選択すると、基になるデータをテーブル値として実際に表示できます。

Table.ToNavigationTable

Table.ToNavigationTable 関数を使用すると、nav テーブルを作成するために必要なテーブル型のメタデータを追加できます。

Note

現在は、この関数をコピーして M 拡張機能に貼り付ける必要があります。 今後、M 標準ライブラリに移動する可能性があります。

この関数のパラメーターの説明を次の表に示します。

パラメーター 詳細
テーブル ご自分のナビゲーション テーブル。
keyColumns ナビゲーション テーブルの主キーとして機能する列名の一覧。
nameColumn ナビゲーターの表示名として使用される列の名前。
dataColumn 表示するテーブルまたは関数を含む列の名前。
itemKindColumn 表示するアイコンの種類を決定するために使用する列の名前。 下記の、列に有効な値の一覧を参照してください。
itemNameColumn プレビュー動作を決定するために使用する列の名前。 通常、これは itemKind と同じ値に設定されます。
isLeafColumn これがリーフ ノードであるかどうか、またはノードを展開して別のナビゲーション テーブルを含めることができるかどうかを決定するために使用される列の名前。

この関数によって、次のメタデータがテーブル型に追加されます。

フィールド パラメーター
NavigationTable.NameColumn nameColumn
NavigationTable.DataColumn dataColumn
NavigationTable.ItemKindColumn itemKindColumn
NavigationTable.IsLeafColumn isLeafColumn
Preview.DelayColumn itemNameColumn

ItemKind の値

次の項目の種類の値はそれぞれ、ナビゲーション テーブルでは異なるアイコンになります。

  • フィード
  • データベース
  • DatabaseServer
  • ディメンション
  • テーブル
  • Folder
  • 機能
  • 表示
  • シート
  • DefinedName
  • Record

フラットなナビゲーション テーブル

次のコード サンプルは、3 つのテーブルと関数を含むフラットな nav テーブルを示します。

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 列を別の nav テーブルとしても設定します。

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 に次のナビゲーターが表示されます。

階層ナビゲーション テーブルのサンプル。

動的ナビゲーション テーブル

これらの基本から、より複雑な機能を構築できます。 上記のすべての例は、nav テーブルのハードコーディングされたエンティティを示していますが、特定のユーザーが使用できるエンティティに基づいて nav テーブルを動的に生成する方法が簡単にわかります。 動的ナビゲーション テーブルの主な考慮事項は次のとおりです。

  • 特定のエンドポイントにアクセスできないユーザーに対して適切なエクスペリエンスを確保するためのエラー処理
  • 既定では、ノードの評価は遅延します。リーフ ノードは、親ノードが展開されるまで評価されません。 複数レベルの動的 nav テーブルの実装によっては、ツリー全体が集中的に評価される場合があります。 最初にナビゲーション テーブルをレンダリングするときに Power Query が行っている呼び出しの数を監視してください。 たとえば、引数を評価する必要がないため、Table.InsertRows は Table.FromRecords よりも「遅延」します。