Requête sur un champ ramené

Bonjour,
je cherche à requeter un champ ramené comme suit :

String [] resp_list = getGrant().queryFirstColumn("select evlValInvId__evlPrtId__evlPrtManager1 from evl_valuation where evl_val_cpn_id="+getRowId());

sauf que le champ n’est pas reconnu dans la table :

2021-09-16 18:50:08,694|SIMPLICITE|ERROR||http://demo.simplicite.io:20128||ECOREDB001|system|com.simplicite.util.engine.GrantManager|query||Error SQL query: select evlValInvId.evlPrtId.evl_prt_manager1 from evl_valuation where evl_val_cpn_id=5
    java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: EVLVALINVID.EVLPRTID.EVL_PRT_MANAGER1 in statement [select evlValInvId.evlPrtId.evl_prt_manager1 from evl_valuation where evl_val_cpn_id=5]

Pouvez-vous m’aider ? merci :slight_smile:

2 pbs:

  1. en Java il faut utiliser les noms logiques avec des ., pas les noms Javascript avec les __
  2. le nom logique n’est pas un nom de colonne => il faut récupérer le nom de colonne via getColumn

Et bien sûr, s’agissant d’un attribut ramené, il faut sélectionner sur la bonne table

"select " + getField("evlValInvId.evlPrtId.evlPrtManager1").getColumn() + "..."

Mais bon, il n’est en général pas une bonne approche de passer par du SQL sauf si on a une très très bonne raison pour zapper la couche logique. Ca peut le cas dans des cas très tordus, mais si on part sur du SQL pour un besoin simple c’est certainement qu’on fait un mauvais choix = potentiellement une grave erreur de conception (car ça zappe totalement les filtrages logiques, les règles de gestion etc.)

Mieux vaut utiliser les APIs niveau logique genre:

ObjectDB obj = getGrant().getTmpObject("MyObject");
for (String[] row : obj.getTool().search(new JSONObject().put("myFilter1", "...").put(...)) { // Search records
   obj.setValues(row); // Load record as current record
   // Do something with record, e.g.
   String val = obj.getFieldValue("myOtherField");
}

Merci pour ta réponse,
en fait je cherche à récupérer des adresses emails d’utilisateurs qui sont reliés à un type d’objet (Participation), lui même relié à un Investissement, lui même relié à des Evaluations reliées à des Campagnes d’évaluations.
Et ce pour leur envoyer un mail d’information dès qu’on change de statut sur la campagne.

Petites questions techniques :

  • la variable row est donc une liste de type String que l’on vient charger dans une instance d’objet temporaire “obj” ?
  • Concernant l’utilisation de gettool().search(new Json…). Tu utilises plusieurs put() à la suite, dans quels cas ?
  • pareil au sein d’un put, on peut donc cumuler les filtres ? sous quelle forme ?

merci pour ton aide

Ces questions rélèvent plus de la formation que du support…

  1. dans mon exemple je ne manipule pas un “row ID” mais d’un “record” (row)= un tableau de valeurs que je charge dans l’objet comme le record courant (cf. les commentaires)

  2. le JSONObject que je passe au search contient un ensemble de filtres (d’où les .put multiples)
    c’est une methode utilitaire qui permet de faire de manière “compacte” de faire ce que j’aurais pu écrire comme cela:

obj.resetFilters();
obj.getField("myFilter1").setFilter(...);
obj.getField("myFilter2").setFilter(...);
for (String[] row : obj.getTool().search()) {
    obj.setValues(row); 
    ...
}
...

Très bien,
je comprends qu’il faut que je me rapproche de la formation pour ce cas d’usage.
merci.

Ce document : Simplicité® documentation/01-core/businessobject-code-hooks donne des guidelines et des exemples d’implémentation de hooks d’objet métier coté serveur

En l’occurence ce que je comprend du besoin indiqué il faut à priori implémenter la recherche des adresses email via les filtres ad hoc et l’envoi de mail dans le postSave de votre objet Campagne (= après enregistrement réussi d’un changement sur Campagne je fais quelque chose, ici un envoi de mail)

Par contre si on parle d’un “statut” au sens d’un attribut de type “modèle d’état” il existe un mécanisme paramétrable de notification sur transition d’état = les alertes. A voir si cela répondrait à votre cas. Il y a des exemples de ce type d’alertes de transition d’état dans la démo (sur l’objet commande = le client qui commande est notifié de l’annulation et de la livraison de la commande)

1 Like

ok pour les hooks.
Je ne peux pas passer par les alertes car les listes d’emails sont sur une table liée (d’où la requête SQL en amont).

J’ai cette erreur en essayant d’utiliser “JSON”

Class compilation error (status 1)
/home/formationsiparex1/tomcat/webapps/ROOT/WEB-INF/src/com/simplicite/objects/Evaluator/EvlCampain.java:79: error: cannot find symbol
			for (String[] row : eval_ot.search(new JSONObject().put("evlValCpnId", campainId))) { // Search records
			                                       ^
  symbol:   class JSONObject
  location: class EvlCampain
1 error
#ERROR

Code utilisé :

	ObjectDB eval = getGrant().getTmpObject("EvlValuation");
			BusinessObjectTool eval_ot = eval.getTool();
			for (String[] row : eval_ot.search(new JSONObject().put("evlValCpnId", campainId))) { // Search records
				   eval.setValues(row); // Load record as current record
				   // Do something with record, e.g.
				   String resp = eval.getFieldValue("evlValInvId.evlPrtId.evlPrtManager1");
				   AppLog.info("===================="+resp, Grant.getSystemAdmin());
				}

REUSSI !!! :partying_face:
Il me manquait un try {}catch !!

Vu l’erreur de compilation il manquait à priori un import org.json.*;

Pour les alertes paramétrables si vous regardez comment on implémente les destinataires vous verrez que ça peut justement être une requête SQL (pour les cas complexes). Cf. les cas de la demo.

Bref à vous lire je ne vois à priori pas de raison de ne pas utiliser les alertes paramétrables.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.