Récupérer l' ID d'un élément créé à partir de Power Apps

Étiquetté : , ,

  • Récupérer l' ID d'un élément créé à partir de Power Apps

    Posté par RANDRIATAHINA Charles sur 22 décembre 2022 à 9h37

    Bonjour,

    Je suis confronté à un souci pour la récupération de l’ID d’un élément SharePoint créé dans Power Apps. En fait, je souhaite que lorsqu’un utilisateur créé un élément SP Liste A via mon application Power Apps, l’ID de l’élément soit, en même temps, récupéré dans une Liste B (colonne personnalisée).
    J’ai essayé d’utiliser cette formule sur la OnVisible de mon écran pour récupérer le dernier ID de l’élément SharePoint liste A :

    Set(  nvarLastAddedItem,  nLast('maListeA').ID  n)  

    Puis j’incrémente de 1 la variable à chaque fois qu’on créé un élément, et je sauvegarde l’ID (varLastAddedItem+1) de l’élément créée dans la liste B.

    La limite : lorsque l’élément est supprimé de SharePoint, le prochain élément créé va avoir un ID en continuité de l’ID de l’élément qui a été supprimé.

    Alors la formule précédente montre sa limite, car elle récupère l’ID du tout dernier élément présent dans la liste ( sans tenir compte de l’ID de l’élément qui a été supprimé). Quand j’incrémente ce dernier ID récupéré de la liste SP A, on aura plus la bonne valeur.

    Quelqu’un saurait un workaround ?

    Merci

    PostID=fKaqWUStj0TpiXh

    Sylvain a répondu Il y a 11 mois, 3 semaines 1 Membre · 9 Réponses
  • 9 Réponses
  • DavidZed

    Membre
    22 décembre 2022 à 10h24

    hello RANDRIATAHINA Charles ,

    Si ton item est créé via un formulaire, tu peux normalement récupérer l’id via la formule : NomDeTonForm.LastSubmit.ID

    CommentID=buLKK1nqHue5OF0, PostID=fKaqWUStj0TpiXh

    • RANDRIATAHINA Charles

      Membre
      22 décembre 2022 à 10h32

      Hello DavidZed ,
      Ah d’accord. Bon à savoir. Merci.
      Mon problème, c’est que je dois récupérer l’ID avant même la soumission du formulaire. C’est à dire que je l’ai mis dans un Patch() pour updater un item de la liste B quand je séléctionne un checkbox.

      Patch(n   colExistingBusinessValue,n    ThisItem,n    {n        Colonne1:ThisItem.Colonne1,n        Checked:Checkbox.Value,n        CustomID: varLastAddedItem+1n    })

      SubCommentID=SRbApDVdvrUtcbz, CommentID=buLKK1nqHue5OF0, PostID=fKaqWUStj0TpiXh

    • DavidZed

      Membre
      22 décembre 2022 à 10h54

      Je me fais des noeuds au cerveau pour essayer de comprendre ton besoin 😄

      Normalement, si tu mets ton patch (liste B) dans le OnSucces du formulaire de ta liste B, tu devrais parvenir à tes fins 🙂 Il faudra simplement conditionner ton patch à la valeur de ton checkbox au lieu de mettre le patch dans le onselect de celle-ci.

      Exemple:

      if(Checkbox.Value,nPatch( colExistingBusinessValue,nThisItem,n{ nColonne1:Self.LastSubmit.Colonne1,nChecked:Checkbox.Value,nCustomID: Self.LastSubmit.ID n}))

      SubCommentID=i53mEv6IgtdHNo5, CommentID=buLKK1nqHue5OF0, PostID=fKaqWUStj0TpiXh

    • R3dKap

      Membre
      30 décembre 2022 à 18h17

      RANDRIATAHINA Charles l’identifiant des éléments de liste SharePoint ne peut être géré manuellement ; c’est strictement géré par le système. Impossible donc de le connaître AVANT que l’élément n’existe.

      Lorsque l’on a besoin d’exploiter l’ID d’un nouvel élément d’une liste SharePoint on procède ainsi :

      1. On soumet le formulaire avec un SubmitForm()

      2. Dans le OnSuccess du formulaire on récupère le nouvel ID à l’aide de Form1.LastSubmit.ID pour l’utiliser pour autre chose

      Si tu as besoin d’avoir un ID avant que l’élément n’existe, alors tu n’as plus qu’à créer ta propre colonne d’ID custom que tu devras gérer toi-même à ta façon.

      Mais peut-être peux-tu nous éclairer sur les raisons qui te poussent à avoir besoin de l’ID de l’élément SharePoint AVANT qu’il n’existe… A mon avis c’est là qu’est l’os ; peut-être faut-il envisager une solution différente à ta problématique. Expose-là nous et on verra comment procéder…

      SubCommentID=4v0LbNGTjgieCAN, CommentID=buLKK1nqHue5OF0, PostID=fKaqWUStj0TpiXh

    • RANDRIATAHINA Charles

      Membre
      3 janvier 2023 à 12h54

      Bonjour R3dKap ,

      Bonne année !
      Le besoin consiste à mettre à disposition des éléments prédéfinis affichés dans mon formulaire de création lié à ma ” liste A”. Ces éléments proviennent d’une autre liste SharePoint( Liste B). L’utilisateur doivent être capable de séléctionner plusieurs éléments à partir de la liste B via un checkbox placé à côté de chaque élément de ma galerie.

      Lors de la création d’un élément dans ma “liste A”, les métadonnées de ma liste B doivent être également mises à jour en fonction, dont l’ID du nouvel élément créée de ma liste A. Cet ID doivent être stocké dans une colonne personnalisé de ma liste B, ce qui me permettra après de gérer l’affichage des éléments de la liste B lié à l’ID de l’élément de la liste A lors de l’affichage de données dans l’app.

      Pour illuster, voici à quoi ressemble l’affichage des éléments de la liste B dans mon formulaire de création d’élément de la liste A.

      Dans la propriété OnCheck des checkbox, j’ai utilisé la fonction Patch() pour mettre à jour ma collection avec les nouvelles valeurs séléctionnées. J’ai bidouillé comme suit pour l’ID avec ses limites.

      Patch(n   colExistingBusinessValue,n    ThisItem,n    {n        Title:ThisItem.Title,n        CheckedBusinessValue:'Checkbox-BusinessValue'.Value,n        IDItemlistA:Value(varLastAddedItem+1)nn    })

      SubCommentID=wXXs9M6D0nkK0TS, CommentID=buLKK1nqHue5OF0, PostID=fKaqWUStj0TpiXh

    • R3dKap

      Membre
      3 janvier 2023 à 14h02

      Belle année à toi aussi RANDRIATAHINA Charles.

      Ok, je vois. Si je comprends bien :

      • Liste A : sur le formulaire de création tu affiches dans un datacard une galerie avec une liste d’éléments qui viennent d’une liste B ; il y a une case à cocher en face de chaque élément pour que l’utilisateur puisse en sélectionner plusieurs

      • Liste B : c’est ici que sont listés les éléments qui peuvent être sélectionnés lors de la création d’un élément de la liste A ; tu stockes (dans une colonne IDItemListA), en face de chaque élément sélectionné pour un item de la liste A, l’ID de cet item de la liste A, l’objectif étant de pouvoir les afficher comme étant sélectionnés lorsque l’utilisateur ré-éditera l’élément de la liste A

      Est-ce que j’ai bien compris ?

      Si c’est le cas, j’ai une question : que se passe-t-il si “First delivered value” est sélectionné sur plusieurs éléments de la liste A ? Est-ce possible ? Comment gères-tu ce cas de figure dans ta colonne IDItemListA de ta liste B ?

      A mon avis, et je m’en doutais un peu, il faudra probablement revoir la manière d’implémenter ton besoin. Mais j’attends d’abord ton retour sur mes questions… 😉

      SubCommentID=uXNXth6E8bcFbBd, CommentID=buLKK1nqHue5OF0, PostID=fKaqWUStj0TpiXh

    • RANDRIATAHINA Charles

      Membre
      3 janvier 2023 à 16h12

      Merci beaucoup R3dKap !
      Tu as tout compris par rapport à mon besoin actuel.

      Juste une précision par rapport à tes dernières questions, un élément de la liste A peuvent avoir plusieurs éléments de la liste B à la fois. Un élément de la liste B peut être séléctionné qu’une seule fois. C’est à dire qu’une fois qu’un élément de la liste B ( “First delivered value” par exemple) est rattaché à un élément de la liste A, celui là n’apparaitra plus dans le formulaire et donc ne sera plus séléctionnable lors de la création d’un nouvel élément dans la liste A.

      Merci 👍

      SubCommentID=foWrIvpi5mD7K3T, CommentID=buLKK1nqHue5OF0, PostID=fKaqWUStj0TpiXh

    • R3dKap

      Membre
      3 janvier 2023 à 17h58

      Ok. Alors vu qu’un élément B ne peut être rattaché qu’à un seul élément A, oui pourquoi pas stocker l’ID de l’élément A sur les éléments B.

      Par contre, il faut procéder différemment pour que ça fonctionne. Dans la suite de mes explications je vais utiliser la nomenclature suivante :

      • ListeA (et ses colonnes)

      • ListeB (et ses colonnes dont la colonne IdItemA)

      Je vais aussi supposer que tu as un écran HOME où tu listes tes éléments A et où tu peux soit créer un nouvel élément A ou en modifier un en cliquant sur l’élément en question dans une galerie. Dans les 2 cas, je suppose que cela t’amènes sur un écran DETAILS_A où se trouve ton formulaire FormA et ta galerie galItemsB.

      Je vais aussi supposer que lors de la navigation de HOME vers DETAILS_A lorsque l’on clique sur un élément A, tu passes l’élément en question dans le 3è paramètre du Navigate() afin que celui-ci soit directement exploitable au moment où l’écran s’affiche. Donc, si tu as quelque chose comme ceci Navigate(DETAILS_A; ScreenTransition.None; {locItemA: ThisItem}) je suppose alors que locItemA est bien positionné sur la propriété Item de ton formulaire sur l’écran DETAILS_A.

      Tu me suis ?

      Du coup, pour la suite, tout se passe sur l’écran DETAILS_A

      Et et vérifies aussi que tu as bien activé ce paramètre sur ton application :

      Au niveau de l’écran lui-même

      • Sur le OnVisible : ClearCollect(colItemsB; Filter(ListeB; IdItemA = Blank() || (FormA.Mode = FormMode.Edit && IdItemA=locItemA.ID))) (en gros : je ramène toujours les B qui n’ont pas encore été sélectionnés (que je sois en création ou en modification sur un A), mais si je suis en train de modifier un A alors il faut que je ramène en plus ceux qui lui sont associés -> tu me suis ?)

      • Toujours sur le OnVisible, à la suite du code précédent : ClearCollect(colSelectedItemsB; Filter(colItemsB; IdItemA = locItemA.ID))

      Côté galerie qui liste les éléments B avec les cases à cocher

      Cette galerie ne doit fonctionner QUE sur la base de la collection locale colItemsB.

      • Sur le Items de la galerie : colItemsB

      • Sur la case à cocher (que j’appelle cbxItemsB) dans la galerie :

        • sur le OnCheck : Collect(colSelectedItemsB; ThisItem)

        • sur le OnUncheck : Remove(colSelectedItemsB; ThisItem)

      • Sur le Default de la case à cocher : ThisItem.IdItemA = locItemA.ID

      Côté formulaire FormA

      • Sur le OnSuccess :

      // Détacher d'abord tous les B qui étaient rattachés à AnUpdateIf(ListeB; IdItemA = locItemA.ID; {IdItemA: Blank()});;n// Rattacher ensuite les B sélectionnés au AnForAll(n    colSelectedItemsB As LoopItemB;n    Patch(n        ListeB;n        LookUp(ListeB; ID = LoopItemB.ID);n        {n            IdItemA: locItemA.IDn        }n    )n)

      A la suite de quoi il vaudrait mieux retourner sur l’écran d’accueil pour pas avoir à gérer la mise à jour des collections locales…

      Voilou…

      Bon j’ai fait ça de tête donc y’aura sûrement des p’tits bugs à corriger mais l’esprit est là…

      SubCommentID=FlKObLbNmiD44wW, CommentID=buLKK1nqHue5OF0, PostID=fKaqWUStj0TpiXh

  • Sylvain

    Membre
    28 décembre 2022 à 20h33

    Bonjour, j’ai un soucis pour comprendre comment tu peux récupérer un ID d’un élément qui n’a pas encore été créé. L’ID se créé au moment où tu valides ton formulaire par Submit(). A priori, je crois que tu ne peux pas forcer la valeur de l’ID car c’est un champ/colonne en lecture seule dans ta liste SharePoint. Par conséquent, pour récupérer l’ID de ton enregistrement, il doit d’abord être créé.

    Une solution bricolée peut éventuellement être réalisée en récupérant l’ID de l’élément précédant et en lui ajoutant +1 comme tu l’as mentionné, mais cela ne marchera pas si tes enregistrements peuvent être supprimés. L’ID s’incrémente toujours même si il y a eu des suppressions. (si tu effaces l’ID 8 par exemple et que ta liste s’arrête au 7, le prochain sera quand-même le 9)

    Sylvain

    CommentID=F8VEGoRyig8LIjn, PostID=fKaqWUStj0TpiXh

Connectez-vous pour répondre.