Impossible d'écraser un filtre

Bonjour

ce problème fait suite au tickets ;
Ajouter un filtre par défaut modifiable sur une instance fille

J’ai un objet application qui a 2 FK : une vers produit, une vers fonction.
Mon produit a également une référence vers fonction.

Je filtre ma liste de produit via ma fonction, grâce au hook

	@Override
	public void initRefSelect(ObjectDB parent) {
		if (parent != null && "BCSIAppEAPM".equals(parent.getName())) {
			if (Boolean.valueOf(getGrant().getParameter("initSearchProduct"))) {
				AppLog.info(getClass(), "initRefSelect", this.getField("BusProBusinessFunctionId.BusFuncName").getFilter(), getGrant());
				// Que cette ligne soit commentée ou non, le résultat est le même.			
				this.resetFilters();
				this.getField("BusProBusinessFunctionId.BusFuncName").setFilter(parent.getFieldValue("AppEAPMBusinessFunctionId.BusFuncName")
				AppLog.info(getClass(), "initRefSelect", this.getField("BusProBusinessFunctionId.BusFuncName").getFilter(), getGrant());
				this.getGrant().setParameter("initSearchProduct", false);
			}
		}
	}

Scénario
J’affiche mon formulaire d’édition d’applications
Je sélectionne la Function A.
Lorsque je clique sur le champ Produit, une popup s’affiche avec une recherche pré-filtrée sur la Function A.
Je sélectionne mon produit. La popup se ferme.
Sur mon formulaire d’édition de l’application, je change la Function en B.
Lorsque je clique pour sélectionner un produit, une popup s’affiche avec une recherche pré-filtrée sur la Function A.

Savez-vous pourquoi le filtre n’est pas écrasé ? Sachant que this.getInstance est le même à chaque fois et que mes logs affichent bien les bons filtres.

Merci d’avance

[Platform]
Status=OK
Version=4.0.P23
BuiltOn=2020-01-10 17:30 (revision 51ec4c2ec0814956190ff9ff1bb6ffd6dde0801c)

Le resetFilters fonctionne parfaitement.
Vous devez être dans un cas où le context du parent n’est pas actualisé.
Pour vider le filtre, il faut juste retirer votre ligne qui le repositionne ensuite.

A priori c’est que le parent n’est pas bon et que le filtre reste celui d’avant.
parent.getFieldValue("AppEAPMBusinessFunctionId.BusFuncName")

Je vous suggère de passer par une variable de session comme décrit sur l’autre post.
Soit depuis l’ouverture initUpdate, ou en ajoutant un “change” sur le champ dynamique pour prévenir le back du nouveau filtre / à récupérer ensuite dans le initRefSelect s’il existe en back.

Merci pour votre retour.
Mais comme indiqué dans le ticket, les instructions AppLog contiennent bien les bonnes valeurs, cela signifie que le contexte parent est bien présent. Cf vidéo.
Il y a vraiment un problème au niveau de l’application du nouveau filtre.

Savez-vous donc pourquoi le filtre n’est pas écrasé ?

PS : j’ai bien vu votre réponse dans Filtre par defaut modifiable sur une instance fille dans laquelle vous suggérez d’utiliser les événements Javascript mais puisque j’ai les bonnes valeurs dans mon hook, je souhaiterai éviter de multiplier les fichiers de code. Merci

N’ayant pas réussi à uploader une vidéo plus grande que 30 secondes, voici des captures d’écran.

  1. Formulaire initial
  2. Log du hook intRefSelect
	@Override
	public void initRefSelect(ObjectDB parent) {
		if (parent != null && "BCSIAppEAPM".equals(parent.getName())) {
			if (Boolean.valueOf(getGrant().getParameter("initSearchProduct"))) {
				AppLog.info(getClass(), "initRefSelect", "ATR--------------- Ancien filtre " + this.getField("BusProBusinessFunctionId.BusFuncName").getFilter(), getGrant());
				this.resetFilters();
				this.getField("BusProBusinessFunctionId.BusFuncName").setFilter(parent.getFieldValue("AppEAPMBusinessFunctionId.BusFuncName"));
				
				AppLog.info(getClass(), "initRefSelect", "ATR--------------- Nouveau filtre " + this.getField("BusProBusinessFunctionId.BusFuncName").getFilter(), getGrant());
				this.getGrant().setParameter("initSearchProduct", false);
			}
		}
	}


3. Popup de recherche → le filtre est bien mis en place
03. Popup 1ère recherche
4. Formulaire avec la function modifiée

5. Log du hook intRefSelect → la nouvelle function est bien récupérée

6. Popup de recherche → le filtre n’est pas mis à jour
06. Popup 2e recherche

Votre code montre bien que le filtre est remplacé à cet instant, ensuite il y a autre chose qui le re-modifie avant l’affichage.

que contient votre preSearch, initList, etc… ?
recherchez dans vos objets où vous manipulez ce champ.
autre possibilité, vous utilisez un LinkMap sur la relation pour contraindre un filtre ?

ensuite si votre champ “business function” est modifié sur le parent à l’écran, comment back est informé du prochain filtre ?

que contient votre preSearch, initList, etc… ? --> rien les méthodes n’ont pas été surchargé
recherchez dans vos objets où vous manipulez ce champ. --> je ne manipule ce champs nulle part ailleurs
autre possibilité, vous utilisez un LinkMap sur la relation pour contraindre un filtre ? --> non

ensuite si votre champ “business function” est modifié sur le parent à l’écran, comment back est informé du prochain filtre ? --> j’ai testé deux cas :

  1. En faisant un sauvegarde du parent (on exécute alors de nouveau de initUpdate qui repositionne la variable de sessions)
  2. En positionnant la variable de session dans le hook postSearch de mon objet Function

Merci,

Votre point 2) montre que vous avez bien dû code ailleurs, et que c’est un pur problème d’algo de tel sorte que le filtre n’est pas celui attendu, ce n’est pas Simplicité qui le positionne tout seul.
vos logs inversent la trace “Ancien / Nouveau” par rapport à votre code fourni.

si le hook est appelé 2 fois, faites le setFilter 2 fois.
votre initSearchProduct peut être un compter = 2 qui se décrémente.

ou plus simple retirez le if (initSearchProduct)
le filtre peut rester puisque cette instance d’objet ne sert à qu’à ça.