Pb de save de Panel

Bonjour,

j’ai une objet CrbRechDemande
qui est lié par relation 1,1 à CrbRechInst

CrbRechInst a un lien 0,n à CrbRechInstNoteExt et CrbRechInstV

CrbRechInst apparait sous forme de panel dans la zone CrbRechDemande-instruction

CrbRechInstNoteExt et CrbRechInstV apparaissent sous forme de panel dans la zone CrbRechInst de l’objet CrbRechInst

quand je veux enregistrer les données de CrbRechInstNoteExt, rien ne se passe. je ne comprends pas.

En l’état impossible de comprendre sans reproduire/accéder à votre cas d’usage.

“Rien ne se passe” : c’est très vague

  • L’utilisateur a t il les bons droits de mise à jour ?
  • y a-t-il un HTTP POST envoyé ou aucun flux HTTP ? (facile de voir au debugger chrome l’activité réseau)
  • si les données sont envoyées, est ce que les hooks pre/postValidate pre/postSave se déclenchent ? (ajouter des console.log)

Merci de préciser le mode opératoire complet pour reproduire le pb : logon / accueil menu / saisies / actions…

oui l’utilisateur a les droits
non les hooks ne se déclenchent pas

identifiant : agrocampus@gmail.com mdp : test
application : Extranet recherche

Demande test2, onglet instruction
Notes du valideur, saisir une valeur et enregistrer

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)
  • ou le hook isUpdateEnable

Extrait de votre code :

CrbRechInstNoteV.initList = function(parent) {
	this.setReadOnly(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;
};

le isupdate renvoie bien true

mais je ne passe tjrs pas dans le prevalidate

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 :

------WebKitFormBoundaryKGOatwpGgYgMgkrF
Content-Disposition: form-data; name="rechInstNoteVValeur.CrbRechInstNoteV.17"

99

Je vais me connecter et faire qq tests, il se peut que j’ai à modifier temporairement le paramétrage pour voir.

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.

il n’y a qu’une instruction par demande.
j’ai voulu faire un objet CrbRechInst pour éviter d’avoir un très gros objet CrbRechDemande

je vais donc choisir la 1ère solution.

Ok

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.