Power Apps
Les 5 erreurs de délégation qui tuent votre Power App
Les erreurs de délégation cassent silencieusement les Power Apps à grande échelle. Découvrez les 5 erreurs les plus courantes et les solutions éprouvées pour les corriger.
La délégation est le concept le plus mal compris dans Power Apps. Votre application fonctionne parfaitement avec 50 enregistrements de test, passe l'UAT, est mise en production, puis retourne silencieusement des données incomplètes quand la table dépasse 501 lignes. Pas d'erreur. Pas d'avertissement. Juste des résultats faux.
Voici les cinq erreurs de délégation qui provoquent cela, et comment les corriger.
1. Utiliser Search() au lieu de Filter() avec StartsWith
Search() n'est jamais délégable à Dataverse ou SharePoint. La fonction semble pratique, mais elle charge l'intégralité de la table côté client avant de filtrer. Pour une table de 10 000 enregistrements, cela signifie charger les 10 000 lignes via le réseau, puis filtrer dans le navigateur.
Le pattern cassé :
Search(Accounts, TextInput1.Text, "name")
Cela plafonne à la limite de délégation (500 par défaut, 2 000 maximum) et ignore silencieusement tout ce qui est au-delà.
La solution :
Filter(
Accounts,
StartsWith(Name, TextInput1.Text)
)
StartsWith est délégable à Dataverse. Si vous avez besoin d'une recherche "contains", vous avez deux options :
- Dataverse Search via le connecteur
Search(retourne des résultats classés par pertinence, supporte la recherche floue) - Collecter dans une collection locale au démarrage de l'application si le jeu de données est suffisamment petit (moins de 2 000 enregistrements)
// On App.OnStart — only for small reference tables
ClearCollect(
colAccounts,
Accounts
);
// Then use Search on the local collection
Search(colAccounts, TextInput1.Text, "name")
2. CountRows() sur des grandes tables
CountRows() n'est pas délégable. Cela signifie que la formule suivante ne compte que les 500 (ou 2 000) premiers enregistrements, puis s'arrête :
// Returns 500, not the actual count
CountRows(Filter(Orders, Status = "Pending"))
C'est dangereux car le nombre semble correct jusqu'à ce que le jeu de données dépasse le seuil. Les dashboards, KPI et compteurs d'approbation affichent tous le mauvais nombre.
La solution : utilisez des fonctions d'agrégation ou des vues.
Pour Dataverse, utilisez le pattern CountIf avec une vue pré-filtrée, ou appelez un flux Power Automate qui utilise l'agrégation FetchXML :
// Delegable alternative: use a Dataverse view
CountRows(
Filter(
Accounts,
'Account Status' = 'Account Status (Accounts)'.Active
)
)
Mieux encore, pour des comptages réels à grande échelle, créez un flux Power Automate avec une requête FetchXML d'agrégation et appelez-le depuis votre application :
<fetch aggregate="true">
<entity name="salesorder">
<attribute name="salesorderid" alias="count" aggregate="count"/>
<filter>
<condition attribute="statuscode" operator="eq" value="1"/>
</filter>
</entity>
</fetch>
3. Enchaîner des fonctions non délégables dans Filter()
Chaque fonction à l'intérieur de Filter() doit être indépendamment délégable. Une seule fonction non délégable casse l'expression entière.
Le pattern cassé :
Filter(
Projects,
Status = "Active",
Year(CreatedOn) = 2026, // NOT delegable
User().Email = AssignedTo.Email // NOT delegable
)
Year(), Month(), Day(), Hour() ne sont pas délégables. User() non plus dans un contexte de délégation.
La solution : restructurez les comparaisons pour utiliser des opérateurs délégables.
Filter(
Projects,
Status = "Active",
CreatedOn >= Date(2026, 1, 1),
CreatedOn < Date(2027, 1, 1),
AssignedTo.Email = varCurrentUserEmail
)
Stockez User().Email dans une variable au démarrage de l'application :
// App.OnStart
Set(varCurrentUserEmail, User().Email);
Puis référencez la variable dans Filter(). Les comparaisons de variables sont délégables ; les appels de fonctions ne le sont pas.
4. Ignorer le paramètre de limite de délégation
La limite de délégation par défaut est de 500 lignes. Beaucoup de développeurs ne la changent jamais. Le maximum est de 2 000 lignes. Aucun de ces deux nombres n'est suffisant pour les données de production.
Où la changer : Settings > General > Data row limit for non-delegable queries.
Mettez-la à 2 000 immédiatement. Mais comprenez bien : 2 000 reste un plafond strict. Cela ne résout pas la délégation. Cela ne fait que repousser le moment où le même bug réapparaîtra.
La vraie solution est d'éliminer complètement les patterns non délégables. Utilisez l'augmentation de la limite de délégation comme filet de sécurité, pas comme solution.
Checklist :
- Mettez la limite de délégation à 2 000 dans chaque application
- Activez les avertissements de délégation au niveau des formules dans les paramètres
- Recherchez dans l'ensemble de votre application le triangle jaune de délégation
- Pour chaque avertissement, refactorisez vers des fonctions délégables ou documentez explicitement pourquoi la limite est acceptable (par exemple, une table de référence avec 200 lignes)
5. Utiliser LookUp() avec des conditions complexes
LookUp() lui-même est délégable, mais les développeurs y insèrent souvent des fonctions non délégables :
// Non-delegable: Text() is not delegable
LookUp(
Invoices,
Text(InvoiceNumber, "INV-0000") = TextInput1.Text
)
La solution : gardez les conditions de LookUp simples et délégables.
LookUp(
Invoices,
InvoiceNumber = Value(TextInput1.Text)
)
Si vous avez besoin d'un formatage de texte pour l'affichage, faites-le après le lookup, pas dans la condition de filtre :
Set(
varInvoice,
LookUp(Invoices, InvoiceNumber = Value(TextInput1.Text))
);
// Format for display separately
Set(
varInvoiceDisplay,
Text(varInvoice.InvoiceNumber, "INV-0000")
);
Le workflow de débogage de la délégation
Quand une application se comporte mal avec de grands jeux de données, suivez cette séquence :
- Ouvrez Monitor (Advanced Tools > Monitor) et observez les appels Dataverse
- Filtrez Monitor par "getRows" pour voir combien de lignes chaque requête retourne
- Si vous voyez exactement 500 ou 2 000 lignes, vous avez un problème de délégation
- Recherchez les icônes de triangle jaune dans la barre de formule sur tous les écrans
- Refactorisez en utilisant les patterns ci-dessus
- Testez avec des données à l'échelle de production, pas votre table de dev à 50 lignes
Référence rapide : délégable vs non délégable
| Délégable (Dataverse) | Non délégable |
|---|---|
Filter | Search |
Sort | SortByColumns (partiellement) |
StartsWith | EndsWith |
=, <>, <, >, <=, >= | exactin (pour la plupart des sources) |
And, Or, Not | IsBlank (dans un contexte de filtre) |
LookUp (conditions simples) | Year, Month, Day, Hour |
Sum, Min, Max, Avg (Dataverse) | CountRows |
La délégation n'est pas une complexité optionnelle. C'est la frontière entre une application qui fonctionne et une application qui fonctionne correctement. Chaque projet Power Apps devrait inclure une revue de délégation avant la mise en production, sans exception.