Insertion de N enregistrements dans une collection

Étiquetté : , ,

  • Insertion de N enregistrements dans une collection

    Posté par Youcef DOUMANDJI sur 7 mars 2023 à 14h04

    Bonjour,

    J’ai toujours mon problème d’insertion d’un certain nombre d’enregistrements dans une collection cible pour chaque enregistrement d’une collection source.

    J’ai commencé avec le code suivant :

    ForAll(n    Col_Source,n    Collect(n        Col_Target,n        {n            Field1: ThisRecord.'Account Name',n            Field2: ThisRecord.'Created On'n        }n    );n    Collect(n        Col_Target,n        Col_Source,n        {n            Field1: ThisRecord.'Account Name',n            Field2: DateAdd(ThisRecord.'Created On',1)n        }n    );n    Collect(n        Col_Target,n        Col_Source,n        {n            Field1: ThisRecord.'Account Name',n            Field2: DateAdd(ThisRecord.'Created On', 2 )n        }n    )n)

    Qui est censé me générer 2 enregistrements supplémentaires pour chaque enregistrement de ma source. Cela fonctionne mais au lieu de ne me créer que 27 enregistrements (ma source en contient 9) eh bien ! je me retrouve avec 189 lignes (27 plus la différence en lignes vides).

    Outre ce problème j’aimerai introduire une variable N et pouvoir écrire la formule de façon plus compacte (s’il y a N jours à rajouter , je ne voudrai pas répéter N fois le collect).

    et après génération :

    PostID=dx2TzeXzF3eQOD0

    Youcef DOUMANDJI a répondu Il y a 9 mois, 3 semaines 1 Membre · 10 Réponses
  • 10 Réponses
  • DavidZed

    Membre
    7 mars 2023 à 16h43

    Hello Youcef DOUMANDJI ,

    Essaies en enlevant le Col_Source des deux derniers Collect() 👍

    CommentID=Mi47NjK7XMF9wLZ, PostID=dx2TzeXzF3eQOD0

    • Youcef DOUMANDJI

      Membre
      7 mars 2023 à 16h50

      Bonjour David,

      Super ! Cela marche.

      Aurais-tu une idée de ce que pourrait être la formule pour introduire N enregistrements et ne pas avoir à écrire de façon explicite ?

      SubCommentID=4LOFhnVqGY3JqPq, CommentID=Mi47NjK7XMF9wLZ, PostID=dx2TzeXzF3eQOD0

    • DavidZed

      Membre
      7 mars 2023 à 20h04

      Cela devrait ressembler à :

      ForAll(Col_Source As SourceRecord,ForAll(Sequence(3,0) As SequenceRecord, Collect(Col_Target,{Field1: SourceRecord.’Account Name’, Field2: DateAdd(SourceRecord.’Created On’, SequenceRecord.Value)})))

      En gros, 2 ForAll Imbriqués, dans le second on utilise Sequence pour déterminer le nombre de jours à ajouter, je n’ai pas testé, mais théoriquement ça devrait fonctionner.

      Et on utilise ‘As’ pour attribuer des noms aux valeurs et remplacer le ‘ThisRecord’

      Il y a un moyen plus optimisé, mais je ne suis plus trop sûr, je vais tester avant 😀

      SubCommentID=eLeYsyJ2nx6aPLC, CommentID=Mi47NjK7XMF9wLZ, PostID=dx2TzeXzF3eQOD0

  • DavidZed

    Membre
    7 mars 2023 à 21h09

    Alors après test, cette formule est plus optimisée que la précédente :

    Clear(Col_Target);nForAll(n    Sequence(n        3,n        0n    ) As SequenceRecord,n    Collect(n        Col_Target,n        ForAll(n            Col_Source As SourceRecord,n            {n                Field1: SourceRecord.'Display Name',n                Field2: DateAdd(n                    SourceRecord.'Created On',n                    SequenceRecord.Value,n                    TimeUnit.Daysn                )n            }n        )n    )n)

    Tu vas faire 3 passes de Collect sur le Sequence, mais en revanche la référence à ta source sera collectée en lot.

    Pour illustrer le gain de perf sur 2K+ éléments :

    CommentID=eH4NOyd35xAfHSN, PostID=dx2TzeXzF3eQOD0

    • Youcef DOUMANDJI

      Membre
      8 mars 2023 à 12h59

      Bonjour David,

      Excellent ! Merci infiniment.

      Youcef

      SubCommentID=KzY1DPhemcum6cB, CommentID=eH4NOyd35xAfHSN, PostID=dx2TzeXzF3eQOD0

    • Youcef DOUMANDJI

      Membre
      8 mars 2023 à 13h28

      Comme je voulais avoir un enregistrement pour le matin(AM) et un pour l’après-midi (PM) j’ai modifié ton code ainsi et cela marche super bien :

      Clear(Col_Target);nForAll(n    Sequence(N,0) As SequenceRecord,n    Collect(Col_Target,n        ForAll(Col_Source As SourceRecord,n            {n                Field1: SourceRecord.'Account Name',n                Field2: DateAdd(SourceRecord.'Created On',SequenceRecord.Value,TimeUnit.Days),n                Field3: "AM"n            }n        ),n        ForAll(Col_Source As SourceRecord,n            {n                Field1: SourceRecord.'Account Name',n                Field2: DateAdd(SourceRecord.'Created On',SequenceRecord.Value,TimeUnit.Days),n                Field3: "PM"n            }n        )n    )n)

      SubCommentID=OTbrg1viComoJ1E, CommentID=eH4NOyd35xAfHSN, PostID=dx2TzeXzF3eQOD0

  • DavidZed

    Membre
    8 mars 2023 à 14h12

    Du coup, le sequence était adapté pour une suite d’entiers, si tu ajoutes AM / PM, tu dois pouvoir imbriquer un autre ForAll :

    ForAll(Table(“AM”,”PM”) As MidDayRecord ….

    et mettre pour le Field3 :

    Field3: MidDayRecord.Value

    CommentID=wM4hYmAEuBsRZcF, PostID=dx2TzeXzF3eQOD0

    • Youcef DOUMANDJI

      Membre
      25 mars 2023 à 12h57

      Bonjour David,

      Très ingénieux.

      J’ai un autre souci, si tu le permets ;

      Je reviens à mon application d’origine dans laquelle je veux générer une feuile de présence. J’ai le soucis de récupérer le nom du stagiaire quand je complète ma collection “ColEmargementsStagiaires” (les noms des stagiaires sont stockés dans la collection “ColNomsdesStagiaires”). Voici mon code qui se divise en deux blocs. Le bloc 2 me permet d’ajouter N enregistrements avec une signature vide pour les jours de la semaine qui ne sont pas sélectionnés entre StartDate et EndDate :

       //Alimentation de la collection des émargements des stagiaires nClearCollect(n    ColEmargementsStagiaires;n    Filter(n        'Sessions stagiaires';n        Formation.'Nom de la formation' = VarNomdelaFormation && Date >= StartDate && Date <= EndDaten          )n            );;n//Ajout dans la collection des émargements des stagiaires d'enregistrements vides de signatures pour chaque stagiaire (matin et après-midi) des dates de la semaine manquantesnForAll(n    Sequence(N) As DateCounter;n    Collect(ColEmargementsStagiaires;n        ForAll(ColNomsStagiaires As SourceRecord;n                // Ajout pour chaque stagiaire d'un enregistrement pour le matin n                    {n                Date: DateAdd(EndDate;DateCounter.Value;TimeUnit.Days);n                Signature: Blank();n                Stagiaire:SourceRecord.Stagiaire;n                //'Demie journée':"Matinn                    }n        ));;n        ForAll(ColNomsStagiaires;n        Collect(ColEmargementsStagiaires;n              // Ajout pour chaque stagiaire d'un enregistrement pour l'après-midi n                    {n                Date: DateAdd(EndDate;DateCounter.Value;TimeUnit.Days);n                Signature: Blank()n                //Stagiaire:SourceRecord.Stagiairen                //'Demie journée':"Après-midi"n                    }n                )n            )n        )

      SubCommentID=ZZtLhrc7uaZ8vYC, CommentID=wM4hYmAEuBsRZcF, PostID=dx2TzeXzF3eQOD0

    • DavidZed

      Membre
      27 mars 2023 à 7h29

      Hello,

      Il faudrait une vue plus précise de l’erreur pour en dire plus. A première vue, c’est le SourceRecord.Stagiaire qui pose soucis.

      SubCommentID=WENkpUKpOX8hzaV, CommentID=wM4hYmAEuBsRZcF, PostID=dx2TzeXzF3eQOD0

    • Youcef DOUMANDJI

      Membre
      27 mars 2023 à 9h04

      Bonjour David,

      Désolé si je n’ai pas été clair.

      En fait j’ai les noms des stagiaires concernés dans la collection ColNomsStagiaires et je veux rajouter des lignes pour caque stagiaire dans la collection cible ColEmargementsStagiaires. Dans la boucle principale ForAll j’ai deux boucles imbriquées qui devraient me rajouter pour chaque stagiaire un certain nombre (N) d’enregistrements dans ma collection cible.

      Dans mes deux boucles imbriquées j’ai l’instruction Stagiaire: SourceRecord.Stagiaire par laquelle je pensais pouvoir récupérer le nom du stagiaire (dans la deuxième boucle j’ai mis cette instrcution en commentaires).

      En fait je n’arrive pas à récupérer le nom du stagiaire dans la collection cible lorsque je rajoute des enregistrements avec signature vide. J’en ai besoin de ce nom car plus loin je trie les données pour alimenter une gallerie.

      J’espère avoir été plus clair.

      Merci d’avance pour ton temps.

      Youcef

      SubCommentID=HNOXo0jRhBze6e9, CommentID=wM4hYmAEuBsRZcF, PostID=dx2TzeXzF3eQOD0

Connectez-vous pour répondre.