La liste passe en mode “editlist”, il se passe bien ce que la plateforme doit faire : les lignes passent en mode édition avec les boutons Enregistrer/Annuler.
Ce qui pose pb est que les lignes restent en lecture seule.
L’utilisateur est configuré avec les droits de mise à jour donc cela vient du code scripté.
Il faut traquer dans votre code les setReadOnly(true) sur l’objet
ou les grant.accessUpdate(“CrbRechInstNoteV”, false)
Semble bien annuler un read only positionné ailleurs.
Par contre le isUpdateEnable semble problématique :
C’est le parametre “row” qui contient le tuple et non pas l’objet courant this.getField(‘rechInstNoteVInst_fk’).getValue().
Il faut utiliser row[this.getFieldIndex(“rechInstNoteVInst_fk”)]
ou en tout cas ajouter des traces dans le code suivant pour savoir si cela retourne true|false
CrbRechInstNoteV.isUpdateEnable = function(row) {
var requete="select d.row_id from crb_rech_ref_dispositif d,CRB_RECH_DEMANDE r, CRB_RECH_INST i "
+"where i.row_id="+this.getField('rechInstNoteVInst_fk').getValue()+" and i.rech_inst_demande_fk=r.row_id and d.row_id=r.rech_demande_ref_dispositif_fk "
+"and rech_ref_dispositif_dt_valid_etab> current_date";
var result=this.getGrant().query(requete);
// l'instructeur externe peut modifier son instruction si la date de validation est pas passée
if(this.getGrant().hasResponsibility("APPLI_SIMPLICITE_RECHERCHE_VALIDEUR")&&result.size()>0) return true;
return false;
};
A l’écran on peut maintenant modifier le champ valeur de la liste.
Action save : au debugger on voit bien les valeurs envoyées dans le HTTP POST multipart :
Après 2 heures d’analyse/test de paramétrage, ce design me semble impossible.
Le formulaire présente 3 niveaux de hiérarchies et cela ne marche pas.
Formulaire CrbRechDemande <-- CrbRechInst (inline) <-- CrbRechInstNoteV (PANEL dans la dernière zone)
Le save d’un formulaire avec listes embarquées ne fonctionne que pour les listes filles et non pas les petite-filles.
Il faut donc nécessairement ouvrir la Note pour faire sa mise à jour (j’ai remis usage du formulaire = oui, reste à retirer le bouton edit list). Je me demande si la jointure qui est faite est correcte car les PANEL font la jointure avec le formulaire affiché (et non pas l’objet embarqué).
Du coup :
S’il n’y a qu’une seule instruction par demande, il faudra supprimer l’objet CrbRechInst = remonter tous les champs de CrbRechInst d’un niveau dans CrbRechDemande, pour n’avoir qu’un seul niveau vers CrbRechInstNoteV qui redeviendra du coup éditable comme tout autre objet lié 0,N.
S’il peut y avoir plusieurs instructions par demande, il faudra laisser les objets comme actuellement mais nécessairement passer par 2 formulaires et ne pas essayer de tout mettre dans un seul ces 3 niveaux (retirer la relation embarquée pour afficher une liste d’instructions dans la demande).
Les champs embarqués ne fonctionnent que pour des objets simples (ex une adresse, un rib), ce n’est pas prévu pour des objets complexe à état ou à relations 0,N.
Un autre design serait de faire de l’héritage pour avoir 2 objets (sur la même table) :
la demande qui contient que les champs communs sans instruction
l’instruction qui étend la demande avec des champs en plus suivant le type de demande
Très utile par exemple pour avoir différents types de demande avec une seule instruction qui dépend du type.
Avec le getTargetObject on peut depuis la liste des demandes ouvrir la “bonne” instruction.