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”.
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:
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.
Y le damos a publicar en la parte inferior derecha:
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:
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”:
A continuación, nos solicita que le asignemos un nombre a la función de usuario:
Y se nos abre:
Hacemos clic sobre el icono de la pantalla y se nos abre la siguiente venta con el siguiente código:
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”:
Y la función es:
¡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:
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:
Hacemos clic para añadir una nueva conexión:
Y en la ventana que se nos abre, seleccionamos la base de datos SQL que acabamos de crear y hacemos clic sobre “Conectar”:
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”.
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:
Y esperamos a que termine el proceso y… listo:
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:
¿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”
A continuación, seleccionamos nuestra base de datos SQL:
Seleccionamos la tabla DimChannel y hacemos clic en “Cargar”:
Seleccionamos el modo de conexión, seleccionamos “Modo Import”
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.
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:
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:
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”:
Y seleccionamos “Función de datos” y se nos despliegan las siguientes opciones:
Á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:
Y rellenamos los campos con los segmentadores de texto que hemos creado en el lienzo:
Ahora, aunque no tiene nada que ver, es recomendable insertarle un texto al botón para saber qué es lo que realiza.
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:
Hacemos clic sobre el botón y se ejecuta la función:
Y se actualiza el modelo de manera automática:
Y nos devuelve el mensaje que hemos configurado en la función:
Y si visualizamos los datos de la tabla se nos ha actualizado el modelo e insertado los datos dentro del mismo:
¿Qué os parece? A mí me parece súper interesante y que trae muchas posibilidades en el mundo de Power BI.