Utiliser "obj.getGrant().simpleQuery()" dans un Impact

Tags: #<Tag:0x00007fdd49e37e10>

Bonjour,

Est-ce qu’on peut utiliser “obj.getGrant().simpleQuey(SQL)” dans un impact ?

Cordialement,

Je pense que par “impact” vous voulez dire l’expression d’un impact de contrainte.

Dans une expression exécutée coté serveur (ex: une contrainte “back”, un attribut calculé, une valeur par défaut d’attribut, …) on peut utiliser toutes les APIs Java Simplicité et/ou tiers disponibles dans la plateforme (en utilisant la syntaxe Javascript-like de Rhino), donc oui par exemple faire des requêtes SQL.

Par contre dans une expression exécutée coté client (ex: une contrainte “front”) on ne peut faire qu’un nombre restreint de choses (qui sont pertinentes coté client en Javascript), il n’est bien entendu pas possible de faire des requêtes SQL ou d’autres choses du même genre qui n’ont de sens que coté serveur.

PS: De manière plus générale, quand dans Simplicité on en arrive à écrire du SQL c’est souvent qu’on est en train de faire une erreur de conception. Cela peut peut sembler “pratique” dans certains cas mais c’est la plupart du temps une très mauvaise idée à moins d’être absolument certain qu’il n’y a pas une autre manière de faire (ex: faire un select/update en base plutôt qu’un select/update logique au niveau des objets métier c’est passer à coté de toutes les règles d’habilitation et de gestion de l’objet métier, etc.)

Oui on peut faire du SQL en back uniquement.

Par contre c’est plus couteux que d’accéder à des objets/champs déjà en mémoire.
Une contrainte s’exécute très fréquemment donc la question à se poser est : est ce que le résultat de ma requête peut être factorisé, donc de quelles données ai-je besoin pour ma règle ?

  • si ça dépend de l’enregistrement : stocker le résultat de ma requête dans un attribut calculé une seule fois à chaque save en fonction de mon enregistrement (calculé au preSave par exemple, et juste accédé en lecture dans l’impact de contrainte [VALUE:field])

  • si ça dépend des droits : dans un paramètre de session si ça dépend d’une donnée ou d’un droit utilisateur calculé une seule fois par session : grant.setParameter("x","y") dans le GrantHooks.postLoad(grant), puis juste accédé dans l’impact via getGrant().getParameter("x")=="y"

Ces 2 options ont le mérite de fonctionner en back et front.

Merci @francois et @david pour vos explications.