Partilhar via


Gestão da navegação

As tabelas de navegação (ou nav tables) são uma parte fundamental para proporcionar uma experiência amigável para o conector. A experiência Power Query mostra-os ao utilizador depois de este ter introduzido quaisquer parâmetros necessários para a função da sua fonte de dados e autenticado com a fonte de dados.

A tabela de navegação TripPin.

Nos bastidores, uma tabela de navegação é apenas um valor normal da Tabela M com campos de metadados específicos definidos no seu Tipo. Quando a função da sua fonte de dados devolve uma tabela com estes campos definidos, o Power Query irá mostrar o diálogo do navegador. Pode, na verdade, ver os dados subjacentes como um valor de tabela clicando com o botão direito no nó raiz e selecionando Editar.

Tabela.ParaNavegaçãoTabela

Pode usar a Table.ToNavigationTable função para adicionar os metadados do tipo de tabela necessários para criar uma tabela de navegação.

Observação

Atualmente precisa de copiar e colar esta função na sua extensão M. No futuro, provavelmente será transferido para a biblioteca padrão M.

A tabela seguinte descreve os parâmetros para esta função:

Parâmetro Detalhes
tabela A tua tabela de navegação.
keyColumns Lista de nomes de colunas que funcionam como a chave principal da sua tabela de navegação.
coluna nomeNome O nome da coluna que deve ser usada como nome de exibição no navegador.
dataColumn O nome da coluna que contém a Tabela ou Função a mostrar.
ColunaItemKindT O nome da coluna a usar para determinar o tipo de ícone a exibir. Veja abaixo a lista de valores válidos para a coluna.
ColunaNomeItemNome O nome da coluna a usar para determinar o comportamento de pré-visualização. Isto é normalmente definido com o mesmo valor que itemKind.
isLeafColumn O nome da coluna é usado para determinar se este é um nó folha, ou se o nó pode ser expandido para conter outra tabela de navegação.

A função adiciona os seguintes metadados ao tipo de tabela:

Campo Parâmetro
NavigationTable.NameColumn coluna nomeNome
NavigationTable.DataColumn dataColumn
TabelaDeNavegação.ColunaDeTipoDeItem ColunaItemKindT
NavigationTable.IsLeafColumn isLeafColumn
Pré-visualização.ColunaDeAtraso ColunaNomeItemNome

Valores para o ItemKind

Cada um dos seguintes valores de tipo de item apresenta um ícone diferente na tabela de navegação.

  • Feed
  • Base de dados
  • Servidor de Base de Dados
  • Dimensão
  • Table
  • Folder
  • Função
  • View
  • Folha
  • Nome Definido
  • Gravar / Registo

Examples

Tabela de navegação plana

O exemplo de código seguinte apresenta uma tabela de navegação plana com três tabelas e uma função.

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

Este código resultará na seguinte exibição do Navigator no Power BI Desktop:

Um exemplo de uma tabela de navegação plana.

Tabela de navegação multinível

É possível usar tabelas de navegação aninhadas para criar uma vista hierárquica sobre o seu conjunto de dados. Faz-se isto definindo o IsLeaf valor dessa linha para false (que a marca como um nó que pode ser expandido), e formatando a Data coluna para ser também outra tabela de navegação.

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;

Este código resultaria na seguinte exibição do Navigator no Power BI Desktop:

Um exemplo de uma tabela de navegação hierárquica.

Tabelas de navegação dinâmica

Funcionalidades mais complexas podem ser construídas a partir destes fundamentos. Embora todos os exemplos acima mostrem entidades codificadas fixamente na tabela de navegação, é fácil perceber como uma tabela de navegação poderia ser gerada dinamicamente com base em entidades disponíveis para um dado utilizador. Algumas considerações chave para tabelas de navegação dinâmica incluem:

  • Gestão de erros para garantir uma boa experiência para utilizadores que não têm acesso a certos endpoints.
  • A avaliação de nós é preguiçosa por defeito; os nós folha não são avaliados até que o nó pai seja expandido. Certas implementações de tabelas dinâmicas de navegação multinível podem resultar numa avaliação entusiasta de toda a árvore. Certifique-se de monitorizar o número de chamadas que o Power Query está a fazer ao renderizar inicialmente a tabela de navegação. Por exemplo, o Table.InsertRows é 'mais preguiçoso' do que o Table.FromRecords, pois não precisa de avaliar os seus argumentos.