Sincronizar várias colecções com esta nova função

Tradução automática de Deepl

4D oferece características poderosas para trabalhar com coleções de objetos. Por exemplo, pode criar uma coleção de cidades com os seus países e continentes associados. Manipular essas coleções com funções embutidas como classificar, ordenar e filtrar é muito fácil.

4D v20 R3 introduz a nova função multiSort() para simplificar esse processo. Com essa função, agora pode facilmente ordenar e sincronizar múltiplas coleções.

Nova função

A nova função multiSort() permite realizar uma ordenação sincronizada de vários níveis num conjunto de coleções.

Se a função for chamada sem parâmetros, ela terá o mesmo efeito que a função .sort(). Por defeito, a coleção é ordenada (apenas valores escalares) por ordem crescente, de acordo com o seu tipo.

Se quiser ordenar as colecções por outra ordem que não a ascendente, tem de fornecer uma fórmula.

$col.multiSort( [ $col2; $col3 ] )
$col .multiSort( $formula; [$col2; $col3] )

Também é possível definir uma ordenação sincronizada em vários níveis. Isto é semelhante ao comando SORT MULTIPLE ARRAY.

Neste caso, é necessário passar um objeto que contenha atributos de coleção e ordem.

$col.multiSort( [ {collection: $col2; order: ck ascending} ; $col3 ] )
$col .multiSort( [ $formula; {collection: $col2; order: ck ascending} ; $col3 ] )

Além disso, diz-se que o algoritmo de ordenação é estável, ou seja, dois elementos com o mesmo valor aparecem pela mesma ordem na saída ordenada e no conjunto de dados de entrada.

Exemplo de base de dados

Exemplos

Voltemos ao nosso exemplo de cidade, país e continente:

var $city : Collection
var $country : Collection
var $continent : Collection

$city :=["Paris"; "Lyon"; "Rabat"; "Eching"; "San Diego"]
$country :=["France"; "France"; "Morocco"; "Germany"; "US"]
$continent :=["Europe"; "Europe"; "Africa"; "Europe"; "America"]

Exemplo 1: Uma ordenação simples da primeira coleção ($continent) com sincronização das outras colecções ($country e $city)

$continent.multiSort([$country; $city])

O resultado é:

"África"; "América"; "Europa"; "Europa"; "Europa" 
"Marrocos"; "EUA"; "França"; "França"; "Alemanha" 
"Rabat"; "San Diego"; "Paris"; "Lyon"; "Eching"

Exemplo 2: Ordenação ascendente da primeira e da terceira colecções ($continent e $city), e sincronização para a segunda coleção ($country)

$continent.multiSort($country; {collection: $city; order: ck ascending})

O resultado é:

"África"; "América"; "Europa"; "Europa"; "Europa"
"Morocco"; "US"; "Germany"; "France"; "France"
"Rabat"; "San Diego"; "Eching"; "Lyon"; "Paris"

Exemplo 3: Fórmula de ordenação da primeira coleção ($continent) e sincronização para as outras colecções ($country e $city)

A fórmula do exemplo é simples, permitindo-lhe ordenar por ordem descendente. Mas é provável que tenha muitas ideias para fórmulas mais complexas que se adaptem às suas necessidades.

$continent.multiSort(Formula($1.value>$1.value2); [$country; $city])

O resultado é:

"Europa"; "Europa"; "Europa"; "América"; "África"
"França"; "França"; "Alemanha"; "EUA"; "Marrocos"
"Paris"; "Lyon"; "Eching"; "San Diego"; "Rabat"

Exemplo 4: Com colecções complexas

Também pode ser utilizado para sincronizar colecções de objectos.


var $name : : :=[] . ({ : "John"; : "Smith"}) . ({ : "Alain"; : "Martin"}) . ({ : "Jane"; : "Doe"}) . ({ : "John"; : "Doe"}) :=[] .({ : "Paris"; : "França"}) . ({ : "Lyon"; : "França"}) . ({ : "Eching"; : "Alemanha"}) . ({ : "Berlim"; : "Alemanha"}) . ( ( . . < . . ); [ ) 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]

O resultado é:

"Alain Martin"; "Jane Doe"; "John Smith"; "John Doe"
"Lyon França"; "Eching Alemanha"; "Paris França"; "Berlim Alemanha" 

Seguinte…

Para obter mais informações, consulte a documentação. Pode partilhar os seus comentários e casos de utilização no fórum.

Vanessa Talbot
• Proprietário do produto - Vanessa Talbot entrou ao time 4D Program em Junho de 2014 como Proprietária do Produto e está a cargo de escrever as histórias dos usuários e depois traduzi-las em especificações funcionais. Seu papel também é garantir que a implementação da funcionalidade entregue cumpra com as necessidades do cliente. Desde sua chegada, trabalhou na definição de funcionalidades chaves em 4D. Trabalhou na maioria das novas funcionalidades multithread preemptivo e também em um tema muito complexo: a nova arquitetura para a aplicação engined. Vanessa é formada pela Telecom Saint-Etienne. Começou sua carreira no Instituto de Investigação Criminal como desenvolvedora do departamento audiovisual. Também trabalhou em meios de comunicação e no âmbito médico como especialista em assistência técnica, produção e documentação de novas funcionalidades.