ORDA – Genealogie – Folge zwei

Automatisch übersetzt von Deepl

In der ersten Folge dieser Trilogie haben wir die Grundlagen von ORDA anhand von Listenfeldern, Entitäten und Entitätsauswahlen demonstriert. Heute gehen wir etwas tiefer und führen einige Abfragen aus, die rekursive Beziehungen nutzen. Außerdem werfen wir einen kurzen Blick darauf, wie Listenfelder mithilfe der Eigenschaft „meta info expression“ ansprechend dargestellt werden können.

Download Genealogie – Episode zwei

Anwendungsszenario

Ich habe eine Person in einer sehr großen Liste ausgewählt und möchte nun ihre Eltern und Großeltern finden. Ich möchte auch ihre Geschwister … und Kinder, wenn sie welche haben! Warum nicht auch Tanten und Onkel … und Cousins und Cousinen?
Wird das alles eine Ewigkeit dauern? Finden wir es heraus.

Lassen Sie uns mit dem Anfang beginnen!

Die Auswahl der Entität people enthält Personen, die nach dem 1. Januar 1960 geboren sind, und wird im Objekt Form gespeichert:

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

Beachten Sie dieses sehr empfohlene Abfrageformat, es verwendet Platzhalter (:1) und Parameter (!1960-01-01!).

EINRICHTEN DES LISTENFELDES

Wie wir im vorigen Beitrag gesehen haben, wird die Entitätsauswahl(Form.people) zu Beginn als Eigenschaft der Entitätsauswahl eingerichtet.

Das Listenfeld, das auf einer Entitätsauswahl basiert, hat eine Reihe neuer Eigenschaften. Wir werden drei von ihnen beschreiben: Aktuelles Element, Ausgewählte Elemente und Meta-Info-Ausdruck.

Sowohl das aktuelle Element als auch die ausgewählten Elemente werden automatisch aktualisiert, wenn der Benutzer die Auswahl in der Listbox ändert:

Das aktuelle Element enthält die ausgewählte Entität (ODER die zuletzt hinzugefügte Entität, falls mehrere ausgewählt wurden). Wenn in der Liste kein Element ausgewählt ist, ist dieses Element leer.

blank

Der Eintrag Ausgewählte Elemente ist eine Auswahl von Entitäten. Sie enthält alle ausgewählten Elemente in der Liste, unabhängig davon, wie sie ausgewählt wurden (Umschalt+Klick, Control+Klick, etc.). Diese Entitätsauswahl ist immer vorhanden, kann aber auch leer sein.

blank

Der Meta-Info-Ausdruck wird unten am Ende dieses Beitrags beschrieben.

FAMILIENMITGLIEDER

Während des Ereignisses “ on selection change “ des Hauptlistenfeldes müssen wir die Eltern, die Kinder und die Geschwister der ausgewählten Personen finden:

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

Sobald wir diese Entitätsauswahlen erstellt haben, ist die Suche nach Großeltern, Onkeln und Tanten sowie Cousins und Cousinen sehr einfach. Großeltern sind die Eltern der Eltern, Onkel und Tanten sind die Geschwister der Eltern, und Cousins und Cousinen sind die Kinder der Onkel und Tanten!

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

Abfragen

Die Suche nach verwandten Mitgliedern ist wirklich einfach, wenn Sie ORDA verwenden. Jede „Get“-Methode empfängt eine Entitätsauswahl als Parameter und gibt eine andere Entitätsauswahl zurück (basierend auf dem Inhalt oder der empfangenen).

Eltern

Die Methode GetParents erhält Form.parents als Parameter $1. Nennen wir sie $_persons.
(Der Unterstrich dient hier nur als visuelle Hilfe, um die Unterscheidung zwischen „Entität“ und „Entitätsauswahl“ zu erleichtern).

Nur zur Erinnerung: Mutter und Vater sind die Entitäten, die in den Beziehungsdefinitionen definiert sind. Sie sind die Namen der „N zu 1“-Beziehungen.

