Récupérer le row_id d'éléments sélectionnés lors d'une association

Bonjour,
Meilleurs voeux pour 2024

Nous utilisons Simplicité 5.1.66.
Nous effectuons une associations entre deux tables (A et B) dans une troisième (la table C).

Au clic sur le bouton “Associer éléments”, un ensemble d’éléments de la table A sont choisis, pour les associer avec des éléments de la table B.
Au sein de la table C, nous affichons cette association et souhaitons appliquer une méthode sur ces éléments associés.

Pour se faire, nous avons besoin de récupérer le row_id des éléments de la table A sélectionner pour l’utiliser dans la méthode développée dans le code java de l’objet C.

Nous avons pensé récupérer l’instance de l’objet A en cours pour appliquer une méthode getSelectedIds. En vain.

Auriez-vous une façon de procéder à nous conseiller ?

Bien à vous,
VML

Bonjour et bonne année!

Simplicité 5.1 n’est plus maintenue depuis octobre 2022 et vous devez avoir un bon millier de commits de retard. C’est un risque de sécurité et votre problème pourrait être lié à un bug déjà corrigé. Il est recommandé de maintenir la plateforme à jour.

getSelectedIds est plutôt destiné à être utilisé au sein d’une action après la sélection, et je ne comprends pas bien le flow que vous décrivez.

Voici ce que j’interprète: l’utilisateur est sur la liste A, il sélectionne les lignes, va sur la liste C et clique sur une action de C ? Si c’est le cas, je pense que Simplicité n’a pas pris en compte les “SelectedIds” car il n’y a pas eu de clic sur une action de A.

Vous pourriez éventuellement faire une action de A, enregistrer les selectedIds dans un param dans le code cette action, puis récupérer le param dans l’action de C, mais l’utilisateur va se perdre à coup sûr: comment doit-il deviner cet enchaînement d’actions?

Bref, si j’ai bien interprété la solution envisagée (?), ce n’est vraiment pas une approche que je recommenderais.


Si je ne m’abuse, votre cas semble plutôt adapté à l’utilisation d’un process (la documentation est morcelée, n’hésitez pas à nous solliciter en cas de besoin d’aide : doc1, doc2, doc3)

  1. sélection des éléments de A
  2. sélection des éléments de B
  3. création des éléments de C
  4. affichage de C
Workflow de saisie de commande dans la Démo disponible dans l'appstore

Voici une description de ce qui est fait :

  • L’utilisateur clique sur “associer” et selectionnes des éléments dans une liste A
  • Il choisit un paramètre dans une liste de paramètres B qui seront associés aux premiers éléments sélectionnés
  • A la fermeture (sur le hook postCreate) est appelé une méthode qui doit prendre en argument les id des éléments sélectionnés dans A

Toutefois, la méthode est appelée dans la classe de C, classe qui liste les éléments créés A-B

Je vais supposer que quand vous parlez de classes et de tables, vous parlez bien d’objets métiers, et que C est un objet de relation N/N entre A et B. Le postCreate de C n’est pas appelé “à la fermeture” (de quoi?), mais à chaque instance de C créée.

Est-ce que cette “méthode qui doit prendre en argument les id des éléments sélectionnés dans A” doit être appelée

  1. après chaque création de C (n fois) ?
  2. après la création de l’ensemble des C (1 fois) ?

Tout à fait !

C’est une méthode asynchrone que doit être appelée une seule fois, après la création de l’ensemble des C.

Actuellement, l’associate revient conceptuellement à créer les NN en boucle à la main, c’est géré dans le front et non dans le back, et à ce titre, il n’y pas de hook postAssociate.

Partant de ce constat, plusieurs options s’offrent à vous:

  1. faire un workflow
  2. coder en JS l’équivalent d’un associate, mais avec un appel final à l’action asynchrone

$ui.selectObject multiple de B
$ui.displayForm éventuel des valeurs par défaut des champs obligatoires de la NN
boucle ajax de create NN pour chaque B sélectionné
puis update ajax final…

  1. Revoir votre conception pour que votre algo de traitement postCréation soit unitaire. Par curiosité, quels sont lea traitements qui sont réalisés uniquement dans le cas de l’association et non lors de la création de C par formulaire? (option conseillée!)

Pour revenir à votre approche initiale, dans le cas étudié, je pense que vous n’arrivez pas à récupérer les IDs car vous ne visez simplement pas la bonne instance de A (instance de sélection de références) . En effet, en 5.3.25, j’ai bien la liste des IDs dans ce test:

  • relation NN sur C configurée comme suit: A ← C → B
  • étant sur B, dans le panel de C, je clique sur “Associate”.
  • je sélectionne dans la liste de “A” et clique sur “Select”
  • dans le postCreate de C, je peux récupérer la liste des IDs de A via l’instance de sélection de références getGrant().getRefObject("A").getSelectedIds()

ATTENTION: cette solution est donnée pour cesser de tergiverser et répondre à la question initiale, mais ce n’est probablement pas la bonne approche. Il reste en effet à répondre à la question de l’exécution de votre algo si l’utilisateur n’est pas passé par l’associate, mais que getSelectedIds n’est pas vide car il contient une sélection passée…

Bonjour @victormehdileguet,

Cela répond-t-il à votre question?

Bonjour,

Je vous prie de m’excuser, étant passé à coté de votre réponse.

Vous avez pu répondre à mes questions. Merci beaucoup
VML

[Message prédéfini]

Nous conseillons aux utilisateurs de marquer comme “solution” la réponse résolvant leur problématique pour permettre au support de mieux suivre les sujets non résolus, et à la communauté de trouver plus facilement la bonne réponse.

Vos messages indiquant une résolution du problème, nous avons réalisé cette opération pour vous.