Y si ahora, en un panel de Power Bi, no tuviéramos que conformarnos solo con ver los datos sino que también pudiéramos, editarlos, actualizarlos y demás?
En este artículo trataré de explicar cómo lograr algo que ya se hacia configurando procesos de automatización e integrando otras herramientas y que ahora parece ser más fácil gracias a los los flujos de tareas translíticos (versión preliminar) lanzados en la actualización de Power Bi del mes de Mayo de 2025.
Los flujos de tareas translíticos son una nueva funcionalidad en Power BI + Fabric (actualmente en public preview), que permiten a los usuarios realizar acciones de escritura directamente desde los informes: agregar, editar o eliminar datos, o bien invocar APIs externas, todo sin salir de la interfaz. Encuentra Aquí mas información.
Estos flujos se basan en las Fabric User Data Functions, que conectan elementos visuales del reporte (botones, slicers) con acciones backend, por ejemplo, actualización de registros en una base SQL, disparo de notificaciones, o consultas a APIs.
Hay una gran cantidad de casos de uso donde podríamos utilizar esta nueva función, se me ocurre por ejemplo para hacer presupuestos financieros, verificar la disponibilidad de recursos, entre otros muchos, les presento un par más pero en este repositorio de GitHub encontrarán más ejemplos:
Ejemplo 1: Descuentos bajo aprobación
Es uno de los ejemplos que nos propone Microsoft el artículo donde presentan los flujos; un usuario propone un descuento en un reporte; al hacer clic en “Request discount”, se envía a Teams para aprobación, y si se aprueba, el informe se actualiza con el nuevo valor
Ejemplo 2: Gestión de disponibilidad de técnicos o personal operativo (clínicas, talleres, etc.)
Desde un informe en Power BI que muestra los turnos o disponibilidad de personal (médicos, técnicos, operarios…), un coordinador puede modificar en tiempo real el estado de un recurso: Marcarlo como «Disponible», «De baja», o «En visita externa». El cambio actualiza la tabla SQL correspondiente.
Inmediatamente, los demás visuales (calendario, planificación, tiempos de espera) se refrescan.
Valor agregado: Sin abrir un sistema externo ni cambiar de interfaz, se puede actualizar la disponibilidad directamente desde el reporte, ayudando a los equipos operativos a actuar con mayor agilidad.
Lo que hace posible todo este flujo es la integración nativa entre Power BI y Microsoft Fabric mediante funciones de datos de usuario (User Data Functions o UDFs). Estas funciones se escriben en Python y se alojan en Fabric, donde pueden conectarse a bases de datos SQL, Lakehouse o incluso invocar APIs externas. Cuando el usuario en Power BI interactúa con un botón o control (por ejemplo, para guardar un nuevo dato o modificar un registro), Power BI no realiza directamente la acción en la base de datos, sino que invoca esa UDF alojada en Fabric pasando los parámetros definidos por el usuario.
La función, entonces, se conecta de forma segura al origen de datos y ejecuta la lógica definida: actualizar, insertar, eliminar, llamar a una API, etc. El resultado se devuelve a Power BI, que refresca el informe para reflejar los cambios en tiempo real. Así, se establece un puente directo entre la capa visual de Power BI y la capa transaccional de los datos, sin necesidad de aplicaciones intermedias, sin Power Apps, ni infraestructura adicional.
Este es un Ejemplo que he construido de una función de usuario:
import fabric.functions as fn
udf = fn.UserDataFunctions()
@udf.connection(argName="sqlDB", alias="DeudaRlombanaBl")
@udf.function()
def actualizar_estado_deuda(sqlDB: fn.FabricSqlConnection, idcliente: int, nuevoestado: str) -> str:
# Validar que el estado es uno de los tres permitidos
estados_validos = ["Vencida", "Saldada", "Sin Vencer"]
if nuevoestado not in estados_validos:
raise fn.UserThrownError("Estado inválido. Usa: Vencida, Saldada o Sin Vencer.", {"Estado ingresado": nuevoestado})
connection = sqlDB.connect()
cursor = connection.cursor()
# Actualizar el campo estado
update_query = """
UPDATE deuda_clientes
SET estado = ?
WHERE id_cliente = ?
"""
cursor.execute(update_query, (nuevoestado, idcliente))
connection.commit()
cursor.close()
connection.close()
return f"Estado de cliente {idcliente} actualizado a '{nuevoestado}'"
Componentes Principales
Aunque los flujos de tareas translíticos abren una puerta poderosa hacia la interacción directa con los datos, también introducen un nuevo nivel de riesgo: ahora no solo se consultan datos desde el informe, sino que también se modifican en tiempo real desde la misma interfaz. Esto implica que, sin una adecuada gobernanza, validaciones y control de permisos, se corre el riesgo de introducir errores en la fuente de datos, afectar procesos críticos o comprometer la integridad de los sistemas conectados. Por tanto, aunque las ventajas en agilidad, automatización y usabilidad son claras, el valor real de esta funcionalidad solo se alcanza si se implementa con un enfoque responsable, gobernado y auditable.
Rodrigo Lombana Reina