Alimentation de recherche via un WebService

Bonjour,
J’ai une problématique: alimenter une recherche d’objets via un WebService, afin de remplir des champs de formulaires depuis un référentiel sans avoir des copies à gauche a droite de ce référentiel.
Aujourd’hui, le code qui appelle le webservice est dans le hook postSearch, qui modifie alors la liste de lignes fournies.

En pseudo code:

@Override
public List<String[]> postSearch(List<String[]> rows) {
    var listeDiplomes = WebService.getDiplomes();
    for (diplome : listeDiplomes) {
        rows.add(diplome); // normalement sous forme d'array, je simplifie juste
    }
    return rows;
}

Cependant, ce système casse la pagination et semble être limité en nombre de ligne (au delà de 500 lignes environ, la recherche est vide).
Auriez-vous quelques indications pour déplacer ce traitement dans un autre hook, afin de récupérer la pagination ?

Merci d’avance.

Le “framework” pour developper un objet métier “service” = un objet métier Simplicité qui interagit avec des webservices distants est ObjectService cf. ObjectService

Mais bien entendu la capacité à paginer de cet objet service dépendra de la capacité à paginer des webservices que vous appelez.

nous avons créer un objet métier car nous avons besoin de faire un mapping avec un autre objet métier.
cette façon de faire fonctionnait très bien en V3.
Nous alimentions notre objet métier avec les 767 diplomessans problème.
En V4, lorsque le nombre de row récupéré est trop important, la liste affichée est vide. Alors que le ws ramène bine la totalité des lignes

si on ajoute un filtre qui permet de réduire le nombre de lignes ramenées, l’affichage fonctionne :

Un objet “service” est un objet métier.

C’est fait pour ce genre de choses = manipuler un objet qui n’est pas local mais récupéré via des appels de services. Typiquement pour faire des datamaps ou des liens “meta objet”

Out of the box nous avons 4 types d’objet “service” :

Au delà de ces cas là vous pouvez implémenter vos propres objet “service” pour vous mapper sur des webservices ad hoc.

Pour cela vous devez développer une classe qui étend la classe ObjectService (ObjectService) au lieu de ObjectDB

C’est, selon moi, vraiment le bon pattern pour faire ce genre de choses (ça existait déjà en 3.x)

Oui ça remonte à loin cette implémentation, vous aviez codé le postSearch car à l’époque de Rhino, on ne pouvait pas écraser le search directement.

Je ne vois pas en quoi passer par un ObjectService va corriger ce problème de pagination.

Le pb est surement sur la UI responsive qui limite les callback à 500 ou un truc du genre.
Je vais regarder.

Ok je reproduis bien le problème même pour un objet “normal”, ce n’est donc pas lié au fait d’aller chercher des enregistrements ailleurs.

Passé 500 lignes, la UI n’affiche plus rien en liste, il doit y avoir une limite technique quelque part, même quand le flag “Pagination = non” dans la définition de l’objet.

  • On va corriger car sur l’ancienne UI legacy, il n’y avait pas cette limite
  • Mais ça reste dangereux de laisser ouverte la porte du “search” sans limite ou pagination côté UI

Du coup je suis perplexe sur ce qu’il conviendrait de faire = corriger mais laisser tout de même une limite à 500 avec un warning ?

Car en terme UX afficher une liste de plus de 500 lignes n’a pas de sens :

  • d’une part c’est long à afficher
  • et en plus on doit scroller sur 50 pages pour retrouver ce qu’on cherche

L’idéal serait que le webservice en question sache paginer et de l’encapsuler dans un ObjectService mais bon vous faites comme vous voulez :wink:

Ce serait l’idéal en effet, mais le manque de temps se fait ressentir dans ce cas ci. De plus, je n’ai pas trouvé grand chose comme documentation concernant les ObjectService.

Oui l’ObjectService était pratique à l’époque des hooks Rhino, maintenant qu’on peut faire du Java et surcharger les verbes CRUD d’accès aux données (getCount, search, create…), ça revient un peu au même.

En tout cas on a un bien un problème à résoudre pour les objets à “pagination = non” initialement prévu pour les objets à faible volumétrie.

A la base le pb c’est surtout que votre webservice ne pagine pas (donc long à afficher + humainement pas utilisable comme le dit François).

Un garde fou technique à N lignes non paginées (ex: N = 500) n’est fondamentalement pas inutile pour ne pas ruiner l’UX.

ils ne scrollent pas toutes les pages. la recherche permet de filtrer les diplomes.
en ce qui concerne les temps d’affichage, on n’a jamais eu de pb ni de remarque

Bonjour,

Il y avait bien une limite technique du navigateur dans la boucle qui alimentait les lignes de façon asynchrone. Une modification a été faite en V4 et V5 sur les listes pour ne plus brider à 500 lignes s’il n’y a pas de pagination. Ca devrait également améliorer le temps de construction de la liste.

Attention,

il n’y a pas encore de garde fou pour limiter la liste si jamais le back retourne 1M de lignes… Même si vous n’utilisez pas de pagination, il faut au moins contrôler ou limiter ce que retourne votre WS pour éviter de planter le serveur et la UI.

Le garde fou qui viendra dans un second temps consistera surement à forcer une pagination à 500 lignes. Ca ne pourra se faire qu’en V5 car la notion de “min/max rows” de pagination a été ajoutée au niveau d’un objet en surchage des préférences utilisateurs.

Il s’avère que la liste des données en question, nous est fournie par un autre organisme et nécessiterait un traitement supplémentaire pour enlever les choix obsolètes qu’il peut y avoir. Une fois ceci fait, nous devrions avoir moins de 500 lignes dans tous les cas. Du moins je l’espère.

Un exemple basique d’objet service dans ce post: https://community.simplicite.io/t/fusion-de-ligne-postsearch-puis-export/3238/9

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.