4D offre de puissantes fonctionnalités pour travailler avec des collections d’objets. Par exemple, vous pouvez créer une collection de villes avec leurs pays et continents associés. La manipulation de ces collections à l’aide de fonctions intégrées telles que le tri, l’ordonnancement ou le filtrage devient un jeu d’enfant.
4D v20 R3 introduit la nouvelle fonction multiSort() pour simplifier ce processus. Grâce à cette fonction, vous pouvez désormais facilement trier et synchroniser plusieurs collections.
Nouvelle fonction
La nouvelle fonction multiSort() vous permet d’effectuer un tri synchronisé à plusieurs niveaux sur un ensemble de collections.
Si la fonction est appelée sans paramètres, elle a le même effet que la fonction .sort(). La collection est triée (uniquement les valeurs scalaires) par défaut dans l’ordre croissant, en fonction de leur type.
Si vous souhaitez trier les collections dans un autre ordre que l’ordre croissant, vous devez fournir une formule.
$col.multiSort( [ $col2; $col3 ] )
$col.multiSort( $formula; [$col2; $col3] )
Il est également possible de définir un tri synchronisé à plusieurs niveaux. Ceci est similaire à la commande SORT MULTIPLE ARRAY.
Dans ce cas, vous devez passer un objet contenant les attributs, collection et order.
$col.multiSort( [ {collection: $col2; order: ck ascending} ; $col3 ] )
$col.multiSort( [ $formula; {collection: $col2; order: ck ascending} ; $col3 ] )
En outre, l’algorithme de tri est dit stable, c’est-à-dire que deux éléments ayant la même valeur apparaissent dans le même ordre dans la sortie triée que dans les données d’entrée.
Exemples de base de données
Reprenons notre exemple de ville, de pays et de continent :
var $city : Collection
var $country : Collection
var $continent : Collection
$city:=["Paris" ; "Lyon" ; "Rabat" ; "Eching" ; "San Diego"]
$country:=["France" ; "France" ; "Maroc" ; "Allemagne" ; "US"]
$continent:=["Europe" ; "Europe" ; "Afrique" ; "Europe" ; "Amérique"]
Exemple 1 : Un tri simple de la première collection ($continent) avec synchronisation des autres collections ($country et $city)
$continent.multiSort([$country; $city])
Le résultat est le suivant :
"Afrique" ; "Amérique" ; "Europe" ; "Europe" ; "Europe" "Maroc" ; "US" ; "France" ; "France" ; "Allemagne" "Rabat" ; "San Diego" ; "Paris" ; "Lyon" ; "Eching"
Exemple 2 : Tri croissant de la première et de la troisième collection ($continent et $city), et synchronisation pour la deuxième collection ($country)
$continent.multiSort($country; {collection: $city; order: ck ascending})
Le résultat est le suivant :
"Afrique" ; "Amérique" ; "Europe" ; "Europe" ; "Europe" "Maroc" ; "US" ; "Allemagne" ; "France" ; "France" "Rabat" ; "San Diego" ; "Eching" ; "Lyon" ; "Paris"
Exemple 3 : Formule de tri de la première collection ($continent) et synchronisation pour les autres collections ($country et $city)
La formule de l’exemple est simple et vous permet de trier par ordre décroissant. Mais vous avez probablement de nombreuses idées de formules plus complexes pour répondre à vos besoins.
$continent.multiSort(Formula($1.value>$1.value2) ; [$country; $city])
Le résultat est le suivant :
"Europe" ; "Europe" ; "Europe" ; "Amérique" ; "Afrique" "France" ; "France" ; "Allemagne" ; "US" ; "Maroc" "Paris" ; "Lyon" ; "Eching" ; "San Diego" ; "Rabat"
Exemple 4 : avec des collections complexes
Vous pouvez également l’utiliser pour synchroniser des collections d’objets.
var $name : Collection
var $address : Collection
$name:=[]
$name.push({firstname: "John"; lastname: "Smith"})
$name.push({firstname: "Alain"; lastname: "Martin"})
$name.push({firstname: "Jane"; lastname: "Doe"})
$name.push({firstname: "John"; lastname: "Doe"})
$address:=[]
$address.push({city: "Paris"; country: "France"})
$address.push({city: "Lyon"; country: "France"})
$address.push({city: "Eching"; country: "Germany"})
$address.push({city: "Berlin"; country: "Germany"})
$name.multiSort(Formula($1.value.firstname<$1.value2.firstname); [$address])
Le résultat est le suivant :
"Alain Martin" ; "Jane Doe" ; "John Smith" ; "John Doe" "Lyon France" ; "Eching Allemagne" ; "Paris France" ; "Berlin Allemagne"
Suite…
Pour plus d’informations, veuillez vous référer à la documentation. Vous pouvez partager vos commentaires et vos cas d’utilisation sur le forum.