Filter et délégation

  • Filter et délégation

    Posté par Laurent CARRIERE sur 29 août 2022 at 13h30

    Bonjour

    J’ai une table (liste SP) avec 4507 enregistrements (“MaTable”)

    Je me heurte donc au problème de délégation. je cherche donc a filtrer pour réduire et arriver a moins de 2000 et pouvoir interagir correctement dans powerapps.

    Groupby c’est mort non délegable, impossible a appliquer sur les 4507

    Filter a priori c’est ok, mais voilà les résultats que j’obtiens :

    ClearCollect(CollectionColl;Filter(Matable;ID<1500))

    Countrows(CollectionColl) = 1499 jusque là tout va bien

    je me crée une 2eme collection pour les 1500 suivants :

    ClearCollect(CollectionColl2;Filter(Matable;And(ID>1500;ID<3000)))

    Countrows(CollectionColl2) = 501 !!!!!!!!!!Why…..

    En effet les items de la galerie basée sur CollectionColl2 s’arrête a 2000 !!!!

    je persiste en me créant une 3ème collection

    ClearCollect(CollectionColl3;Filter(Matable;ID>3000))

    Countrows(CollectionColl3) = 0

    je ne comprends pas pourquoi il ne s’occuppe que des 2000 1ers ID, malgré les Collections différentes crées. Filter étant délégable et > < aussi. (doc microsoft)

    j’ai bien lu le post de michel Couderc a ce sujet, mais je ne comprends toujours pas ces résultats.

    Merci d’éclairer ma lanterne s’il vous plait.

    PostID=6uetl2M2IMmquZP

    R3dKap a répondu 11 months, 3 weeks ago 1 Membre · 7 Réponses
  • 7 Réponses
  • DavidZed

    Member
    29 août 2022 at 15h28

    Bonjour ,Le soucis, il me semble, c’est que le filtre sur l’ID n’est que partiellement délégable (qu’avec “=” mais pas avec “<,>,>=,<=” )Il y a une astuce simple qui peux permettre de récupérer jusqu’à 4000 lignes en jouant sur le sorting, ce qui revient à récupérer les 2000 premiers et les 2000 derniers records, un exemple :

    Concurrent( ClearCollect(Collection1;Filter(SortByColumns(List;"ID";Ascending);ID>0));;nClearCollect(Collection2;Filter(SortByColumns(List;"ID";Descending);ID>0)) );; nClearCollect(NewCollection;Collection1;Filter(Collection2; Not(ID in Collection1.ID)));;nClear(Collection1);;nClear(Collection2)

    Pour récupérer plus de 4000 items par contre, il faudra nécessairement ajouter une colonne “Other_ID” de type nombre entier, sur laquelle tu vas pouvoir filter avec des “>”,”<“.

    Cela ne règlera pas le problème, mais dans ta seconde collection, au niveau du filtre : ClearCollect(CollectionColl2;Filter(Matable;And(ID>1500;ID<3000)))

    Mieux vaux ne pas utiliser le “and” et mettre les conditions directement en paramètre du filtre : ClearCollect(CollectionColl2;Filter(Matable;ID>1500;ID<3000))

    CommentID=iHxm1K8SZBmV7H1, PostID=6uetl2M2IMmquZP

  • R3dKap

    Member
    30 août 2022 at 18h45

    Laurent CARRIERE au-delà des éventuelles solutions techniques, la vraie piste à étudier est plus fonctionnelle : sur quelle données de ma liste je peux inviter l’utilisateur à réduire le nombre d’éléments sur lesquels travailler.

    L’idée c’est de penser l’application de telle sorte que l’on oblige l’utilisateur a entrer un premier critère pour filtrer les données de la liste et la réduire à une quantité inférieure à 2000 (en utilisant une égalité ou un StartsWith() dans un Filter() par ex.).

    See what I mean? 😉

    CommentID=EizDXoY4VaTDBdy, PostID=6uetl2M2IMmquZP

  • Laurent CARRIERE

    Member
    1 septembre 2022 at 7h39

    Merci de vos réflexions. Effectivement le Champs ID pose problème – La création d’un autre champ est indispensable et cela marche bcp mieux.

    Je note pour l’astuce du And, c’est vrai que j’avais pris cette habitude…

    Pour répondre a R3dKap:

    On est d’accord sur le principe. Je voulais répondre a une problématique via powerapps alors que c’est peut être excel qu’il fallait utiliser….

    Néanmoins je trouve dommage que l’on soit obligé de prendre cette axe de réflexion que d’obliger l’utilisateur a intervenir sur moins de 2000 lignes.

    merci a vous deux

    CommentID=GwwXfBKCDDQX8N0, PostID=6uetl2M2IMmquZP

  • Sylvain

    Member
    4 octobre 2022 at 1h50

    hello,

    je me permet de réouvrir cette discussion. j’ai le même soucis.

    en suivant les conseils de R3dKap j’ai utiulisé la fonction Endswith() dans mon Filter() mais j’ai toujours le problème.

    Merci d’avance.

    Sylvain

    CommentID=7TZ7xdrfhs7D4qX, PostID=6uetl2M2IMmquZP

  • R3dKap

    Member
    4 octobre 2022 at 19h49

    Salut Sylvain,

    C’est normal… Comme tu peux le voir dans ce tableau extrait de la doc Microsoft sur la délégation SharePoint, la fonction EndsWith() n’est pas délégable :

    CommentID=CZMJD09Nn3ZpV9K, PostID=6uetl2M2IMmquZP

  • Sylvain

    Member
    14 décembre 2022 at 23h22

    Merci pour tout retour R3dKap . J’ai essayé avec le StartsWith() du coup mais comme ma chaine de caractère à filtrer se trouve à la fin, j’ai ajouté une colonne calculée dans SharePoint avec =GAUCHE([maColonne];NBCAR([maColonne])-3) pour virer les 3 premiers caractères et du coup, je fais mon Filter() sur cette nouvelle colonne calculée. J’ai toujour le même problème, même avec un = qui pourtant fonctionne aussi sur du texte d’après le tableau que tu as posté.

    CommentID=AiZ7fmWiAxO46MM, PostID=6uetl2M2IMmquZP

  • R3dKap

    Member
    15 décembre 2022 at 9h07

    Laurent CARRIERE c’est à cause de ta colonne calculée. Il faut que tu revoies la manière d’organiser tes données pour éliminer ton problème. Si je comprends bien ce que tu essaies de faire : tu as une combo où il y un numéro de mois, une autre où il y a une année, tu concatènes les deux au format MM/AAAA et tu filtres sur une colonne de date préalablement convertie en texte sur les 7 derniers caractères -> carrément impossible sans problème de délégation. Pour éviter la délégation il faut que ton filter soit simple.

    Ce que je ferais :

    • je créerais une colonne de texte colMoisAn dans la liste dans laquelle je mettrais la partie MM/AAAA de la date à chaque modification/enregistrement dans la liste

    • je ferais une petite moulinette pour balayer les données existantes et alimenter cette colonne

    • sur les OnChange des 2 combos je construirais une variable locale qui représenterait le MM/AAAA à partir des combos : UpdateContext({locMoisAnnée: cmb_mois_2.SelectedText.numMois & "/" & cmb_moisAns_2.SelectedText.Value})

    • du coup le Filter() s’écrirait ainsi :

    ...Filter(CHT_TB_suiviActivite; colMoisAn = locMoisAnnée)

    Et là t’auras plus de pb… Oui ça demande un peu de boulot mais les Filter() faut les simplifier au maximum, surtout quand on bosse sur de gros volumes, quitte à créer des colonnes spécifiquement dédiées au filtrage…

    CommentID=ZbJob5xcP3OmIxR, PostID=6uetl2M2IMmquZP

Connectez-vous pour répondre.