Compartilhar via


TripPin parte 3 - Tabelas de navegação

Este tutorial de várias partes aborda a criação de uma nova extensão de fonte de dados para o Power Query. O tutorial deve ser seguido sequencialmente; cada lição se baseia no conector criado nas lições anteriores, adicionando incrementalmente novos recursos a ele.

Nesta lição, você vai:

  • criar uma tabela de navegação para um conjunto fixo de consultas
  • testar a tabela de navegação no Power BI Desktop

Esta lição adiciona uma tabela de navegação ao conector do TripPin criado na lição anterior. Quando o conector usou a OData.Feed função (Parte 1), você recebeu a tabela de navegação "gratuitamente", conforme derivado do documento $metadata do serviço do OData. Quando você mudou para a Web.Contents função (Parte 2), você perdeu a tabela de navegação interna. Nesta lição, você usará um conjunto de consultas fixas criadas no Power BI Desktop e adicionará os metadados apropriados ao Power Query para exibir a caixa de diálogo Navegador da sua função de fonte de dados.

Consulte a documentação da Tabela de navegação para obter mais informações sobre como usar as tabelas de navegação.

Definindo consultas fixas no conector

Um conector simples para uma API REST pode ser considerado como um conjunto fixo de consultas, cada uma retornando uma tabela. Essas tabelas podem ser encontradas por meio da tabela de navegação do conector. Basicamente, cada item no navegador está associado a uma URL específica e a um conjunto de transformações.

Você começará copiando as consultas que escreveu no Power BI Desktop (na lição anterior) no arquivo do conector. Abra o projeto do Visual Studio Code no TripPin Visual e cole as consultas de companhias aéreas e aeroportos no arquivo TripPin.pq. Transformará essas consultas em funções que usam um único parâmetro de texto:

GetAirlinesTable = (url as text) as table =>
    let
        source = TripPin.Feed(url & "Airlines"),
        value = source[value],
        toTable = Table.FromList(value, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
        expand = Table.ExpandRecordColumn(toTable, "Column1", {"AirlineCode", "Name"}, {"AirlineCode", "Name"})
    in
        expand;

GetAirportsTable = (url as text) as table =>
    let
        source = TripPin.Feed(url & "Airports"),
        value = source[value],
        #"Converted to Table" = Table.FromList(value, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
        #"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"Name", "IcaoCode", "IataCode", "Location"}, {"Name", "IcaoCode", "IataCode", "Location"}),
        #"Expanded Location" = Table.ExpandRecordColumn(#"Expanded Column1", "Location", {"Address", "Loc", "City"}, {"Address", "Loc", "City"}),
        #"Expanded City" = Table.ExpandRecordColumn(#"Expanded Location", "City", {"Name", "CountryRegion", "Region"}, {"Name.1", "CountryRegion", "Region"}),
        #"Renamed Columns" = Table.RenameColumns(#"Expanded City",{{"Name.1", "City"}}),
        #"Expanded Loc" = Table.ExpandRecordColumn(#"Renamed Columns", "Loc", {"coordinates"}, {"coordinates"}),
        #"Added Custom" = Table.AddColumn(#"Expanded Loc", "Latitude", each [coordinates]{1}),
        #"Added Custom1" = Table.AddColumn(#"Added Custom", "Longitude", each [coordinates]{0}),
        #"Removed Columns" = Table.RemoveColumns(#"Added Custom1",{"coordinates"}),
        #"Changed Type" = Table.TransformColumnTypes(#"Removed Columns",{{"Name", type text}, {"IcaoCode", type text}, {"IataCode", type text}, {"Address", type text}, {"City", type text}, {"CountryRegion", type text}, {"Region", type text}, {"Latitude", type number}, {"Longitude", type number}})
    in
        #"Changed Type";

Em seguida, importará a consulta de tabela de navegação simulada que você escreveu, que criará uma tabela fixa vinculando a essas consultas de conjunto de dados. Nomeie como TripPinNavTable:

TripPinNavTable = (url as text) as table =>
    let
        source = #table({"Name", "Data"}, {
            { "Airlines", GetAirlinesTable(url) },
            { "Airports", GetAirportsTable(url) }
        })
    in
        source;

Por fim, você declara uma nova função compartilhada, TripPin.Contents,que é usada como a principal função de fonte de dados. Você também remove o valor Publish de TripPin.Feed para que não seja mais mostrado na caixa de diálogo Obter dados.

[DataSource.Kind="TripPin"]
shared TripPin.Feed = Value.ReplaceType(TripPinImpl, type function (url as Uri.Type) as any);

[DataSource.Kind="TripPin", Publish="TripPin.Publish"]
shared TripPin.Contents =  Value.ReplaceType(TripPinNavTable, type function (url as Uri.Type) as any);

Observação

Sua extensão pode marcar várias funções como shared, com ou sem associá-las a um DataSource.Kind. No entanto, quando você associa uma função a um específico DataSource.Kind, cada função deve ter o mesmo conjunto de parâmetros obrigatórios com o mesmo nome e tipo. Isso ocorre porque os parâmetros da função de fonte de dados são combinados para criar uma "chave" usada para pesquisar credenciais armazenadas em cache.

Crie seu conector depois de finalizar todas as alterações e teste sua função TripPin.Contents usando o arquivo TripPin.query.pq. Você pode continuar a utilizar a credencial criada anteriormente ou pode definir uma nova e, em seguida, avaliar o arquivo atual do Power Query.

TripPin.Contents("https://services.odata.org/v4/TripPinService/")

Tabela do TripPin.

Criando uma tabela de navegação

Use a útil função Table.ToNavigationTable para formatar sua tabela estática em algo que o Power Query reconhece como uma tabela de navegação. Como essa função não faz parte da biblioteca padrão do Power Query, você precisará copiar o código-fonte dela para o seu arquivo .pq.

Com essa função auxiliar em vigor, atualize em seguida a sua função TripPinNavTable para adicionar os campos da tabela de navegação.

TripPinNavTable = (url as text) as table =>
    let
        source = #table({"Name", "Data", "ItemKind", "ItemName", "IsLeaf"}, {
            { "Airlines", GetAirlinesTable(url), "Table", "Table", true },
            { "Airports", GetAirportsTable(url), "Table", "Table", true }
        }),
        navTable = Table.ToNavigationTable(source, {"Name"}, "Name", "Data", "ItemKind", "ItemName", "IsLeaf")
    in
        navTable;

A execução da consulta de teste novamente, depois de compilar novamente seu conector, fornecerá um resultado semelhante ao da última vez, com mais algumas colunas adicionadas. Tabela2 do TripPin.

Observação

Você não vê a janela Navegador aparecer na janela de resultado PQTest do Visual Studio Code. A janela Saída da consulta M sempre exibirá a tabela subjacente.

Se você copiar sua extensão no conector personalizado do Power BI Desktop e invocar a nova função na caixa de diálogo Obter dados, o seu navegador aparecerá.

Navegador do TripPin.

Se você clicar com o botão direito do mouse na raiz da árvore de navegação e selecionar Editar, verá a mesma tabela, da mesma forma que você fez no Visual Studio.

Consulta do TripPin.

Conclusão

Neste tutorial, você adicionou uma Tabela de Navegação à sua extensão. As tabelas de navegação são um recurso importante que facilita o uso de conectores. Neste exemplo, sua tabela de navegação tem apenas um único nível, mas a interface do usuário do Power Query suporta a exibição de tabelas de navegação com várias dimensões (mesmo que irregulares).

Próximas etapas

TripPin parte 4 – Caminhos da fonte de dados