ORDA et recherche sur les liens

Bonjour,
je suis confronté à une problematique avec ORDA, j’essaye de trouver des éléments d’une table A lié par un lien AversB à une table B.
Les éléments que je veux trouver ne doivent pas avoir de lien :

Code :
$esA = ds.A.query(“ChampA = :1”;“valA”)
$esA = $esA.query(“AversB=null”)

ne marche pas ca me retourne $esA equivalent au nombre d’éléments de la table B

Code :
$esA = ds.A.query(“Champ1 = :A”;“valA”)
$esA = $esA.query(“AversB.ChampB =null”)

ca ne marche pas non plus.
Quelqu’un aurait une idée ?
D’avance merci

Bonjour,

$esA:=$esA.minus(ds.TableB.all().LienRetourVersA)

Merci, j’imaginais bien pouvoir faire la recherche inverse, mais du coup ca veut dire qu’on ne peut pas chercher directement !? et si la table B est grande ca ne risque pas d’être trop lourd ?

Il y a peut-être une autre solution. Je ne sais pas. Ce serait bien en effet.

Dans 4D, en général, ça a toujours été compliqué de faire une recherche basée sur une non-existence :wink:
Il vaut mieux chercher ce qui existe puis en déduire la sélection complémentaire.
En terme de performance sur une grosse table, il faut tester. Le champ d’où part le lien doit être indexé, c’est sûr.

Je vais noter cette solution, mais si jamais quelqu’un a une alternative ou si 4D note ca en feature :slight_smile: ca nous interesse du coup :wink:

En même temps, comment en interne peut-il faire mieux que ça ?
Comment trouver les entités de A non liées à une entité de B ?
S’il y a une meilleure solution, elle doit peut-être venir de nous développeurs. Le champ de lien est vide par exemple.

Alors on vient de tomber sur une information supplémentaire qui pourrait dire qu’il y a eventuellement un bug ?!
Si on applique la formule de cette facon :

Code :
$esA:=ds.A.query(“AversB= null”)
$esA:=$esA.query(“ChampA : :1”;“valA”)

ca donne le résultat attendu … mais ca ne me convient pas car $esA.query(“ChampA : :1”;“valA”) est bien plus complexe dans le code original et passe par beaucoup de méthode…

Ça demande vérification.
J’ai testé la forme $esA:=ds.A.query(“AversB= null”).
Ça n’a rien donné de bon chez moi. La sélection est vide alors qu’elle ne devrait pas.

Ok… c’est en quelle version de 4D ?

J’ai testé en 17.3 HF2.

Bonjour,

Et si vous essayez :

$esA = $esA.query(“AversB is null”)

ou

$esA = $esA.query(“AversB is not null”)

Cordialement,

Bonjour Olivier,

$esA = $esA.query(“AversB is not null”) fonctionne (retourne 1 element alors que l’entity selection de base contient 4 element )mais pas $esA = $esA.query(“AversB is null”) (retourne 12 element alors que l’entity selection de base contient 4 element )

Bonjour,

Il faut surement revenir au pb de base avant de complexifier :

$esA = ds.A.query(“ChampA = :1 AND AversB is not null”;“valA”)

ou

$esA = ds.A.query(“ChampA = :1 AND AversB is null”;“valA”)

Cordialement,

Le problème comme indiqué c’est que ChampA = :1 n’est qu’un exemple pour simplifier ma demande mais $esA avant la requete sur le lien est issu d’un certain nombre de méthode.
Du coup j’ai fait la recherche inverse et j’ai fait le minus …

Bonjour,

Actuellement il y a un bug sur ce genre de recherche (query sur une related entity Null) si la foreign key n’est pas indexée.

Si vous ajoutez un index sur la foreign key du lien many to one, il n’y a pas de problème.

Bonjour,

Merci de votre retour mais les 2 champs du lien sont déjà indexés :disappointed:

Bonjour,

Je vous ai envoyé une base d’exemple qui pourra nous aider à trouver le problème, je l’espère.