¡La serie ORDA continúa! En esta entrada del blog veremos cómo utilizar los operadores lógicos en las selecciones de entidades.
Estas operaciones permiten obtener intersecciones, uniones o diferencias entre dos selecciones de entidades como se puede hacer con los conjuntos clásicos de 4D.
Ejemplo de operadores lógicos en selecciones de entidades
En 4D clásico, se utilizan conjuntos para realizar operaciones lógicas sobre varios resultados de consulta. Debe crear un conjunto después de cada consulta, realizar la operación lógica sobre los conjuntos y, finalmente, actualizar la selección actual de la tabla en cuestión con el conjunto resultante. ¡Es un poco pesado! Afortunadamente, con ORDA las cosas se vuelven mucho más ligeras. Cada consulta le da una selección de entidades a la que sepueden aplicar directamente los operadores lógicos.
ORDA provee los siguientes métodos para realizar operaciones lógicas en dos selecciones de entidades:
– and(): obtiene la intersección entre dos selecciones de entidades (entidades que pertenecen a ambas)
– or(): obtiene la unión entre dos selecciones de entidades (entidades que pertenecen a una o a la otra)
– minus(): obtiene la diferencia entre dos selecciones de entidades (entidades que pertenecen a una y no a la otra)
Estos métodos también pueden ser aplicados a una selección de entidades y a una entidad individual.
Ejemplo
¡Un ejemplo vale más que mil palabras! Echemos un vistazo a los empleados y sus preferencias de comida.
CLÁSICO 4D:
//A named selection "meat" is created before
// ...
QUERY BY ATTRIBUTE([Empleado];[Empleado]food; "pescado";=;Verdadero)
CREATE SET ([Empleado]; "pescado")
USE NAMED SELECTION ("carne")
CREATE SET ([Empleado]; "carne")
UNION ("pescado"; "carne"; "resultado")
USE SET ("resultado")
CLEAR SET ("carne")
CLEAR SET ("pescado")
CLEAR SET ("resultado")
ORDA:
Aquí tenemos un método que recibe como parámetro una selección de entidades. Devolvemos la unión de la selección de entidades $eatingMeat y la selección de entidades $eatingFish.
C_OBJECT($eatingFish;$1;$eatingMeat;$result)
$eatingMeat :=$1
//Get employees eating fish
$eatingFish :=ds.Employee.query("comida.pescado=:1";Verdadero)
//Get the union of the 2 entity selections $eatingMeat and $eatingFish
$result:=$eatingMeat.or($eatingFish)
$0 :=$result