La actualización de mayo del 2025 de Power BI vino cargada con grandes novedades que cada vez hacen que nuestra manera de trabajar con los datos vaya cambiando para bien y facilitándonos las cosas. Una de estas actualizaciones ha sido la de flujos de tareas translíticos. ¡Vaya nombre nos ha dado Microsoft!

¿Y qué son los flujos de tareas translíticos? En un lenguaje mundano, son flujos de tareas que nos van a permitir desde Power BI, ya sea desde el Deskop como desde el Service, insertar, editar, eliminar registros y realizar llamada a una API externa. Hasta la actualización de Mayo, si queríamos insertar datos en una base de datos desde Power BI, necesitábamos integrar una aplicación de Power Apps en nuestro informe, desarrollarla y mediante un flujo de datos con Power Automate actualizar el modelo semántico para que refrescase los datos, por ejemplo.

Bien, dicho esto, ¿qué tal si empezamos con los flujos? Vamos allá. Como aún se encuentran en versión preliminar pública, lo primero que debemos de tener son activadas las características de versión preliminar activadas tanto en Power BI y Fabric. Para ello, en Power BI Desktop, activamos las siguientes opciones:

 

  

Una vez activadas, reiniciamos el Desktop y listo, ya lo tenemos preparado. Ahora debemos preparar Fabric activando la opción preliminar “Funciones de datos de usuario”:

  

 

 

Hay que comentar que para poder hacer esto, necesitamos una licencia Fabric por capacidad y además se administradores del inquilino.

Una vez ya tenemos realizadas estas acciones, estamos preparados para comenzar a trabajar con los flujos de tareas translíticos. Lo primero que hacemos es crear un workspace de Fabric:

 

 

Y en la pantalla de creación del workspace asignamos el nombre, el modo de licenciamiento, debemos asignarle la “Capacidad Premium”:

  

Una vez creado el workspace con capacidad premium, el siguiente paso es crear la base de datos SQL. Antes de seguir, importante hay que indicar que, para poder crearla, nuestra capacidad tiene que estar alojada a fecha de hoy (17/06/2025) en alguna de estas regiones:

 

Una vez alojada nuestra capacidad en una región apta, hacemos clic en “Nuevo Elemento” y en el buscador escribimos por ejemplo “SQL” y a continuación en los resultados de la búsqueda, hacemos clic en “SQL Database”:

 

 

Esperamos unos segundos a que se nos cree la base de datos:

  

 

Una vez creada la base de datos, ahora tenemos que empezar a llenarla. ¿Cómo? Por ejemplo, con un flujo de datos Gen2. Hacemos clic en “Obtener Datos” y luego en “Nuevo flujo de datos Gen2”:

 

 

En el flujo de datos, creamos los parámetros de conexión a nuestro servidor, así como a nuestra base de datos:

 

 

A continuación, nos conectamos a nuestro origen de datos, en este caso, un SQL on-premise. Para ello, en “Obtener Datos” hacemos clic sobre “Base de datos de SQL Server”.

Interfaz de usuario gráfica, Aplicación, Word

El contenido generado por IA puede ser incorrecto.

Rellenamos los campos de servidor y base de datos con los parámetros creados en el paso anterior y automáticamente se nos rellena la puerta de enlace:

Interfaz de usuario gráfica, Texto, Aplicación

El contenido generado por IA puede ser incorrecto.

 

Hacemos clic en siguiente y vemos el contenido de nuestra base de datos on-premise. Ahora ya podemos seleccionar las tablas deseadas, para este ejemplo, solamente vamos a seleccionar una única tabla, la tabla DimChannel.

Tabla

El contenido generado por IA puede ser incorrecto.

Y le damos a publicar en la parte inferior derecha:

Interfaz de usuario gráfica, Aplicación

El contenido generado por IA puede ser incorrecto.

Si nos fijamos, tenemos el destino de datos que es la base de datos SQL que acabamos de crear en el workspace. Una vez publicado, se nos genera el dataflow Gen2 en el workspace:

