French Power Platform User Group

Please login or click SIGN UP FOR FREE to create your PowerPlatformUG account to join this user group.
 View Only
  • 1.  Listes en cascade et formulaire

    Posted Nov 10, 2021 10:16 AM
    Bonjour,

    Je rencontre une difficulté sur PowerApps.

    Pour expliquer un peu le contexte, j'ai créé une application à partir d'une liste Sharepoint (une liste d'actions à réaliser)
    Dans cette liste d'actions, j'ai des colonnes "Société" et "Equipement" de type "Référence"
    J'ai donc deux listes 
    - Une liste "Société" reliée à ma liste d'action sur la colonne Title (pour avoir le choix entre plusieurs sociétés quand je créé une action)
    - Une liste "Equipement" reliée à la liste "Société" sur la colonne Title (pour sélectionner la société à laquelle appartient l'équipement) et  reliée à la liste action par la colonne Title (pour sélectionner l'équipement quand je créé une action)

    Pour schématiser :


    Revenons à mon application PowerApps :
    J'ai un EditForm basé sur ma liste d'actions.
    En mode "nouveau formulaire", j'ai voulu paramétrer mes listes déroulantes, de manière à avoir des filtres en cascade (n'afficher que les équipements appartenant à la société sélectionnée juste avant). J'ai créé une variable contenant le nom de ma société (en format texte), je l'ai appelé vSociété (l'idée étant de filtrer à la source en fonction de la société choisie dès le départ)
    Pour la société, dans le champ Items j'ai mis la formule suivante LookUp(Sociétés;'title' = vSociete) (pour forcer le choix sur la société pré-sélectionnée)
    Pour mes équipements, dans le champ "Items"  j'ai mis la formule suivante : Filter(Equipements;'Société'.Value = vSociete)
    Aucun souci là dessus, mon filtre fonctionne bien.

    Là on ça se corse, c'est au moment du SubmitForm puisque (si je comprends bien le souci) ma source de données pour deux de mes colonnes n'est plus la liste Sharepoint visée mais deux autres listes. Dans ma liste Sharepoint, les cellules correspondantes à la société et à l'équipement restent vides même si les champs sont complétés sur PowerApps.

    Pour résoudre ce problème, et après lecture de quelques sujets ici, j'ai voulu utilisé la formule Patch (sur le champ OnSuccess de mon EditForm) :

    Patch('Liste d'actions';LookUp('Liste d'actions'; Title = "AZERTY");
    {
    Société: {
    Id: DataCardValue16.Selected.ID;                  DataCardValue16 est de type Listbox, basée sur ma liste "Sociétés"
    Value: DataCardValue16.Selected.Title
    };
    Equipement: {
    Id: DataCardValue37.Selected.ID;
    Value: DataCardValue37.Selected.Title           DataCardValue37 est de type ListBox, basée sur ma liste "Equipements"
    }
    }
    )

    Mes difficultés :
    - Je sais pas quoi mettre dans le lookup pour récupéré le dernier enregistrement modifié (là j'ai fait des tests en mettant AZERTY en title d'une action pour voir si les autres champs se mettaient bien à jour). 
    - Mes couples Id et Value ne remontent rien dans ma liste Sharepoint. Quand je remplace par les valeurs nombre et texte correspondantes ça fonctionne. Pourtant, mes champs sont bien de type valeur et texte. J'ai fait remonter les infos en étiquette pour vérifier, ça me donne bien un nombre pour DataCard....ID et un texte DataCard...title 

    (J'ai essayé de forcer la main en passant par PowerAutomate mais ça bloque aussi).

    Merci pour vos lumières

    ------------------------------
    Delphine Blanc
    ------------------------------


  • 2.  RE: Listes en cascade et formulaire

    Gold Contributor
    Posted Nov 11, 2021 06:15 AM

    Salut Delphine,

    >> Lorsque ce sujet sera clôturé n'hésite pas à allez sur le nouveau site d'entraide https://ppfc.fr car celui-ci sera clôturé d'ici quelques semaines 😉 << 

    Merci pour les explications très détaillées et pour le p'tit schéma (ça aide toujours à mieux comprendre). D'ailleurs, au passage, je t'invite à récupérer le PPT de cet article (tout e bas) qui te permettra de mieux représenter tes modèles de données. C'est quelque chose que je fais systématiquement pour tous mes projets car je m'y reporte souvent pour me souvenir comment j'ai structuré mon application et ça aide aussi quand on demande de l'aide... 😉

    Pour résumer ton besoin :

    • ton application permet de créer des tâches
    • chaque tâche est rattachée à une société et à un équipement
    • lorsque l'on crée une tâche la société est choisie précédemment -> dans le formulaire la liste déroulante Société est préalimentée avec la société choisie (et n'est plus modifiable -> du moins c'est que je ferais) puis l'utilisateur choisit un équipement (seuls les équipements de la société choisie sont accessibles)
    • lorsque l'on modifie une tâche, on ne peut pas modifier la société (à voir), on peut juste changer l'équipement
    • et tout ça dans SharePoint

    Est-ce que c'est bien ça l'idée ? Sinon, corrige-moi. 🙂

    Si c'est bien ça l'idée, voici quelques éléments qui devraient t'aider...

    Lorsque tu as ajouté le contrôle formulaire à ton application, que tu l'as branché sur ta liste SharePoint et que tu y as ajouté tous les champs dont tu avais besoin, les listes déroulantes Société et Equipement avaient respectivement ceci :

    Société.Items = Choices(taListe.Société)
    
    Equipement.Items = Choices(taListe.Equipement)

    Comme tu le sais probablement déjà, les colonnes de recherche dans SharePoint ont une structure {Id: ...; Value...}. Quoiqu'il arrive, pour que les choses soient plus simple par la suite, il ne faut pas déroger à cette structure sur tes 2 listes déroulantes. Quoique tu fasses, l'idéal consiste à faire en sorte que le Items de tes listes déroulantes aient toujours ce format au final. Cela a pour avantage entre autres de ne pas avoir à modifier la propriété Update des datacards correspondants (un peu touchy à bidouiller).

    Donc, première chose, comment faire en sorte que la liste déroulante Société prennent par défaut, dans le formulaire en création, la société choisie à l'origine ? Eh bien, sur le DefaultSelectedItems de ta liste déroulante tu dois mettre ceci (en supposant que tu n'as qu'un seul formulaire pour gérer la création et la modification) :

    If(Form1.Mode = FormMode.New; LookUp(Choices(taListe.Société); Value = vSociété); Parent.Default)

    Comme tu peux le voir on travaille toujours, dans le DefaultSelectedItems, avec les éléments qui sont dans le Items. En effet, il faut forcément que le DefaultSelectedItems prennent comme valeur un des éléments du Items de ta liste déroulante.

    Ensuite, pour filtrer ta liste d'équipement en fonction de la société, ça va être un peu plus compliqué. En effet ta liste déroulante d'équipements est également au format {Id: ...; Value: ...} et donc tu n'a pas accès la société des équipements pour effectuer le filtrage. Le Items de ta liste déroulante définit par Choices(taListe.Equipement) te renvoie une table avec la totalité des équipements au format {Id: ...; Value: ...}. Eh bien ce que l'on va faire c'est de filtrer cette table pour ne conserver QUE ceux qui correspondent à la société en cours. Pour faire ça on va construire une liste des équipements correspondant à cette société, ne garder que la colonne ID (attention en majuscule car c'est le champ SharePoint) et réduire la table du Choices(taListe.Equipement) à ces seuls ID là. Voici la formule en question à mettre dans le Items de ta liste déroulante Equipement :

    Filter(
        Choices(taListe.Equipement);
        Id in ShowColumns(
            Filter(
                Sociétés;
                Société.Value = vSociété
            );
            "ID"
        )
    )

    Cette petite formule je la garde toujours sous le coude parce-que je l'utilise assez souvent. Après, pour tout te dire, y'a pas mal de temps déjà que Power Apps a fournit une fonctionnalité native pour créer des dépendances entre listes déroulantes 😅 :


    Une fois que t'as fait ça eh bin y'a plus rien d'autre à faire. Comme tu as respecté les structures d'origine des champs de ta liste SharePoint, il suffit que tu fasses un SubmitForm(Form1) et tes données s'enregistreront correctement.

    NOTE : si tu veut pouvoir un jour enregistrer une liste déroulante à vide, il faut que tu actives cette option dans les paramètres de ton application :


    Dis-moi si ça fonctionne bien chez toi...



    ------------------------------
    EMMANUEL GALLIS
    Power Platform Consultant
    France
    ------------------------------



  • 3.  RE: Listes en cascade et formulaire

    Posted Nov 12, 2021 02:31 AM
    Déjà un grand merci pour cette réponse détaillée et tes explications, j'y vois plus clair (et je vais pouvoir revoir deux-trois éléments de mon application grâce à toi, j'utilisais mal le Items / DefaultSelectedItems pour "forcer" les choix).

    Ca fonctionne parfaitement, juste tu avais fait une coquille pour la liste déroulante Equipements (il doit aller chercher les éléments dans la Liste Equipements et non Sociétés):

    Filter(
        Choices(taListe.Equipement);
        Id in ShowColumns(
            Filter(
                Equipements;
                Société.Value = vSociété
            );
            "ID"
        )
    )​

    J'avais vu la fonctionnalité "dépend de" sur PowerApps mais je n'arrivais pas à obtenir ce que je voulais.

    Je migre donc vers ppfc.fr et te remercie encore.



    ------------------------------
    Delphine Blanc
    ------------------------------