Pb enregistrement d'une liste

Bonjour,

Le contexte :
On doit pouvoir enregistrer les heures de formation réalisées par les stagiaires d’une session.
Chaque stagiaire a autant de lignes de suivi que de mois de formation. Les lignes sont crées dans l’objet CrbFopSuiviStg au moment de la validation du stagiaire.

Le pb :
la liste des suivis d’une session affiche par défaut le suivi de mois m-1 de chaque stagiaire :


=> j’ai codé le presearch pour que ça fonctionne
l’utilisateur édite la liste, saisi les valeurs, l’enregistrement fonctionne :slight_smile:

Grace à la recherche, l’utilisateur peut changer de période :


il édite la liste et saisi les valeurs. et là, l’enregistrement ne fonctionne pas :((

les rowId en erreurs sont bien les rowId affichés. j’ai vérifié en bdd.

je ne trouve pas d’où cela peut venir.

L’enregistrement en liste fonctionne-t-il dans un cas nominal (sans hook spécifique) ?
Si oui c’est une demande de support et non un bug de la plateforme.

A priori vos filtres ou search-spec empêchent le save de retrouver la ligne à mettre à jour.
Lors du save de la liste :

  • le moteur refait un select de chaque ligne (donc repassera par le preSearch filtré en plus sur le row_id)
  • applique les mises à jour sur les champs
  • et fait un save

Le message indique que le get (select row) n’a rien ramené, pas que l’ID n’existe pas en base.

  • Activez les traces SQL pour debugger le select qui ne ramène rien et identifier dans le where la partie spécifique (filter, search spec)

  • Donnez nous votre code pour voir s’il fonctionne dans tous les cas, perso j’aurai mis un setFilter(m-1) dans le postLoad (ou depuis l’initUpdate de l’objet parent sur l’instance fille/panel), si vous le mettez dans le preSearch il sera toujours ré-appliqué.

oui, l’enregistrement fonctionne si j’enlève le hook de presearch

je fais des tests en déplaçant le code et je te redis

le setFilter dans le postload ne fonctionne pas : toutes mes lignes sont affichées

en fait, quand on fait le save, le presearch est exécuté mais sans le filtre. c’est pour ça que ça ne marche pas dans mon cas. Puisque quand le filtre est vide, je veux que le mois en cours soit affiché.

j’ai ajouté un test sur le row_id !==’’ et ça fonctionne.

pas sure d’être très claire mais ça fonctionne :)

voilà mon script, si ça peut servir aux autres :
CrbFopSuiviStg.preSearch = function() {
// recherche en fonction du groupement connecté
var login=this.getGrant().getLogin();
// on peut filtrer sur le mois et l’année
// mais si on active un filtre (recherche pour un mois et une année), il faut enlever le setSearchSpec
// et si le rowId est renseigné aussi car c’est le cas ou on fait un update et du coup les filtres repassent à %
if(this.getRowId()!==’’||this.getField(“fopSuiviStgMois”).getFilter()!=’%’||this.getField(“fopSuiviStgAnnee”).getFilter()!=’%’||(this.getParentObject()&& this.getParentObject().getName().equals(“CrbFopStagiaire”))){
this.setSearchSpec(“1=1”);
}else{
//par défaut, on affiche le mois précédent au mois courant.
// le demandeur voit les suivis du mois précédent
var today=new Date();
if(this.getGrant().hasResponsibility(“APPLI_SIMPLICITE_FORPRO_DEMANDEUR”)){
this.setSearchSpec(“t.FOP_SUIVI_STG_MOIS=month(SUBDATE(curdate(), INTERVAL 31 DAY)) and t.FOP_SUIVI_STG_ANNEE=year(SUBDATE(curdate(), INTERVAL 31 DAY)) and t.FOP_SUIVI_STG_SESSION_FK in (select distinct s.row_id "
+“from forpro.CRB_FOP_SESSION s, forpro.CRB_FOP_ACTION_OF ao,forpro.CRB_FOP_COMPTE_TIERS t, forpro.CRB_FOP_ACTION a "
+“where s.FOP_SESSION_ACTION_FK = a.row_id and a.row_id=ao.FOP_ACTION_OF_ACTION_FK and ao.FOP_ACTION_OF_SIRET=t.FOP_COMPTE_TIERS_SIRET and t.FOP_COMPTE_TIERS_LOGIN=’”+login+”’)”) ;
}else{
this.setSearchSpec(“t.FOP_SUIVI_STG_MOIS=month(SUBDATE(curdate(), INTERVAL 31 DAY)) and t.FOP_SUIVI_STG_ANNEE=year(SUBDATE(curdate(), INTERVAL 31 DAY))”);
}
}
};

Ok c’est une façon de voir les choses, le row_id est effectivement renseigné lors d’un save.
Dans votre design, vous utilisez une search spec, non accessible à l’utilisateur.
J’aurai essayé de positionner des setFilter (ou setFilterDataMin / DateMax si c’est une date) par défaut à l’ouverture du formulaire pour que l’utilisateur puisse les modifier ou les retirer ensuite.

note:

Vous pouvez utiliser
this.getField("xxx").isFiltered()
au lieu de
this.getField(“xxx”).getFilter()!='%'

Ca permet de tester suivant le type champ s’il est filtré (période date min/max, intervalle min/max… pas uniquement sur une valeur fixe).

et sinon il faut encapsuler le code avec 3 back-quote ``` pour le formatter dans un post du forum (syntaxe markdown)