ORDA es una funcionalidad principal a largo plazo que abre un mundo de nuevas posibilidades en 4D.
Seguimos mejorando ORDA para ofrecer un código poderoso. Así, sus aplicaciones serán fáciles de desarrollar y mantener. Y sobre todo se optimizan con un gran rendimiento para sus usuarios finales.
Por eso estamos encantados de introducir una nueva funcionalidad en 4D 20 R10 relativa a eventos sobre los datos en memoria.
En un típico viaje de usuario, los datos que necesita el usuario se cargan en memoria. Luego se someten a cambios según las acciones del usuario y finalmente se guardan cuando el usuario hace clic en un botón Guardar.
¿Qué pasa con la activación automática de la lógica de negocio cuando algunos datos cambian en la memoria? Ahora es posible formatear o preparar los datos lo antes posible antes de la acción de guardar para tener los datos en un estado listo para guardar.
Esto se hace gracias al evento ORDA touched en los datos y el beneficio es considerable.
¿Quiere saber más? Continue leyendo
ORDA ya cubre muchos aspectos detallados en este blogpost. ¡La capa de abstracción ORDA se vuelve más poderosa que nunca! Ahora es capaz de reaccionar ante cualquier cambio en los datos en memoria.
Recuerde que, con ORDA, los datos se manejan a través de entidades cargadas en memoria por una acción de lectura (una consulta por ejemplo).
4D 20 R10 introduce el concepto de eventos. El evento touched es el primero de una serie que viene y como no tiene equivalente en el código 4D clásico, vale la pena utilizarlo.
Un evento touched permite implementar un código centralizado para disparar la lógica de negocio cuando los valores de los atributos cambian en una entidad cargada en memoria.
desencadenar la lógica de negocio cuando se cambia un atributo de la entidad
Durante un viaje de usuario, ahora puede reaccionar a los cambios de datos en la memoria para desencadenar alguna lógica de negocio apropiada y, finalmente, mostrar el resultado al usuario final.
Al trabajar con una entidad, puede centrarse en un atributo determinado y activar código cuando cambie su valor.
Aquí algunos casos de uso en los que el beneficio será grande:
- poner los datos en mayúsculas o minúsculas
- propagar algunas actualizaciones a otros atributos en el modelo
ejemplo #1
En el siguiente ejemplo, se actualiza una entidad People. El title se trunca a sus primeros seis caracteres. El lastname + city se escriben en mayúsculas.

Antes, para ejecutar tal caso de uso, tenía que manejar eventos como On losing focus en cada uno de sus objetos de formulario y ejecutar el código apropiado en muchos lugares de su código.
Ahora, los eventos touched pueden ser implementados para algunos atributos gracias a las palabras clave touched y event. El código se centraliza en la clase de entidad apropiada y se ejecuta tan pronto como el valor de un atributo cambia en cualquier lugar de su aplicación.
En este ejemplo, se ha implementado un evento touched para algunos atributos en la clase 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)
ejemplo #2
En este otro ejemplo, el evento touched se utiliza para evitar el manejo de un atributo calculado que podría conducir a un mal rendimiento. Dada una clase de datos Booking en una aplicación de alquiler de coches, se necesita un atributo para saber si las fechas de salida y llegada son las mismas.
Su implementación debería serlo:
exposed function get sameDay(): Boolean
return (This.departureDate = This. arrivalDate)
Pero la consulta de este atributo no puede utilizar índices, por lo que no está muy optimizada.
Así que se puede crear un atributo sameDay en la clase de datos e implementar un evento touched como se indica a continuación para los atributos departureDate y arrivalDate. Para que este atributo sameDay esté siempre actualizado.
Function event touched departureDate($event : Object)
This.sameDay:=(This.departureDate=This.arrivalDate)
Function event touched arrivalDate($event : Object)
This.sameDay:=(This.departureDate=This.arrivalDate)
desencadenar la lógica de negocio cuando se cambia cualquier atributo
¿Necesita reaccionar ante cualquier cambio de datos en memoria durante un viaje de usuario? Cualquiera que sea el propósito: depuración o actualización de datos sobre la marcha, ahora es posible.
Puede activar un evento touched a nivel de la entidad. Cuando se cambia el valor de cualquier atributo de la entidad, el evento se activa y ofrece información útil.
cómo implementar esto
En la clase Entidad, añade la función touched que recibe el evento como parámetro Object.
Por ejemplo, aquí está la clase PeopleEntity.
Class extends Entity
Function event touched($event : Object)
caso de uso #1
En su aplicación, ha detectado que una entidad People ha sido actualizada pero no entiendes dónde. Implementa el evento touched y coloca un breakpoint dentro para comprobar la cadena de llamadas.
Aquí tiene un método de proyecto simple updatePeople:
$people:=ds.People.all().first()
updateCivilInfo($people)
updateAddress($people)
Y la ventana de depuración mostrando la cadena de llamadas con el método que dispara el evento touched (updateCivilInfo).
Note que el objeto Event contiene el nombre del atributo.

caso de uso #2
Puede poner en mayúsculas el valor de un atributo si su tipo es Text, sea cual sea el atributo.
Para ello, implemente este código:
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
Y compruebe que funciona:

Como puede entender, es probable que el evento touched se active muy a menudo. Por eso el código implementado debe ser de rápida ejecución y ligero para mantener un buen rendimiento. El último ejemplo anterior es relevante si la clase de datos contiene sólo unos pocos atributos.
Si necesita saber más sobre cómo se comporta este evento en C/S o usando 4D Qodly pro o cuando se trabaja con un datastore remoto, lea este blogpost.
Consulte la documentación y juegue con HDI para aprender más.
Por el momento, no se pueden publicar comentarios en esta entrada.