LookUp function basée sur une combobox (multiple choice)

  • LookUp function basée sur une combobox (multiple choice)

    Posté par Christelle sur 16 mars 2022 à 10h38

    Bonjour!

    j´ai un problème. Je travaille sur une solution permettant la validation de délégations de signature et visualisation des documents créés pour une zone d´une vingtaine de pays. Afin de sécuriser l´accès, je vais passer par Power Automate. Je souhaite donc regrouper dans une ou plusieurs colonnes SP le mail des personnes ayant un droit d´accès. Les employés travaillent sur plusieurs pays et donc dans le formulaire PowerApps, j´ai une colonne multiple choice pour leur affecter les bons pays (“ComboScope”).

    J´ai une deuxième liste avec par pays les personnes des RH ayant accès, ainsi que les personnes devant valider les délégations de signature.

    Je souhaite pouvoir récupérer dans le formulaire le noms de toutes les personnes devant avoir accès pour le nouvel item créé dans SP.

    Je n´ai pas réussi à écrire une formule correcte (mélange de for all, concat, etc.).

    Alors je pensais passer par une Gallery de la liste pays (de son vrai nom: “AccessManagement”):

    Filter(AddColumns(AccessManagement,”Selectedcountries”,If”yes” in Concat(ForAll(ComboScope.SelectedItems.Value,If(Value in CountryChoice.Value,”yes”,”no”)),”true”,”false”),Selectedcountries=”true”)

    Il faudra certainement que je change ma colonne pays par une choice column sinon cela ne devrait pas fonctionner.

    Et je pensais dans le bouton de soumission du formulaire faire un ClearCollect de cette Gallery et un concat de la gallery pour les colonnes RH et validation. Puis patcher dans ma première liste dans une colonne pour les droits.

    Puis lancer Power Automate pour couper les droits et mettre les droits pour les mails contenus dans cette dernière colonne.

    Si quelqu´un a déjà eu ce scénario et/ou souhaite m´aider à faire ca de la manière la plus simple possible (je ne suis pas dans mon domaine d´expertise…), ce serait top!😅

    Bonne journée,

    Christelle

    PostID=7sLjiaO0S60z9LY

    R3dKap a répondu Il y a 11 mois, 4 semaines 1 Membre · 7 Réponses
  • 7 Réponses
  • Laurent CARRIERE

    Membre
    16 mars 2022 à 11h02

    Bonjour

    si je comprends bien, tu veux récuperer les données de l’utilisateur (nom, mail; fonction etc….)

    tu as cela avec la fonction “user” si tu veux afficher les infos dans powerapps.

    De toutes manière a la création de ton enregistrement sur la liste sharepoint avec les colonnes remplies comme tu le souhaite, il y aura automatiquement une colonne avec la date de création et a partir de quel compte cela a été créé.

    bon courage

    CommentID=nfSTEzTd3QHrymm, PostID=7sLjiaO0S60z9LY

  • Christelle

    Membre
    16 mars 2022 à 11h11

    Bonjour Laurent,

    pas tout à fait: j´ai besoin de chercher le nom des personnes qui auront le droit de voir l´item.

    J´ai un employé 1, qui travaille sur Allemagne, Autriche et Suisse;

    Dans une deuxième liste, je définis que tout ce qui concerne l´Allemagne sera accessible par la personne A et B; pour l´Autriche ce sera seulement la personne A et pour la Suisse ce sera la personne C et la personne D.

    Comme l´employé 1 à 3 pays, il faudra donc que les personnes A, B, C et D aient accès.

    Pour l´employé 2, qui ne travaille que pour l´Allemagne et l´Autriche, il faudra que son document ne soit accessible que par les personnes A et B (pas par C et D).

    Un peu casse-tête mais je souhaite faire ca directement dans PowerApps et non pas dans Power Automate (où je m´y connais encore moins… et je ne suis pas sure de savoir déterminer une variable à partir d´une multiple-choice column pour aller ensuite chercher la valeur dans ma liste AccessManagement…). Mais je suis ouverte à toute bonne idée! 😀

    CommentID=yMiBDX0xl3qygzd, PostID=7sLjiaO0S60z9LY

  • R3dKap

    Membre
    16 mars 2022 à 12h48

    Salut @Christelle ah j’ai mieux compris avec ta 2è explication… 😋

    Faut que je le simule chez moi pour te donner la bonne formule… Je t’envoie ça dès que je l’ai fait… 😉

    CommentID=ZRaOmnaqZ2GLLTx, PostID=7sLjiaO0S60z9LY

  • R3dKap

    Membre
    16 mars 2022 à 13h50

    Alors, pour mon test j’ai construis les collections suivantes :

    colEmployés

    ClearCollect(n    colEmployés;n    {n        Id: 1;n        Nom: "Employé 1";n        Pays: Table(n            {Id: 1; Value: "Allemagne"};n            {Id: 2; Value: "Autriche"};n            {Id: 3; Value: "Suisse"}n        )n    };n    {n        Id: 2;n        Nom: "Employé 2";n        Pays: Table(n            {Id: 1; Value: "Allemagne"};n            {Id: 2; Value: "Autriche"}n        )n    }n)

    colPays

    ClearCollect(n    colPays;n    {n        Id: 1;n        Nom: "Allemagne";n        Personnes: Table(n            {Id: 1; Value: "A"};n            {Id: 2; Value: "B"}n        )n    };n    {n        Id: 2;n        Nom: "Autriche";n        Personnes: Table(n            {Id: 1; Value: "A"}n        )n    };n    {n        Id: 3;n        Nom: "Suisse";n        Personnes: Table(n            {Id: 3; Value: "C"};n            {Id: 4; Value: "D"}n        )n    }n)

    colPersonnes

    ClearCollect(n    colPersonnes;n    {Id: 1; Value: "A"};n    {Id: 2; Value: "B"};n    {Id: 3; Value: "C"};n    {Id: 4; Value: "D"}n)

    Sur mon écran j’ai mis une combo box cbxEmployés Items = colEmployés. Donc, dans cbxEmployés.Selected j’ai l’employé sélectionné.

    L’objectif c’est que si je choisis Employé 1 il me donne ABCD et si je choisis Employé 2 il me donne AB (comme dans ton exemple).

    Voici comment j’ai procédé pour monter la formule…

    Mon objectif est de filtrer colPays pour ne garder que les pays de l’employé sélectionné et en extraire ensuite les personnes (sans les doublons).

    Du coup, d’abord je rajoute une colonne dans colPays pour avoir une concaténation des identifiants des personnes de chaque pays :

    AddColumns(n    colPays As Pays;n    "ConcatPersonnesId";n    Concat(Pays.Personnes; Text(Id); ";")n)

    Le résultat est le suivant :

    Ensuite, je filtre la liste des pays pour ne conserver que les pays de l’employé sélectionné (à droite du in il faut obligatoirement une table à une seule colonne ; c’est pour ça que je fais le ShowColumns() pour ne garder que la colonne Id des pays de l’employé) :

    Filter(n    <formule précédente>;n    Id in ShowColumns(cbxEmployés.Selected.Pays; "Id")n)

    Pour l’employé 2 par ex. ça me donne donc ceci :

    Après, je concatène tous les ids des personnes identifiées dans la colonne ConcatPersonnesId :

    Concat(n    <formule précédente>;n    ConcatPersonnesId;n    ";"n)

    Ca me donne donc :

    1;2;1

    Il faut maintenant que j’élimine les doublons. Pour cela je reconvertis ce résultat en tableau à l’aide du Split() :

    Split(<formule précédente>; ";")

    Ca me donne :

    Puis j’élimine les doublons :

    Distinct(<formule précédente>; Result)

    Et j’obtiens enfin :

    Ces ids correspondants à ceux des personnes qui ont dont les droits d’accès.

    La formule complète est donc la suivante :

    Distinct(n    Split(n        Concat(n            Filter(n                AddColumns(n                    colPays As Pays;n                    "ConcatPersonnesId";n                    Concat(n                        Pays.Personnes;n                        Text(Id);n                        ";"n                    )n                );n                Id in ShowColumns(n                    cbxEmployés.Selected.Pays;n                    "Id"n                )n            );n            ConcatPersonnesId;n            ";"n        );n        ";"n    );n    Resultn)

    Si tu mets ça dans une galerie, tu peux afficher le nom des personnes avec un libellé où tu mets LookUp(colPersonnes; Id = Value(ThisItem.Result)). Il faut convertir le ThisItem.Result en numérique pour que la comparaison avec le Id de colPersonnes fonctionne correctement.

    Voilou… J’espère que t’arriveras à l’adapter à ton cas de figure… Sinon n’hésite pas à revenir ici… 😉

    Je te mets ci-joint la p’tite application que j’ai faite pour simuler ton cas d’usage… A ouvrir directement depuis le studio Power Apps.

    CommentID=zaVTYRe1Y4tJ2cz, PostID=7sLjiaO0S60z9LY

  • Christelle

    Membre
    16 mars 2022 à 14h34

    Merci beaucoup!

    Je vais avoir besoin d´un peu de temps pour suivre tout ca et je m´y mettrai demain (j´ai des obligations cet après-midi). Je reviens volontier vers toi si je bloque… Cool!

    CommentID=pvL8aJmyVid6WLc, PostID=7sLjiaO0S60z9LY

  • Christelle

    Membre
    18 mars 2022 à 6h53

    Bonjour @R3dKap !

    tes explications m´ont absolument aidée, notamment les explications sur toutes les étapes intermédiaires.

    Du coup, j´ai pu construire ma solution.

    Voici donc mon formulaire pour créer un nouvel item dans ma liste principale (pour définir jusqu´à combien un employée peut signer et pour quel(s) pays):

    Dans le champ “ItemAccess”, j´ai mis la formule suivante, me permettant de récupérer les emails des personnes pouvant avoir accès à l´item créé [DataCardValue49_1 étant le champ où je choisis les pays (DOAScope, multiple choice):

    If(FormNewHQ.Mode=FormMode.New,Concat(Distinct(Split(Concatenate(Concat(Filter(

    AddColumns(AccessManagement,”Selectedcountries”,

    If(IsEmpty(DataCardValue49_1.SelectedItems.Value),”true”,

    If(“yes” in Concat(ForAll(DataCardValue49_1.SelectedItems.Value,If(Value in Country.Value,”yes”,”no”)),Value),”true”,”false”))),

    Selectedcountries=”true”),AdminEmailAccess,”;”),”;”,

    Concat(Filter(

    AddColumns(AccessManagement,”Selectedcountries”,

    If(IsEmpty(DataCardValue49_1.SelectedItems.Value),”true”,

    If(“yes” in Concat(ForAll(DataCardValue49_1.SelectedItems.Value,If(Value in Country.Value,”yes”,”no”)),Value),”true”,”false”))),

    Selectedcountries=”true”),HREmailAccess,”;”),”;”,Concat(Filter(

    AddColumns(AccessManagement,”Selectedcountries”,

    If(IsEmpty(DataCardValue49_1.SelectedItems.Value),”true”,

    If(“yes” in Concat(ForAll(DataCardValue49_1.SelectedItems.Value,If(Value in Country.Value,”yes”,”no”)),Value),”true”,”false”))),

    Selectedcountries=”true”),CentralApproverEmailAccess,”;”)),”;”),Result),Result,”;”),Parent.Default)

    Ca semble fonctionner.

    Si tu constates un problème, je suis évidemment à l´écoute des conseils!

    Merci et bonne journée!

    Christelle

    CommentID=WOdkIFg0jEAY8oN, PostID=7sLjiaO0S60z9LY

  • R3dKap

    Membre
    18 mars 2022 à 12h24

    Avec plaisir… 😉

    Alors j’ai indenté ton code pour y voir plus clair :

    If(n    FormNewHQ.Mode = FormMode.New,n    Concat(n        Distinct(n            Split(n                Concatenate(n                    Concat(n                        Filter(n                            AddColumns(n                                AccessManagement,n                                "Selectedcountries",n                                If(n                                    IsEmpty(DataCardValue49_1.SelectedItems.Value),n                                    "true",n                                    If(n                                        "yes" in Concat(n                                            ForAll(n                                                DataCardValue49_1.SelectedItems.Value,n                                                If(Value in Country.Value, "yes", "no")n                                            ),n                                            Valuen                                        ),n                                        "true",n                                        "false"n                                    )n                                )n                            ),n                            Selectedcountries = "true"n                        ),n                        AdminEmailAccess,n                        ";"n                    ),n                    ";",n                    Concat(n                        Filter(n                            AddColumns(n                                AccessManagement,n                                "Selectedcountries",n                                If(n                                    IsEmpty(DataCardValue49_1.SelectedItems.Value),n                                    "true",n                                    If(n                                        "yes" in Concat(n                                            ForAll(n                                                DataCardValue49_1.SelectedItems.Value,n                                                If(Value in Country.Value, "yes", "no")n                                            ),n                                            Valuen                                        ),n                                        "true",n                                        "false"n                                    )n                                )n                            ),n                            Selectedcountries = "true"n                        ),n                        HREmailAccess,n                        ";"n                    ),n                    ";",n                    Concat(n                        Filter(n                            AddColumns(n                                AccessManagement,n                                "Selectedcountries",n                                If(n                                    IsEmpty(DataCardValue49_1.SelectedItems.Value),n                                    "true",n                                    If(n                                        "yes" in Concat(n                                            ForAll(n                                                DataCardValue49_1.SelectedItems.Value,n                                                If(Value in Country.Value, "yes", "no")n                                            ),n                                            Valuen                                        ),n                                        "true",n                                        "false"n                                    )n                                )n                            ),n                            Selectedcountries = "true"n                        ),n                        CentralApproverEmailAccess,n                        ";"n                    )n                ),n                ";"n            ),n            Resultn        ),n        Result,n        ";"n    ),n    Parent.Defaultn)

    Bon, le post n’étant pas très large ça n’aide pas non plus mais c’est déjà ça…

    Je vois que tu as 3 blocs parfaitement identiques :

    Filter(n    AddColumns(n        AccessManagement,n        "Selectedcountries",n        If(n            IsEmpty(DataCardValue49_1.SelectedItems.Value),n            "true",n            If(n                "yes" in Concat(n                    ForAll(n                        DataCardValue49_1.SelectedItems.Value,n                        If(Value in Country.Value, "yes", "no")n                    ),n                    Valuen                ),n                "true",n                "false"n            )n        )n    ),n    Selectedcountries = "true"n)

    Pour simplifier la maintenance de ton code, ce que je ferais c’est que je mettrais une galerie vide (supposons qu’elle s’appelle Gallery1), masquée, sur l’écran et j’y mettrais cette formule dans sa propriétés Items.

    Du coup, ta grosse formule devient :

    If(n    FormNewHQ.Mode = FormMode.New,n    Concat(n        Distinct(n            Split(n                Concatenate(n                    Concat(n                        Gallery1.AllItems,n                        AdminEmailAccess,n                        ";"n                    ),n                    ";",n                    Concat(n                        Gallery1.AllItems,n                        HREmailAccess,n                        ";"n                    ),n                    ";",n                    Concat(n                        Gallery1.AllItems,n                        CentralApproverEmailAccess,n                        ";"n                    )n                ),n                ";"n            ),n            Resultn        ),n        Result,n        ";"n    ),n    Parent.Defaultn)

    Ce qui est quand même plus lisible… 😉

    CommentID=ueu6hQtk5XhurdV, PostID=7sLjiaO0S60z9LY

Connectez-vous pour répondre.