Interfaz de usuario gráfica, Aplicación, Teams

El contenido generado por IA puede ser incorrecto.

 

Bien, ahora, una vez creado, ¿cómo insertamos datos en la base de datos? Para ello, Microsoft ha creado lo que denominan las funciones de datos de usuario (que las hemos habilitado en los pasos previos en la configuración del inquilino). Para ello hacemos clic en “Nuevo Elemento” y a continuación en “Funciones de datos de usuario”:

Interfaz de usuario gráfica, Texto, Aplicación

El contenido generado por IA puede ser incorrecto.

 

A continuación, nos solicita que le asignemos un nombre a la función de usuario:

Interfaz de usuario gráfica, Texto, Aplicación, Chat o mensaje de texto

El contenido generado por IA puede ser incorrecto. 

 

Y se nos abre:

Interfaz de usuario gráfica, Aplicación

El contenido generado por IA puede ser incorrecto.

Hacemos clic sobre el icono de la pantalla y se nos abre la siguiente venta con el siguiente código:

 

Interfaz de usuario gráfica, Texto, Aplicación

El contenido generado por IA puede ser incorrecto.

 

Lo primero que se me viene a la cabeza al ver esto es… ¿qué diablos es esto? ¿Cómo hago yo para insertar registros en mi tabla DimChannel?

No os preocupéis, Microsoft ha pensado eso por nosotros y nos ha creado un repositorio en Git con diferentes funciones para que las podamos reutilizar a nuestra conveniencia. Os dejo aquí el enlace:

Example User data functions for Translytical task flows · GitHub

 

Para el caso que nos concierne en este post, vamos a seleccionar la función “Add Annotation” de la categoría “Data Annotation”:

Texto

El contenido generado por IA puede ser incorrecto.

 

Y la función es:

Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico

El contenido generado por IA puede ser incorrecto.

 

¡Tranquilos! ¡Qué no cunda el pánico! Vamos a desgranarlo poco a poco para que lo entendamos y podamos modificarlo para nuestro ejemplo.

Lo primero que hacemos es copiar el código y nos lo llevamos a nuestro espacio de Fabric y la pegamos sobrescribiendo la función por defecto:

Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico

El contenido generado por IA puede ser incorrecto.

 

Ahora vamos a entrar en materia, vamos a ir poco a poco desgranando el código para entenderlo y modificarlo a nuestra necesidad.

 

# Importamos la librería 'fabric.functions', que contiene funciones necesarias para trabajar con Fabric y SQL

import fabric.functions as fn

 

# Importamos el módulo de logging para registrar información en el log

import logging

 

# Creamos una instancia de funciones personalizadas para usar UDFs

udf = fn.UserDataFunctions()

 

# Decorador que define la conexión a la base de datos con el alias "Flujos"

@udf.connection(argName="sqlDB", alias="Flujos")

 

# Decorador que declara esta función como una función personalizada (UDF) en Fabric

@udf.function()

def AddAnnotation(sqlDB: fn.FabricSqlConnection, ChannelKey: str, ChannelLabel: str, ChannelName: str, ChannelDescription: str) -> str:

   

    # Log de que la función fue llamada

    logging.info('Python UDF trigger function processed a request.')

 

    # Agrupamos los valores recibidos por parámetro en una tupla

    data = (ChannelKey, ChannelLabel, ChannelName, ChannelDescription)

 

    # Nos conectamos a la base de datos usando la conexión proporcionada

    connection = sqlDB.connect()

    cursor = connection.cursor()    

 

    # Registramos en el log que estamos insertando datos

    logging.info("Añadiendo los datos a DimChannel ... ")

   

    # Definimos la consulta SQL para insertar los datos en la tabla DimChannel

    insert_query = "INSERT INTO [dbo].[DimChannel] ([ChannelKey], [ChannelLabel],[ChannelName],[ChannelDescription]) VALUES (?, ?, ?, ?);"

   

    # Ejecutamos la consulta con los datos

    cursor.execute(insert_query, data)

   

    # Log de confirmación

    logging.info("Los datos se han añadido correctamente")

 

    # Confirmamos los cambios en la base de datos

    connection.commit()

 

    # Cerramos el cursor y la conexión

    cursor.close()

    connection.close()              

   

    # Devolvemos un mensaje de éxito

    return "ChannelKey, ChannelLabel, ChannelName and ChannelDescription se han registrado correctamente"

 

