💡 La importancia de la resiliencia en aplicaciones móviles

En el mundo empresarial actual, la movilidad es un requisito indispensable. Sin embargo, no siempre podemos garantizar una conexión a internet estable. Ya sea en almacenes subterráneos, zonas rurales o plantas industriales, las aplicaciones deben ser capaces de funcionar sin conexión. La sincronización de datos offline en Power Apps Canvas no es solo una característica técnica, es una estrategia de continuidad de negocio que garantiza que los trabajadores de campo sigan siendo productivos sin interrupciones.

Estrategias Principales para el Modo Desconectado

Existen dos enfoques principales para manejar datos sin conexión en Power Apps. La elección depende del origen de los datos y de la complejidad de la aplicación.

Funciones SaveData y LoadData (Enfoque Tradicional)

Este método es ideal para aplicaciones que utilizan conectores como SharePoint o SQL Server. Se basa en el almacenamiento de colecciones en la memoria caché local del dispositivo móvil.

  • SaveData: Almacena una colección en una ubicación con nombre en el dispositivo.
  • LoadData: Carga la colección almacenada de vuelta a la aplicación al reiniciarse.
  • Connection.Connected: Una propiedad booleana esencial para detectar si hay internet y decidir si enviar los datos al origen real o guardarlos localmente.
FórmulaDescripciónResultado
SaveData( LocalCache, «MyCache» )Guarde la colección LocalCache en el dispositivo del usuario con el nombre «MyCache», adecuado para LoadData recuperarlo más adelante.Los datos se guardan en el host de la aplicación con el nombre «MyCache».
LoadData( LocalCache, «MyCache» )Carga la colección LocalCache desde el dispositivo del usuario con el nombre «MyCache», almacenado previamente con una llamada a SaveData.Los datos se cargan desde el host de la aplicación con el nombre «MyCache».
ClearData( «MyCache» )Borra el almacenamiento con el nombre «MyCache». Los datos almacenados con este nombre ya no estarán disponibles a través LoadData.Los datos se quitan del host de la aplicación con el nombre «MyCache».
ClearData()Borre todo el almacenamiento asociado con esta aplicación. Los datos almacenados por otras aplicaciones no se ven afectados.Todos los datos se eliminan del host de la aplicación.

Modo Offline Nativo para Dataverse

Es la opción más robusta y moderna. Microsoft ha simplificado drásticamente el proceso para las aplicaciones que utilizan Dataverse como fuente de datos. En este modo, Power Apps se encarga automáticamente de la sincronización de tablas mediante perfiles de navegación fuera de línea.

Comparativa de Estrategias

CaracterísticaAlmacenamiento Local (SaveData)Origen de Datos en la Nube (Dataverse/SharePoint)
Disponibilidad OfflineSí, los datos residen 100% en el dispositivo.No, requiere conexión activa a internet.
PersistenciaTemporal/Local (se borra si se reinstala la app).Permanente y centralizada en servidores seguros.
Velocidad de LecturaInstantánea (sin latencia de red).Depende del ancho de banda y rendimiento de la API.
Capacidad de AlmacenamientoLimitada por el sistema operativo y el navegador.Prácticamente ilimitada (según licenciamiento).

Mejores Prácticas para una Sincronización Exitosa

  • Optimización de Datos: No intentes descargar miles de registros. Utiliza filtros para descargar solo lo que el usuario necesita para su jornada laboral.
  • Indicadores Visuales: Informa siempre al usuario sobre su estado de conexión y si hay datos pendientes de sincronizar mediante iconos de estado.
  • Manejo de Errores: Implementa lógica para capturar errores durante la sincronización (como duplicados o permisos) para evitar la pérdida de información.
  • Pruebas en Dispositivos Reales: El comportamiento del modo offline puede variar entre un navegador web y la aplicación móvil de Power Apps.

💻 Escenario Técnico: Flujo de Trabajo para Trabajar Sin Conexión

Para implementar una estrategia offline robusta, generalmente combinamos estas funciones con la propiedad Connection.Connected, la cual devuelve un valor booleano (true o false) que nos indica si el dispositivo tiene acceso a internet.

1. Guardar datos localmente al perder la conexión

Imagina que un usuario está completando un formulario de inspección. Si no hay internet, en lugar de usar Patch directo a la base de datos, guardamos el registro en una colección y luego en el dispositivo:

// Verificamos la conexión antes de enviar
If(
Connection.Connected,
// Si hay internet, guardamos directamente en la nube
Patch(InspeccionesNube, Defaults(InspeccionesNube), { Titulo: TextInput1.Text, Fecha: Today() }),
// Si NO hay internet, acumulamos en una colección y guardamos localmente
Collect(ColInspeccionesLocales, { Titulo: TextInput1.Text, Fecha: Today() });
SaveData(ColInspeccionesLocales, "MisInspeccionesLocales")
)

2. Recuperar y sincronizar los datos al iniciar la aplicación

Cuando el usuario vuelve a abrir la aplicación o recupera la conectividad, debemos cargar los datos guardados en caché y, si es posible, subirlos a la nube:

// En la propiedad OnStart de la aplicación
LoadData(ColInspeccionesLocales, "MisInspeccionesLocales", true);
// Si recuperamos conexión, subimos los datos pendientes
If(
Connection.Connected And CountRows(ColInspeccionesLocales) > 0,
ForAll(
ColInspeccionesLocales,
Patch(InspeccionesNube, Defaults(InspeccionesNube), { Titulo: ThisRecord.Titulo, Fecha: ThisRecord.Fecha })
);
// Limpiamos la colección y el archivo local tras la sincronización exitosa
Clear(ColInspeccionesLocales);
SaveData(ColInspeccionesLocales, "MisInspeccionesLocales")
)

✍️ Mini Ejercicio Práctico: Captura Offline con Colecciones

Sigue estos pasos para crear una estructura básica de guardado local:

  1. Detección de conexión: En la propiedad OnSelect de tu botón de guardado, utiliza la función Connection.
  2. Lógica de bifurcación:
 If(Connection.Connected,
    Patch(OrigenDeDatos, Defaults(OrigenDeDatos), {Campo: TextInput1.Text}),
    Collect(ColPendientes, {Campo: TextInput1.Text}); 
    SaveData(ColPendientes, "DatosLocales")
)
  1. Sincronización al volver: En la propiedad OnVisible de tu pantalla principal, carga los datos y, si hay conexión, envíalos:
LoadData(ColPendientes, "DatosLocales", true);
If(Connection.Connected && CountRows(ColPendientes) > 0,
ForAll(ColPendientes, Patch(OrigenDeDatos, Defaults(OrigenDeDatos), {Campo: ThisRecord.Campo}));
Clear(ColPendientes);
SaveData(ColPendientes, "DatosLocales")
)

💡 Usa el siguiente Sandbox para tus pruebas!

Power Fx Interactive Sandbox: Registros

Cargando el entorno interactivo de Power Fx…

📚 Fuentes

Deja una respuesta

¡Gracias por tu mensaje!

Me pondré en contacto tan rápido como pueda.

Descubre más desde Power Platform En Español

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Seguir leyendo