ORDA je hlavní dlouhodobou funkcí, která otevírá svět nových možností ve 4D .
ORDA neustále vylepšujeme, abychom poskytli výkonný kód. Pak se vaše aplikace stanou snadno vyvíjenými a udržovatelnými. A hlavně jsou optimalizované s velkým výkonem pro vaše koncové uživatele.
Proto jsme rádi, že můžeme ve 4D 20 R10 představit novou funkci týkající se událostí na datech v paměti.
Při typické uživatelské cestě se data, která uživatel potřebuje, načítají v paměti. Poté se podrobí změnám podle akcí uživatele a nakonec se uloží, když uživatel klikne na tlačítko Uložit.
Jak je to s automatickým spouštěním obchodní logiky při změně některých dat v paměti? Nyní je možné data formátovat nebo připravit co nejdříve před akcí uložení, aby byla data ve stavu připraveném k uložení.
To se děje díky události ORDA touched na datech a přínos je značný.
Chcete se dozvědět více? Čtěte dál!
ORDA již pokrývá tolik aspektů podrobně popsaných v tomto blogpostu. Abstraktní vrstva ORDA se stává mocnější než kdy dříve! Nyní je schopna reagovat na jakoukoli změnu dat v paměti.
Nezapomeňte, že u ORDA se s daty pracuje prostřednictvím entit načtených do paměti akcí čtení (například dotazem ).
4D 20 R10 zavádí koncept událostí. Dotyková událost je první z nadcházející řady, a protože nemá v klasickém kódu 4D ekvivalent, stojí za to ji používat.
Událost touched umožňuje implementovat centralizovaný kód pro spouštění obchodní logiky při změně hodnot atributů v entitě načtené v paměti.
spouštění obchodní logiky při změně atributu entity
Během cesty uživatele můžete nyní reagovat na změny dat v paměti a spustit nějakou vhodnou obchodní logiku a případně zobrazit výsledek koncovému uživateli.
Při práci s entitou se můžete zaměřit na daný atribut a při změně jeho hodnoty spustit nějaký kód.
Zde je několik případů použití, kde bude přínos velký:
- psaní velkých nebo malých písmen v datech
- propagovat některé aktualizace do jiných atributů v modelu
příklad č. 1
V níže uvedeném příkladu je aktualizována entita Lidé. Údaj title je zkrácen na prvních šest znaků, údaje lastname + city jsou psány velkými písmeny.

Dříve jste pro spuštění takového případu použití museli zpracovávat události typu Při ztrátě fokusu na každém z objektů formuláře a spouštět příslušný kód na tolika místech kódu.
Nyní lze pro některé atributy implementovat události touched díky funkci tzv. touched a klíčovým slovům event. Kód je centralizován v příslušné třídě Entity a spouští se, jakmile se změní hodnota atributu na libovolném místě vaší aplikace.
V tomto příkladu je touched byla pro některé atributy implementována událost ve třídě PeopleEntity:
Class extends Entity
Function event touched title($event : Object)
This.title:=Substring(This.title; 1; 6)
Function event touched lastname($event : Object)
This.lastname:=Uppercase(This.lastname)
Function event touched city($event : Object)
This.city:=Uppercase(This.city)
příklad č. 2
V tomto dalším příkladu je použita událost touched, aby se zabránilo zpracování vypočítaného atributu, které by mohlo vést ke špatnému výkonu. Vzhledem k datové třídě Booking v aplikaci pro pronájem automobilů je potřeba atribut, který zjistí, zda jsou data odjezdu a příjezdu stejná.
Jeho implementace by měla být následující:
exposed function get sameDay(): Boolean
return (This.departureDate = This. arrivalDate)
Dotazování na tento atribut však nemůže využívat indexy, takže není příliš optimalizované.
Proto lze v datové třídě vytvořit atribut sameDay a pro atributy departureDate a arrivalDate implementovat událost touched, jak je uvedeno níže. Tak, aby byl tento atribut sameDay vždy aktuální.
Function event touched departureDate($event : Object)
This.sameDay:=(This.departureDate=This.arrivalDate)
Function event touched arrivalDate($event : Object)
This.sameDay:=(This.departureDate=This.arrivalDate)
spouštění obchodní logiky při změně některého atributu.
Potřebujete reagovat na jakoukoli změnu dat v paměti během cesty uživatele? Ať už je účel jakýkoli: ladění nebo aktualizace dat za běhu, nyní je to možné.
Dotčenou událost můžete spustit na úrovni entity. Při změně hodnoty jakéhokoli atributu entity se spustí událost, která poskytne užitečné informace.
jak to implementovat
Ve třídě Entity přidejte příkaz touched event funkci přijímající událost jako parametr Object.
Zde je například třída PeopleEntity.
Class extends Entity
Function event touched($event : Object)
Případ použití #1
Ve své aplikaci jste zjistili, že byla aktualizována entita People, ale nevíte kde. Implementujte událost touched a umístěte do ní bod přerušení, abyste zkontrolovali řetězec volání.
Zde je jednoduchý updatePeople metoda projektu:
$people:=ds.People.all().first()
updateCivilInfo($people)
updateAddress($people)
A okno ladění zobrazující řetězec volání s metodou spouštějící událost touched (updateCivilInfo).
Všimněte si, že objekt Událost obsahuje název atributu.

Případ použití č. 2
Hodnotu atributu můžete psát velkými písmeny, pokud je jeho typem Text, ať už se jedná o jakýkoli atribut.
Za tímto účelem implementujte tento kód:
Class extends Entity
Function event touched($event : Object)
If (Value type(This[$event.attributeName])=Is text)
This[$event.attributeName]:=Uppercase(This[$event.attributeName])
End if
A zkontrolujte, zda to funguje:

Jak jistě chápete, událost touched bude pravděpodobně spouštěna velmi často. Proto musí být implementovaný kód rychle proveditelný a lehký, aby byl zachován dobrý výkon. Poslední výše uvedený příklad je relevantní, pokud datová třída obsahuje pouze několik atributů.
Pokud se potřebujete dozvědět více o tom, jak se tato událost chová v C/S nebo při použití 4D Qodly pro nebo při práci se vzdáleným datovým úložištěm, přečtěte si tento blogpost.
Podívejte se do dokumentace a pohrajte si s HDI, abyste se dozvěděli více.
