Reglas en transacciones - Más conocimientos

Anuncio
Reglas en transacciones - Más conocimientos
En un video anterior hemos visto que en las transacciones, los controles que nos solicitan los
usuarios o que debemos validar, se definen en la sección de RULES.
Hemos explicado ya algunas reglas que nos ofrece GeneXus y ahora presentaremos algunos
ejemplos más.
Siguiendo con nuestro ejemplo de construir una aplicación para una agencia de viajes,
supongamos que todo cliente va acumulando millas en la medida que realiza excursiones.
Observemos en particular la estructura de la transacción Customer:
Vemos que cada cliente puede realizar varias excursiones.
Pero detengámonos en este atributo CustomerTripMiles. Permite el ingreso de las millas
obsequiadas aquí en el segundo nivel de la transacción, para cada excursión realizada para
cada cliente.
Otra opción de diseño, si es que la realidad a reflejar fuera así, sería definir que cada excursión
tenga asociada una cierta cantidad de millas que obsequiar..
De esta forma:
Page
1
TripMiles
Video filmado con GeneXus X Evolution 2 – upgrade 2
Entonces en el segundo nivel de la transacción Customer, es decir para cada excursión
realizada por cada cliente, podríamos “inferir”, “disponer” de este valor del atributo TripMiles
a través del atributo TripId.
TripMiles
De igual forma que inferimos el valor de TripDate y los demás atributos de la transacción Trip.
Pero en este ejemplo, hemos definido las millas recibidas, por cliente y excursión, por si de
forma personalizada reciben diferente cantidad de millas según el caso:
A su vez, cada cliente tiene un total de millas acumuladas.
Vamos a presentar la regla Add.
Declaramos en la transacción Customer la siguiente regla:
Add(CustomerTripMiles, CustomerTotalMiles);
Page
2
¿Y cómo será el comportamiento de esta regla?
La regla Add tiene incorporado el siguiente comporamiento:
Video filmado con GeneXus X Evolution 2 – upgrade 2
•
Si se ingresa una nueva excursión para el cliente, entonces se le suma la cantidad
CustomerTripMiles a CustomerTotalMiles.
•
Si se elimina una excursión del cliente, entonces automáticamente se resta el valor de
CustomerTripMiles a CustomerTotalMiles.
•
Y en caso de modificarse el valor de CustomerTripMiles asociado a una excursión del
cliente, entonces automáticamente se resta el valor que tenía CustomerTripMiles a
CustomerTotalMiles y se le suma el nuevo valor de CustomerTripMiles. O sea, se
efectúa la diferencia.
En definitiva, la regla add, hace lo que dice su nombre:
Suma el primer valor al segundo, si es que el usuario está nsertando.. y resuelve las demás
operaciones según se esté eliminando o modificando.
Como esta regla Add que hemos definido tiene al menos un atributo del segundo nivel,
GeneXus entiende que está asociada al segundo nivel... es decir que va a ejecutar esta regla
cada vez que el usuario inserte o elimine una línea.. o cada vez que el usuario modifique el
valor de CustomerTripMiles de alguna línea.
GeneXus ofrece también la regla Subtract, que tiene un comportamiento absolutamente
similar al de la regla Add, solamente que en este caso, y como su nombre lo dice, subtract
resta si el usuario inserta… y hace las demás operaciones según el caso.
Consideremos entonces la regla que estamos viendo:
Subtract(CustomerTripMiles, CustomerTotalMiles);
Si se inserta una nueva excursión para el cliente, se resta el valor de
CustomerTripMiles a CustomerTotalMiles.
•
Si se elimina una excursión del cliente, entonces se suma el valor de
CustomerTripMiles a CustomerTotalMiles.
•
Y en caso de modificarse el valor de CustomerTripMiles asociado a una excursión del
cliente, entonces se calcula la diferencia.
Page
3
•
Video filmado con GeneXus X Evolution 2 – upgrade 2
Ahora veremos una particularidad importante de tener en cuenta, a la hora de definir
controles que combinan la regla Subtract o Add, con la regla Error. Y lo veremos con un
ejemplo práctico.
Observemos la transacción Prize, que permite definir premios a ser canjeados por millas.
Cada premio tiene una cantidad de millas requerida para poder ser otorgado a un cliente que
disponga de dicha cantidad de millas , o que tenga más aún.
De modo que cuando el usuario ejecute esta transacción y trate de asignar un cliente a un
premio, se debe validar si efectivamente el cliente tiene millas suficientes. En caso de
alcanzarle y quedarse con el premio, hay que restarle al cliente las millas que utilizó; y en caso
de no tener las millas suficientes para canjear el premio, se debe anunciar el error
correspondiente.
Veamos entonces las reglas declaradas en esta transacción Prize, para resolver el
requerimiento:
Subtract(PrizeMiles, CustomerTotalMiles);
Error(“The customer doesn´t have enough miles”) if CustomerTotalMiles < 0;
La regla Subtract, como ya hemos explicado, si estamos insertando un nuevo registro de
premio, va a restar las millas asociadas al premio al total de millas del cliente.
Por su lado, la regla error está desplegando un error que indica que el cliente no tiene millas
suficientes si es que el total de millas del cliente quedó con valor negativo.
¿Y por qué lo hemos resuelto así?
Page
4
Porque dado que ambas reglas involucran al atributo CustomerTotalMiles, siendo que una de
las reglas actualiza a dicho atributo y la otra regla evalúa su valor, GeneXus determina que
primero debe ejecutar la sustracción y luego evaluar qué sucedió con el valor de
CustomerTotalMiles.
Video filmado con GeneXus X Evolution 2 – upgrade 2
Como la resta se efectúa primero, si el cliente tiene menos millas que las requeridas por el
premio, entonces el atributo CustomerTotalMiles quedará con valor negativo. Y por este
motivo es que la regla error debe evaluar si CustomerTotalMiles es menor que cero.
En caso de ocurrir esto, se dispara la regla Error, se emite el texto que anuncia el error y la
regla Subtract de deshace, es decir, que se revierte su ejecución como si no se hubiera hecho
nada y entonces el total de millas del cliente queda sin haberse modificado.
Si en cambio luego de la ejecución del Subtract, el valor de CustomerTotalMiles aún queda con
valor positivo, entonces la regla Error no se dispara y el Subtract queda efectuado.
Recordemos que si se elimina el registro correspondiente a un premio, la regla Subtract actúa
sumando. O sea que sumará la cantidad de millas correspondiente al premio al total de millas
del cliente.
Vamos a verlo en ejecución. Presionemos F5…
Seleccionamos Work With Customers.
Vemos entonces los clientes que están registrados, y para cada uno de ellos la cantidad de
millas que tiene acumulada.
Observemos, por ejemplo, que Susan Parker tiene un total de 650 millas. Vamos entonces a
otorgarle un premio a Susan Parker que requiere de cien millas.
Vamos entonces a la transacción Prize, y registramos el nuevo premio.
Seleccionamos la fecha de hoy, la descripción del premio que va a ser una cena, la cantidad de
millas que se requiere, seleccionamos al cliente, y al inferir los datos vemos que ya se realizó la
resta de las millas correspondientes.
Confirmamos el premio, y verificamos el resultado volviendo a Work With Customers…
Supongamos ahora, que por algún motivo, este premio que fue otorgado se cancela.
Según lo que hemos visto del comportamiento de la regla Subtract, si este premio se cancela,
entonces las cien millas que fueron restadas al cliente volverán a ser adjudicadas.
Vamos entonces a seleccionar el premio, y lo vamos e eliminar. Presionamos Delete.
Volvemos entonces a Work With Customers, y podemos comprobar que efectivamente las cien
millas volvieron a sumarse.
Page
Nuevamente otorgamos una cena, indicamos las mil millas, y seleccionamos al cliente Susan
Parker. Como efectivamente este cliente no tiene millas suficientes, se emite el mensaje de
error.
5
Intentemos ahora otorgarle un nuevo premio a Susan Parker pero que requiera de mil millas.
Como esta persona no tiene millas suficientes, entonces deberá emitirse el mensaje de error.
Video filmado con GeneXus X Evolution 2 – upgrade 2
Para finalizar, veremos una regla que ofrece numerar automáticamente y correlativamente los
identificadores de líneas, es decir, del segundo nivel de una transacción, ya que para este caso
no podemos utilizar la propiedad Autonumber con valor Yes, porque esta propiedad
Autonumber solamente numera llaves primarias simples.
La regla que presentamos se llama Serial y veremos su uso en esta transacción Country que
tenemos definida en nuestra base de conocimiento.
Queremos que CityId vaya recibiendo automáticamente un número cada vez que el usuario
define una nueva línea con una ciudad, y de esta forma no tenga que digitarlo en forma
manual.
Vamos a declarar entonces la siguiente regla:
Serial(CityId,CountryLastCityId,1);
El primer parámetro debe ser el atributo a ser numerado automáticamente. El segundo
parámetro debe ser un atributo que necesariamente tiene que estar declarado en el primer
nivel de la transacción y será el encargado de almacenar el último número de línea asignado
hasta el momento.
Vamos entonces a definirlo en la estructura de la transacción, ya que de lo contrario no va a
ser posible salvar esta declaración..
Volvemos nuevamente al sector de las reglas… y nos resta explicar que en el último parámetro
debemos indicar el incremento, o sea de cuánto en cuánto queremos numerar.
Cabe mencionar que a este atributo CountryLastCityId podemos quitarlo del form, si es que no
queremos verlo, pero la regla Serial lo requiere.
Veamos esto en funcionamiento. Presionemos F5…
Ingresamos a la transacción Country, y vamos a dar de alta a Uruguay, con dos ciudades…
Page
6
Vemos que automáticamente las líneas se numeraron, y en el primer nivel se guarda el último
valor asignado.
Video filmado con GeneXus X Evolution 2 – upgrade 2
Descargar