TripPin, parte 3: tablas de navegación
En este tutorial de varias partes se describe la creación de una nueva extensión de origen de datos para Power Query. El tutorial está diseñado para seguirse secuencialmente: cada lección se basa en el conector creado en las lecciones anteriores, agregando incrementalmente nuevas funcionalidades al conector.
En esta lección, aprenderá lo siguiente:
- Creación de una tabla de navegación para un conjunto fijo de consultas
- Prueba de la tabla de navegación en Power BI Desktop
En esta lección se agrega una tabla de navegación al conector TripPin creado en la lección anterior. Cuando su conector usó la función OData.Feed
(Parte 1), usted recibió la tabla de navegación "gratis", como se deriva del documento de $metadata del servicio OData. Cuando pasó a la función Web.Contents
(Parte 2), perdió la tabla de navegación integrada. En esta lección, tomará un conjunto de consultas fijas que creó en Power BI Desktop y agregará los metadatos adecuados para Power Query para que aparezca el cuadro de diálogo Navegador para la función del origen de datos.
Consulte la documentación sobre tablas de navegación para obtener más información sobre el uso de tablas de navegación.
Definición de consultas fijas en el conector
Un conector sencillo para una API REST se puede considerar como un conjunto fijo de consultas, cada una de las cuales devuelve una tabla. Estas tablas se pueden descubrir mediante la tabla de navegación del conector. Básicamente, cada elemento del navegador está asociado a una dirección URL específica y a un conjunto de transformaciones.
Comenzará copiando las consultas que escribió en Power BI Desktop (en la lección anterior) en el archivo del conector. Abra el proyecto TripPin en Visual Studio Code y pegue las consultas Airlines y Airports en el archivo TripPin.pq. A continuación, puede convertir esas consultas en funciones que toman un ú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";
Luego, importará la consulta de tabla de navegación simulada que escribió que crea una tabla fija que vincula estas consultas de conjunto de datos. Asígnele el nombre TripPinNavTable
:
TripPinNavTable = (url as text) as table =>
let
source = #table({"Name", "Data"}, {
{ "Airlines", GetAirlinesTable(url) },
{ "Airports", GetAirportsTable(url) }
})
in
source;
Por último, se declara una nueva función compartida, TripPin.Contents
, que se usa como función principal del origen de datos. También quita el valor Publish
de TripPin.Feed
para que ya no aparezca en el cuadro de diálogo Obtener datos.
[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);
Nota:
La extensión puede marcar varias funciones como shared
, asociándolas a DataSource.Kind
o no. Sin embargo, cuando se asocia una función a un DataSource.Kind
específico, cada función debe tener el mismo conjunto de parámetros obligatorios, con el mismo nombre y tipo. Esto se debe a que los parámetros de la función del origen de datos se combinan para crear una "clave" que se usa para buscar credenciales almacenadas en caché.
Compile el conector después de finalizar todos los cambios y pruebe la función TripPin.Contents
mediante el archivo TripPin.query.pq. Puede seguir usando la credencial creada anteriormente o puede establecer una nueva y, a continuación, evaluar el archivo de Power Query actual.
TripPin.Contents("https://services.odata.org/v4/TripPinService/")
Creación de una tabla de navegación
Use la práctica función Table.ToNavigationTable para dar formato a la tabla estática en algo que Power Query reconozca como una tabla de navegación. Puesto que esta función no forma parte de la biblioteca estándar de Power Query, debe copiar su código fuente en el archivo .pq.
Con esta función auxiliar disponible, a continuación actualice la función TripPinNavTable
para agregar los campos de la tabla de navegación.
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;
Si vuelve a ejecutar la consulta de prueba, después de compilar de nuevo el conector, le ofrece un resultado similar al de la última vez, con algunas columnas más agregadas.
Nota:
No verá que la ventana Navegador aparezca en la ventana de resultados PQTest de Visual Studio Code. La ventana Salida de consulta M siempre muestra la tabla subyacente.
Si copia la extensión en el conector personalizado de Power BI Desktop e invoca la nueva función desde el cuadro de diálogo Obtener datos, aparece el navegador.
Si hace clic con el botón derecho en la raíz del árbol de navegación y selecciona Editar, verá la misma tabla que en Visual Studio.
Conclusión
En este tutorial, ha agregado una Tabla de navegación a la extensión. Las tablas de navegación son una característica clave que facilita el uso de los conectores. En este ejemplo, la tabla de navegación solo tiene un solo nivel, pero la interfaz de usuario de Power Query admite la visualización de tablas de navegación que tienen varias dimensiones (incluso cuando son desiguales).