ORDA – Genealogie – Folge vier (auf Anfrage !)

Automatisch übersetzt von Deepl

In der ersten, zweiten und dritten Folge dieser Serie haben wir die Leistungsfähigkeit von ORDA demonstriert und gezeigt, wie einfach es ist, verwandte Personen mit einer einzigen, stark rekursiven Tabelle zu verwalten.

In der heutigen Folge geht es um die Benutzeroberfläche, mit der Sie ansprechende Listen und Raster erstellen können!

Genealogie herunterladen – Folge vier

Listenfelder und gestalteter Text

Listboxen, die auf Arrays und Auswahlen basieren, ermöglichen die Anzeige von gestalteten Textspalten. Das wirft die Frage auf: „Kann ich das auch mit Listenfeldern machen, die auf Sammlungen und Entitätsauswahlen basieren?“

Wie Sie vielleicht schon erraten haben, lautet die Antwort ja, aber Sie wissen vielleicht nicht, wie das geht!

Natürlich, wenn die Attribute Ihrer Entitäten bereits gestylt sind, dann wird „This.myStyledAttribute“ die Aufgabe ohne jegliche Programmierung erledigen (solange die Eigenschaft „multi-style“ der Spalte aktiviert ist). Aber wenn Sie mehrere Attribute haben (Name, Vorname, Postleitzahl, Telefon, usw.), ist Ihr Ziel eher…

dies anzuzeigen… …und nicht dies!

blank

Magie? nicht wirklich, aber dennoch einfach

In beiden oben genannten Fällen haben wir eine Listbox, die auf einer Entitätsauswahl basiert, die mit DS erstellt wurde (siehe frühere Episoden). Anstatt ein einzelnes Attribut (z. B. Dies.Name) oder sogar einen Ausdruck wie „Dies.Vorname+“ „+Dies.Nachname“ anzuzeigen, ist der Spaltenausdruck eine 4D-Methode, die einen vollständigen Text liefert.

In der einen ist der Textgestylt. In der anderen ist er es nicht.

Einfacher Text (nicht gestylt)

$text:=""
$text: =$text+This.Title+" "+This.Firstname+" "+This.Lastname+Char(Carriage return)
$text:
=$text+This.Address+Char(Carriage return)
...
$text: =$text+"email: "+This.email+Char(Carriage return)
$0 : =$text

Gestalteter Text auf der Grundlage einer Vorlage

Der Trick dabei ist, eine Vorlage für gestylten Text zu erstellen. Dazu verwenden Sie einfach einen gestalteten Textbereich, wie links im Beispiel unten gezeigt.

Der Bereich auf der rechten Seite soll Sie daran erinnern, dass gestalteter Text auf span-Tags basiert. Sie müssen span-Tags innerhalb Ihrer eigenen Tags vermeiden. Die Zeichenkette „[Lastname]“ muss mit dem Befehl replace string. abgerufen werden. Dies ist nicht möglich mit [Lastname] oder [Lastname] (d.h., das erste Zeichen in einem anderen Stil mit anderer Farbe).

blank

$text:=template
$text :=Replace string($text;"[title]";This.Title)
$text :=Replace string($text;"[firstname]";This.Firstname)
...
$text :=Replace string($text;"[cell]";This.Cell)
$text :=Replace string($text;"[email]";This.email)
$0: =$text

Entity-Auswahlen vs. Sammlungen

„Was? Warum sollte ich diese vergleichen? Die sind doch völlig unterschiedlich!“

„Ja, du hast Recht. Aber warte mal…“

Listenfelder, die auf der Auswahl von Entitäten basieren, sind großartig. Sie können Tausende von Entitäten aufnehmen und sie sehr schnell und schön mit so vielen Spalten wie nötig anzeigen. Sie können entweder kompakte Daten (wie oben gesehen) oder separate Attribute usw. anzeigen.

Das einzige, was sie nicht können, ist die Anzeige von Gittern (Matrix) von Daten. Sie können nicht eine Gruppe von Personen von 1 bis 100 in einer ersten Spalte anzeigen und dann die Gruppe von 101 bis 200 in einer zweiten Spalte fortsetzen, usw. Um ehrlich zu sein, können Listboxen, die auf einer Sammlung basieren, das auch nicht, aber es gibt eine schöne Möglichkeit, dies mit sehr wenig Programmierung zu tun.

Nehmen wir an, unser Ziel ist es, eine Gruppe von Personen wie diese anzuzeigen:

