4D offre potenti funzioni per lavorare con collezioni di oggetti. Ad esempio, è possibile creare una collezione di città con i relativi paesi e continenti. La manipolazione di queste raccolte con le funzioni integrate come l’ordinamento, l’ordine e il filtro diventa un gioco da ragazzi.
4D v20 R3 introduce la nuova funzione multiSort() per semplificare questo processo. Con questa funzione è ora possibile ordinare e sincronizzare facilmente più raccolte.
Nuova funzione
La nuova funzione multiSort() consente di eseguire un ordinamento sincronizzato a più livelli su un insieme di raccolte.
Se la funzione viene chiamata senza parametri, ha lo stesso effetto della funzione .sort(). Per impostazione predefinita, l’insieme viene ordinato (solo per i valori scalari) in ordine crescente, in base al loro tipo.
Se si desidera ordinare le collezioni in un ordine diverso da quello ascendente, è necessario fornire una formula.
$col.multiSort( [ $col2; $col3 ] )
$col .multiSort( $formula; [$col2; $col3] )
È anche possibile definire un ordinamento sincronizzato a più livelli. È simile al comando SORT MULTIPLE ARRAY.
In questo caso, è necessario passare un oggetto contenente gli attributi della collezione e dell’ordine.
$col.multiSort( [ {collection: $col2; order: ck ascending} ; $col3 ] )
$col .multiSort( [ $formula; {collection: $col2; order: ck ascending} ; $col3 ] )
Inoltre, l’algoritmo di ordinamento è detto stabile, cioè due elementi con lo stesso valore appaiono nello stesso ordine nell’output ordinato come nel set di dati di input.
Esempi
Torniamo al nostro esempio di città, paese e continente:
var $city : Collection
var $country : Collection
var $continent : Collection
$city :=["Parigi"; "Lione"; "Rabat"; "Eching"; "San Diego"]
$country :=["Francia"; "Francia"; "Marocco"; "Germania"; "Stati Uniti"]
$continent :=["Europa"; "Europa"; "Africa"; "Europa"; "America"]
Esempio 1: Un semplice ordinamento della prima collezione ($continent) con la sincronizzazione delle altre collezioni ($country e $city)
$continent.multiSort([$country; $city])
Il risultato è:
"Africa"; "America"; "Europa"; "Europa"; "Europa". "Marocco"; "USA"; "Francia"; "Francia"; "Germania" "Rabat"; "San Diego"; "Parigi"; "Lione"; "Eching".
Esempio 2: ordinamento ascendente della prima e della terza collezione ($continent e $city), e sincronizzazione per la seconda collezione ($country)
$continent.multiSort($country; {collection: $city; order: ck ascending})
Il risultato è:
"Africa"; "America"; "Europa"; "Europa"; "Europa". "Marocco"; "Stati Uniti"; "Germania"; "Francia"; "Francia" "Rabat"; "San Diego"; "Eching"; "Lione"; "Parigi".
Esempio 3: Formula di ordinamento della prima collezione ($continent) e sincronizzazione per le altre collezioni ($country e $city)
La formula dell’esempio è semplice e consente di ordinare in ordine decrescente. Ma probabilmente avete molte idee per formule più complesse, adatte alle vostre esigenze.
$continent.multiSort(Formula($1.value>$1.value2); [$country; $city])
Il risultato è:
"Europa"; "Europa"; "Europa"; "America"; "Africa". "Francia"; "Francia"; "Germania"; "USA"; "Marocco" "Parigi"; "Lione"; "Eching"; "San Diego"; "Rabat".
Esempio 4: Con collezioni complesse
Si può usare anche per sincronizzare collezioni di oggetti.
var $name : : :=[] . ({ : "John"; : "Smith"}) . ({ : "Alain"; : "Martin"}) . ({ : "Jane"; : "Doe"}) . ({ : "John"; : "Doe"}) :=[] .({ : "Parigi"; : "Francia"}) . ({ : "Lione"; : "Francia"}) . ({ : "Eching"; : "Germania"}) . ({ : "Berlino"; : "Germania"}) . ( ( . . < . . ); [ ) 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]
Il risultato è:
"Alain Martin"; "Jane Doe"; "John Smith"; "John Doe". "Lione Francia"; "Eching Germania"; "Parigi Francia"; "Berlino Germania".
Avanti…
Per ulteriori informazioni, consultare la documentazione. Potete condividere il vostro feedback e i vostri casi d’uso sul forum.