Transmettre les données entre les activités d'un même processus

Bonjour,

J’ai un processus qui contient plusieurs activités. J’aimerai pouvoir transmettre les données issues d’une activité dans une autre activité.
Je n’ai pas eu le résultat voulu en utilisant les “activity data” car mes données proviennent de plusieurs objets liés.
J’ai écris le script suivant qui ne fonctionne pas :

CreatePV.postValidate = function(context){
 	var step = context.getActivity().getStep();
 	
 	if (step == "CPV-CPVS"){
 		// Je récupère la valeur à transmettre
 		var dm = context.getDataValue("Field", "Departement_DirectionMetier_id.NomDirectionMetier");
 		
 		// Je mets cette valeur dans un paramètre
 		this.getGrant().setParameter("MY_DM", dm);
 		//console.log(this.getGrant().getParameter("MY_DM"));
 	}
 };

CreatePV.postInstanciate = function(){
       // Je récupère la valeur de mon paramètre dans une varaible
 	var val = this.getGrant().getParameter("MY_DM");

 	// Je récupère mon activité
 	var act = this.getContext(this.getActivity("CPV-CBDO"));
 	
 	// Et je mets la valeur de ma variable dans mon champs
 	act.setDataFile("Field", "ObjectifDM_DirectionMetier_id.NomDirectionMetier", val);
 };

Pouvez vous m’apporter votre aide?

Merci d’avance

le post Instanciate n’est appelé qu’une fois sur tout le processus je crois, une fois qu’il est instancié et avant que l’activité Begin commence

pourquoi ne pas mettre

dans le post Validate ?

Oui je confirme le hook postInstanciate n’est appelé qu’une fois par execution du process (= au moment de son “instantiation” pour execution). Les règles de gestion qu’on y met en général sont donc des règles de gestion plutôt “statiques”, i.e. qui resteront valable tout au long de l’execution du processus.

En général la “tuyauterie” de data entre activités n’a pas besoin qu’on écrive de code. Exemple dans la démo le processus de prise de commande passe des données entre activités uniquement par paramétrage.

Afin qu’on vous guide vers la bonne approche merci de nous fournir une description plus complète de votre processus

Description du processus

activité1: ici j’ai un formulaire de création de PV + un formulaire de sélection de personne (car il y a une relation entre PV et Personne)

Or “Personne” est lui aussi en relation avec “Role” et “Centre”. Le “Centre” est lui en relation avec “Departement”, et “Departement” avec “Direction”. On a donc une relation de ce genre :
Role<----Personne—>Centre---->Departement---->Direction
Lorsque je sélectionne, une personne, je récupère aussi son rôle et son centre ( également son département et sa direction)

activité2 : Ici il s’agit d’une étape intermédiaire qui ne pose pas de problème

activité3 : Dans cette activité, j’ai également un formulaire de création qui doit être pré-remplit avec les données saisies précédemment.
J’ai une relation : PV<----Objectif----->Direction
Le problème réside dans le fait que, je n’arrive pas à pré-remplir le champs “direction name” avec la direction de la personne sélectionnée au préalable. Sachant qu’il n’y a aucune relation directe entre “Personne” et “Direction”

Voila, j’espère avoir été assez explicite

J’ai eu le même souci, en fait si on renseigne “seulement” la “foreign key” (ie l’id de l’objet lié), grace au Parameters par exemple, il ne rapporte pas les informations.

Voila comment j’ai fait pour que l’utilisateur ait les informations :
J’ai créé à la volée des data de type “Field” avec les informations rapportée. (par exemple le nom de la direction) :

Data d = new Data( String Groupe (“Field”), String Nom (“directionFK.directionNom”), String Valeur (“A”))

ensuite sur l’activité qui doit avoir l’information on fait un

act.addData(d)

Par contre il faut penser a mettre la valeur de ses data à “” (vide) pour qu’il n’y ai pas de mauvaise interprétation lorsque l’on relance le processus après.
Donc dans le postValidate après l’action begin par exemple:

Data d = new Data( String Groupe (“Field”), String Nom (“directionFK.directionNom”), String Valeur ("")) //on met a vide la data
[…]
act.addData(d)

Comme la clé fonctionnel existe deja, la valeur est écrasée par la nouvelle

Mais je suis preneuse d’une “meilleure” idée si le staff a !

