ORDA est une fonctionnalité principale à long terme qui ouvre un monde de nouvelles possibilités dans 4D.
Nous continuons à améliorer ORDA pour fournir un code puissant. Ainsi, vos applications deviennent faciles à développer et à maintenir. Et surtout, elles sont optimisées avec une grande performance pour vos utilisateurs finaux.
C’est pourquoi nous sommes heureux d’introduire une nouvelle fonctionnalité dans 4D 20 R10 concernant les événements sur les données en mémoire.
Dans un parcours utilisateur typique, les données dont l’utilisateur a besoin sont chargées en mémoire. Ensuite, elles sont soumises à des changements en fonction des actions de l’utilisateur et enfin, elles sont sauvegardées lorsque l’utilisateur clique sur un bouton Enregistrer.
Qu’en est-il du déclenchement automatique de la logique métier lorsque certaines données changent en mémoire? Il est désormais possible de formater ou de préparer les données le plus tôt possible avant l’action d’enregistrement , afin que les données soient prêtes à être enregistrées.
Cela se fait grâce à l’événement ORDA touché sur les données et l’avantage est considérable.
Vous voulez en savoir plus ? Continuez à lire !
HDI_ORDA_Events_touched (événements touchés)
ORDA couvre déjà beaucoup d’aspects détaillés dans ce blogpost. La couche d’abstraction ORDA devient plus puissante que jamais ! Elle est maintenant capable de réagir à n’importe quel changement sur les données en mémoire.
Rappelons qu’avec ORDA, les données sont manipulées au travers d’entités chargées en mémoire par une action de lecture (une requête par exemple).
Le 4D 20 R10 introduit la notion d’événement. L’événement touché est le premier d’une série à venir et comme il n’a pas d’équivalent dans le code 4D classique, il est intéressant de l’utiliser.
Un événement touché permet de mettre en place un code centralisé pour déclencher une logique métier lorsque les valeurs d’un attribut sont modifiées dans une entité chargée en mémoire.
déclencher la logique métier lorsqu’un attribut d’une entité est modifié
Au cours d’un parcours utilisateur, vous pouvez maintenant réagir aux changements de données en mémoire pour déclencher une logique métier appropriée et éventuellement montrer le résultat à l’utilisateur final.
Lorsque vous travaillez avec une entité, vous pouvez vous concentrer sur un attribut donné et déclencher du code lorsque sa valeur change.
Voici quelques cas d’utilisation où les avantages sont importants :
- mettre les données en majuscules ou en capitales
- propager des mises à jour à d’autres attributs du modèle
exemple n° 1
Dans l’exemple ci-dessous, une entité Personnes est mise à jour. Le title est tronqué à ses six premiers caractères et les lastname + city sont mis en majuscules.

Auparavant, pour exécuter un tel cas d’utilisation, vous deviez gérer des événements tels que On losing focus sur chacun de vos objets de formulaire et exécuter le code approprié à de nombreux endroits dans votre code.
Désormais, les événements touched peuvent être implémentés pour certains attributs grâce aux mots-clés touched et event. Le code est centralisé dans la classe d’entité appropriée et exécuté dès que la valeur d’un attribut change à n’importe quel endroit de votre application.
Dans cet exemple, un événement touched a été implémenté pour certains attributs dans la 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)
exemple n°2
Dans cet autre exemple, l’événement touched est utilisé pour éviter de gérer un attribut calculé, ce qui pourrait nuire aux performances. Étant donné une classe de données Booking dans une application de location de voitures, un attribut est nécessaire pour savoir si les dates de départ et d’arrivée sont les mêmes.
Son implémentation devrait être :
exposed function get sameDay(): Boolean
return (This.departureDate = This. arrivalDate)
Mais l’interrogation de cet attribut ne peut pas utiliser d’index et n’est donc pas très optimisée.
Un attribut sameDay peut donc être créé dans la classe de données et un événement touched peut être implémenté comme ci-dessous pour les attributs departureDate et arrivalDate. Ainsi, l’attribut sameDay est toujours à jour.
Function event touched departureDate($event : Object)
This.sameDay:=(This.departureDate=This.arrivalDate)
Function event touched arrivalDate($event : Object)
This.sameDay:=(This.departureDate=This.arrivalDate)
déclencher la logique métier lorsqu’un attribut est modifié
Vous avez besoin de réagir à tout changement de données en mémoire au cours d’un parcours utilisateur ? Quel que soit le but recherché : débogage ou mise à jour des données à la volée, c’est désormais possible.
Vous pouvez déclencher un événement touché au niveau de l’entité. Lorsque la valeur d’un attribut de l’entité est modifiée, l’événement est déclenché et fournit des informations utiles.
Comment implémenter ceci
Dans la classe Entité, ajoutez la fonction touched qui reçoit l’événement en tant que paramètre Object.
Par exemple, voici la classe PeopleEntity.
Class extends Entity
Function event touched($event : Object)
cas d’utilisation n°1
Dans votre application, vous avez détecté qu’une entité People a été mise à jour, mais vous ne savez pas où. Implémentez l’événement touched et placez un point d’arrêt à l’intérieur pour vérifier la chaîne d’appel.
Voici une méthode de projet simple updatePeople méthode de projet simple :
$people:=ds.People.all().first()
updateCivilInfo($people)
updateAddress($people)
Et la fenêtre de débogage montrant la chaîne d’appels avec la méthode déclenchant l’événement touched (updateCivilInfo).
Notez que l’objet Event contient le nom de l’attribut.

cas d’utilisation n°2
Vous pouvez mettre en majuscules la valeur d’un attribut si son type est Text, quel que soit l’attribut.
Pour cela, implémentez ce code :
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
Et vérifiez qu’il fonctionne :

Comme vous pouvez le comprendre, l’événement touched est susceptible d’être déclenché très souvent. C’est pourquoi le code mis en œuvre doit être rapide et léger pour conserver de bonnes performances. Le dernier exemple ci-dessus est pertinent si la classe de données ne contient que quelques attributs.
Si vous souhaitez en savoir plus sur le comportement de cet événement en C/S ou en utilisant 4D Qodly pro ou lorsque vous travaillez avec un datastore distant, lisez cet article de blog.
Consultez la documentation et jouez avec HDI pour en savoir plus.
