How To write calculated expression as Java server code

Bonjour,

Je veux écrire une expression calculée de type :

[VALUE: attribute1] * [VALUE:attribute2]

En code java côté serveur.
Quels sont les Business Object hooks que je peux utiliser pour faire ce calcul et l’affecter à un 3ème attribut attribut3

Merci

Les expressions calculées sont évaluées dans les phases de “préparation” de l’objet en vue de sa création/mise à jour. Cela correspond donc aux hooks serveur initCreate, initUpdate, initCopy, … Cf. https://docs.simplicite.io/documentation/01-core/businessobject-code-hooks.md#datapreparationhooks

La syntaxe [VALUE:xxx] doit être transposée en code Java en faisant attention au type, ex: ici pour récupérer un double il faut écrire getField("xxx").getDouble(0) (0 étant la valeur par défaut quand l’attribut est vide ou s’il contient une valeur non parsable en numérique) ou getField("xxx").getInt(0) pour une valeur entière.

Merci de votre réponse @david !
J’ai testé avec le code suivant mais ça ne remplis pas mon champs.

package com.simplicite.objects.Module;

import java.util.*;
import com.simplicite.util.*;
import com.simplicite.util.tools.*;

/**
 * Business object Ob
 */
public class Ob extends ObjectDB {
	private static final long serialVersionUID = 1L;
	
	ObjectDB o = getGrant().getTmpObject("Ob");
	
	public void initUpdate(){
		
		int q = getField("attribut1").getInt(0);
        Double p = getField("attribut2").getDouble(0);
        o.getField("attribut3").setUpdatable("attribut3".equals(p*q));
        
        
	}

}

Votre code ne valorise aucun attribut…

Mais de toute façon il y a plusieurs autres pbs graves dans votre code Java

  • getDouble(def) renvoie un double natif pas un objet Double l’autoboxing des JVM modernes vous sauve sans doute d’erreur de compilation mais je ne sais quel type aura votre p*q
  • Ce bout de code là "attribut3".equals(p*q) c’est vraiment sans doute pas ce que vous vouliez écrire: vous comparez une chaîne de caractère alphabétique avec le résultat d’une multiplication de 2 variables numériques…Le résultat de ce equals sera forcément faux. Sachant que pour comparer une valeur numérique flottante le == (et à fortiori un equals) n’est de toute façon pas approprié (cf. https://howtodoinjava.com/java/basics/correctly-compare-float-double/). Ces dernières remarques n’ont strictement rien de spécifiques à Simplicité, on parle ici de Java de base et ce forum n’a pas vocation à discuter des fondamentaux du langage Java…

Merci de votre réponse.

Mon but sur la deuxième remarque n’est pas la comparaison, mais plutôt l’affectation de la valeur du produit p*q (qui sera un double) à attribut3.

Dans ce cas vous n’utilisez pas la bonne méthode: setUpdatable sert à rendre un attribut modifiable ou non, ça ne sert pas à valoriser un attribut, c’est pour cela que ça prend en argument un boolean.

Pour valoriser un attribut avec un type numérique (int ou double) vous devez utiliser getField("myFieldName").setValue(myDoubleValue).

Attention au type configuré de vos attributs sinon vous risquez d’avoir des pbs de format.

PS: Ma remarque sur double vs Double dans votre code reste valable.

J’ai modifié mon code en suivant les instructions, toutefois ça ne renvoie pas de valeur sur le champs.
Le code modifié :

package com.simplicite.objects.Module;

import java.util.*;
import com.simplicite.util.*;
import com.simplicite.util.tools.*;

/**
 * Business object Ob
 */
public class Ob extends ObjectDB {
	private static final long serialVersionUID = 1L;
	
	ObjectDB o = getGrant().getTmpObject("Ob");
	
	public void initUpdate(){
		
		int q = getField("attribut1").getInt(0);
        double p = getField("attribut2").getDouble(0);
        o.getField("attribut3").setValue(p*q);
        
        
	}

}

Il y a un autre truc qui ne va pas du tout (je n’avais pas vu dans votre post précédent) :

Vous créez une variable de classe qui pointe sur une instance temporaire de votre objet
ObjectDB o = getGrant().getTmpObject("Ob"); puis vous settez votre attribut sur cette instance (qui n’est sans doute pas l’instance utilisée par la UI donc forcément votre attribut n’est pas valorisé).

Avez vous suivi une formation Simplicité ? Je pose la question car la notion d’instance d’objet est un concept fondamental a bien comprendre sinon vous risquez de graves contre-sens comme ici.

En outre cette approche à base de variable de classe valorisée à l’instanciation pour un objet n’est pas du tout un bon pattern avec Simplicité car cela ne peut pas marcher (si vous avez besoin d’une instance d’objet dans une méthode créez votre variable dans la méthode)

Par ailleurs en Java quand vous surchargez une méthode d’une classe dont vous héritez (comme ici le initUpdate de la classe ObjectDB) vous deviez vraiment ajouter le @Override pour être sûr d’avoir la bonne signature (ce sera alors checké à la compilation et ça vous évitera des soucis). Ici aussi on est sur des fondamentaux de Java.

Bref, votre code devrait donc être du genre:

package com.simplicite.objects.Module;

import java.util.*;
import com.simplicite.util.*;
import com.simplicite.util.tools.*;

public class Ob extends ObjectDB {
	private static final long serialVersionUID = 1L;

	@Override
	public void initUpdate() {
		int q = getField("attribut1").getInt(0);
		double p = getField("attribut2").getDouble(0);
		getField("attribut3").setValue(p*q);
	}
}

Merci @david !
Avec vos remarques c’est devenu plus claire, et j’ai réussi à résoudre mon problème.

OK mais à la lumière de vos questions, de votre code et des nommages que vous utilisez dans vos paramétrages (module “Module”, objet métier “Ob”, attributs “attributsX” contraire à toutes les bonnes pratiques que nous recommandons) je pense vraiment qu’il y a des concepts fondamentaux de Simplicité que vous ne maîtrisez pas, ou en tout cas pas suffisamment, pour ne pas vous retrouver rapidement face à des problèmes que vous jugerez incompréhensibles.

Ce forum ne peut pas être pas un espace de formation à Simplicité (ni à fortiori à Java), il est là pour apporter du support aux personnes qui ont suivi une (auto)formation complète et qui souhaitent obtenir de l’aide sur des sujets spécifiques ou complexes. Je me trompe peut être mais j’ai l’impression que dans votre cas on est pas dans ce contexte…

Vous comprendrez à la lumière de cet échange qu’on ne peut vraiment pas passer autant de temps sur quelque chose d’aussi basique. Bref comment pouvons nous vous accompagner ?