ORDA – Généalogie – Episode 2

Traduit automatiquement de Deepl

Dans le premier épisode de cette trilogie, nous avons démontré les bases d’ORDA en utilisant des boîtes de liste, des entités et des sélections d’entités. Aujourd’hui, nous allons aller un peu plus loin en exécutant quelques requêtes qui tireront profit des relations récursives. Nous allons également jeter un coup d’œil rapide sur la façon d’afficher les boîtes de liste de façon agréable en utilisant la propriété « meta info expression ».

Télécharger Généalogie – Episode deux

scénario d’utilisation

J’ai sélectionné une personne dans une très grande liste, et maintenant je veux trouver ses parents et grands-parents. Je veux aussi ses frères et sœurs … et ses enfants s’il en a ! Pourquoi pas les oncles et tantes … et les cousins ?
Est-ce que tout cela va prendre une éternité ? C’est ce que nous allons voir.

Commençons par le début !

La sélection de l’entité people contiendra les personnes nées après le 1er janvier 1960, et sera enregistrée dans l’objet Form :

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

Notez ce format de requête hautement recommandé, il utilise des caractères de substitution (:1) et des paramètres (!1960-01-01 !).

CONFIGURER LA BOÎTE DE LISTE

Comme nous l’avons vu dans le post précédent, la sélection d’entité(Form.people) est mise en place au début comme propriété de sélection d’entité.

La boîte de liste, basée sur une sélection d’entité, a quelques nouvelles propriétés. Nous allons décrire trois d’entre elles : Élément actuel, Éléments sélectionnés, et Expression Meta info.

L’élément actuel ainsi que les éléments sélectionnés seront automatiquement mis à jour lorsque l’utilisateur modifiera la sélection de la boîte de liste :

L’élément actuel contient l’entité sélectionnée (OU la dernière entité ajoutée, en cas de sélections multiples). Si aucun élément n’est sélectionné dans la liste, cette entité sera nulle.

blank

L’élément Selected est une sélection d’entités. Elle contiendra tous les éléments sélectionnés dans la liste, quelle que soit la façon dont ils ont été sélectionnés (shift+clic, control+clic, etc.). Cette entité sélection existera toujours, mais elle peut être vide.

blank

L’expression Meta info est décrite ci-dessous à la fin de ce billet.

MEMBRES DE LA FAMILLE

Lors de l’événement de changement de sélection de la liste principale, nous devons trouver les parents, les enfants, et les frères et sœurs des personnes sélectionnées :

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

Ensuite, une fois que nous avons créé ces sélections d’entités, il est très facile de trouver les grands-parents, les oncles et les tantes, ainsi que les cousins. Les grands-parents sont les parents des parents, les oncles et tantes sont les frères et sœurs des parents, et les cousins sont les enfants des oncles et tantes !

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

Requêtes

Trouver des membres apparentés est très facile lorsque vous utilisez ORDA. Chaque méthode « Get » reçoit une sélection d’entités comme paramètre et renvoie une autre sélection d’entités (basée sur le contenu ou celle reçue).

Parents

La méthode GetParents reçoit Form.parents comme paramètre $1. Nommons-le $_persons.
(Le trait de soulignement n’est ici que pour une aide visuelle afin de faire une distinction facile entre « entité » et « sélection d’entité »).

Pour rappel, Mère et Père sont les entités définies dans les définitions des relations. Ce sont les noms des relations « N à 1 ».

La magie de ORDA est qu’il peut retourner soit une seule entité ($person.Mother, $person.Father, $person.Partner) lorsqu’il est utilisé avec une seule entité ($person) OU une sélection d’entités lorsqu’il est utilisé avec une autre sélection d’entités ($_persons).

$_personnes:=$1
$_parents:=$_personnes.Mère.ou($_personnes.Père)
$0:=$_parents

enfants

Il en va de même pour les sélections d’entités définies pour les relations « 1 à n ».

// Note: the text below fits on a single line
$_enfants:=$_personnes.EnfantsCommePère (...)
.or($_persons.EnfantsCommeMère) (...)
.orderBy("Birthday asc")

Frères et sœurs

Pour les frères et sœurs, nous devons utiliser plusieurs relations. D’abord pour trouver le Père, puis pour trouver les Enfants du Père, suivi d’un« ou » logique appliqué aux Mères, puis d’un« moins » logique pour enlever les personnes de leurs listes de frères et sœurs(les parents de Paul ont deux fils, Paul et Jean mais Paul n’a qu’un seul frère, Jean…)

// Note: the text below fits on a single line
$_siblings:=$_personnes.Père.EnfantsCommePère (...)
.or($_persons.Mère.EnfantsCommeMère) (...)
.minus($_persons)

Résultat final

Maintenant que nous avons trouvé les membres de la famille par catégorie, nous allons les afficher dans d’autres listes (avec le même type d’informations que la liste principale). Il suffit alors de dupliquer les listes et de changer les noms des propriétés de sélection des entités en Form.grandParents, Form.parents, Form.siblings, Form.children, etc.

blank

L’expression Meta info

La Meta info expression est une méthode 4D qui reçoit (généralement) This comme premier paramètre et renvoie un objet. Dans les images ci-dessus, cette méthode est utilisée pour dessiner des fonds de ligne bleus et roses.

L’objet retourné a quelques propriétés qui sont définies ici. Dans ce cas, la seule propriété que nous utilisons est 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

Conclusion

Cette base de données contient essentiellement SEPT lignes de code !

La première requête pour remplir Form.people, puis une ligne de code dans les six méthodes « Get… ». Simple et puissant.

Alors pourquoi ai-je l’impression d’avoir oublié quelque chose ? Ah oui … est-ce que c’est rapide ? Le temps moyen pour trouver les six catégories de parents pour une seule personne dans un groupe de plusieurs milliers d’autres personnes est d’environ 1 ms (testé sur un iMac 4.2Ghz Core i7 16Gb).

blank

Si la sélection de personnes est beaucoup plus importante(disons 7284), le temps moyen est de 6 ms.

blank

Essayez vous-même. Téléchargez la démo et profitez d’ORDA !

Roland Lannuzel
- Product Owner & 4D Expert - Après avoir étudié l'électronique, Roland s'est lancé dans l'informatique industrielle en tant que développeur et consultant, créant des solutions pour les clients avec une variété de bases de données et de technologies. À la fin des années 80, il est tombé amoureux de 4D et l'a utilisé pour écrire des applications commerciales, notamment des systèmes de comptabilité, de facturation et de messagerie électronique. Il a rejoint la société en 1997 et a contribué à la conception de spécifications, d'outils de test et de démonstrations, ainsi qu'à la formation et à la présentation de la communauté 4D lors de nombreuses conférences. Il continue à façonner activement l'avenir de 4D en définissant de nouvelles fonctionnalités et des outils de développement de bases de données.