Últimamente he recibido algunas consultas sobre un famoso símbolo de atención que aparece muy frecuentemente cuando trabajamos sobre Power Apps y nos avisa "Advertencia de delegación. Es posible que la parte resaltada en la fórmula no funcione correctamente en largos conjuntos de datos". La delegación lleva de cabeza a muchos Power Users que crean sus aplicaciones lienzo y experimentan este aviso cuando implementan ciertas consultas y filtros sobre los datos, pero ¿Cuál es exactamente el problema con la delegación? ¿Debo preocuparme cuando Power Apps me indica un posible error por delegación? En esta corta entrada espero despejarte todas las dudas y arrojar un poco de luz al funcionamiento de Power Apps.
¿Qué es la delegación?
¿Qué significa delegación? Precisamente define la responsabilidad que asume la fuente de datos para ejecutar según qué consultas. La aplicación de lienzo "delega" algunas consultas sobre los datos directamente al origen de donde provienen esos datos para que éstos se transfieran a la aplicación ya transformados (filtrados, ordenados, etc.) y no tenga que ser la aplicación la responsable de procesar todos los datos que nos está devolviendo la fuente.
¿Qué beneficios obtenemos? Tiempo, y el tiempo es oro. Si la aplicación tiene que consumir memoria para procesar todos los elementos devueltos, tendremos un alto impacto en la performance de la aplicación. Para saber qué fuentes de datos se pueden delegar y cuáles son las funciones (queries predefinidas) que se pueden delegar para estas fuentes de datos, consulta la documentación oficial de Microsoft: https://docs.microsoft.com/es-es/powerapps/maker/canvas-apps/delegation-overview
¿En qué consiste la advertencia de delegación?
Trabajando desde SharePoint nos encontramos este error en fórmulas de filtrado de nuestros datos como pueden ser:
Filter (Datos, TextoABuscar In Columna)
Filter (Datos, Creador.Email = User().Email)
Normalmente en estos casos debajo de "In" y debajo de "=" nos saldrá la famosa raya azul y el símbolo de advertencia, pero ¿por qué? Porque Power Apps lanza la query de consulta a la fuente de datos y resulta que justo esa consulta, la fuente de datos nos informa que no es delegable: "Prueba de otro modo, pero justo de esta consulta, yo no me ocupo"; y entonces nuestro origen de datos nos devuelve de todos los elementos, los 500 primeros "Házte tú esa operación de datos, Power Apps".
¿Por qué 500?
Por que justo es el número de elementos indicado en la configuración ( y que podemos cambiar hasta 2000 elementos). Entonces Power Apps tiene que cargar con esos 500 elementos y filtrarlos (gastando memoria y tiempo del navegador o dispositivo móvil) por sí mismo.
¿Y qué sucede con los elementos que exceden ese límite? (elemento 501 o elemento 2001 si cambiamos la configuración?
Que se ignoran. El origen de datos solo nos devuelve ese límite, puesto que debemos entender que límites mayores podría causar una sobrecarga de la interfaz del usuario. "O utilizas una query delegada que yo pueda procesar, o solo te devuelvo hasta la ID num X).
Y en ese momento es cuando se nos queda una cara tal que así -> 😨
Importante tener en cuenta la documentación que he dicho antes: En cada fuente de datos que admite delegación, hay funciones que son delegables y otras que no, depende SIEMPRE del origen de los datos. Revisad la documentación de conectores para más info: https://docs.microsoft.com/es-es/connectors/
¿Qué debo hacer entonces cuando Power Apps me muestra una advertencia de delegación?
Cada caso es distinto, obviamente:
- Si tenemos muy claro que deberemos transformar los datos a lo largo de la aplicación, mi recomendación sería guardarlos en una colección ya filtrados para ser modificados y transformados (con el impacto de performance correspondiente). Pero ¡atención! Cuando guardamos datos de una en una colección, también estaremos impactados por el límite configurado (500, 2000), aunque la función de filtrado sea delegable, puesto que una colección no tiene opciones de paginación como una galería o una tabla; una galería y una tabla se "comunica" con Sharepoint para seguir obteniendo datos (como podéis ver en la imagen de aquí abajo).
Por lo que si queremos guardar en una colección más del límite configurado, deberemos (de algún modo) asegurarnos que nos traemos realmente toda la cantidad de elementos que necesitamos a esa colección (a través de cargas incrementales).
- La delegación viene condicionada por la fuente de datos, la función a utilizar y... ¡el campo! Un caso claro de SharePoint otra vez, donde en una columna compleja podría llevarnos por el camino de la desesperación.
- Pero mi recomendación es siempre buscar una alternativa, que muchas veces la hay. En los casos expuestos anteriormente, estas simples resoluciones evitarían la advertencia de delegación (en el caso de SharePoint) y podríamos seguir trabajando sin restricciones:
Filter (Datos, Columna = "TextoABuscar")
Set(UserEmail, User().Email);Filter (Datos, Creador.Email = UserEmail)
Pero por supuesto cada fuente de datos es distinta y habrá que buscar una alternativa en cada caso.
¿Habéis experimentado alguna consulta o transformación de datos que no se podía delegar? ¿Cuál fue vuestra solución? ¡Contadme!
0 Comentarios