La delegación en Power Apps ¿La tenemos clara?

Ú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.


Ejemplo sencillo: Yo tengo una entidad coche en mi CDS con 200 unidades de coche introducidas. En mi Powerapps solo quiero mostrar los coches que sean de color negro. Cuando delegamos, el CDS no nos devuelve 200 unidades y la aplicación nos filtra según condición, sino que el filtro se aplica directamente en el CDS y éste, solo nos devuelve los que necesitamos. Si hemos trabajado con bases de datos tradicionales, entenderemos que la app ejecuta una query directamente sobre el origen de los datos. pero...  atención!
La delegación también está ahí en queries simples, ¿habéis probado alguna vez de listar en una galería de Power Apps una fuente de datos delegable (SharePoint por ejemplo) con 2200 elementos? Sin filtros, todos:


El componente de galería de Power Apps gestiona los elementos devueltos al usuario: ¿de verdad necesita visualizar los 2300 elementos? Así que a medida que el usuario vaya haciendo scroll hacia abajo, Power Apps va a continuar con la paginación de elementos a SharePoint gracias a la delegación.

¿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!


La + nueva