A série ORDA continua! Neste post de blogue veremos como utilizar operadores lógicos nas selecções de entidades!
Estas operações permitem-lhe obter intersecções, uniões, ou diferenças entre duas selecções de entidades como pode fazer com os conjuntos clássicos 4D.
Exemplo de operadores lógicos nas selecções de entidades
No clássico 4D, utilizam-se conjuntos para realizar operações lógicas em vários resultados de consulta. Deve criar um conjunto após cada consulta, realizar a operação lógica nos conjuntos, e finalmente actualizar a selecção actual da tabela em questão com o conjunto de resultados. É um pouco pesado! Felizmente, com a ORDA as coisas estão a tornar-se muito mais leves! Cada consulta dá-lhe uma selecção de entidade à qual os operadores lógicos podem ser directamente aplicados!
A ORDA fornece os seguintes métodos para realizar operações lógicas em duas selecções de entidades:
– and(): obter a intersecção entre duas selecções de entidades (entidades pertencentes a ambas)
– or(): obter a união entre duas selecções de entidades (entidades pertencentes a uma ou à outra)
– minus(): obter a diferença entre duas selecções de entidades (entidades pertencentes a uma e não à outra)
Estes métodos também podem ser aplicados a uma selecção de entidade e a uma entidade individual.
Exemplo
Um exemplo vale mais que mil palavras! Vamos dar uma vista de olhos aos empregados e às suas preferências alimentares.
CLÁSSICO 4D:
//A named selection "meat" is created before
// ...
QUERY BY ATTRIBUTE([Empregado];[Empregado]food; "peixe";=;Verdadeiro)
CREATE SET ([Empregado]; "peixe")
USE NAMED SELECTION ("carne")
CREATE SET ([Empregado]; "carne")
UNION ("peixe"; "carne"; "resultado")
USE SET ("resultado")
CLEAR SET ("carne")
CLEAR SET ("peixe")
CLEAR SET ("resultado")
ORDA:
Aqui, temos um método que recebe uma selecção de entidade como parâmetro. Devolvemos a união da selecção da entidade $eatingMeat e a selecção da entidade $eatingFish.
C_OBJECT($eatingFish;$1;$eatingMeat;$result)
$eatingMeat :=$1
//Get employees eating fish
$eatingFish :=ds.Employee.query("food.fish=:1";True)
//Get the union of the 2 entity selections $eatingMeat and $eatingFish
$result:=$eatingMeat.or($eatingFish)
$0 :=$result