Autocompletition

4.0
Autocompletition
0.0 0
Tags: #<Tag:0x00007f6828b53730>

#1

Bonjour,

En fait je veux faire de l’autocomplétition, j’ai un résultat en JSON et je veux alimenter les champs (code APE, Intitulé de la NAF) d’un formulaire qui appartient à un objet A, mais le problème c’est que ces deux champs appartiennent à un autre objet B, donc je dois y accéder, vérifier avec le résultat retourné en JSON dans la liste de l’objet B, si elle existe je remplis le champ dans l’objet A sinon j’ajoute l’enregistrement dans l’objet B et je l’affiche dans A.

j’ai pu avec o.search() de trouver les résultats à insérer (ou à remplir) de l’autre objet, mais je n’arrive pas à les insérer.

Merci d’avance


#2

J’ai l’impression que vous êtes en train de refaire à la main des choses qui se font en standard par simple paramétrage.

Les champs ramenés d’un autre objet peuvent être sélectionnés soit par popup (en cliquant sur la loupe) soit par complétion du 1er champ ramené (il faut donc bien le choisir), soit les deux.

Ex dans la démo sur une commande on peut sélectionner le produit soit en tapant sa référence par completion:


Soit par sélection dans la popup de selection (qui donne plus de capacités de filtrages):

Au final le résultat est bien le même:

A noter que si vous devez créér un objet référencé c’est possible soit via le menu associé à la loupe:


Soi via le bouton create de la popup de sélection (cf. ci-dessus)


#3

Merci David pour ta réponse, mais le besoin consiste à alimenter les champs de type popup automatiquement sans cliquer sur la loupe et sélectionner un enregistrement.

En fait, j’ai des résultats retournés en JSON
image

je veux les insérer dans les deux champs Code APE et Intitulé de la NAF qui appartient à un autre objet.
image

Mais j’obtiens cette erreur

Voila le code source

var o = this.getGrant().getTmpObject("ImmoAPE");
o.getField("apeCode");
var rows = o.search();
for (var i = 0; i < rows.size(); i++) {
var row = rows.get(i);
o.setValues(row);
val = o.getField("apeCode").getValue();
val2 = o.getField("apeDesc").getValue();
if(val==APEcode){
console.log("row=========="+val);
    console.log("row=========="+val2);
    this.getField("legalEntityImmoApeId").setValue(val);
}}`

Merci d’avance


#4

Dans quel hook serveur ce code est il écrit ?


#5

Mais de toute façon les champs ramenés ne se valorisent pas individuellement, c’est uniquement le champ foreign key qu’il faut valoriser (avec le row ID de l’objet référencé), les champs ramenés s’alimenteront alors tout seuls.

Au passage, votre code n’est vraiment pas idéal car votre search() n’est pas filtré. Donc vous ramenez tous les records de votre objet pour retrouver celui que vous voulez en faisant une boucle… alors qu’il suffirait de valoriser le ou les filtres qui vont bien avant le search() et vous ne récupéreriez que le record que vous cherchez…

En outre tout search() doit impérativement être précédé par un resetFilters() pour annuler les éventuels filtres qui auraient précédement valorisés sur cette instance d’objet, ensuite vous pouvez valoriser les filtres qui vont bien dans votre cas et ensuite seulement vous faites le search().


#6

Autrement dit votre code devrait plutôt ressembler à ça:

var o = this.getGrant().getTmpObject("ImmoAPE");
o.resetFilters();
o.getField("apeCode").setFilter(APEcode);
var rows = o.search();
if (rows.size() != 1) throw new SearchException("No unique record found for " + APEcode);
o.setValues(rows.get(0));
this.getField("legalEntityImmoApeId").setValue(o.getRowId());

Mais je reste de toute façon assez dubitatif sur l’intérêt de ce code en fonction d’où provient la valeur de la variable APEcode, d’où ma question à laquelle vous n’avez pas répondu: dans quel hook serveur ce code est il écrit ?