20 expresiones de Power Apps (Power Fx)

Marca la diferencia: apps más rápidas, limpias y fáciles de mantener
Power Fx tiene decenas de funciones y patrones que, bien usados, mejoran rendimiento, legibilidad y escalabilidad. [learn.microsoft.com], [learn.microsoft.com], [learn.microsoft.com]
En esta publicación te comparto 20 funciones que uso con frecuencia y cómo aplicarlas con impacto real (datos, performance, manejo de errores y JSON). [learn.microsoft.com], [learn.microsoft.com], [learn.microsoft.com]
🧠 Funciones para trabajar con datos (CRUD y operaciones masivas)
1) Patch() — crear/actualizar registros con precisión
Úsala para modificar o crear registros sin reemplazar todo el registro y con control sobre qué campos cambian.
Ejemplo (actualizar un campo): [learn.microsoft.com]
Patch( Clientes; { ID:1; Telefono:"1-212-555-1234"});;Ejemplo (crear registro con Defaults):
Patch( Clientes; Defaults(Clientes); { Nombre:"Ejemplo"; Telefono:"1-212-555-1234" });;2) ForAll() — ejecutar una fórmula para todos los registros de una tabla
Ideal para operaciones masivas (por ejemplo, crear/actualizar varios registros). Importante: puede procesar en paralelo y en cualquier orden, por eso conviene evitar dependencias de orden. [learn.microsoft.com], [learn.microsoft.com]
ForAll( Lista; Patch( Ordenes; Defaults(Ordenes); { Titulo: ThisRecord.Titulo }));;3) UpdateIf() — actualizar registros que cumplen una condición
Sirve para actualizar columnas específicas en múltiples registros que cumplan condiciones. Ten en cuenta consideraciones de delegación/limitaciones. [learn.microsoft.com], [learn.microsoft.com]
UpdateIf( Tareas; Estado="Abierto"; { Flag:true } );;4) RemoveIf() — eliminar registros que cumplan una condición
Útil para “limpieza” (archivar/eliminar) por criterio. También tiene consideraciones de soporte/limitaciones por origen de datos. [learn.microsoft.com], [learn.microsoft.com]
RemoveIf( Auditoria; Fecha< DateAdd(Today(); -30; Days);;🔎 Nota pro: Microsoft incluso publicó una mejora de “delegación simulada” para UpdateIf/RemoveIf para trabajar con más registros en grandes datasets (hasta 2,000 registros coincidentes por ejecución). [learn.microsoft.com], [learn.microsoft.com]
🧰 Funciones para simplificar fórmulas y mejorar performance
5) With() — variables locales (limpias) para dividir fórmulas complejas
Con With creas valores temporales (tipo “variables locales”) y haces fórmulas más legibles sin depender de variables globales o contextuales. [learn.microsoft.com], [learn.microsoft.com]
With(
{ Total: Sum(ItemsFactura; Cantidad*Precio) }; Total * 1.18
);;6) Concurrent() — cargar datos en paralelo (menos tiempo de espera)
Cuando tu app hace varias llamadas a conectores/Dataverse, Concurrent permite ejecutarlas en paralelo y reduce el tiempo total de carga (esperas el “más lento”, no la suma de todos). [learn.microsoft.com], [learn.microsoft.com]
Concurrent(
ClearCollect(listaPerfiles; Perfiles);
ClearCollect(listaUsuarios; Usuarios);
ClearCollect(listaAreas Areas)
);;✅ Reglas rápidas: dentro de Concurrent evita dependencias entre fórmulas (el orden no es predecible). [learn.microsoft.com]
🧱 Funciones para construir y moldear tablas (menos pasos, más claridad)
7) AddColumns() — agregar columnas calculadas (sin tocar el origen)
Agrega una columna calculada a una tabla/colección sin modificar el origen; devuelve una nueva tabla “enriquecida”. [learn.microsoft.com], [learn.microsoft.com]
AddColumns( Productos; "Total"; Cantidad * Precio );;8) ShowColumns() — quedarte con lo necesario (reduce payload en memoria)
Te permite “proyectar” columnas: excelente para performance y para que galerías/forms trabajen con lo mínimo. [learn.microsoft.com]
ShowColumns( Usuarios; "nombre"; "perfil" );;9) DropColumns() — eliminar columnas que sobran
Ideal para simplificar colecciones antes de exportar, enviar o mapear datos. [learn.microsoft.com]
DropColumns( ListaConMuchasColumnas; "Notas"; "Flag" );;🔎 Funciones para buscar, filtrar y recuperar registros (con delegación en mente)
10) Filter() — filtrar tablas por criterios
Devuelve una tabla con los registros que cumplan condiciones; cuando es posible, Power Apps delega filtro/orden al origen para rendimiento. [learn.microsoft.com], [learn.microsoft.com]
Filter( Tareas; Estado="Abierto" && Fecha <= Today() );;11) LookUp() — obtener el primer registro que cumple condición
Útil para traer un registro (por ejemplo, para detalles, validaciones o relaciones). [learn.microsoft.com], [learn.microsoft.com]
LookUp( Usuarios; ID= varIdUsuario);;12) StartsWith() — búsquedas “tipo autocompletar”
Excelente para búsquedas por prefijo (y en muchas fuentes es delegable). Devuelve boolean y se usa típicamente dentro de Filter. [learn.microsoft.com], [learn.microsoft.com]
Filter( Usuarios; StartsWith(Nombre; txtBusqueda.Text) );;🧺 Colecciones y utilidades (cuando sí conviene)
13) ClearCollect() — limpiar y recargar una colección en un solo paso
Combina Clear + Collect. Útil para caché local; ojo con delegación si lo usas contra orígenes grandes. [learn.microsoft.com], [learn.microsoft.com]
ClearCollect( listaOrdenesAprobadas, Filter(Ordenes, Estado="Aprobado") );;14) Sequence() — generar una tabla de números (para iteraciones “n veces”)
Genera una tabla de una columna (Value) y se usa mucho con ForAll para “hacer algo” una cantidad fija de veces. [learn.microsoft.com], [learn.microsoft.com]
ForAll( Sequence(10); Collect(NumerosAleatorios; Rand()) );;15) Index() — traer un registro por posición (1-based)
Devuelve el registro en la posición indicada (1 = primero). Útil para escenarios controlados (ej. galerías/colecciones pequeñas). No es delegable para orígenes grandes. [learn.microsoft.com], [learn.microsoft.com]
Index( Galeria.AllItems; 1 );;🛡️ Robustez y calidad: manejo de errores y validación
16) IfError() — fallback seguro ante errores (sin romper la app)
Permite capturar un error y devolver un valor alternativo o ejecutar una acción (por ejemplo, Notify). [learn.microsoft.com], [learn.microsoft.com]
IfError( 1/x; 0 );;17) IsBlank() — validar “sin valor” (incluye cadena vacía)
Verifica si algo está en blanco o vacío; muy útil para validaciones de entrada. [learn.microsoft.com], [learn.microsoft.com]
If( IsBlank(txtEmail.Text); Notify("Ingresa un correo"); SubmitForm(Formulario) );;18) IsBlankOrError() — validar vacío o error
Es clave cuando habilitas manejo de errores a nivel de fórmula o cuando una conversión puede fallar. [learn.microsoft.com], [learn.microsoft.com]
If( IsBlankOrError(Value(txtAmount.Text)); Notify("Monto inválido"); true )🧾 Formato y datos externos: Text y JSON
19) Text() — formatear números/fechas y convertir a texto
Convierte y formatea valores (números/fechas) con formatos predefinidos o personalizados; también sirve para convertir tipos a texto antes de concatenar. [learn.microsoft.com], [learn.microsoft.com]
Text( Now(); "dd-mmm-yyyy" );;20) ParseJSON() — interpretar JSON y convertir a tipos
Convierte un JSON válido en un valor Dynamic (o tipado si activas funciones experimentales). Es clave para integrar APIs y datos externos. [learn.microsoft.com], [learn.microsoft.com]
Set(registro; ParseJSON(jsonString));;
Set(varEnviado; Boolean(registro.Enviado));;
Set(varCantidad; Value(registro.Cantidad));;💡 Consejo: es buena práctica convertir explícitamente tipos (Text/Value/Boolean/DateValue) cuando trabajas con Dynamic. [learn.microsoft.com], [learn.microsoft.com]
✅ Casos de uso (rápidos y aplicables)
Caso A — OnStart más rápido con carga paralela
Problema: 3–5 llamadas seguidas hacen que la app demore “la suma” de tiempos.
Solución: Concurrent() para cargar catálogos/colecciones en paralelo. [learn.microsoft.com], [learn.microsoft.com]
Caso B — Menos “código espagueti” en fórmulas largas
Problema: fórmulas difíciles de leer y mantener.
Solución: With() para variables locales y subcálculos con nombres. [learn.microsoft.com], [learn.microsoft.com]
Caso C — Integración con APIs sin dolor
Problema: recibes JSON (HTTP/Custom Connector) y necesitas usarlo en la app.
Solución: ParseJSON() + conversiones explícitas (Value/Text/Boolean). [learn.microsoft.com], [learn.microsoft.com]
Caso D — Operaciones masivas y mantenimiento de datos
Problema: actualizar o limpiar muchos registros por condición.
Solución: UpdateIf() / RemoveIf() (con ojo al límite práctico) + patrones de optimización. [learn.microsoft.com], [learn.microsoft.com], [learn.microsoft.com]
🧾 Conclusiones y recomendaciones (para adoptar ya)
📌 Si quieres apps más “productivas” en menos tiempo, aplica estas 5 reglas:
- Optimiza carga con Concurrent cuando tengas llamadas independientes a conectores. [learn.microsoft.com], [learn.microsoft.com]
- Reduce complejidad usando With para “sub-fórmulas” y variables locales. [learn.microsoft.com], [learn.microsoft.com]
- Moldea tablas (AddColumns/ShowColumns/DropColumns) para evitar colecciones pesadas y pasos extra. [learn.microsoft.com], [learn.microsoft.com]
- Busca con delegación en mente: Filter + StartsWith suele ser un patrón eficiente para búsquedas. [learn.microsoft.com], [learn.microsoft.com]
- Robustez por defecto: valida y maneja errores con IfError e IsBlankOrError. [learn.microsoft.com], [learn.microsoft.com]
📚 Referencias oficiales
- Power Fx overview (por qué Power Fx y su enfoque): https://learn.microsoft.com/en-us/power-platform/power-fx/overview [learn.microsoft.com]
- Guía de optimización de código (With/Concurrent y performance): https://learn.microsoft.com/en-us/power-apps/guidance/coding-guidelines/code-optimization [learn.microsoft.com]
- Patch: https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-patch [learn.microsoft.com]
- ForAll: https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-forall [learn.microsoft.com]
- With: https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-with [learn.microsoft.com]
- Concurrent: https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-concurrent [learn.microsoft.com]
- Sequence: https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-sequence [learn.microsoft.com]
- Filter/Search/LookUp: https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-filter-lookup [learn.microsoft.com]
- Sort/SortByColumns: https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-sort [learn.microsoft.com]
- Clear/Collect/ClearCollect: https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-clear-collect-clearcollect [learn.microsoft.com]
- Update/UpdateIf: https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-update-updateif [learn.microsoft.com]
- Remove/RemoveIf: https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-remove-removeif [learn.microsoft.com]
- First/Index/Last: https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-first-last [learn.microsoft.com]
- StartsWith/EndsWith: https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-startswith [learn.microsoft.com]
- IfError/IsBlankOrError: https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-iferror [learn.microsoft.com]
- IsBlank/IsEmpty: https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-isblank-isempty [learn.microsoft.com]
- Text: https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-text [learn.microsoft.com]
- ParseJSON y JSON en Power Fx:
- https://learn.microsoft.com/en-us/power-platform/power-fx/reference/function-parsejson [learn.microsoft.com]
- https://learn.microsoft.com/en-us/power-platform/power-fx/working-with-json [learn.microsoft.com]

