次の方法で共有


ナビゲーションの処理

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

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

バックグラウンドでは、ナビゲーション テーブルは、特定のメタデータ フィールドが Type で定義されている通常の 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 の値

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

  • フィード
  • データベース
  • データベースサーバー
  • ディメンション
  • フォルダー
  • 機能
  • 表示
  • Sheet
  • 定義済み名前
  • 記録

例示

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

次のコード サンプルでは、3 つのテーブルと関数を含むフラット ナビゲーション テーブルを表示します。

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' です。