blankDie obige Liste zeigt nur 9 Personen, aber in der Entity-Auswahl gibt es mehr, sagen wir 28.

nur ein bisschen Mathe

Als Erstes müssen wir einen Weg finden, um für jede Zelle eine eindeutige Zahl von 0 bis 28 zu erhalten. Entweder von links nach rechts, Zeile für Zeile; von oben nach unten, oder Spalte für Spalte.

blank

Rufen Sie dazu einfach eine Funktion mit zwei Parametern auf: die Zeilennummer und die Spaltennummer. In diesem Fall ist die Anzahl der Spalten 3 ($colNum von 0 bis 2) und die benötigte Anzahl der Zeilen ist 10 ($rowNum von 0 bis 9). Mit diesem Wissen ist die Berechnung einfach:
Fall „A“: $rowNum+($colNum*AnzahlZeilen)
Fall „B“: ($rowNum*AnzahlSpalten) + $colNum

Im Listenfeld selbst wird eine Sammlung mit Zahlen von 0 bis 9 angezeigt, die die Zeilennummern darstellen. Jetzt ist es noch einfacher: Sie müssen die Zeilennummer nicht an die Funktion senden. Jedes Mal, wenn die Funktion aufgerufen wird, wird die Zeilennummer durch This.value dargestellt! Sie müssen also nur die Spaltennummer an die Funktion senden, damit sie die ID entsprechend der Zeilennummer berechnen kann!

Und wissen Sie was? Das war’s! Anstatt die berechnete $i als longint zurückzugeben, geben Sie einfach die benötigten Informationen wie myEntity[$i].name als Text zurück! (stellen Sie nur sicher, dass der Wert von $i kleiner ist als myEntities.length)

Code-Beispiel für den Fall „A“:

Die Ausdrücke für die Spalten lauten

CalcID(„vertikal“;0) für die 1. Spalte
CalcID(„vertikal“;1) für die 2. Spalte
CalcID(„vertikal“;2) für die 3. Spalte
(usw., wenn mehr als 3 Spalten)

Schauen wir uns nun an, wie die Methode CalcID aussieht!

C_TEXT($1)
C_LONGINT ($2)
C_LONGINT ($rowNum;$colNum)
$rownum :=This.value // This.value is the current value of the collection (0,1,2,3,...)
$colNum :=$2 // $2 is given by the expression
If ($1="vertical")
$0 :=$rowNum+($colNum*numberOfRows) // numberOfRows is a previously calculated value (ex: 10)
Else

$0 :=($rowNum*numberOfCols)+$colNum // numberOfCols is a previously calculated value (ex: ")

End if

ein weiterer Trick …

Es ist nicht nötig, für jeden Ergebnistyp, den Sie benötigen, eine eigene Funktion zu erstellen. Senden Sie einfach einen Parameter, der bestimmt, was Sie als Rückgabe benötigen, und lassen Sie Ihre Funktion ein Objekt mit dem gewünschten Attribut zurückgeben!

Anstatt drei Methoden zu erstellen (getName, getPicture, getBirthday um ein text, ein picture und ein date zurückzugeben ) und diese in Spaltenausdrücke einzutippen…

getName(0) // getName returns a text
getPicture (0) // getPicture returns a picture
getBirthday (0) // getBirthday returns a date

… erstellen Sie eine einzelne Methode getAttribute, die ein Objekt zurückgibt, das entsprechend dem von Ihnen gesendeten Parameter gefüllt ist.

Frage: Geben Sie mir den Namen der Person!
Die Antwort: Hier ist ein Objekt mit dem Attribut “ name“, das den Namen enthält, nach dem Sie gefragt haben!

Hier ist ein Beispiel für die Methode getAttribute :

C_TEXT($1)
C_OBJECT ($0)
C_OBJECT ($result)
$result :=New object()
Case of
: ($1="name")
$result .name:=contact.name // name is requested: returned as attribute of $result
: ($1="portrait")
$result .portrait:=contact.portrait // portrait is requested: returned as attribute of $result
: ($1="birthday")
$result .birthday:=contact.birthday // birthday is requested: returned as attribute of $result
End case
$0:=$result

Sobald diese Methode geschrieben ist, können Sie sie in Spaltenausdrücken aufrufen:

getAttribute("name").name // getAttribute returns an object
getAttribute ("portrait").portrait // getAttribute returns an object
getAttribute("Geburtstag").birthday // getAttribute returns an object

Viel Spaß und lassen Sie Ihrer Fantasie freien Lauf!

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.