J’ai fait comme ça parce que dans mes souvenirs (c’était il y a quelques semaines) le fait de créer directement des Data par paramètrage dans l’action avec comme valeur [ < step >.Field.< field name >] (cf : https://training.simplicite.io/training/business-workflows-configuration/w05-routing/ (step4)) ne fonctionnait pas.

Effectivement il faut “raccorder” tous les champs y compris les champs ramenés (d’ailleurs @Francois je ne sais pas si on pourrait améliorer ça d’une manière ou d’une autre).

Dans l’exemple de la démo, à la dernière étape (creation de la commande) on retrouve bien tous les champs requis et sélectionnés aux étapes précédentes (selection du client, du fournisseur et du produit) :

L’exemple de la demo est très différent de mon cas.
Dans la demo, la sélection du client est une activité à part entière (ce qui rend la récupération de ces données relativement simple grace à : “ORDC-100.Field.row_id” oû ORDC-100 est l’étape de sélection du client.)
Dans mon cas, la sélection d’une personne n’est pas une activité (donc on ne peut pas récupérer ces données via : [etape.Field.field name]), mais fait parti d’une activité

D’ou la complexité

les champs de l’activité 1 “créer PV” contiendra en mémoire tous les champs de l’objet PV.
donc a fortiori tous les champs de la personne = FK + champs joints

[nomEtape1.Field.champPersonneId]

ou via des jointures de proche en proche :
pour aller cherche l’id + nom de la direction :

[nomEtape1.Field.champPersonneId.champCentreId.champDepartementId.champDirectionId]
[nomEtape1.Field.champPersonneId.champCentreId.champDepartementId.champDirectionId.directionNom]

Oui, on pourrait faire un populate si on détecte la valorisation d’une FK.
Je vais regarder

Arg, ça ne marche pas, il y a un problème de parsing du champ joint, la démo fonctionne car il n’y a qu’un seul niveau.

il faudra utiliser des double “__” et non des “.” demain pour faire des tests.

[nomEtape1.Field.champPersonneId__champCentreId__champDepartementId__champDirectionId]
[nomEtape1.Field.champPersonneId__champCentreId__champDepartementId__champDirectionId__directionNom]

Effectivement çà ne marche pas, même avec les double __ çà ne marche toujours pas.

Je regarde encore

J’ai fait la modification qui sera poussée ce soir sur le master :

  • pour que “__” soit géré dans la syntaxe entre crochets pour aller chercher la valeur d’un champ join
  • pour n’avoir à valoriser que la foreign-key, le socle fera le populate (alimentation des champs join) lors de l’init de l’activité NEW

Donc à re-tester lorsque votre instance sera à jour.

@david
Il faudra mettre à jour la démo pour vérifier que le populate fonctionne avec le produit et le client sur la commande.

1 Like

@Francois
J’ai fait le test sur la démo, en ne ramenant que les FKs sur l’étape finale et ça marche désormais (les autres champs sont correctement populés)


Merci!

@david
C’est sur la P21 ?
Et avec une foreignkey ça fonctionnera aussi ? (ex: [CODE_ACT.Field.champFK])

Pour l’instant ça a été poussé sur la branche “master” (i.e. la P21 beta)

Sur l’autre point je laisse @Francois répondre car je n’ai pas testé ce cas

ça ne marche chez moi, le populate fonctionne pour les relations de niveau 1, mais pas au delà. J’ai essayé de récupérer le nom de la direction métier de la personne en utilisant cette écriture :

[nomEtape1.Field.champPersonneId.champCentreId.champDepartementId.champDirectionId]
[nomEtape1.Field.champPersonneId.champCentreId.champDepartementId.champDirectionId.directionNom]

Mais ça ne fonctionne pas

Ce que dis David c’est que ça fonctionnera avec la prochaine release, donc avec la P21 et l’autre écriture que vous proposez ne fonctionnera, parce que le champCentreId n’est pas lié à champPersonneId et correspond à la foreign key je suppose. ce champ donc a une autre nom dans votre objet (style champCentreFK par exemple)

Je comprend ce que vous dites, l’écriture proposé n’est qu’un exemple, elle est bien représentée dans mon processus. Je l’ai utilisé par analogie avec celle proposée par François plus haut

1 Like