4D ofrece potentes funciones para trabajar con colecciones de objetos. Por ejemplo, puede crear una colección de ciudades con sus países y continentes asociados. Manipular estas colecciones con funciones incorporadas como ordenar, clasificar y filtrar se convierte en un juego de niños.
4D v20 R3 introduce la nueva función multiSort() para simplificar este proceso. Con esta función, ahora puede ordenar y sincronizar fácilmente múltiples colecciones.
Nueva función
Esta nueva función multiSort() le permite realizar una ordenación sincronizada multinivel en un conjunto de colecciones.
Si se llama a la función sin parámetros, ésta tiene el mismo efecto que la función .sort(). La colección se ordena (sólo valores escalares) por defecto en orden ascendente, según su tipo.
Si desea ordenar las colecciones en otro orden que no sea ascendente, debe proporcionar una fórmula.
$col.multiSort( [ $col2; $col3 ] )
$col .multiSort( $formula; [$col2; $col3] )
También es posible definir una ordenación sincronizada de varios niveles. Esto es similar al comando SORT MULTIPLE ARRAY.
En este caso, es necesario pasar un objeto que contenga atributos de colección y orden.
$col.multiSort( [ {collection: $col2; order: ck ascending} ; $col3 ] )
$col .multiSort( [ $formula; {collection: $col2; order: ck ascending} ; $col3 ] )
Además, se dice que el algoritmo de ordenación es estable, es decir, que dos elementos con el mismo valor aparecen en el mismo orden en la salida ordenada que en el conjunto de datos de entrada.
Ejemplos
Volvamos a nuestro ejemplo de ciudad, país y continente:
var $city : Collection
var $country : Collection
var $continent : Collection
$city :=["París"; "Lyon"; "Rabat"; "Eching"; "San Diego"]
$country :=["Francia"; "Francia"; "Marruecos"; "Alemania"; "EE.UU."]
$continent :=["Europa"; "Europa"; "África"; "Europa"; "América"]
Ejemplo 1: Ordenación simple de la primera colección ($continent) con sincronización de las otras colecciones ($country y $city)
$continent.multiSort([$country; $city])
El resultado es:
"África"; "América"; "Europa"; "EE. "Morocco"; "US"; "France"; "France"; "Germany" "Rabat"; "San Diego"; "París"; "Lyon"; "Eching"
Ejemplo 2: Ordenación ascendente de la primera y tercera colecciones ($continent y $city), y sincronización para la segunda colección ($country)
$continent.multiSort($country; {collection: $city; order: ck ascending})
El resultado es:
"África"; "América"; "Europa"; "EE. "Morocco"; "US"; "Germany"; "France"; "France" "Rabat"; "San Diego"; "Eching"; "Lyon"; "París"
Ejemplo 3: Ordenación por fórmula de la primera colección ($continent) y sincronización para las otras colecciones ($country y $city)
La fórmula del ejemplo es sencilla y permite ordenar en orden descendente. Pero seguro que tienes muchas ideas para fórmulas más complejas que se adapten a tus necesidades.
$continent.multiSort(Formula($1.value>$1.value2); [$country; $city])
El resultado es:
"Europa"; "Europa"; "Europa"; "América"; "África" "Francia"; "France"; "Alemania"; "EE.UU."; "Marruecos"; "France"; "Germany"; "US"; "Morocco". "París"; "Lyon"; "Eching"; "San Diego"; "Rabat"
Ejemplo 4: Con colecciones complejas
También se puede utilizar para sincronizar colecciones de objetos.
var $name : : :=[] . ({ : "John"; : "Smith"}) . ({ : "Alain"; : "Martin"}) . ({ : "Jane"; : "Doe"}) . ({ : "John"; : "Doe"}) :=[] .({ : "Paris"; : "France"}) . ({ : "Lyon"; : "France"}) . ({ : "Eching"; : "Germany"}) . ({ : "Berlin"; : "Germany"}) . ( ( . . < . . ); [ ) 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]
El resultado es:
"Alain Martin"; "Jane Doe"; "John Smith"; "John Doe" "Lyon Francia"; "Eching Alemania"; "París Francia"; "Berlín Alemania"
Siguiente…
Para más información, consulte la documentación. Puede compartir sus comentarios y casos de uso en el foro.