Das Besondere an ORDA ist, dass es entweder eine einzelne Entität ($person.Mother, $person.Father, $person.Partner) zurückgeben kann, wenn es mit einer einzelnen Entität ($person) ODER einer Entitätsauswahl verwendet wird, wenn es mit einer anderen Entitätsauswahl ($_persons) verwendet wird.

$_persons:=$1
$_parents:=$_persons.Mutter.oder($_Personen.Vater)
$0:=$_Eltern

Kinder

Dasselbe gilt für Entitätsselektionen, die für die Beziehungen „1 bis n“ definiert sind.

// Note: the text below fits on a single line
$_Kinder:=$_Personen.KinderAlsVater (...)
.or($_persons.KinderAlsMutter) (...)
.orderBy("Geburtstag aufsteigend")

Geschwister

Für Geschwister müssen wir mehrere Beziehungen verwenden. Zuerst wird der Vater gefunden , dann die Kinder des Vaters, gefolgt von einem logischen„oder„, das auf die Mütter angewandt wird, dann ein logisches„minus„, um Personen aus der Geschwisterliste zu entfernen(die Eltern von Paul haben zwei Söhne, Paul und John, aber Paul hat nur einen Bruder, John…)

// Note: the text below fits on a single line
$_Geschwister:=$_Personen.Vater.KinderAlsVater (...)
.or($_Personen.Mutter.KinderAlsMutter) (...)
.minus($_Personen)

Endgültiges Ergebnis

Nun, da wir die Familienmitglieder nach Kategorien gefunden haben, zeigen wir sie in anderen Listenfeldern an (mit der gleichen Art von Informationen wie im Hauptlistenfeld). Dann müssen wir nur noch die Listenfelder duplizieren und ihre Eigenschaftsnamen für die Entitätsauswahl in Form.grandParents, Form.parents, Form.siblings, Form.children, usw. ändern.

blank

Meta-Info-Ausdruck

Der Meta-Info-Ausdruck ist eine 4D Methode, die (normalerweise) This als ersten Parameter erhält und ein Objekt zurückgibt. In den obigen Bildern wird diese Methode verwendet, um blaue und rosa Zeilenhintergründe zu zeichnen.

Das zurückgegebene Objekt hat eine Reihe von Eigenschaften, die hier definiert werden. In diesem Fall ist die einzige Eigenschaft, die wir verwenden, 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

Schlussfolgerung

Diese Datenbank besteht im Wesentlichen aus SIEBEN Zeilen Code!

Die erste Abfrage, um Form.people zu füllen, dann eine Zeile Code innerhalb der sechs „Get…“-Methoden. Einfach und mächtig.

Warum habe ich also das Gefühl, dass ich etwas vergessen habe? Ach ja … ist es schnell? Die durchschnittliche Zeit, um die sechs Verwandtenkategorien für eine einzelne Person innerhalb einer Gruppe von vielen tausend anderen Personen zu finden, beträgt etwa 1 ms (getestet auf einem iMac 4.2Ghz Core i7 16Gb).

blank

Wenn die Personenauswahl viel größer ist(sagen wir 7284), beträgt die durchschnittliche Zeit 6 ms.

blank

Probieren Sie es selbst aus. Laden Sie die Demo herunter und genießen Sie ORDA!

Roland Lannuzel
- Product Owner & 4D Experte - Nach seinem Studium der Elektronik arbeitete Roland als Entwickler und Berater in der industriellen IT-Branche, wo er Lösungen für Kunden mit einer Vielzahl von Datenbanken und Technologien entwickelte. In den späten 80er Jahren verliebte er sich in 4D und setzte es bei der Entwicklung von Geschäftsanwendungen wie Buchhaltungs-, Abrechnungs- und E-Mail-Systemen ein. 1997 trat er schließlich in das Unternehmen ein und leistete einen wertvollen Beitrag, indem er Spezifikationen, Testtools und Demos entwarf, Schulungen durchführte und auf vielen Konferenzen für die 4D Community sprach. Er gestaltet die Zukunft von 4D aktiv mit, indem er neue Funktionen und Datenbankentwicklungstools definiert.