Populate des champs ramenés dans une activité "sans dialogue utilisateur"

Bonjour,

Lors d’une activité A1, de type « Créer », est qui est « sans dialogue utilisateur », les champs ramenés ne sont pas remplis. Est-ce normal ?

Je m’explique, dans le postValidate de l’objet OBJ, qui est défini dans les données d’activité de A1, je ne récupère pas les valeurs des champs ramenés des objets liés à OBJ, mais juste leurs row_id.

Pareil, dans le postValidate de l’activité A1, je ne peux pas utiliser les champs ramenés dans cette activité.

Si je bascule A1 en « avec dialogue utilisateur », tous les pbs seront réglés.

Dans un souci de réduction de nombres d’écran dans notre process et étant donné que A1 est une activité qui ne sert qu’à créer un objet OBJ, pour lequel tous les champs principaux sont déjà pré-alimentés dans les activités précédentes, donc, je n’ai aucun intérêt à l’afficher aux utilisateurs. En revanche, j’ai besoin d’utiliser dans le postValidate de cet activité A1, les champs ramenés. D’où ma question.

Peut-être qu’il faut utiliser un autre hook que postValidate pour cette activité A1, dans lequel le populate des champs sera fait, même en cas de « Pas de dialogue utilisateur » ?

J’espère avoir été assez explicite.

Merci d’avance pour votre aide.

Abed.

Bonjour,

Pour alimenter les champs ramenés par code à partir des row_id valorisés dans le FK (et aussi setter les valeurs par défaut lors d’un create), il faut faire pour tous les champs un :

obj.populate(true);

ou pour un seul champ :

obj.populate(getField("myForeignKey"), true);

A l’inverse pour peupler la FK à partir des champs ramenés (la clé fonctionnelle doit être complète), il faut faire un :

obj.completeForeignKeys();

Donc à appeler dans un hook qui survient avant votre usage, ou juste avant votre code qui accéde à un champ ramené. Le pattern peut être le suivant pour tester si le champ est vide et pas la FK :

if (getField("myForeignKey.joinedField").isEmpty() && !getField("myForeignKey").isEmpty()) {
   populate(getField("myForeignKey"), true);
}

Merci @Francois pour votre réponse.
J’ai essayé “populate” sans succès. il doit sûrement me manquer qq choses :

Voici le code que j’ai ajouté dans le postValidate de l’objet à créer (OBJ dans mon message précédent)

	var leaseStatus = this.getField("leaseTenantImmoLeaseId.leaseStatus").getValue();
	console.log("AVANT POPULATE : leaseStatus = "+ leaseStatus);	
	if (this.getField("leaseTenantImmoLeaseId.leaseStatus").isEmpty() && !this.getField("leaseTenantImmoLeaseId").isEmpty()) {
		console.log("je suis dans le POPULATE : leaseTenantImmoLeaseId = " + this.getFieldValue("leaseTenantImmoLeaseId"));	
		this.populate(this.getField("leaseTenantImmoLeaseId"), true);
	}
	var leaseStatus = this.getField("leaseTenantImmoLeaseId.leaseStatus").getValue();
	console.log("APRES POPULATE :  leaseStatus = "+ leaseStatus);

Et voici le résultat :

10:19:33,920|SIMPLICITE|INFO||http://e3m.simplicite.io:10118||INFO|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoLeaseTenant/bpm_ajax_ImmoLeaseTenant||Evénement: APRES POPULATE : leaseStatus =
2022-01-26 10:19:33,920|SIMPLICITE|INFO||http://e3m.simplicite.io:10118||INFO|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoLeaseTenant/bpm_ajax_ImmoLeaseTenant||Evénement: je suis dans le POPULATE : leaseTenantImmoLeaseId = 882
2022-01-26 10:19:33,919|SIMPLICITE|INFO||http://e3m.simplicite.io:10118||INFO|designer|com.simplicite.util.engine.ScriptInterpreter|ImmoLeaseTenant/bpm_ajax_ImmoLeaseTenant||Evénement: AVANT POPULATE : leaseStatus =

J’ai bien le champ ramené vide, le row_id renseigné et malgré le populate, le champ ramené reste vide.

Et aussi une question svp : quel pattern de populate à utiliser dans le postValidate de l’activité (sans dialogue) pour récupérer par exemple le champ :

var tenantTypePerson = context.getDataValue("Field", "leaseTenantImmoTenantId.leaseStatus ");		

Merci d’avance pour votre aide.
Abed.

Essayez un populate(true) global sans désigner le champ.

Le populate est simple = il appelle la méthode populateForeignKey qui fait un “select” de la référence et set les champs ou les remet à vide si le select ne ramène rien.

Testez un select dans votre code sur l’instance getRefObject sur cet Id pour voir s’il n’y a pas une règle ou un filtre/search-spec/code qui bloque l’accès à cette référence.

if (this.getGrant().getRefObject(“JoinObject”).select(id)) …

Si le populate ne fonctionne pas vous pouvez toujours alimenter les champ en faisant les select/setValue spécifiquement à vos contraintes.

Je ne comprends pas bien votre 2eme question. Les verbes sont les mêmes mais sur des instances différentes dans le cadre d’un screen flow = donc vous devez les peupler également getProcessObject(“x”).select(id), setValue…

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