TripPin parte 1: conector de datos para un servicio OData

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 un nuevo proyecto de conector de datos mediante el SDK de Visual Studio
  • Creación de una función base para extraer datos de un origen
  • Prueba del conector en Visual Studio
  • Registro del conector en Power BI Desktop

Creación de un conector básico de OData

En esta sección, creará un nuevo proyecto de conector de datos, proporcionará información básica y lo probará en Visual Studio.

Abra Visual Studio y cree un proyecto nuevo. En la carpeta Power Query, seleccione el proyecto Conector de datos. Para este ejemplo, establezca el nombre del proyecto en TripPin.

VSProject.

Abra el archivo TripPin.pq y pegue la siguiente definición del conector.

section TripPin;

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

TripPinImpl = (url as text) =>
    let
        source = OData.Feed(url)
    in
        source;

// Data Source Kind description
TripPin = [
    Authentication = [
        Anonymous = []
    ],
    Label = "TripPin Part 1 - OData"
];

// Data Source UI publishing description
TripPin.Publish = [
    Beta = true,
    Category = "Other",
    ButtonText = { "TripPin OData", "TripPin OData" }
];

Esta definición del conector contiene:

  • Un registro de definición de origen de datos para el conector TripPin
  • Declaración que indica que Implícita (Anónima) es el único tipo de autenticación para este origen.
  • Una función (TripPinImpl) con una implementación que llama a OData.Feed
  • Una función compartida (TripPin.Feed) que establece el tipo de parámetro en Uri.Type
  • Un registro de publicación del origen de datos que permitirá que el conector aparezca en el cuadro de diálogo Obtener datos de Power BI

Abra el archivo TripPin.query.pq. Reemplace el contenido actual por una llamada a la función exportada.

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

Seleccione el botón Iniciar para iniciar la utilidad de consulta M.

El archivo <proyecto>.query.pq se usa para probar la extensión sin tener que implementarlo en la carpeta bin de Power BI Desktop. Al seleccionar el botón Iniciar (o pulsar F5) se compila automáticamente la extensión y se inicia la utilidad de consulta M.

