ORDA – Genealogie – čtvrtý díl (na přání !)

Automaticky přeloženo z Deepl

V prvním, druhém a třetím díle tohoto seriálu jsme si ukázali, jakou sílu má ORDA a jak jednoduché je spravovat spřízněné osoby pomocí jediné , vysoce rekurzivní tabulky.

Dnešní díl je zaměřen na uživatelské rozhraní, které vám pomůže vytvářet pěkně vypadající seznamy a tabulky!

Stáhnout Genealogie – díl čtvrtý

Rámečky seznamů a stylizovaný text

Seznamové boxy založené na polích a výběrech umožňují zobrazovat stylizované textové sloupce. To vyvolává otázku: „Mohu totéž udělat se seznamovými boxy založenými na kolekcích a výběrech entit?“.

Jak jste možná uhodli, odpověď zní ano, ale možná nevíte, jak na to!

Samozřejmě, pokud jsou atributy vašich entit již stylizované, pak „This.myStyledAttribute“ udělá svou práci bez jakéhokoli programování (pokud je zaškrtnuta vlastnost „multi-style“ sloupce). Pokud však máte několik atributů (jméno, křestní jméno, PSČ, telefon atd.), je vaším cílem spíše…

zobrazit spíše toto… …než toto !

blank

Kouzlo? ne tak docela, ale STÁLE je to snadné

V obou výše uvedených případech máme seznamové pole založené na výběru entit vytvořeném pomocí DS (viz předchozí díly). Namísto zobrazení jediného atributu (např. This.name) nebo dokonce výrazu typu „This.Firstname+“ „+This.Lastname“ je výrazem sloupce metoda 4D, která vrací celý text.

V jednom je textstylizován. V druhém nikoliv.

Jednoduchý text (nestylizovaný)

$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

Stylizovaný text na základě šablony

Trik zde spočívá ve vytvoření šablony stylizovaného textu. K tomu stačí použít oblast stylizovaného textu, jak je znázorněno vlevo v ukázce níže.

Oblast vpravo je zobrazena proto, abyste si připomněli, že stylizovaný text je založen na značkách span. V rámci vlastních značek se musíte vyhnout značkám span. Řetězec „[Příjmení]“ je třeba načíst pomocí příkazu replace string. . To není možné u znaků [Příjmení] nebo [Příjmení] (tj. první znak v jiném stylu jiné barvy).

blank

$text:=template
$text :=Replace string($text;"[název]";This.Title)
$text :=Replace string($text;"[jméno]";This.Firstname)
...
$text :=Replace string($text;"[buňka]";This.Cell)
$text :=Replace string($text;"[e-mail]";This.email)
$0: =$text

Výběr entit vs. kolekce

„Co je to? Proč bych to měl porovnávat? Vždyť jsou úplně jiné!“

„Ano, máte pravdu. Ale počkej…“

Seznamová pole založená na výběru entit jsou skvělá. Mohou pojmout tisíce entit, zobrazit je velmi rychle a pěkně s tolika sloupci, kolik je potřeba. Mohou zobrazovat buď kompaktní data (jak je vidět výše), nebo samostatné atributy atd.

Jediné, co neumějí, je zobrazovat mřížky (matice) dat. Nemohou zobrazit skupinu osob od 1 do 100 v prvním sloupci, pak pokračovat skupinou od 101 do 200 ve druhém sloupci atd. Upřímně řečeno, seznamová pole založená na kolekci to také neumějí, nicméně existuje pěkný způsob, jak to udělat s velmi malým množstvím programování.

Řekněme, že naším cílem je zobrazit skupinu lidí takto:

blankVýše uvedený seznam zobrazuje pouze 9 osob, ale ve výběru entit je jich více, řekněme, že jich je 28.

Stačí trocha matematiky

Nejdříve musíme najít způsob, jak mít pro každou buňku jedinečné číslo od 0 do 28. V tomto případě je nutné, abychom se dostali k číslům, která jsou pro každou buňku jedinečná. Buď zleva doprava, po řádcích; shora dolů, nebo po sloupcích.

blank

K tomu stačí zavolat funkci se dvěma parametry: číslem řádku a číslem sloupce. V tomto případě je NumberOfColumns 3 ($colNum od 0 do 2) a potřebný NumberOfRows je 10 ($rowNum od 0 do 9). Když to víme, je výpočet snadný:
Případ „A“: $rowNum+($colNum*NumberOfRows)
Případ „B“: ($rowNum*NumberOfColumns) + $colNum

Samotné pole seznamu bude zobrazovat kolekci vyplněnou čísly od 0 do 9, která budou představovat čísla řádků. Nyní je to ještě jednodušší; Není třeba posílat číslo řádku do funkce. Při každém volání funkce je číslo řádku reprezentováno This.value! Stačí tedy funkci poslat číslo sloupce, aby mohla vypočítat ID podle čísla řádku!

A hádejte co ? A je to! Místo toho, abyste vraceli vypočtenou hodnotu $i jako longint, stačí vrátit potřebnou informaci jako myEntity[$i].name jako text! (jen se ujistěte, že hodnota $i je nižší než. myEntities.length)

Příklad kódu pro případ „A“:

Výrazy pro sloupce budou následující

CalcID(„vertical“;0) pro 1. sloupec
CalcID(„vertical“;1) pro 2. sloupec
CalcID(„vertical“;2) pro 3. sloupec
(atd.; pokud je sloupců více než 3).

Nyní se podívejme, jak vypadá metoda CalcID!

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="vertikální")
$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

Ještě jeden trik …

Není třeba vytvářet jednotlivé funkce pro každý typ výsledku, který potřebujete. Stačí poslat parametr, který určí, co potřebujete na oplátku, a zařídit, aby vaše funkce vracela objekt s vyplněným požadovaným atributem!

Místo toho, abyste vytvořili tři metody (getName, getPicture, getBirthday, které vrátí text, picture a date) a zadali je do sloupcových výrazů …

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

… vytvořit jedinou metodu getAttribute, která vrátí objekt vyplněný podle zaslaného parametru.

Otázka: Uveďte jméno osoby!
Odpovězte: Zde je objekt s atributem name, který obsahuje to, na co jste se ptali!

Zde je příklad metody 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

Jakmile je tato metoda napsána, můžete ji volat ve sloupcových výrazech:

Název // getAttribute returns an object
getAttribute ("portrét").portrait // getAttribute returns an object
getAttribute("narozeniny").birthday // getAttribute returns an object

Bavte se a popusťte uzdu své fantazii!

Roland Lannuzel
- Product Owner & 4D Expert - Po studiu elektroniky se Roland věnoval průmyslovým IT jako vývojář a konzultant, který vytvářel řešení pro zákazníky s různými databázemi a technologiemi. Koncem 80. let se zamiloval do 4D a používal jej při psaní podnikových aplikací, které zahrnovaly účetní, fakturační a e-mailové systémy. nakonec se připojil ke společnosti v roce 1997 a Rolandův cenný přínos zahrnuje návrh specifikací, testovacích nástrojů, demoverzí a také školení a přednášky pro komunitu 4D na mnoha konferencích. Nadále aktivně utváří budoucnost 4D definováním nových funkcí a nástrojů pro vývoj databází.