Ciberseguridad y Seguridad Informática Franco Correa Grupo B.pptx
Genexus
1. Ya hemos visto anteriormente el concepto general de Business Component y su
aplicación en una transacción de un solo nivel.
Veamos ahora qué sucede cuando nos enfrentamos a la declaración de una
transacción de dos niveles como Business Component.
2. Analizaremos esta situación a través de la implementación de una nueva funcionalidad
en nuestra aplicación.
Cada cierto tiempo la Agencia obsequia una excursión a elección, en este caso a una
ciudad italiana, a grupos reducidos de clientes.
Si bien un cliente puede contratar varias excursiones y cada excursión puede ser
contratada por varios clientes, en particular cada cliente puede participar solamente de
una única excursión obsequiada por la Agencia (al menos por ahora).
Cuando las excursiones se insertan, se especifica si son gratuitas o no. En tanto, en la
transacción Customer hemos definido el atributo fórmula CustomerFreeTrips y la regla:
Error(“Customer already has registered a free trip.”) if CustomerFreeTrips > 1;
para controlar que los clientes no puedan tener más de una excursión obsequiada.
Utilizaremos la transacción Customer como Business Component. Para eso, declaramos
su propiedad Business Component con el valor True.
Al grabar, sabemos que GeneXus creó el tipo de dato Customer asociado a la
transacción. Pero como se trata de una transacción de dos niveles, creó también el tipo
de dato Customer.Trip asociado a las líneas del segundo nivel, que en nuestro ejemplo
corresponden a las excursiones del cliente.
3. Este web panel muestra los clientes en un combo dinámico y las excursiones
gratuitas a ciudades italianas en una grilla.
También hemos especificado la propiedad Allow Selection del grid, con el valor
True, para que el usuario final, pueda seleccionar una línea del grid:
La idea entonces es seleccionar un cliente en el combo, una excursión del grid, y
que al presionar el botón Confirm dicha excursión se grabe como una línea del
cliente, controlando siempre que solamente se registre una excursión gratuita
para ese cliente.
4. Definimos en este objeto una variable &Customer de tipo Customer y una variable
&oneTrip de tipo Customer.Trip.
Analicemos ahora el código declarado en el evento Enter asociado al botón.
En el evento Enter asociado al botón Confirm, lo primero que hacemos es recuperar
de la base de datos toda la información del cliente seleccionado en el combo y la
misma queda cargada en memoria en la variable &Customer.
La variable &oneTrip es del tipo de datos de una línea de la transacción Customer,
es decir que corresponde a una excursión del cliente. O sea que esta variable es
compuesta de varios miembros que almacenan datos.
En particular le estamos asignando al miembro TripId, el identificador de la
excursión seleccionada en el grid.
En la siguiente línea de código estamos usando un método Add, el cual agrega a la
lista de excursiones que ya tiene el cliente, la excursión que se le indica entre
paréntesis O sea, la variable &oneTrip que hemos cargado en la línea de código
anterior.
Hasta ahora hemos trabajado en memoria. Solamente hemos agregado una
excursión a un cliente.
Para realizar la actualización física en la base de datos declaramos el método Save
y el comando Commit, necesarios al trabajar con Business Component.
5. ¿Qué sucede con el control de la cantidad de excursiones gratuitas por cliente?
Si bien este control se dispara automáticamente al aplicar el método Save a la
variable del Business Component, para que el usuario final se entere, debemos
obtener y mostrar explícitamente los mensajes que se emitieron.
¿A qué tipo de mensajes nos referimos? A los propios que emite GeneXus por
controles de consistencia de los datos, unicidad de valores de llaves primarias,
etc. y a los mensajes asociados a nuestras propias reglas Errror y Msg.
¿Cómo hacemos entonces para recuperar los mensajes que ocurrieron?
Utilizamos el Tipo de datos estructurado Messages que automáticamente define
GeneXus al crear una nueva KB. La finalidad de este tipo de datos colección, es
permitirnos acceder a los mensajes que se emiten en la ejecución de un Business
Component.
De modo que definimos dos variables:
&Messages (del tipo de datos Messages, colección) y
&oneMessage (del tipo de datos Messages.Message, que representa un elemento
de la colección).
6. Aplicamos el método GetMessages a la variable &Customer y obtenemos la
colección de mensajes que ocurrieron…
y por último, utilizando la estructura “For elemento in colección”, recorremos
cada mensaje de la variable colección de mensajes y desplegamos su descripción.
7. Ejecutamos el web panel WPTrips, elegimos al cliente Parker, seleccionamos la
excursión a Roma y presionamos el botón.
Vemos que se despliega el mensaje de GeneXus informando que se realizó el
registro.
¿Qué sucederá si intentamos asignarle también la excursión a Venecia?
Se despliega el mensaje correspondiente a nuestra regla Error, que controla que
el cliente solamente tenga asociada una excursión gratuita.