Comment créer un champ calculé


#1

Bonjour,
Comment puis-je créer un champ calculé avec une fonction java? j’ai créé le service java et le controlleur, mais quand j’ai essayé de l’intégrer à la vue avec une action j’ai pas su comment le faire. Des idées?


#2

il vous suffit de créer un action-record (ou action-attribut) pour lequel vous utiliserez: name="myfield" expr="eval:my.controller:myMethod". Dans le controller vous récupérer l’objet en cours de traitement par ActionRequest


#3

Pour action-attribut … je dois modifier quel attribut pour modifier la valeur? Sur la documentation il est écrit que l’attribut “value” peut être modifié mais sur IntelliJ on me donne pas “value” comme attribut pour la balise “field”


#4

si votre champs est <field name="myfield".../> alors dans le action-attribute for="myfield" name="value" expr="eval:my.controller:myMethod"


#5

Sinn j’ai appelé l’action au niveau de la balise form mais ça n’a pas marché , vous avez une idée ?
Y’a t’il possibilité de faire appel à l’action au niveau de la balise field


#6

à ma connaissance: non. Une action ne peut être appelée que par “onChange” sur un field. J’ai déjà implémenté ce type de mécanisme via les form (onNew, onLoad) et cela fonctionne très bien…par exemple j’ai modifié la form User pour générer automatiquement un mot de passe.


#7

Est-ce que c’est for=“myfield” name=“value” expr=“eval:my.controller:myMethod” ou bien for=“myfield” name=“value” expr=“eval:my.controller.myMethod” ? (un point au lieu de 2 points) car ca marche tjrs pas pour moi!
Il est à noter que sur mon controlleur, j’ai mis response.setValue("$price", prix); avec “price” le champ que je veux modifier!


#8

Si vous souhaitez assigner une valeur à un champs je vous conseille la manière suivante:

Creation de l’action
<action-record name="my.action" model="com.my.model"> <field name="myfield" expr="call:my.controller:Method()"/> </action-record>

Pour l’action, si vous souhaitez récupérer le ActionRequest dans votre contrôleur, supprimer les parenthèses à la méthode (“call:my.controller:Method()” -> “call:my.controller:Method”).

Dans votre contrôleur, pas besoin de s’assigner une valeur, il suffit juste de faire un return. Dans cet exemple, le controleur retour une valeur String (de même type que myfield):

public String MyMethod() { return "This is my result"; }

ou
public String MyMethod(ActionRequest req, ActionResponse resp) { return "This is my result"; }

L’utilisation de response.setValue() est utile si vous utiliser un action-method. Ainsi, lors de l’exécution de la méthode, un champs du formulaire sera mis à jour.

En synthèse vous pouvez assigner un valeur à un champs via un controleur de différente manière:

  • via action-record ou action-attribute: utilisez un “return XXX” dans votre controleur
  • via action-method: utiliser le response.setValue pour assigner la valeur au champs

#9

J’ai essayé action-method et j’ai appelé l’action avec un onLoad sur le form mais cela n’a pas marché! @RequestScoped
public class SaleOrderController {

@Inject
private SaleOrderService service;

public void ChangePublicPrice(ActionRequest request , ActionResponse response) {

        SaleOrderLine sol = request.getContext().asType(SaleOrderLine.class);
        BigDecimal prix = service.ChangePublicPrice(sol);

        response.setValue("test", prix);
}

}
< action-method name=“action-test”>
< call class=“com.axelor.apps.test.web.SaleOrderController” method=“ChangePublicPrice”/ >
< /action-method >

Le controlleur marche bien quand on utilise un response.setFlash() et quand on l’appelle à partir d’un bouton. Donc il n’y a pas de problème au niveau de la methode changePublicPrice. Mais avec response.setValue(“test”, prix); et action-method cela ne marche pas. Des idées?


#10

j’utilise les différentes méthodes explicitées ci-avant sans difficulté donc je ne vois pas pourquoi cela ne fonctionnerait pas pour vous.

  1. Quel est le model associé à votre formulaire ?
  2. Quel est le type du field “test” ?

#11

Le modèle associé est com.axelor.apps.sale.db.SaleOrderLine est le test est de type decimal sur xml (BigDecimal sur le fichier Java généré)


#12

tout semble parfaitement en ordre.
Pouvez-vous essayer un response.setAttr(“test”, “value”, prix) ?
Confirmez-vous que le champs “test” fait bien partie du model et qu"il ne s’agit pas d’un dummy ?


#13

Oui, j’ai vérifié sur pgadmin, “test” fait bel et bien partie du domain.


#14

alors si avec setValue et setAttr cela ne fonctionne pas je ne vois pas d’où vient le problème. Désolé.