ORDA – Genealogia – Episodio due

Tradotto automaticamente da Deepl

Nel primo episodio di questa trilogia, abbiamo mostrato le basi di ORDA utilizzando caselle di riepilogo, entità e selezioni di entità. Oggi andremo un po’ più a fondo, eseguendo alcune query che sfrutteranno le relazioni ricorsive. Daremo anche una rapida occhiata a come visualizzare le caselle di riepilogo in modo gradevole, utilizzando la proprietà “meta info expression”.

Scarica Genealogia – Episodio due

scenario d’uso

Ho selezionato una persona in un elenco molto ampio e ora voglio trovare i suoi genitori e i suoi nonni. Voglio anche i suoi fratelli e sorelle… e i suoi figli, se ne ha! Perché non gli zii… e i cugini?
Ci vorrà un’eternità per tutto questo? Scopriamolo.

cominciamo dall’inizio!

La selezione dell’entità people conterrà le persone nate dopo il 1° gennaio 1960 e sarà salvata all’interno dell’oggetto Form:

Form.people:=ds.PEOPLE.query("Birthday >= :1";!1960-01-01!).orderBy("Birthday asc, Lastname asc, Firstname asc")

Si noti questo formato di query altamente raccomandato, che utilizza segnaposto (:1) e parametri (!1960-01-01!).

IMPOSTARE LA CASELLA DI RIEPILOGO

Come abbiamo visto nel post precedente, la selezione dell’entità(Form.people) è impostata all’inizio come proprietà di selezione dell’entità.

La casella di riepilogo, basata su una selezione di entità, ha un paio di nuove proprietà. Ne descriveremo tre: Elemento corrente, Elementi selezionati e Espressione meta info.

L’elemento corrente e gli elementi selezionati saranno aggiornati automaticamente quando l’utente cambierà la selezione della casella di riepilogo:

L’elemento corrente conterrà l’entità selezionata (O l’ultima aggiunta, nel caso di selezioni multiple). Se non c’è nessun elemento selezionato nell’elenco, questa entità sarà nulla.

blank

L’elemento Selezionato è una selezione di entità. Conterrà tutti gli elementi selezionati nell’elenco, indipendentemente dal modo in cui sono stati selezionati (shift+click, control+click, ecc.). Questa selezione di entità esisterà sempre, ma può essere vuota.

blank

L’espressione Meta info è descritta di seguito, alla fine di questo post.

MEMBRI DELLA FAMIGLIA

Durante l’evento di cambio di selezione della casella di riepilogo principale, dobbiamo trovare i genitori, i figli e i fratelli delle persone selezionate:

Form.parents:=GetParents (Form.persons)
Form .children:=GetChildren (Form.persons)
Form .siblings:=GetSiblings (Form.persons)

Una volta create queste selezioni di entità, trovare nonni, zii e zie, nonché cugini, è davvero facile. I nonni sono i genitori dei genitori, gli zii e le zie sono i fratelli dei genitori e i cugini sono i figli degli zii e delle zie!

Form.grandParents:=GetParents (Form.parents)
Form .auntsAndUncles:=GetSiblings (Form.parents)
Form .cousins:=GetChildren (Form.auntsAndUncles)

Query

Trovare i membri correlati è molto semplice quando si usa ORDA. Ogni metodo “Get” riceve una selezione di entità come parametro e restituisce un’altra selezione di entità (basata sul contenuto o su quella ricevuta).

Genitori

Il metodo GetParents riceve Form.parents come parametro $1. Chiamiamolo $_persone.
(Il trattino basso è qui solo per aiutare visivamente a distinguere facilmente tra “entità” e “selezione di entità”).

Come promemoria, Madre e Padre sono le entità definite nelle definizioni delle relazioni. Sono i nomi delle relazioni “N a 1”.

La magia di ORDA è che può restituire una singola entità ($person.Mother, $person.Father, $person.Partner) se usata con una singola entità ($person) OPPURE una selezione di entità se usata con un’altra selezione di entità ($_persons).

$_persone:=$1
$_genitori:=$_persone.Madre.or($_persone.Padre)
$0:=$_genitori

figli

Lo stesso vale per le selezioni di entità definite per le relazioni “1 a n”.

// Note: the text below fits on a single line
$_figli:=$_persone.FigliComePadre (...)
.or($_persone.FigliComeMadre) (...)
.orderBy("Birthday asc")

Fratelli

Per i fratelli, dobbiamo usare più relazioni. Prima per trovare il padre, poi per trovare i figli del padre, seguito da un“o” logico applicato alle madri, poi da un“meno” logico per rimuovere le persone dall’elenco dei fratelli(i genitori di Paul hanno due figli, Paul e John, ma Paul ha solo un fratello, John…)

// Note: the text below fits on a single line
$fratelli:=$_persone.Padre.FigliComePadre (...)
.or($_persone.Madre.FigliComeMadre) (...)
.minus($_persone)

Risultato finale

Ora che abbiamo trovato i membri della famiglia per categoria, li visualizzeremo in altri riquadri (con lo stesso tipo di informazioni del riquadro principale). A questo punto, basterà duplicare le caselle di riepilogo e cambiare i nomi delle proprietà di selezione delle entità in Form.grandParents, Form.parents, Form.siblings, Form.children, ecc.

blank

Espressione Meta info

L’espressione Meta info è un metodo 4D che (di solito) riceve This come primo parametro e restituisce un oggetto. Nelle immagini precedenti, questo metodo viene utilizzato per disegnare gli sfondi delle righe blu e rosa.

L’oggetto restituito ha un paio di proprietà che sono definite qui. In questo caso, l’unica proprietà utilizzata è fill.

$person:=$1
$meta :=New object()
$even :=(($person.indexOf()%2)=0) // is it an even or and odd row ?
If ($person.Gender=True) // women
If ($even)
$meta .fill:="#FFF0F0" // women light
Else
$meta .fill:="#FFE8E8" // women a bit darker
End if
Else // man
If ($even)
$meta .fill:="#E8F8FF" // men light
Else
$meta .fill:="#E0F0FF"// men a bit darker
End if
End if
$0:=$meta

Conclusione

Questo database contiene fondamentalmente SETTE righe di codice!

La prima query per riempire Form.people, poi una riga di codice all’interno dei sei metodi “Get…”. Semplice e potente.

Allora perché ho la sensazione di aver dimenticato qualcosa? Oh sì… è veloce? Il tempo medio per trovare le sei categorie di parenti per una singola persona all’interno di un gruppo di molte migliaia di altre persone è di circa 1 ms (testato su un iMac 4,2Ghz Core i7 16Gb).

blank

Se la selezione di persone è molto più ampia(diciamo 7284), il tempo medio è di 6 ms.

blank

Provate voi stessi. Scaricate la demo e godetevi ORDA!

Roland Lannuzel
- Product Owner ed esperto di 4D - Dopo aver studiato elettronica, Roland è passato all'IT industriale come sviluppatore e consulente, realizzando soluzioni per i clienti con una varietà di database e tecnologie. Alla fine degli anni '80 si è innamorato di 4D e lo ha utilizzato per scrivere applicazioni aziendali che includono sistemi di contabilità, fatturazione e posta elettronica. Entrato a far parte dell'azienda nel 1997, Roland ha dato il suo prezioso contributo progettando specifiche, strumenti di test e demo, oltre a formare e parlare alla comunità 4D in occasione di numerose conferenze. Continua a plasmare attivamente il futuro di 4D definendo nuove funzionalità e strumenti di sviluppo di database.