Hola a todos!
Uno de los principales problemas cuando trabajamos con listas de SharePoint (u otro origen de datos) desde Power Apps es la delegación.
Cuando una fórmula no puede delegarse, Power Apps no procesa todos los registros de la lista, sino únicamente los primeros 500 registros o, como máximo, 2.000 registros si modificamos el límite de filas de datos de la aplicación.
Esto puede provocar que una búsqueda, un filtro o cualquier cálculo realizado sobre la lista devuelva resultados incompletos.
En este post vamos a crear una solución que nos permitirá cargar en una colección de Power Apps todos los registros de una lista de SharePoint, aunque contenga varios miles de elementos.
Para conseguirlo utilizaremos:
- Una columna auxiliar en SharePoint.
- Un flujo de Power Automate para asignar automáticamente un número de bloque a cada registro.
- Las funciones
Sequence,ForAll,FilteryCollecten Power Apps. - Una colección local que contendrá todos los registros de la lista.
Imaginemos que tenemos una lista de SharePoint con 7.600 registros y queremos cargarla completa en una colección:
ClearCollect(
miColeccion;
ALTIORA_CLIMA_COMENTARIOS
)
Aunque la fórmula es válida, Power Apps no cargará necesariamente los 7.600 registros. La colección estará limitada por el número máximo de filas configurado en la aplicación.
Por tanto, necesitamos dividir la lista en grupos de menos de 2.000 registros y cargar cada grupo mediante una consulta independiente. Es decir, crear bloques.
Para poder hacerlo, lo primero será crear una columna nueva en la lista de SharePoint a la que voy a denominar: BLOQUECARGA que será numérica:
En el ejemplo, he creado una lista de 6.280 registros con información de los comentarios de una encuesta inventada sobre clima laboral.

Para evitar tener que completar esta columna manualmente, crearemos un flujo de Power Automate, que va a ser el encargado de generar los bloques, en este caso cada 1.900 registros.

Es decir, la expresión que está en BLOQUECARGA:
add(div(sub(item()?['ID'],1),1900),1)
Genera esto:
Los ID del 1 al 1.900 reciben el bloque 1.
Los ID del 1.901 al 3.800 reciben el bloque 2.
Los ID del 3.801 al 5.700 reciben el bloque 3.
Y así sucesivamente.
Una vez que ejecutamos el flujo, el campo ya aparece con la información necesaria y la lista ya se podría subir completa a una colección en Power Apps y, por lo tanto, evitar problemas de delegación.

Pero, cómo generamos esa colección?
Pues bien, hay varias formas. Aunque mi preferida es esta: En Power App, en el evento OnStart
With(
{
NumeroBloques:
RoundUp(
First(
SortByColumns(
ALTIORA_CLIMA_COMENTARIOS;
"ID";
SortOrder.Descending
)
).ID / 1900;
0
)
};
Clear(miColeccion);;
ForAll(
Sequence(NumeroBloques) As Bloque;
Collect(
miColeccion;
Filter(
ALTIORA_CLIMA_COMENTARIOS;
BLOQUECARGA = Bloque.Value
)
)
);;
Notify(
"Carga completada: " &
CountRows(miColeccion) &
" registros";
NotificationType.Success
)
)
La fórmula calcula automáticamente cuántos bloques de 1.900 registros necesita, vacía la colección y genera los números de bloque. Después consulta cada bloque de SharePoint y añade todos sus registros a una única colección. Finalmente, muestra cuántos elementos se han cargado.
El resultado lo podéis ver aquí:

Fijaros en el número de filas que tiene la colección miColección: 6.280.
Luego esta técnica se puede adaptar de muchas formas y con necesidades específicas. Por ejemplo si queréis subir una tabla directamente a SharePoint, podréis calcular previamente este campo en excel con esta fórmula:
=ENTERO((FILA(A2)-1)/1900)+1
y creará en la tabla o en la hoja el bloque de números necesario para crear la colección luego en Power Apps.
Obviamente, también podremos crear otros flujos automáticos o que se generen al crear un registro en una lista de SharePoint, pero eso es al gusto de la solución que necesitéis.
Espero haberos ayudado 🙂

