Tato funkce pokračuje v novém paradigmatu: zpracování dat způsobem řízeným událostmi. 4D 21 poskytuje kompletní řadu událostí souvisejících s databázovými operacemi(uložení nebo opuštění).
Události ORDA mohou nahradit spouštěče a nabízejí mnoho dalších výhod: větší kontrolu, což umožňuje kódovat obchodní logiku (včetně časově náročných úloh, jako je tisk faktur nebo ukládání externích dat) přímo ve funkci datové třídy ORDA. Reagují na události na úrovni dat, jako je například new, modify, save, drop (CRUD).
Události ORDA nabízejí přesnou granularitu a sofistikované zpracování chyb, což vede k silné integritě dat a lepší organizaci kódu.
Zjistěte, jak implementovat příslušnou obchodní logiku v každém kroku akce uložení nebo vypuštění.
Události ORDA – několikanásobný valčík
V tomto předchozím blogpostu jsme odhalili první událost z dlouhé řady: dotekovou událost.
Nové události databázových operací jsou určeny k použití ve vrstvě ORDA prostřednictvím entit, s nimiž se pracuje pomocí funkce This klíčovým slovem, což u triggerů není možné.
Oproti spouštěčům nabízejí tyto události jemnější granularitu pro detekci konkrétních kroků databázových operací a sofistikované zpracování chyb, které může v případě potřeby akci zastavit.
Na rozdíl od spouštěčů umožňují události nejen realizovat akce před akcemi uložení/odložení. Mohou také spouštět akce během operací ukládání/odhození a po nich.
Zpracování chyb je výkonné, můžete vracet vlastní chyby s různou závažností a podrobnými dodatečnými informacemi pro koncového uživatele.
Dříve jste pro tyto účely mohli implementovat některé funkce, ale museli jste je volat ručně všude, kde to bylo nutné.
Nyní tato funkce nabízí kompletní logiku řízenou událostmi, automaticky spouštěnou ve vhodnou dobu. Implementujte ji jednou a nechte motor 4D, aby se o ni postaral za běhu:
- Nekonzistentní data lze odmítnout předem, aniž by bylo nutné zapojit vrstvu perzistence.
- Interakce s externími systémy může probíhat právě v okamžiku, kdy jsou data 4D persistována.
- Akce lze spustit, když se uložení/odložení nezdaří
A dobrá zpráva, na rozdíl od spouštěčů ORDA při ukládání/opouštění entit neuzamyká celou základní tabulku datové třídy . Několik událostí může probíhat paralelně, pokud se týkají různých entit (tj. záznamů ).
Pokud se spoléháte na úplné uzamčení celé tabulky, abyste mohli zpracovávat jedinečná pořadová čísla nebo podobně, musíte to řešit sami, například pomocí singletonů – a to vám umožní uzamknout pouze v případě potřeby – a mít nad tímto procesem plnou kontrolu.
Jednotlivé fáze databázové operace
Když se spustí akce uložení nebo vypuštění, tyto události vám umožňují implementovat obchodní logiku ve třech odlišných fázích akce:
- Ověřování akce uložení nebo opuštění: Užitečné pro kontrolu konzistence dat týkajících se této akce, např:
- Je stav entity, která má být vypuštěna, nastaven na „TO DELETE“ ?
- Je datum odjezdu < datum příjezdu v entitě rezervace ?
Díky této události můžete zastavit akci uložení/vypuštění a vrátit koncovému uživateli chybu. Tím zajistíte, že data budou konzistentní a připravená před vstupem do samotné akce uložení/odpuštění.
- V průběhu ukládání/odesílání: Tuto funkci použijte, pokud potřebujete synchronizovat databázové operace s externím systémem, např:
- Při ukládání entity, zápisu dat na disk, vytváření dokumentu na Disku Google atd.
V této události můžete v případě nezastavení akce vracet chyby. Tyto chyby pak můžete zpracovat v události After popsané níže.
- Po akci uložení nebo vypuštění: Zde můžete přijmout opatření týkající se případných chyb vyvolaných během akcí uložení/odložení, např:
- označit výrobek jako „Ke kontrole“, protože během akce vysazení došlo k chybě.
Díky těmto událostem může mít každý krok akce uložení nebo upuštění vlastní vyhrazenou obchodní logiku.
Tyto události se spouštějí, jakmile je databázová operace spuštěna pomocí ORDA nebo serveru REST.
Ukažme si to v akci na příkladech
kde implementovat události
Události ORDA musí být implementovány ve třídě Entity pomocí příkazu event klíčového slova.
události validace
Tyto události se spouštějí před akcí uložení nebo upuštění a mohou akci zastavit vrácením chyby. V tomto případě se ostatní níže popsané události (kromě události po) nespustí.
Mohou být implementovány:
- Na úrovni atributu: pro kontrolu konzistence konkrétního atributu.
- na úrovni entity: pro globální kontrolu obsahu entity nebo porovnání atributů.
Příklad:
V tomto příkladu byla ve třídě ProductsEntity implementována událostvalidateSave pro atributmargin . Uživatel nemůže uložit výrobek s marží nižší než 50 %. V tomto případě je vrácena chyba, která zastaví akci ukládání a poskytne zpětnou vazbu koncovému uživateli.
// ProductsEntity class
//
// validateSave event at attribute level
Function event validateSave margin($event : Object) : Object
var $result : Object
//The user can't create a product whose margin is < 50%
If (This.margin<50)
$result:={errCode: 1; message: "The validation of this product failed"; \
extraDescription: {info: "The margin of this product ("+String(This.margin)+") is lower than 50%"}; seriousError: False}
End if
return $result
Stejná logika platí i pro událostvalidateDrop. Můžete například zabránit uživateli upustit produkt, jehož stav není „K odstranění“.
události ukládání / upouštění
Tyto události se spouštějí právě během akce uložení nebo upuštění a mohou vracet chyby, pokud se něco pokazí. Mohou být implementovány:
- Na úrovni atributů: pro sledování změn hodnot konkrétních atributů.
- Na úrovni entity: pro globální kontrolu obsahu entity nebo porovnání atributů.
Příklad:
V tomto příkladu byla ve třídě ProductsEntity implementována událostuložení pro atributuserManualPath . Při ukládání produktu se na disku vytvoří dokument uživatelské příručky a jeho cesta se uloží do třídy userManualPath atributu. Tyto dvě akce musí být konzistentní.
Dojde-li při vytváření dokumentu uživatelské příručky na disku k chybě, je vrácena chyba, která poskytne zpětnou vazbu a podle níž je třeba postupovat v další události (afterSave), která je podrobně popsána níže.
Všimněte si, že obsah souboru se vytváří dříve mimo událostukládání, protože to může být časově náročné.
// ProductsEntity class
// saving event at attribute level
Function event saving userManualPath($event : Object) : Object
var $result : Object
var $userManualFile : 4D.File
var $fileCreated : Boolean
If (This.userManualPath#"")
$userManualFile:=File(This.userManualPath)
// The user manual document file is created on the disk
// This may fail if no more space is available
Try
// The content of the file has been generated and stored in a map in Storage.docMap previously
$docInfo:=Storage.docMap.query("name = :1"; This.name).first()
$userManualFile.setContent($docInfo.content)
Catch
// E.g.: No more space on disk
$result:={errCode: 1; message: "Error during the save action for this product"; extraDescription: {info: "There is no available space on disk to store the user manual"}}
End try
End if
return $result
Stejná logika platí i pro událostupuštění. Například můžete upustit dokument s uživatelskou příručkou a zároveň upustit výrobek.
události po
Tyto události se spouštějí po akci Uložit nebo Upustit. Protože je akce dokončena, nemohou vracet chyby. Jejich hlavním účelem je spustit obchodní logiku, pokud během předchozích událostí došlo k selhání.
Pokud k žádné chybě nedošlo, mohou také zpracovávat logiku po úspěchu – například odeslání potvrzovacího e-mailu.
Tyto události jsou implementovány pouze na úrovni entit.
Příklad:
V tomto příkladu byla ve třídě ProductsEntity implementována událostafterSave. Pokud se userManualPath atribut nebyl dříve řádně uložen, je jeho hodnota resetována tak, aby odpovídala chybějícímu dokumentu uživatelské příručky na disku.
// ProductsEntity class
Function event afterSave($event : Object)
If (($event.status.success=False) && ($event.status.errors=Null)) // $event.status.errors is filled if the error comes from the validateSave event
// The userManualPath attribute has not been properly saved
// Its value is reset
If ($event.savedAttributes.indexOf("userManualPath")=-1)
This.userManualPath:=""
This.status:="KO"
End if
End if
Stejná logika platí i pro událostafterDrop –např. při neúspěšném upuštění produktu lze tuto událost zaznamenat.
Pozor, v událostech je třeba se pokud možno vyhnout dlouhým operacím. Pokud je to možné, musí být takové operace implementovány jinde.
Nečekejte s implementací událostí, abyste se mohli spolehnout na silnou integritu dat.
👉 S táhněte si HDI a ponořte se do detailů implementace událostí ORDA a podívejte se na níže uvedené video, abyste měli více informací o spuštění HDI.
Přidejte odkaz na CS video
