01/02/2023
En el vasto universo de la creación de aplicaciones, Microsoft Power Fx emerge como un lenguaje innovador que simplifica la programación al adoptar un enfoque similar al de las hojas de cálculo. Si alguna vez te has preguntado cómo construir funcionalidades complejas, como una máquina de sumar que no solo calcule, sino que también mantenga un registro de sus operaciones, este artículo te guiará a través del proceso. Exploraremos los fundamentos de Power Fx, la gestión de variables y, lo más importante, cómo las colecciones pueden elevar tu aplicación a un nuevo nivel de interactividad y utilidad, permitiéndote registrar cada paso de tus cálculos.

A menudo, en otras herramientas de programación como Visual Basic o JavaScript, la primera pregunta que surge es: ¿dónde están las variables? Power Fx aborda este concepto de una manera ligeramente diferente, invitándote a pensar como lo harías en una hoja de cálculo. Mientras que en la programación tradicional se calcula explícitamente y se almacena el resultado en una variable, Power Fx y Excel recalculan automáticamente las fórmulas cuando los datos de entrada cambian. Este comportamiento inherente reduce drásticamente la necesidad de variables explícitas, facilitando la creación y el mantenimiento de aplicaciones. Sin embargo, hay escenarios específicos, especialmente en fórmulas de comportamiento (aquellas que se ejecutan al interactuar con un botón, por ejemplo), donde las variables se vuelven herramientas indispensables para lograr la experiencia deseada por el usuario.
El Paradigma Excel en Power Fx: Fórmulas y Recálculo Automático
Para entender mejor Power Fx, es útil compararlo con Excel. En una hoja de cálculo, una celda puede contener un valor o una fórmula que depende de otras celdas. Cuando los valores de entrada cambian, Excel recalcula automáticamente las fórmulas dependientes. Este comportamiento es fundamental y no requiere programación adicional más allá de la fórmula misma. Excel, en su esencia, no tiene variables en el sentido tradicional; el valor de una celda con una fórmula simplemente cambia en función de sus entradas, sin almacenar un resultado fijo que pueda ser recordado independientemente.
Power Fx replica esta lógica. En lugar de celdas, trabajamos con controles en una pantalla. Por ejemplo, en Power Apps, puedes replicar un sumador simple de Excel añadiendo dos controles de entrada de texto (TextInput1 y TextInput2) y un control de etiqueta (Label1). Si estableces la propiedad Text de Label1 a TextInput1.Text + TextInput2.Text, la etiqueta mostrará automáticamente la suma de los números introducidos. No hay necesidad de escribir código para manejar eventos de cambio; el motor de Power Fx se encarga del recálculo automático, manteniendo la aplicación sincronizada con las entradas del usuario.
Además de los valores principales, Power Fx permite usar fórmulas para determinar propiedades como el formato. Por ejemplo, una fórmula en la propiedad Color de una etiqueta podría mostrar valores negativos en rojo: If(Value(Label1.Text) < 0, Color.Red, Color.Black). Esta flexibilidad se extiende a una amplia gama de escenarios, desde mostrar la ubicación actual del GPS hasta actualizar automáticamente datos desde un origen externo como una lista de SharePoint, todo ello mediante fórmulas declarativas.
Ventajas del Enfoque Basado en Fórmulas
El uso de fórmulas para construir aplicaciones en Power Fx ofrece múltiples beneficios:
- Familiaridad: Si estás familiarizado con Excel, la curva de aprendizaje de Power Fx es significativamente más suave, ya que el lenguaje y el modelo de fórmulas son idénticos.
- Eficiencia: Lo que en otras herramientas de programación requeriría controladores de eventos y código redundante (por ejemplo, para cada cambio en una entrada de texto), en Power Fx se logra con una única fórmula concisa.
- Claridad: El origen de un valor es siempre evidente: la fórmula de su propiedad correspondiente. Esto elimina la ambigüedad y la dificultad de rastrear cambios que pueden ocurrir en programas tradicionales desde múltiples ubicaciones.
- Experimentación Segura: Puedes experimentar libremente con cambios en tu aplicación. Si un usuario introduce un valor y luego cambia de opinión, la aplicación se ajusta automáticamente sin efectos secundarios, tal como ocurre en Excel.
En general, siempre que sea posible, es recomendable utilizar fórmulas y dejar que el potente motor de Power Fx haga el trabajo por ti.
Cuándo Usar Variables: La Máquina de Sumar Acumulativa
Aunque las fórmulas son poderosas, hay casos en los que se necesita un comportamiento más dinámico, como el de una "máquina de sumar" antigua con un total acumulado. Imagina una aplicación donde un botón "Agregar" suma un número a un total corriente y un botón "Borrar" reinicia ese total a cero. Este escenario, que implica una secuencia de acciones del usuario y un estado que debe recordarse, no se puede lograr solo con fórmulas declarativas, ya que el valor depende del historial de interacciones. Aquí es donde entran en juego las variables.
La necesidad de variables surge para registrar y actualizar manualmente un estado que no se deriva directamente de las entradas actuales. Sin embargo, es crucial ser consciente de las implicaciones:
- El total acumulado debe actualizarse manualmente, el recálculo automático no lo hará.
- El total ya no se puede calcular solo a partir de los valores de otros controles; depende del historial de acciones del usuario.
- Los cambios en el total pueden originarse en diferentes acciones, lo que puede complicar la depuración si la aplicación no se comporta como se espera.
Variables Globales: La Solución Más Sencilla
Para construir nuestra máquina de sumar acumulativa, la forma más sencilla de manejar el total es con una variable global. Funcionan así:
- Se establecen con la función
Set. Por ejemplo,Set(MiVariable, 1). - Se usan simplemente referenciando su nombre.
- Pueden contener cualquier tipo de valor: números, cadenas, registros, tablas, etc.
Veamos cómo implementar la máquina de sumar con una variable global:
- Agrega un control de entrada de texto (
TextInput1) y dos botones (Button1yButton2). - Establece la propiedad
TextdeButton1en "Agregar" y deButton2en "Borrar". - Para el botón "Agregar", en su propiedad
OnSelect, usa la fórmula:Set(TotalAcumulado, TotalAcumulado + Value(TextInput1.Text)). La funciónValue()es importante aquí para asegurar que el texto se trate como un número. La existencia de esta fórmula declara implícitamenteTotalAcumuladocomo una variable global de tipo numérico. - Para el botón "Borrar", en su propiedad
OnSelect, usa:Set(TotalAcumulado, 0). - Agrega un control
Labely establece su propiedadTextenTotalAcumulado. Esta etiqueta se actualizará automáticamente mostrando el valor de la variable a medida que cambie.
Al iniciar la aplicación, TotalAcumulado tendrá un valor inicial en blanco. La primera vez que se selecciona "Agregar", se inicializa y comienza la suma. Puedes verificar el valor de las variables globales y dónde se usan desde el menú "Archivo" > "Variables" en Power Apps Studio.
Variables de Contexto: Alcance Limitado a la Pantalla
Power Fx también ofrece variables de contexto, ideales para pasar valores dentro de una sola pantalla o entre pantallas. A diferencia de las globales, su alcance está limitado al contexto de la pantalla donde se definen, lo que las hace útiles para estados temporales o específicos de una vista. Funcionan de la siguiente manera:
- Se establecen implícitamente con
UpdateContextoNavigate. - Se actualizan con registros, por ejemplo:
{ MiVariable: 1 }. - Su valor inicial es en blanco al iniciar la aplicación.
- Se pueden usar directamente por su nombre dentro de la pantalla.
- Pueden contener cualquier tipo de valor.
Reconstruyamos la máquina de sumar con una variable de contexto:
- Mantén
TextInput1,Button1("Agregar") yButton2("Borrar"). - Para el botón "Agregar", en su propiedad
OnSelect:UpdateContext({ TotalAcumulado: TotalAcumulado + Value(TextInput1.Text) }). - Para el botón "Borrar", en su propiedad
OnSelect:UpdateContext({ TotalAcumulado: 0 }). - El control
Labelque muestraTotalAcumuladosigue funcionando de la misma manera.
La función Navigate también permite establecer variables de contexto al moverse entre pantallas, actuando como un paso de parámetros. Por ejemplo, Navigate(Screen1, None, { TotalAcumulado: -1000 }). Las variables de contexto son excelentes para mantener la aplicación organizada, ya que su alcance limitado ayuda a evitar conflictos de nombres y efectos secundarios no deseados.
La Máquina de Sumar con Colecciones: Un Registro Histórico
Finalmente, llegamos a las colecciones, una herramienta poderosa que no solo permite acumular un total, sino también mantener un registro histórico de todos los valores introducidos. Una colección es esencialmente una tabla en memoria, lo que la convierte en un tipo de origen de datos modificable. Esta capacidad de almacenar múltiples registros la hace perfecta para nuestra máquina de sumar que "lleva un registro" de cada operación.
Así es como funcionan las colecciones:
- Para crear y establecer una colección, se usa la función
ClearCollect. Esto limpia la colección si ya existe y luego la rellena. - Para añadir nuevos elementos a una colección existente sin borrar los anteriores, se usa la función
Collect. - Una colección es una tabla, por lo que para acceder a un valor específico, a menudo se necesita una función como
First(si sabes que solo hay un registro, o para obtener el primer elemento) y luego referenciar un campo (ej:First(MiColeccion).Valor). - Pueden contener registros complejos, no solo valores simples.
- Pueden guardarse en el dispositivo local para persistencia usando
SaveData(y cargarse conLoadData).
Vamos a recrear nuestra máquina de sumar para que guarde un registro de cada número añadido:
- Mantén
TextInput1para la entrada de números. - Crea una colección para almacenar los números. Llamémosla
HistorialSumas. - Para el botón "Agregar" (
Button1), su propiedadOnSelectdebe hacer dos cosas:Collect(HistorialSumas, {Numero: Value(TextInput1.Text)});Set(TotalAcumuladoColeccion, Sum(HistorialSumas, Numero))
La primera línea añade un nuevo registro (con un campo llamadoNumero) a la colecciónHistorialSumascon el valor actual deTextInput1. La segunda línea calcula la suma de todos losNumeroen la colección y la guarda en una variable global (TotalAcumuladoColeccion) para mostrar el total actual. - Para el botón "Borrar" (
Button2), su propiedadOnSelectdebe limpiar la colección y resetear el total:ClearCollect(HistorialSumas, {});Set(TotalAcumuladoColeccion, 0)ClearCollect(HistorialSumas, {})limpia completamente la colección. - Agrega un control
Labely establece su propiedadTextenTotalAcumuladoColeccionpara mostrar el total acumulado. - Opcional pero recomendable: Para mostrar el historial de números añadidos, puedes insertar un control de Galería (por ejemplo, una galería de texto vertical) y establecer su propiedad
ItemsenHistorialSumas. Dentro de la plantilla de la galería, agrega un controlLabely establece su propiedadTextenThisItem.Numero. Esto mostrará cada número que se ha agregado a la colección, proporcionando un registro visual de la máquina de sumar.
Al usar una colección, no solo tienes el total, sino también el historial detallado de las operaciones. Esto es increíblemente útil para depurar, auditar o simplemente para que el usuario pueda ver qué números contribuyeron al total final.
Comparativa de Variables en Power Fx para una Máquina de Sumar
| Tipo de Variable | Alcance | Funciones para Establecer | Ventajas | Desventajas | Uso en Máquina de Sumar |
|---|---|---|---|---|---|
| Global | Aplicación completa | Set() | Fácil de usar, accesible desde cualquier pantalla. | Puede llevar a confusión si no se gestiona bien, valores se pierden al cerrar la app. | Ideal para un total simple que se muestra en varias pantallas. |
| Contexto | Una sola pantalla | UpdateContext(), Navigate() | Organiza el estado por pantalla, evita conflictos entre pantallas. | Limitado a una pantalla, valores se pierden al cerrar la app. | Perfecto para un total que solo se usa y muestra en una pantalla específica. |
| Colección | Aplicación completa | Collect(), ClearCollect() | Almacena tablas de datos, permite historial, persistencia local (SaveData). | Más compleja de manejar para un solo valor; el acceso a datos requiere funciones como Sum() o First(). | Permite un total acumulado con registro de operaciones. |
Preguntas Frecuentes sobre Variables y Colecciones en Power Fx
1. ¿Cuándo debo usar una variable global en lugar de una de contexto?
Usa una variable global cuando necesites que el valor sea accesible y modificable desde cualquier pantalla de tu aplicación. Si el valor solo es relevante para una pantalla específica o para pasar parámetros entre pantallas, una variable de contexto es más apropiada, ya que su alcance limitado ayuda a mantener la aplicación más organizada y menos propensa a errores.
2. ¿Puedo guardar los datos de una colección para que no se pierdan al cerrar la aplicación?
Sí, las colecciones pueden persistirse en el dispositivo local del usuario. Utiliza la función SaveData(MiColeccion, "NombreArchivo") para guardar la colección y LoadData(MiColeccion, "NombreArchivo", true) para cargarla al iniciar la aplicación. Ten en cuenta que esto guarda los datos localmente en el dispositivo del usuario, no en un servicio en la nube.
3. ¿Es posible tener una variable con diferentes tipos de datos?
No, una vez que una variable se establece implícitamente con un tipo de dato (por ejemplo, numérico con Set(X, 1)), no puedes reasignarle un valor de un tipo diferente (como Set(X, "Hola")). Esto causaría un error. Power Fx es un lenguaje fuertemente tipado en este sentido.
4. ¿Cómo puedo ver el valor actual de mis variables o el contenido de mis colecciones mientras desarrollo?
En Power Apps Studio, puedes ir al menú "Archivo" en la barra superior izquierda, luego seleccionar "Variables" en el panel de navegación izquierdo. Aquí verás una lista de todas tus variables globales y de contexto, así como tus colecciones, y podrás inspeccionar sus valores y ver dónde se utilizan en tu aplicación.
5. ¿Qué significa que las variables se crean "implícitamente"?
Significa que no hay una palabra clave como Dim o Var para "declarar" una variable antes de usarla. Simplemente al incluir el nombre de una variable en una función que le asigna un valor (Set, UpdateContext, Collect, etc.), Power Fx la crea y le asigna un tipo basado en el valor que le estás dando.
Conclusión
Power Fx ofrece un enfoque refrescante para el desarrollo de aplicaciones, combinando la simplicidad de una hoja de cálculo con la potencia de la programación. Aunque el recálculo automático es la piedra angular, la comprensión y el uso estratégico de variables (globales, de contexto) y, especialmente, las colecciones, son fundamentales para construir aplicaciones dinámicas e interactivas. Las colecciones, en particular, abren un mundo de posibilidades al permitirte no solo gestionar datos en tiempo real, sino también mantener un registro histórico de las interacciones del usuario, como hemos visto con nuestra máquina de sumar. Al dominar estas herramientas, podrás transformar tus ideas en soluciones funcionales y atractivas, aprovechando al máximo el potencial de Power Fx.
Si quieres conocer otros artículos parecidos a Creando una Máquina de Sumar con Colecciones en Power Fx puedes visitar la categoría Librerías.
