Ajouter un filtre complexe au niveau d'une liste

Tags: #<Tag:0x00007f9e5b46e190>

Bonjour,

Je voudrais ajouter un bouton d’action basé sur une méthode, au niveau d’une liste pour filtrer ses lignes.

Exemple, en cliquant sur ce bouton, on affiche seulement les lignes qui ont un lien avec certains objets.

Je sais que par exemple pour filtrer sur la valeur 0 d’un attribut, dans ma méthode, je dois faire simplement un

this.getField(“attribut”).setFilter(‘0’)

Or dans mon besoin actuel, le filtre est plus compliqué. Il faut que je regarde si la ligne est référencée ou non dans un autre objet, en plus d’autre contrôle.

Comment est-ce que je peux coder ceci dans une méthode appelée depuis une liste ?

Merci d’avance pour votre aide.

Abed

Bonjour,

Les filtres / getField(“xxx”).setFilter(“abc”) sont des filtres “utilisateur” donc visibles à l’écran et doivent rester intelligibles pour l’utilisateur, qui pourra les retirer. On peut déjà y mettre des syntaxes avancées (and/or, comparateur, wildcard,… like, not in…) mais guère plus.

Les filtres plus techniques comme celui dont vous semblez avoir besoin sont donc à mettre dans des search-spec = morceau de SQL qui seront ajoutés à la clause where lors des select/search, ces filtres “métier” ne remontent jamais sur la UI.

  • soit au niveau de l’objet globallement obj.setSearchSpec("exists (select...)")
  • soit au niveau de certains champs getField("xxx").setAdditionnalSearchSpec("exists (select...)'")

Ces search-specs peuvent être appliqués dans une méthode d’action back.
Attention, il faut les retirer car elles restent dans la définition en mémoire de l’objet de session (mettre un bouton “reset” ou le retirer dans le postSearch… suivant l’UX attendue).

getField("xxx").setAdditionnalSearchSpec(null)

Si le filtre n’est pas SQL (pas de jointure possible car le filtre dépend d’un algorithme), il faut nécessairement utiliser le hook postSearch pour élaguer/limiter la liste trouvée en base (mais le count en base sera faux). Mais il est en général préférable de préparer/calculer cet “algorithme” en base afin de faire du pur SQL plus performant en lecture / indexable.

En java, dans les cas très complexes, on peut aussi directement surcharger la méthode search et getCount si on souhaite aller chercher les données ailleurs qu’en base ou avoir une logique très spécifique de champ de recherche (utiliser des agrégats, having, group by…), la seule contrainte est de retourner un tableau d’enregistrements conforme à la définition ordonnées des champs de l’objet (row_id, colonnes… timestamps).