ORDA è una caratteristica principale a lungo termine che apre un mondo di nuove possibilità in 4D.
Continuiamo a migliorare ORDA per fornire un codice potente. In questo modo, le vostre applicazioni diventano facili da sviluppare e mantenere. E soprattutto sono ottimizzate con ottime prestazioni per gli utenti finali.
Ecco perché siamo lieti di introdurre in 4D 20 R10 una nuova funzionalità relativa agli eventi sui dati in memoria.
In un tipico percorso utente, i dati necessari all’utente vengono caricati in memoria. Poi vengono sottoposti a modifiche in base alle azioni dell’utente e infine vengono salvati quando l’utente fa clic su un pulsante Salva.
Che ne dite di attivare automaticamente la logica di business quando alcuni dati cambiano in memoria? È ora possibile formattare o preparare i dati il prima possibile prima dell’azione di salvataggio , per avere i dati in uno stato pronto per il salvataggio.
Questo avviene grazie all’evento ORDA toccato sui dati e il vantaggio è notevole.
Volete saperne di più? Continuate a leggere!
ORDA copre già molti aspetti dettagliati in questo blogpost. Il livello di astrazione ORDA diventa più potente che mai! Ora è in grado di reagire a qualsiasi cambiamento dei dati in memoria.
Ricordiamo che, con ORDA, i dati vengono gestiti attraverso entità caricate in memoria da un’azione di lettura (ad esempio una query ).
4D 20 R10 introduce il concetto di eventi. L’evento touched è il primo di una serie in arrivo e, poiché non ha un equivalente nel codice 4D classico, vale la pena di utilizzarlo.
Un evento touched consente di implementare un codice centralizzato per attivare la logica aziendale quando i valori degli attributi vengono modificati in un’entità caricata in memoria.
Attivare la logica di business quando un attributo dell’entità viene modificato
Durante il percorso dell’utente, è ora possibile reagire alle modifiche dei dati in memoria per attivare una logica di business appropriata e mostrare infine il risultato all’utente finale.
Quando si lavora con un’entità, è possibile concentrarsi su un determinato attributo e attivare del codice quando il suo valore cambia.
Ecco alcuni casi d’uso in cui i vantaggi saranno notevoli:
- mettere in maiuscolo o in maiuscolo i dati
- propagare alcuni aggiornamenti ad altri attributi del modello
esempio n. 1
Nell’esempio seguente, viene aggiornata un’entità Persone. title è troncato ai primi sei caratteri, mentre lastname + city sono maiuscoli.

Prima, per eseguire un caso d’uso di questo tipo, era necessario gestire eventi come On losing focus su ogni oggetto del form ed eseguire il codice appropriato in molti punti del codice.
Ora, gli eventi touched possono essere implementati per alcuni attributi, grazie alle parole chiave touched e event. Il codice è centralizzato nella classe Entity appropriata e viene eseguito non appena il valore di un attributo cambia in qualsiasi punto dell’applicazione.
In questo esempio, è stato implementato un evento touched è stato implementato per alcuni attributi nella classe 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)
esempio #2
In quest’altro esempio, l’evento touched viene utilizzato per evitare di gestire un attributo calcolato, che potrebbe portare a cattive prestazioni. Data una classe di dati Booking in un’applicazione di noleggio auto, è necessario un attributo per sapere se le date di partenza e di arrivo sono uguali.
La sua implementazione dovrebbe esserlo:
exposed function get sameDay(): Boolean
return (This.departureDate = This. arrivalDate)
Ma le interrogazioni su questo attributo non possono utilizzare gli indici e quindi non sono molto ottimizzate.
Perciò si può creare un attributo sameDay nella classe di dati e implementare un evento touched come di seguito per gli attributi departureDate e arrivalDate. In modo che questo attributo sameDay sia sempre aggiornato.
Function event touched departureDate($event : Object)
This.sameDay:=(This.departureDate=This.arrivalDate)
Function event touched arrivalDate($event : Object)
This.sameDay:=(This.departureDate=This.arrivalDate)
Attivare la logica di business quando un attributo viene modificato
È necessario reagire a qualsiasi modifica dei dati in memoria durante il percorso dell’utente? Qualunque sia lo scopo: debug o aggiornamento dei dati al volo, ora è possibile.
È possibile attivare un evento toccato a livello di entità. Quando il valore di un attributo dell’entità viene modificato, l’evento viene attivato e fornisce informazioni utili.
Come implementarlo
Nella classe Entity, aggiungere la funzione touched che riceve l’evento come parametro Object.
Ad esempio, ecco la classe PeopleEntity.
Class extends Entity
Function event touched($event : Object)
caso d’uso #1
Nella vostra applicazione, avete rilevato che un’entità People è stata aggiornata, ma non capite dove. Implementare l’evento touched e inserire un breakpoint all’interno per verificare la catena di chiamate.
Ecco un semplice metodo updatePeople metodo del progetto:
$people:=ds.People.all().first()
updateCivilInfo($people)
updateAddress($people)
E la finestra di debug che mostra la catena di chiamate con il metodo che attiva l’evento touched (updateCivilInfo).
Si noti che l’oggetto Event contiene il nome dell’attributo.

caso d’uso #2
È possibile scrivere in maiuscolo il valore di un attributo se il suo tipo è Text, qualunque sia l’attributo.
A tale scopo, implementare questo codice:
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
E verificare che funzioni:

Come si può capire, è probabile che l’evento touched venga attivato molto spesso. Per questo motivo, il codice implementato deve essere di rapida esecuzione e leggero per mantenere buone prestazioni. L’ultimo esempio è pertinente se la classe di dati contiene solo pochi attributi.
Se volete saperne di più su come si comporta questo evento in C/S o utilizzando 4D Qodly pro o quando si lavora con un datastore remoto, leggete questo blogpost.
Consultate la documentazione e giocate con HDI per saperne di più.
Al momento non è possibile lasciare commenti su questo post.