Synchroniser plusieurs collections avec cette nouvelle fonction

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.

Exemple de base de données

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 : :=[] . ({ : "John" ; : "Smith"}) . ({ : "Alain" ; : "Martin"}) . ({ : "Jane" ; : "Doe"}) . ({ : "John" ; : "Doe"}) :=[] .({ : "Paris" ; : "France"}) . ({ : "Lyon" ; : "France"}) . ({ : "Eching" ; : "Allemagne"}) . ({ : "Berlin" ; : "Allemagne"}) . ( ( . . < . . ) ; [ ) Collection
var $address Collection
$name
$namepushfirstname lastname
$namepushfirstname lastname
$namepushfirstname lastname
$namepushfirstname lastname
$address
$addresspushcity country
$addresspushcity country
$addresspushcity country
$addresspushcity country

$namemultiSortFormula$1valuefirstname$1value2firstname$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.

Vanessa Talbot
- Product Owner -Vanessa Talbot a rejoint l'équipe du programme 4D en juin 2014. En tant que Product Owner, elle est chargée de rédiger les user stories puis de les traduire en spécifications fonctionnelles. Son rôle est également de s'assurer que l'implémentation des fonctionnalités livrées répond aux besoins des clients.Depuis son arrivée, elle a travaillé à la définition des fonctionnalités clés de 4D. Elle a travaillé sur la plupart des nouvelles fonctionnalités de multithreading préemptif et aussi sur un sujet très complexe : la nouvelle architecture pour les applications enginées. Vanessa est diplômée de Telecom Saint-Etienne. Elle a commencé sa carrière à l'Institut de Recherche Criminelle en tant que développeur pour le département audiovisuel. Elle a également travaillé dans les domaines des médias et du médical en tant qu'experte en support technique, en production ainsi qu'en documentation de nouvelles fonctionnalités.