Boucler sur plus de 5000 lignes avec Flow

En fonction du niveau de licence sur Power Automate, les quotas et limites varient. J’ai récemment rencontrer l’une d’elle sur les boucles ‘Apply to each’ :

Pour charger un charger un fichier Excel volumineux (~50 000 lignes) dans une table SharePoint, j’ai créé un flow qui lis les lignes du fichier via le connecteur Excel, puis insère chaque ligne une à une dans une boucle.

Au moment d’exécuter le flow, j’obtiens cette erreur :

En me référant à la documentation, je comprends qu’avec les licences gratuite, trial ou plan per app, le nombre d’itération sur une boucle est de 5000 (100000 pour les autres licences).

Etant contraint à utiliser une licence standard, j’ai implémenté le workaround suivant pour contourner cette limitation: le flow récupère les lignes par lot de 4999 maximum afin de ne jamais itérer sur plus de 5000 lignes.

Workaround

Ne sachant pas à l’avance le nombre de ligne dans le fichier, j’utilise une boucle ‘Do Until‘ avec la condition d’arrêt suivante :

  • Si le lot contient 4999 lignes, on continue et répète le processus avec les 4999 lignes suivantes
  • Si non, cela signifie qu’on a atteint la fin du fichier : on s’arrête.

Implémentation

Pour l’implémentation, j’ai besoin définir 2 variables:

  • Skip – Integer – 0 par défaut: définie le nombre de ligne à ‘sauter’ dans le fichier
  • Continue – Boolean – Vrai par défaut : indique si la boucle doit continuer (vrai) ou s’arrêter (faux)

Boucle Do Until

Ensuite on paramètre la boucle :

  • On boucle tant que la variable ‘Continue‘ est à Vrai.
  • On configure le nombre d’itération maximum à 5000 (ou plus) pour éviter qu’elle ne s’arrête avant la fin du lot

Traitement du lot

Maintenant que la boucle est en place, il reste à récupérer les lignes par lot de 4999 au lieu de toutes d’un coup. Dans ce cas, j’utilise le connecteur Excel, cela peut être applicable à d’autres.

2 champs sont importants :

  • Top Count – Il définit le nombre de ligne à renvoyer en résultat, ce qui revient à la taille du batch que l’on veut. Ici : 4999.
  • Skip Count – Il permet d’indiquer le nombre de ligne à ‘sauter’. On utilise ici la variable Skip créée précédemment.

A la première itération, la valeur sera à 0, donc on lira les lignes 1 à 4999. Puis, elle sera incrémentée de 4999, on lira donc les lignes 5000 à 9999, et ainsi de suite. L’incrémentation est expliquée plus bas.

Une fois le lot récupéré, il ne reste plus qu’à appliquer votre traitement sur celui-ci, selon vos besoins.

Condition d'arrêt

A la fin de la boucle, on se base sur le nombre de ligne récupérer sur ce batch pour déterminer si on atteint la fin du fichier au nom avec l’expression : 

length(outputs('List_rows_present_in_a_table')?['body/value']) 
  • Si elle est égale à 4999 (la taille de nombre lot), on continue avec le lot suivant. On incrémente la variable Skip de 4999 pour s’assurer qu’on ne relie pas les mêmes lignes.
  • Si non, on définit la variable Continue à faux. La condition de la boucle ne sera plus réalisée et s’arrêtera.

Vous obtenez donc un flow qui est capable de traiter plus de 5000 lignes en boucles pour les licences standards.

Je rappelle que cette implémentation peut être bien utile dans certains cam mais est à utiliser avec précautions car elle rallonge la durée d’exécution et augmente le nombre d’action qui est également limitée!

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *