Patch fonction 2 listes liées par colonne LookUp

  • Patch fonction 2 listes liées par colonne LookUp

    Posté par Mickael sur 24 janvier 2025 à 8h49

    Hello l’équipe.

    je cherche à ajouter une fonction particulière à une appli sur laquelle je travaille en ce moment.

    Pour expliquer brièvement ce qui fonctionne :

    Nous avons un entrepot dans lequel se trouve différentes catgories d’articles permettant aux différents départements de commander la matière pour réaliser leurs activités.

    L’user sélectionne les items dans un catalogue en donnant les infos usuelles et la soumet (Jusque là pas de problème)

    2 listes SP :

    Liste1 = Infos du service demandeur, nom demandeur, date, statut, commentaire demandeur, etc…

    Liste2 = Infos concernant les articles, désignation, réf, etc…

    La liste2 est liée à la liste1 via 2 colonnes LookUp (ID liste1 et Titre liste1) que je patch lors de la soumission des commandes.

    Cependant, un département a un besoin bien particulier dans le sens où, ils leur faut pouvoir commencer une commande mais sans la soumettre de suite, afin de permettre à d’autres personnes de leur service de pouvoir reprendre cette commande qui aura été initiée aparavant et de l’agrémenter avec d’autres articles.

    Mon problème est que je n’arrive pas à Patcher les articles de ma liste2.

    Ca me patch les nouveaux articles, en plus de ceux déjà enregistrés précédemment.

    J’ai donc opté pour un remove de tous les articles ayant tel ID (Colonne LookUp) avant de Patcher la nouvelle liste d’article, mais ça ne me patch que les articles ajoutés et suprime tous les précédents.

    Exemple:

    Item1, Item2, Item3 (Enregistrés)

    Lorsque je reprend la commande pour y ajouter d’autres item :

    Item1, Item2, Item3, Item4

    La Liste2 est Patchée avec uniquement Item4

    <div>
    <div>OnSelect :</div>
    <div> </div>
    <div>
    <div>
    <div>Remove(</div>
    <div>Liste2,</div>
    <div>Filter(</div>
    <div>Liste2,</div>
    <div>IDLookUpListe2.Value = lbl_IDLookUpListe2.Text)</div>
    <div>);</div>
    </div>
    </div>
    <div>UpdateContext(</div>
    <div>{locComRec:</div>
    <div>Patch(</div>
    <div>Liste1,</div>
    <div>LookUp(</div>
    <div>Liste1,</div>
    <div>ID = Value(lbl_IDLookUpListe2.Text)),</div>
    <div>{</div>
    <div>Title: lbl_Titre.Text,</div>
    <div>CostCenter: Dpd_CCenter.SelectedText,</div>
    <div>NomDemandeur: txt_NomDemandeur.Text,</div>
    <div>DateDemande: DatePicker1.SelectedDate,</div>
    <div>StatutRequette:dpd_StatutCom.SelectedText,</div>
    <div>CommentUser: Txt_Comment_1.Text,</div>
    <div>Service: Gal_Services.Selected.Title</div>
    <div>}</div>
    <div>)</div>
    <div>}</div>
    <div>);</div>
    <div>ForAll(</div>
    <div>Gal_Panier.AllItems,</div>
    <div>Patch(</div>
    <div>Liste2,</div>
    <div>{TitreLookUpListe1:</div>
    <div>{Id: locComRec.ID,</div>
    <div>Value: locComRec.Title},</div>
    <div>Title:Title,</div>
    <div>Reference: Reference,</div>
    <div>Quantité: Quantité,</div>
    <div>UnitConditionnement:UnitConditionnement,</div>
    <div>Batch: Batch ,</div>
    <div>Stockage: Stockage,</div>
    <div>Conso: Conso,</div>
    <div>Transfert: Transfert,</div>
    <div>CommentItem: CommentItem,</div>
    <div>ImageArticle: ImageArticle,</div>
    <div>IDListe1: {Id:locComRec.ID,</div>
    <div>Value: locComRec.ID},</div>
    <div>CatArticle: CategorieArticle}</div>
    <div>)</div>
    <div>)</div>
    <div> </div>
    <div>—-</div>
    <div> </div>
    <div>Désolé pour le pavé, mais difficile d’expliquer autrement.</div>
    <div>Merci pour votre retour.</div>
    </div>

    • Cette discussion a été modifiée Il y a 5 jours, 21 heures par  Mickael.
    R3dKap a répondu Il y a 1 jour, 10 heures 2 Membres · 5 Réponses
  • 5 Réponses
  • R3dKap

    Membre
    24 janvier 2025 à 18h10

    Salut @Mickael,

    Commençons par le modèle de données car c’est lui qui va déterminer comment construire et coder ton application. Je récapitule ta situation actuelle :

    • Liste1 :
      • Infos service
      • Nom demandeur
      • Date
      • Statut
      • Commentaire
    • Liste2 :
      • Infos articles
      • Désignation
      • Réf
      • Lookup1 (lookup vers Liste1.ID)
      • Lookup2 (lookup vers Liste1.Titre)

    Mes questions :

    1. Pourquoi avoir créé 2 colonnes de lookup dans Liste2 ?
    2. Pourquoi ne pas avoir créé une seule colonne de lookup multi dans Liste1 pour indiquer les articles commandés par un demandeur ?

    Si je reprends ton besoin d’origine : Des départements commandent des articles dans un entrepôt. Une commande peut être réalisée par plusieurs personnes différentes.

    En me basant sur ce besoin j’imagine tout de suite un modèle de données différent :

    • Liste Départements
      • Nom
      • Infos
    • Liste Articles
      • Désignation
      • Réf
      • Infos
    • Liste Commandes
      • N° cde
      • Date
      • Département (lookup vers Départements)
      • Statut
    • Liste LignesCde
      • N° cde (lookup vers Commandes)
      • N° ligne
      • Article (lookup vers Articles)

    Il y a sûrement à rajouter d’autres choses, comme les quantités des articles par ex. mais l’idée principale est là.

    Structurer tes données ainsi te permet de gérer plus facilement tes commandes. Tu représentes mieux la réalité et ce sera d’autant plus facile de l’implémenter dans ton application. Tu remarques par exemple que lors d’une commande (contrairement à ta situation actuelle) on ne touchera pas à la liste des articles (sauf quantité éventuelle) mais uniquement aux listes Commandes et LignesCde.

    Ensuite, structurer et organiser tes écrans et le parcours de l’utilisateur est tout aussi important pour te faciliter la vie. Par exemple on pourrait imaginer :

    • Ecran Accueil
      • Liste des commandes dans une galerie triées par date de création décroissante
      • Barre d’actions au-dessus de la galerie avec :
        • Nouvelle commande
        • Annuler commande
        • Supprimer commande
        • Envoyer commande
      • Au clic sur une commande, navigation vers l’écran Commande
    • Ecran Commande
      • Formulaire avec les données de base de la commande
      • Galerie avec la liste des articles faisant partie de la commande
      • Barre d’actions au-dessus de la galerie des articles avec :
        • Ajouter article
        • Retirer article
      • Bouton Enregistrer
      • Bouton Envoyer

    Rien qu’avec ces 2 écrans tu pourras gérer tes commandes assez facilement.

  • Mickael

    Membre
    28 janvier 2025 à 9h37

    Bonjour @R3dKap

    Merci pour ton retour.

    Pour répondre à tes questions :

    1- De mémoire, il me semble avoir créé la seconde colonne LookUp (Sur le titre de la Liste1) afin de pouvoir mentionner le titre de la demande n’importe où où sont listés les items, sans avoir à faire un LookUp dans PA.

    2- Je ne sais aps trop comment utiliser les colonnes LookUp multi.

    En ce qui concerne mon modèle de données, on en avait déjà discuté ensemble et pour cette appli, je me suis appliqué à construire la base de données le plus proprement en fonction de ce que j’attendais de l’application.

    J’ai bien :

    • 1 liste Départements/Services
    • 1 liste catalogue (Contenant toutes les infos des articles)
    • 1 liste Commandes (Liste 1)
    • 1 liste LignesCde (Liste 2)
    • Et d’autres permettants de donner les droits, n° projet, etc…

    Cependant, cette “nouvelle” fonctionnalité ne m’a été demandé que bien après avoir développé l’appli (J’étais presque à la fin pour ainsi dire)

    Pour ce qui est du contenu des 2 listes, je n’ai pas voulu tout détailler mais, en effet, toutes les infos y sont.

    Au départ, étant parti sur une création de commande + soumission dans la foulée (Donc sans enregistrement pour modification ultérieure) le principe était le suivant :

    Ecran d’accueil avec recherche des articles du catalogue triés par catégorie (Au clic sur l’item souhaité, navigation vers écran détail de l’article.

    Ecran détail article

    Détail de l’article sélectionné, champs qté, lot, commentaire item à renseigner par l’user

    Galerie Mon Panier qui liste tous les articles ajoutés.

    Bouton valider Panier (Au clic, navigation vers écran soumettre.

    ——

    Ecran Soumettre

    Galerie Mon Panier listant tous les articles

    Champs custom afin de renseigner le département, service, n° projet, etc…

    Bouton soumettre

    —–

    Cela permet de pouvoir modifier le contenu du panier (Collection) sans toucher aux listes sur SP et de soumettre une commande complète en one shoot.

    MAlheureusement, cette demande de pouvoir mettre de côté une commande pour pouvoir la reprendre ultérieurement me mets un peu dans la m*rde.

    J’ai réussi à trouver le moyen de modifier la ligne de commande, mais mon problème vient de la liste 2 (LigneCde), je n’arrive pas à mettre à jour en ajoutant des items qui n’étaient pas présent lors de l’enregistrement de cette commande.

    J’ai tenté un remove de tous les articles ayant l’ID de la commande sélectionnée (A modifier) avant de Patcher la nouvelle liste d’articles mais le comportement est très étrange.

    Bien que mon Remove se trouve en début de formule, les “nouveaux” articles sont ajoutés et tous les articles enregistrés précedemment sont effacés de ma Liste 2.

    • Cette réponse a été modifiée Il y a 1 jour, 20 heures par  Mickael.
    • Cette réponse a été modifiée Il y a 1 jour, 19 heures par  Mickael.
  • R3dKap

    Membre
    28 janvier 2025 à 12h47

    Ok, je vois…

    Quelle mécanique as-tu prévu dans ton application pour permettre à un utilisateur de revenir sur un commande déjà existante mais non soumise ?

    As-tu rajouté un écran qui liste les commandes ? Lorsque tu cliques sur une commande sur quel écran arrives-tu ?

  • Mickael

    Membre
    28 janvier 2025 à 13h17

    @R3dKap

    En faite j’ai un bouton “Mon Panier” dans l’écran d’accueil, je pars du principe que l’user va se connecter à l’appli et sait déjà à l’avance qu’il va venir récupérer une commande initiée par un de ses collègues. Lorsque l’user clic sur le bouton “Mon Panier” (qui se trouve être vide) une gallerie s’affiche à condition que l’user fait parti du service permettant la récupération des commandes enregistrées et non soumise (Un seul service en faite)

    De là, il sélectionne la commande qu’il veut modifier et une variable vient récupérer la liste des articles déjà enregistrés pour la commande sélectionnée et agrémente la collection “Mon panier”.

    Il n’a plus qu’à aller rechercher d’autres articles à ajouter.

    Finalement, j’ai opté pour un Patch pour les nouveaux articles seulement.

    En ajoutant un toggle qui vérifie l’existance des articles présent dans Mon Panier et ayant l’ID de ma liste commande (Colonne LookUp de la Liste ligne cde). De cette manière, il ne va pas toucher aux articles précédemment enregistrés par un collègue. Et dans le cas d’une suppression d’article, j’ai ajouté un icone Trash dans la galerie, qui fait un remove de l’item sélectionné dans Mon Panier (Directement dans ma liste SP ligne cde)

    Ca à l’air de fonctionner pour le moment.

  • R3dKap

    Membre
    28 janvier 2025 à 20h43

    Je vois… Si ça marche, c’est nickel.

    Après, je sais pas où tu as mis ce toggle mais en fait tu peux t’en passer : dans ta collection Panier, les lignes qui ont une valeur dans la colonne ID SharePoint sont celles qui existent déjà dans la commande sur SharePoint, et celles qui n’en ont pas sont celles ajoutées par l’utilisateur (en effet cette colonne ID est alimentée par SharePoint au moment du Patch()).

    Autre technique : 2 collections, une avec les articles déjà dans la commande, une avec les nouveaux articles à ajouter à la commande. Et ta galerie qui affiche le panier fait la fusion des 2…

    Bref, y’a pleins de façons de faire… 😉

Connectez-vous pour répondre.