Importante del código anterior:

# Decorador que define la conexión a la base de datos con el alias "Flujos"

@udf.connection(argName="sqlDB", alias="Flujos")

 

En el paso anterior, definimos el alias y colocamos el alias de la base de datos SQL que hemos creado.

# Decorador que declara esta función como una función personalizada (UDF) en Fabric

@udf.function()

def AddAnnotation(sqlDB: fn.FabricSqlConnection, ChannelKey: str, ChannelLabel: str, ChannelName: str, ChannelDescription: str) -> str:

 

En el paso anterior, definimos todas y cada unas de las columnas a las que vamos a hacer referencia.

    # Agrupamos los valores recibidos por parámetro en una tupla

    data = (ChannelKey, ChannelLabel, ChannelName, ChannelDescription)

 

En el paso anterior, agrupamos todos los valores que vamos a insertar por parámetro en una tupla.

A continuación, definimos la consulta SQL para insertar los datos en la tabla de la base de datos SQL. Importante que hay tantas ? en el apartado VALUES como columnas a insertar.

    # Definimos la consulta SQL para insertar los datos en la tabla DimChannel

    insert_query = "INSERT INTO [dbo].[DimChannel] ([ChannelKey], [ChannelLabel],[ChannelName],[ChannelDescription]) VALUES (?, ?, ?, ? );"

 

Ya tenemos nuestra función definida, ¿qué nos queda por hacer? Definirle la conexión, para ello, hacemos clic en “labels.manageConnection” de la parte superior:

Interfaz de usuario gráfica, Texto, Aplicación

El contenido generado por IA puede ser incorrecto.


Hacemos clic para añadir una nueva conexión:

Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico

El contenido generado por IA puede ser incorrecto.

Y en la ventana que se nos abre, seleccionamos la base de datos SQL que acabamos de crear y hacemos clic sobre “Conectar”:

Interfaz de usuario gráfica

El contenido generado por IA puede ser incorrecto.

 

Ahora ya sí, estamos casi listos para desplegar la solución, sólo falta publicar la función para que se pueda ejecutar. Para ello hacemos clic sobre “labels.publish” y esperamos a que se publique:

 

 

Como todo en esta vida, antes de poner las cosas en producción debemos testear que funcionan correctamente si no queremos tener llamadas que nos generen pequeños o grandes infartos… ¿Cómo lo testeamos?  Nos posicionamos sobre la función que acabamos de crear y nos aparece un icono de “Play”.

Interfaz de usuario gráfica, Aplicación

El contenido generado por IA puede ser incorrecto.

Y en la parte derecha se nos abre la siguiente ventana, en la que podemos ver los parámetros que hemos generado para insertar en la base de datos. Los rellenamos y hacemos clic sobre el botón Run:

Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico

El contenido generado por IA puede ser incorrecto.

Y esperamos a que termine el proceso y… listo:

Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico

El contenido generado por IA puede ser incorrecto.

Nos dice que la función se ha ejecutado correctamente. Vamos a comprobarlo, para ello, vamos a nuestra base de datos Flujos, y realizamos la consulta sobre la tabla DimChannel y vemos que efectivamente nos ha insertado los datos:

 

Interfaz de usuario gráfica, Aplicación, Tabla

El contenido generado por IA puede ser incorrecto.

 

¿Qué os parece? A mí, todo un avance. Pero… ¿hay que hacerlo desde el servicio la inserción de datos? La respuesta es NO, también la podemos hacer desde el Desktop. ¿Cómo? Vamos a verlo.

