Cependant lorsque j’arrive dans la 3e activité qui est celle de la synthèse( activité 1 + 2) ,2 attributs de la 1ere activité ne sont pas enregistré ( "Produit ou service " et “type”). Et les autres attributs lié à d’autres activité le sont bien.
Le seul moyen d’avoir ses 2 champs bien enregistrer est de les reconfigurer en synthèse (activité 3) ou bien :
-de l'activité 1
-aller vers la activité 2,
-faire précédent vers l'activité 1
-sélectionner les champs lié à ses 2 attributs
-refaire suivant pour aller dans la 2
-suivant encore dans la 3
à ce moment là, cela marche les 2 attributs de la 1er activité sont bien dans la 3e
Auriez-vous une idée d’ou pourrait venir ce problème et pouvoir le régler pour que tous soit pris en compte dès le 1er passage ?
Comment valorisez vous les données de synthèse ?
avec l’accesseur [MyStep1.Data.myfield1] ou via un objet métier persistant de l’étape 1 ?
Sans le paramétrage complet de vos activités, il est difficile de savoir pourquoi les champs ne sont pas présents à la fin.
Dans un screen-flow les données de chaque activités sont en mémoire. Si la syntaxe [stepname(.stepindex).groupname.dataname] ne fonctionne pas dans votre cas :
Vous pouvez aussi les récupérer dans le hook postValidate de chaque étape, le contexte contient les valeurs courantes
ou les re-forcer par la hook preLock de la dernière activité, il est possible d’accéder à la première activité et lire ses données.
Par exemple :
@Override
public Message preLock(ActivityFile context) {
String step = context.getActivity().getStep();
// Last summary activity
if ("MyStep3".equals(step)) {
// read data from 1st activity
Activity a = getActivity("MyStep1"); // definition de l'activité MyStep1
ActivityFile af = getContext(a, null); // instance de cette activité traversée (aid = null dans un screenflow)
String value = af.getDataValue("Data", "myField1"); // ou groupe "Field" si c'est un formulaire d'objet
// Set summary values
context.setDataFile("Data", "mySummaryField1", value);
// ...
}
return null;
}
Si les données en mémoire sont fausses c’est que vos activités sont mal isolées = utilise les mêmes champs ou objets.
Dans une activité de type Condition avec template, le groupe de données est “Data”, si c’est une Création d'objet, c’est le groupe “Field” qui contient les champs.
Cela ne marchait pas initialement car les champs posant problèmes initialement sont des expressions calculés qui en fonction du champs selectionée par l’utilisateur lance une methode dans l’objet principal qui fais une requete sql pour recuperer une valeur, ensuite cette valeur est set dans la table d’association, qui est ensuite utilisé pour afficher ce qu’il y a dans le champs.
Toute cette logique étant dans le object LegalText qui doit obligatoirement être créer pour pouvoir effectuer toute ses opérations.
J’ai essayé de mettre ses opérations dans un initCreate mais vu que l’objet n’est pas créer, pas de creation dans la table d’association car LegalTextrowid = 0 et lorsque la methode est appelé apres la creation les attributs concernés étaient vides…
En fesant ce petit détour de d’abord creer un Object LegalText d’abord dans l’intro, les expresions calculé et la logique dans la table d’association sont bien effectué,
existerait-il un moyen de faire autrement ? ( sans passer par un étape de creation par l’intro ? )
Merci encore pour ses informations et ses retours.
Pas sûr de vous comprendre, mais il est tout à fait possible de pré-créer l’objet par code avant son affichage en mise à jour du coup.
L’activité 1 peut être une activité de création en back non affichée (dialogue utilisateur = non) dont le code devra créer votre objet X (au preValidate de l’étape par exemple, il faudra setter tous les champs via context.setDataFile)
L’activité 2 est alors activité de mise à jour de X (dialogue utilisateur = oui), il faudra lui spécifier le row_id du groupe “Field” pour afficher X :
@Override
public Message preLock(ActivityFile context) {
String step = context.getActivity().getStep();
// Step 2 = Update the object created at step 1
if ("MyStep2".equals(step)) {
ActivityFile af = getContext(getActivity("MyStep1"));
String rowId = af.getDataValue("Field", "row_id");
// Force the row_id to be opened
context.setDataFile("Field", "row_id", rowId);
}
return null;
}
Petite question concernant cette approche au niveau de l’approche simplicité ( j’ai compris l’approche code sur le prelock). Au niveau de mes transition d’activité je dois donc faire ce scénario
—Begin-Activité2-3-4-Fin— ?
Ce scénario de transition d’activité est sans mettre l’activité 1,ou devrais-je bien quand même la mettre dans mes transitions d’activités ?
J’ai voulu tester l’approche rapidement avec l’activité 1 (Begin-1-2-3-4-End) en dialogueUtilisateur(No), le process ne se lance pas car le dialogue utilisauter à non, je n’ai donc pour le moment laisser avec une intro
,j’ai aussi essayé le scénario sans l’activité 1 en transition et juste avec la donnée d’activité de la 1 dans l’étape2 de l’objet mais même problème sur certains attributs.
Tout est possible.
Vous pouvez effectivement vous passer de l’activité 1.
Dans ce cas, il faut pré-créer l’objet nécessaire dans le preLock (avant ouverture) de l’activité 2 qui devra être de type Mise à jour (et pas création) à la place d’aller chercher le rowId de l’activité 1.
Exemple :
@Override
public Message preLock(ActivityFile context) {
String step = context.getActivity().getStep();
if ("MyStep2".equals(step)) {
// pre-create the object before update at step 2
ObjectDB o = getGrant().getTmpObject("MyObject1");
try {
o.resetValues(true, ObjectField.DEFAULT_ROW_ID);
o.setFieldValue("myField1", "...");
// ...
o.getTool().validateAndSave();
}
catch (Exception e) {
AppLog.error("error", e, null);
return Message...
}
// Force the row_id to be opened at step 2
context.setDataFile("Field", "row_id", o.getRowId());
}
return null;
}