Avoir un compteur dans une collection

Étiquetté : , ,

  • Avoir un compteur dans une collection

    Posté par Alexandre sur 5 mars 2022 à 14h45

    Il y a des moments où on a besoin de numéroter les éléments d’une collection alors même que cette collection ne propose pas d’identifiant. Par exemple si vous voulez colorer en alternance chacun des éléments dans une galerie.

    L’astuce consiste à ajouter un compteur qui va être obtenu en faisant une boucle sur une séquence. Cette séquence (suite de valeurs qui sera dans notre cas 1, 2, 3, … à n éléments) sera parcouru pour créer de nouveaux enregistrements contenant à la fois l’enregistrement de la collection et le compteur.

    Voici la formule à utiliser sur la propriété items de la gallerie

    With(n    // Pour simplifier le réemploi de la formule, on mémorise juste ici la collection dans la variable 'theCollection'n    {theCollection:CustomGallerySample};n    ForAll( n        //on parcour non pas la collection mais une séquence dont le nombre d'éléments est égal au nombre d'éléments dans notre collectionn        Sequence(n            CountRows( theCollection )n        );n        //on restitue un tableau d'enregistrements n        {n            cpt: Value; // le compteur de 1 à n (n étant le nombre d'éléments dans la collection)n            item: Last( FirstN( theCollection ; Value ) ) // item contiendra le nième enregistrement de la collectionn        }n    )n)

    With : permet de définir des variables réutilisables uniquement au sein de la formule (évite de modifier le nom de la variable partout dans le code, ou permet de faire un calcul dont le résultat pourra être réutiliser dans la même formule sans être recalculé à chaques fois)
    ForAll : parcours une collection pour traiter chacun de ses éléments
    Sequence : fourni une liste de nombre
    CountRows : compte le nombre d’éléments dans une collection
    Last : récupère le dernier enregistrement d’une collection
    FirstN : récupère les N premiers enregistrements d’une collection

    Pour afficher une donnée de notre collection, on utilise tout simplement ThisItem.item.SampleHeading (SampleHeading étant un champ de notre enregistrement)

    Ensuite pour colorer alternativement chacun des éléments de la gallerie, j’utilise la fonction Mod avec 2. Par exemple la fonction suivante sur la propriété TemplateFill :

    If(n    Mod(ThisItem.cpt;2)=0 ; //si le reste de la division par 2 donne 0 (nombres pairs)n    RGBA(200; 200; 200; 1) ; //gris foncén    RGBA(240; 240; 240; 1) //gris clairn)

    En espérant que ca serve à d’autres.

    PostID=GwtPOEVrD3YiCGN

    Alexandre a répondu Il y a 11 mois, 3 semaines 1 Membre · 3 Réponses
  • 3 Réponses
  • Didier Gbenou

    Membre
    5 mars 2022 à 22h31

    Merci @Alexandre. On pourrait deplacer ce post dans la base de connaissances

    CommentID=pCYZOSSf3pKeBKx, PostID=GwtPOEVrD3YiCGN

  • R3dKap

    Membre
    6 mars 2022 à 11h09

    Merci pour l’astuce @Alexandre. Le seul inconvénient que je vois à cette technique c’est qu’au final ta sources de données se retrouve “derrière” la colonne Item par laquelle tu es obligé de passer pour accéder aux colonnes de ta source de données. Mais la technique est intéressante.

    Toujours sur ce sujet, sans modifier la source de données, j’avais imaginé une autre technique avec un petit libellé à rajouter dans une galerie :

    Il y a aussi une autre technique proposée par Matthew Devaney sur son blog, technique qui ressemble un peu à la tienne mais où il “dégroupe” le résultat final pour ne pas avoir justement sa source de données derrière une colonne “Item” :

    CommentID=1BhIdilpoZFDI1O, PostID=GwtPOEVrD3YiCGN

    • Alexandre

      Membre
      6 mars 2022 à 11h51

      Ta technique me plait par son aspect hack qui peut souvent être astucieux pour se sortir de situations “particulières”.

      La solution de Matthew Devaney est quasi identique à la mienne, mais avec un degré d’astuce bien supérieur :

      Grâce à la méthode ungroup, il ajoute à ma solution le fait d’obtenir en sortie exactement la même collection avec son compteur en plus. Du coup comme tu dis, plus besoin de cacher ses enregistrements derrière un champs ‘item’ 👍

      SubCommentID=lVwCXIDZaOykesG, CommentID=1BhIdilpoZFDI1O, PostID=GwtPOEVrD3YiCGN

Connectez-vous pour répondre.