Lo primero que hacemos es abrir un informe, hacemos clic sobre “Catálogo de  OneLake” y a continuación sobre “SQL Database”

Interfaz de usuario gráfica, Aplicación, Word

El contenido generado por IA puede ser incorrecto. 

 

A continuación, seleccionamos nuestra base de datos SQL:

Interfaz de usuario gráfica, Texto, Aplicación

El contenido generado por IA puede ser incorrecto. 

 

Seleccionamos la tabla DimChannel y hacemos clic en “Cargar”:

Interfaz de usuario gráfica, Aplicación, Tabla

El contenido generado por IA puede ser incorrecto.

 

Seleccionamos el modo de conexión, seleccionamos “Modo Import”

Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico

El contenido generado por IA puede ser incorrecto.

 

Y ya tenemos nuestra tabla en nuestro informe. Ahora lo que nos queda por hacer es crear una acción que nos ejecute la función de insertar datos. ¿Cómo lo hacemos? Bien, lo primero que vamos a realizar es crear una tabla en el informe para visualizar los datos.

Tabla

El contenido generado por IA puede ser incorrecto.

 

A continuación, sacamos al lienzo 4 segmentadores de texto, uno por cada columna que queremos añadir, y le asignamos el título a cada uno con el fin de tenerlo ordenado y documentado:

Interfaz de usuario gráfica

El contenido generado por IA puede ser incorrecto.

 

Una vez hecho esto, el siguiente paso es sacar al lienzo un botón que será el encargado de lanzar la función para la insertar los datos en nuestra base de datos.

Una vez tengamos el botón en el lienzo:

Interfaz de usuario gráfica, Aplicación, Tabla

El contenido generado por IA puede ser incorrecto.

Una vez en el lienzo el botón, seleccionamos el botón y en la propiedades del botón, hacemos clic en la parte de “Acciones”:

Interfaz de usuario gráfica, Aplicación

El contenido generado por IA puede ser incorrecto.

Y seleccionamos “Función de datos” y se nos despliegan las siguientes opciones:

Interfaz de usuario gráfica, Aplicación

El contenido generado por IA puede ser incorrecto.

Área de trabajo: aquí seleccionamos el workspace donde tenemos el modelo semántico y las funciones creadas.

Conjunto de funciones: aquí seleccionamos la función que hemos creado y que vamos a usar.

Función de datos: Aquí seleccionamos la parte de la función que queremos utilizar.

Y una vez rellenados los campos, se nos despliegan los campos que tenemos para insertar:

Interfaz de usuario gráfica, Aplicación

El contenido generado por IA puede ser incorrecto. 

Y rellenamos los campos con los segmentadores de texto que hemos creado en el lienzo:

Interfaz de usuario gráfica, Aplicación

El contenido generado por IA puede ser incorrecto.

 

Ahora, aunque no tiene nada que ver, es recomendable insertarle un texto al botón para saber qué es lo que realiza.

Interfaz de usuario gráfica

El contenido generado por IA puede ser incorrecto.

Y ahora ya podemos probar si realmente todo esto que hemos hecho, funciona realmente.

Rellenamos los campos con los datos que queremos insertar y se nos habilita el botón:

Interfaz de usuario gráfica

El contenido generado por IA puede ser incorrecto.

Hacemos clic sobre el botón y se ejecuta la función:

Interfaz de usuario gráfica

El contenido generado por IA puede ser incorrecto.

Y se actualiza el modelo de manera automática:

Interfaz de usuario gráfica

El contenido generado por IA puede ser incorrecto.

 

Y nos devuelve el mensaje que hemos configurado en la función:

Interfaz de usuario gráfica, Texto, Aplicación, Correo electrónico

El contenido generado por IA puede ser incorrecto.

 

Y si visualizamos los datos de la tabla se nos ha actualizado el modelo e insertado los datos dentro del mismo:

Tabla

El contenido generado por IA puede ser incorrecto. 

¿Qué os parece? A mí me parece súper interesante y que trae muchas posibilidades en el mundo de Power BI.