Mise à jour de plusieurs enregistrements

Étiquetté : 

  • Mise à jour de plusieurs enregistrements

    Posté par Vince sur 14 mai 2022 à 5h22

    Bonjour à tous,
    Dans une app, j’ai une galerie sur laquelle j’applique des filtres.
    Une fois mes éléments filtrés je ‘stock’ le résultat dans une collection ‘Temp’.
    Je voudrais ensuite mettre à jour un champ OUI/NON de la liste de cette galerie en utilisant les élément de la collection

    Voici ce que j’ai fais
    ForAll(Temp;
    Patch(T_Liste_VEH;LookUp(T_Liste_VEH;Num_VEH = Num_VEH)
    {VehDisponible:true})
    )

    …et bien sur ça ne fonctionne pas, d’où la raison de mon appel à l’aide
    Je vous met en annexe le message que je reçois

    PostID=DvDmlANkdWsNjSD

    Vince a répondu Il y a 11 mois, 3 semaines 1 Membre · 8 Réponses
  • 8 Réponses
  • Vince

    Membre
    14 mai 2022 à 11h37

    C’est bon, j’ai trouvé
    ForAll(Temp;UpdateIf(T_Liste_VEH;Num_VEH=Num_VEH;{VehDisponible:true}))

    Ca peut être utile à quelqu’un 😉

    CommentID=2wnDjzYE3luJC6i, PostID=DvDmlANkdWsNjSD

  • Vince

    Membre
    14 mai 2022 à 15h07

    Et bien non !!!
    J’ai parlé trop vite, il met tout la liste à jour …. GRRRRR😧

    CommentID=nwT98layn5OOWPO, PostID=DvDmlANkdWsNjSD

  • DavidZed

    Membre
    14 mai 2022 à 17h25

    Bonjour,

    Il te faut mettre ton test logique true/false dans un filter sur la source de ton forall:

    Forall(Filter(Temp;VehDisponible=true);Patch(T_Liste_VEH;Thisrecord;{Num_VEH:ThisRecord.Num_VEH}))

    Ce qui donne en gros :

    Pour tous les enregistrements de ma collection “Temp” qui ont la valeur disponible=true, met à jour l’enregistrement correspondant dans ma source de données “T_liste”

    Si ca ne marche toujours pas, il faudra peut-etre insérer un remove column(*ton filtre*;”VehDisponible:true”) toujours dans la source du forall

    CommentID=COT3xNCASc7ABtU, PostID=DvDmlANkdWsNjSD

  • Vince

    Membre
    15 mai 2022 à 6h04

    Salut,

    Je ne comprends pas, tout les enregistrements de ma collection temp on une valeur ‘Disponible’ = false.

    Mon problèmes est que la mise à jour se fait bien, mais elle ne se limite pas aux enregistrements de la collection Temp, toute la liste est mise à jour !!!

    CommentID=2yVESsG4uJ9xYOr, PostID=DvDmlANkdWsNjSD

  • DavidZed

    Membre
    15 mai 2022 à 17h05

    Salut, le problème vient de ton patch dans ton ForAll, dans le paramètre record,

    ForAll(Temp;
    Patch(T_Liste_VEH;LookUp(T_Liste_VEH;Num_VEH = Num_VEH)
    {VehDisponible:true})
    )

    A cet endroit, tu es censé faire le lien entre le record de ta collection que tu es en train d’évaluer dans ton Forall et le record correspondant dans ta source de données.
    Or il y a deux soucis dans ta formule :

    → ton lookup() ne se base que sur des données de la source de données, techniquement, chaque itération du forall devrait patcher le 1er record de la liste

    → il n’y a pas de “;” pour séparer l’argument record de l’argument modification de ton patch (2eme et 3eme arguments). Donc je pense que ton patch ignore totalement le lookup et interprete ton 2eme argument comme la modification: à chaque itération du for all, il patch tous les records de ta list pour leur mettre {VehDisponible:true}

    J’ai mal compris ton besoin dans mon premier post, tu n’as pas besoin de mettre le filtre dans le forall:

    Forall(Temp;Patch(T_Liste_VEH;Thisrecord;{VehDisponible:true}))

    CommentID=xrE4PzqADfDDuJB, PostID=DvDmlANkdWsNjSD

    • Vince

      Membre
      15 mai 2022 à 18h59

      Comment faire appel au record alors??

      Ta 2eme remarque, bien que tout a fait correcte, ne s’applique pas, j’ai simplement oublié le “;” dans ce que j’ai recopier l’instruction ici (mea culpa).

      La référence à l’enregistrement balayé par le ForAll de la collection Temp, s’appelle de la même façon que le champ de la liste qui doit être MàJ.
      LookUp(T_Liste_VEH;Num_VEH = Num_VEH)

      J’ai essayé un truc du genre :
      LookUp(T_Liste_VEH;Num_VEH = Temp.Num_VEH)
      Pas concluent non plus !!!

      Je comprends vraiment pas comment faire, j’ai essayé ceci, mais là il n’y a aucune MàJ qui se produit

      ForAll((Gallery1.AllItems);
      Patch(T_Liste_VEH;
      LookUp(T_Liste_VEH;Num_VEH=LabNum_VEH.Text);
      {VehDisponible:true})
      )
      La encore une fois aucune erreur de syntaxe mais pas de résultat
      😞 😓

      SubCommentID=BtkiTUdgm1y04GC, CommentID=xrE4PzqADfDDuJB, PostID=DvDmlANkdWsNjSD

  • R3dKap

    Membre
    15 mai 2022 à 19h26

    Salut @Vince,

    Alors tout d’abord : t’es pas obligé de passer par une collection. Tu peux directement boucler sur la propriété AllItems de ta galerie… EDIT: ah bin je vois que c’est ce que t’as fait dans ta dernière formule ci-dessus… 👍

    Du coup, ta formule devrait fonctionner mais tant qu’à faire voici comment l’améliorer :

    ForAll(n    Gallery1.AllItems As LoopItem;n    Patch(n        T_Liste_VEH;n        LookUp(n            T_Liste_VEH;n            Num_VEH=LoopItem.Num_VEHn        );n        {n            VehDisponible:truen        }n    )n)

    En effet, pour éviter de se mélanger les pinceaux dans les noms des champs selon le niveau de profondeur où on se trouve dans une formule complexe, on utilise le mot-clé As comme tu peux le voir dans ma formule ci-dessus.

    Ensuite, pour le LookUp() de ton Patch(), si ta galerie est bien alimentée par ta liste T_Liste_VEH, tant qu’à faire autant exploiter les champs de la liste en question, d’où le test Num_VEH=LoopItem.Num_VEH.

    Dis-nous si c’est bon cette fois…

    PS : tu devrait pouvoir faire la même chose de cette façon également…

    UpdateIf(n    T_Liste_VEH; n    Num_VEH in ShowColumns(Gallery1.AllItems; "Num_VEH");n    {VehDisponible: true}n)

    CommentID=J8rCjGE4tWTQMGF, PostID=DvDmlANkdWsNjSD

    • Vince

      Membre
      16 mai 2022 à 5h50

      Salut Manu,

      Ca marche, c’est parfait.
      Donc l’astuce vient du fait de “renomer” le champ auquel je fait référence dans la boucle.
      Je ne connaissais pas ce AS bien pratique.

      Merci encore (à vous 2)

      👍

      SubCommentID=nL6mLogGSz4c2bW, CommentID=J8rCjGE4tWTQMGF, PostID=DvDmlANkdWsNjSD

Connectez-vous pour répondre.