Utilisation de rhino dans "Valeur par défaut"

Bonjour
Gros débutant sur simplicite, je suis juste en train d’expérimenter l’outil. J’arrive à créer des formulaires et pour m’initier au code rhino, j’ai créé un champ que je souhaite calculer automatiquement.
C’est une référence de dossier sous la forme “20-D-000001” qui doit contenir “l’année-d-numéro incrémenté”
Je me suis dit que ça devrait se calculer dans la partie “Valeur par défaut”. Mais aucun code rhino ne semble être pris en compte dans ce champ.
J’ai essayé de mettre ça
(function() {
var res = “hello world”;
return res;
});

mais quand je teste le formulaire c’est le code qui est affiché dans mon champ. Aucune interprétation. Pouvez vous me donner quelques pistes pour débuter sur ce sujet ? Comment récupérer une valeur d’un champ de mon formulaire, parcourir la base de données, quelles fonctions de manipulation de string sont disponibles etc…
En gros quelle est la logique de fonctionnement ?

Je vous remercie pour votre aide.
Nicolas

Il est possible de mettre un expression Rhino dans une valeur par défaut en utilisant le keyword [EXPR:...]

Mais pour votre besoin on sort du cadre d’une valeur par défaut car le calcul de cette valeur doit se faire uniquement au moment où on envoie les données pour enregistrement, pas au moment où on affiche le formulaire de création. En effet vous devez penser au cas où 2 personnes affichent en même temps un formulaire de création et/ou aux cas où le formulaire n’est pas enregistré. Les risques sont alors soit d’avoir un conflit de valeur soit de “griller” un incrément pour rien.

Personnellement je mettrait 00-D-0000000 (ou un [EXPR:...] qui calcule uniquement les 2 digits de l’année) comme valeur par défaut (avec une aide qui dit que la valeur est calculée à l’enregistrement) et je mettrait le calcul effectif dans le hook preSave car celui-ci s’exécute après la validation des données juste avant l’enregistrement.

c’est très clair, effectivement c’est à l’enregistrement que ça doit se calculer.
Je vais voir où et comment écrire ce bout de code.

Merci pour votre aide.

Cf. https://docs.simplicite.io/documentation/01-core/businessobject-code-hooks.md#prepostsavehooks

Cf aussi https://docs.simplicite.io/documentation/01-core/businessobject-code-hooks.md#prepostvalidatehooks

dans 99% de cas les règles de gestion liées aux données des objet métier s’écrivent dans ces 4 hooks pre/postValidate ou pre/postSave (ou leur variante spécialisée pre/postUpdate et pre/postCreate, en l’occurrence dans ma réponse j’aurais du dire preCreate au lieu de preSave)

Bonjour,
Désolé je rame.
Pouvez vous me donner un bout de code que je mettrai dans mon objet métier, en java, pour alimenter avec une valeur par défaut le champ vlp_dos_reference, au moment où je crée un nouvel enregistrement.
J’ai mis ce code

package com.simplicite.objects.Valproate;

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

/**
 * Business object VlpDossier
 */
public class VlpDossier extends ObjectDB {
	private static final long serialVersionUID = 1L;
	
	@Override
	public String postCreate() {
		
		this.setFieldValue("vlp_dos_reference","01234567" );
		//return Message.formatInfo("INFO_CODE", "Message", "fieldName");
		//return Message.formatWarning("WARNING_CODE", "Message", "fieldName");
		//return Message.formatError("ERROR_CODE", "Message", "fieldName");
		return "OK";
	}
	
}

Qui m’affiche les erreurs suivantes à l’enregistrement :
ERR_USERKEY:
VlpDossier-1

Je vous remercie, j’ai besoin d’un exemple pour comprendre comment ça fonctionne.

Votre 1ère erreur c’est d’utiliser le hook postCreate => le post c’est trop tard, car celui-ci s’execute après l’enregistrement.

Cf. mes réponses précédentes je vous suggère d’utiliser le preSave ou le preCreate qui sont les derniers hooks qui s’exécutent avant l’enregistrement et qui sont donc le bon endroit pour calculer votre identifiant unique.

La seconde erreur c’est de renvoyer votre "OK", ce que renvoie un postCreate est considéré comme un code d’erreur, pour dire “pas d’erreur” il faut renvoyer null.

Mais bon, dans votre cas ça bloque avant (au moment du validate) car une erreur d’unicité ERR_USERKEY signifie que vous essayez de créer un 2ème record avec la même clé fonctionnelle.

Bref:

  1. Supprimez les records existants
  2. Mettez le code de calcul de votre identifiant unique dans le preCreate (et ne mettez pas une valeur en dur car forcément au 2ème record vous allez retomber dans le pb d’unicité)
  3. Faites retourner null par ce preCreate

Sinon voici un exemple de code qui calcule un identifiant unique formaté selon une “pseudo-séquence” stockée dans un param système:

setFieldValue("myField", getGrant().getNextSystemParamValue("MyObjectSequence", new DecimalFormat("ABC-0000"));

Sinon il y a d’autres exemples là: https://docs.simplicite.io/documentation/01-core/businessobject-code-hooks.md#prepostcreateundatedeletehooks

Merci pour votre réponse.
En effet ça fonctionne, mais comme j’avais toujours le pb de err_userkey j’ai creusé autour de la clé primaire. Il y aavait un prb de nommage

vlpDosID au lieu de vlpDosId

A suivre… merci

Oui les nommages logiques (attributs, objets, …) sont case sensitive dans SImplicité