Uma vez que a ORDA lhe permite trabalhar com várias selecções de entidades simultaneamente, temos a certeza de que tira partido disto ao passar as selecções de entidades como parâmetro para métodos de projecto ou para funções das classes de modelos de dados ORDA.
Para trabalhar eficientemente com programação orientada a objectos usando o menor número possível de linhas de código, é preciso funções robustas e optimizadas. É por isso que com 4D v19 R3, estamos a enviar uma nova função disponível no objecto entitySelection: o selected() função.
Graças a ela, poderá inspeccionar e comparar duas selecções de entidades. Vamos ver os detalhes!
a nova função seleccionada()
Dadas duas selecções de entidades entitySel1 e entitySel2, esta função retorna os índices de entidades de entitySel2 dentro de entitySel1.
Percebeu? Aqui está um exemplo:
var $invoices; $selection: cs.InvoicesSelection
var $result : Object
$invoices :=ds.Invoices.all()
$selection :=ds.Invoices.query("pagamento = :1"; "Dinheiro")
$result :=$invoices.selected($selection)
// $result = {ranges:[{start:1,end:1},{start:9,end:12},{start:18,end:18},{start:21,end:25}]}
O selected() A função devolve um objecto com uma propriedade ranges que é uma colecção de objectos.
Estes objectos designam uma série de entidades (início # fim) ou uma única entidade (início = fim).
As entidades Invoices que têm pagamento = “Dinheiro” entre todas as facturas são as que têm índices:
- 1
- 9 a 12
- 18
- 21 a 25
um caso de utilização concreta
Imagine uma biblioteca com livros sobre diferentes assuntos (História, Arte, Ciência, …). Aqui está a tabela dos Livros:
Numa página HTML, queremos destacar os livros sobre um determinado assunto.
Para isso, temos um método de projecto highlight chamado como uma ACÇÃO 4D com um parâmetro de assunto.
highlight código do método do projecto:
var $index : Integer
var $subject ; $text: Text
var $onSubject : cs.BooksSelection
var $indices; : $range Objecto
: : ( ; 0) ( ; 0 ( ; ) := ( ; "assunto") var $titles Collection
var $i Integer
ARRAY TEXT$anames
ARRAY TEXT$avalues
WEB GET VARIABLES$anames $avalues
//Get the subject
$indexFind in array$anames
$subject := { } $avalues$index
//Search books about the given $subject
$onSubject:= .. ("assunto = :1"; ) := .. . ( ) := . . . . ( ; . ) ( ; . ; . ) [ ]:="<b>"+ [ ]+"</b>" := . ("<br/>") dsBooksquery $subject
//Get ranges of books about the subject
$indicesdsBooksall()selected$onSubject
//Build a collection with all the titles
$titlesdsBooksall()title
// Loop on the $indices.ranges collection of objects
// $indices.ranges is [{start:0,end:0},{start:2,end:4},{start:7,end:9},{start:11,end:11}]
For each$range $indicesranges
For$i $rangestart $rangeend
$titles$i$titles$i
End for
End for each
// Build a text with carriage returns
$text$titlesjoin
WEB SEND TEXT (
$text)
Agora vamos correr 4DACTION/highlight?subject=Historia num browser.
Aqui está o resultado:
Agora vamos escrever código optimizado com selecções de entidades!