Al ejecutar la consulta por primera vez se produce un error de credenciales. En Power Query, la aplicación de hospedaje convertirá este error en una solicitud de credenciales. En Visual Studio, recibirá una solicitud similar que indica para qué origen de datos faltan credenciales y la ruta de acceso del origen de datos. Seleccione la más corta de las rutas de acceso del origen de datos (https://services.odata.org/); de esta manera se aplicará su credencial a todas las direcciones URL de esta ruta de acceso.

Seleccione el tipo de credencial Anónima y, a continuación, seleccione Establecer credencial.

Image of M Query Output dialog, with the Errors tab selected, and the Data Source Path filled in and the Credential Type set to Anonymous.

Seleccione Aceptar para cerrar el cuadro de diálogo y, a continuación, vuelva a seleccionar el botón Iniciar. Verá un cuadro de diálogo de estado de ejecución de la consulta y, por último, una tabla de resultados de la consulta que muestra los datos devueltos de la consulta.

Query results.

Puede probar unas cuantas direcciones URL de OData diferentes en el archivo de prueba para ver qué resultados diferentes se devuelven. Por ejemplo:

  • https://services.odata.org/v4/TripPinService/Me
  • https://services.odata.org/v4/TripPinService/GetPersonWithMostFriends()
  • https://services.odata.org/v4/TripPinService/People

El archivo TripPin.query.pq puede contener instrucciones únicas, instrucciones Let o documentos de sección completos.

let
    Source = TripPin.Feed("https://services.odata.org/v4/TripPinService/"),
    People = Source{[Name="People"]}[Data],
    SelectColumns = Table.SelectColumns(People, {"UserName", "FirstName", "LastName"})
in
    SelectColumns

Abra Fiddler para capturar el tráfico HTTP y ejecute la consulta. Debería ver unas cuantas solicitudes diferentes para services.odata.org, generadas por el proceso de contenedor mashup. Puede ver que el acceso a la dirección URL raíz del servicio da como resultado un estado 302 y una redirección a la versión más larga de la dirección URL. Los redireccionamientos siguientes son otro comportamiento que se obtiene "gratis" de las funciones de la biblioteca base.

Algo que debe tenerse en cuenta si se observan las direcciones URL es que se puede ver el plegado de consultas que se ha producido con la instrucción SelectColumns. https://services.odata.org/v4/TripPinService/People?$select=UserName%2CFirstName%2CLastName

Si agrega más transformaciones a la consulta, puede ver cómo afectan a la dirección URL generada.

Es importante tener en cuenta este comportamiento. Aunque no se implementase lógica de plegado explícita, el conector hereda estas funcionalidades de la función OData.Feed. Las instrucciones M admiten composición: los contextos de filtro fluirán de una función a otra siempre que sea posible. Esto es similar en concepto a la forma en que las funciones de origen de datos usadas en el conector heredan su contexto de autenticación y sus credenciales. En lecciones posteriores, reemplazará el uso de OData.Feed, que tiene funcionalidades de plegado nativas, con Web.Contents, que no tiene. Para obtener el mismo nivel de funcionalidades, deberá usar la interfaz Table.View e implementar su propia lógica de plegado explícita.

Carga de la extensión en Power BI Desktop

Para usar la extensión en Power BI Desktop, deberá copiar el archivo de salida del proyecto de conector (TripPin.mez) en el directorio conectores personalizados.

  1. En Visual Studio, seleccione Compilar | Compilar solución (F6) en la barra de menús. Se generará el archivo .mez para el proyecto. De forma predeterminada, se colocará en la carpeta bin\Debug del proyecto.
  2. Cree un directorio [My Documents]\Power BI Desktop\Custom Connectors.
  3. Copie el archivo de extensión en este directorio.
  4. Marque la opción (Opción no recomendada) Permitir que se cargue cualquier extensión sin ninguna validación ni advertencia en Power BI Desktop (en Archivo>Opciones y configuración>Opciones>Seguridad>Extensiones de datos).
  5. Reinicie Power BI Desktop.
  6. Seleccione Obtener datos > Más para abrir el cuadro de diálogo Obtener datos.

Puede localizar la extensión escribiendo su nombre en el cuadro de búsqueda.

Get Data Dialog.

Seleccione el nombre de la función y seleccione Conectar. Aparece un mensaje de terceros: seleccione Continuar para continuar. Ahora aparece el cuadro de diálogo de invocación de funciones. Escriba la dirección URL raíz del servicio (https://services.odata.org/v4/TripPinService/) y seleccione Aceptar.

Invoke Function.

Puesto que es la primera vez que accede a este origen de datos, recibirá una solicitud de credenciales. Compruebe que se haya seleccionado la dirección URL más corta y, a continuación, seleccione Conectar.

Image of credential prompt set to Anonymous and the level setting set to the shortest URL.

Observe que, en lugar de obtener una tabla de datos simple, aparece el navegador. Esto se debe a que la función OData.Feed devuelve una tabla con metadatos especiales sobre ella que la experiencia de Power Query conoce para mostrarla como una tabla de navegación. En este tutorial se explica cómo crear y personalizar su propia tabla de navegación en una lección futura.

Nav Table.

Seleccione la tabla Me y, después, Transformar datos. Observe que las columnas (la mayoría de ellas) ya tienen tipos asignados. Esta es otra característica de la función OData.Feed subyacente. Si observa las solicitudes en Fiddler, verá que ha capturado el documento $metadata del servicio. La implementación de OData del motor lo hace automáticamente para determinar el esquema, los tipos de datos y las relaciones del servicio.

Me Record.

Conclusión

En esta lección le hemos mostrado cómo crear un conector sencillo basado en la función de biblioteca OData.Feed. Como ha visto, se necesita muy poca lógica para habilitar un conector totalmente funcional por medio de la función base OData. Otras funciones que ofrecen extensibilidad, como ODBC. DataSource, proporcionan funcionalidades similares.

En la siguiente lección, reemplazará el uso de OData.Feed por una función menos compatible: Web.Contents. Cada lección implementará más características del conector, incluida la paginación, la detección de metadatos y esquemas, y el plegado de consultas a la sintaxis de consulta de OData, hasta que el conector personalizado admita el mismo intervalo de funcionalidades que OData.Feed.

Pasos siguientes

TripPin parte 2: conector de datos para un servicio REST