Bouton Action qui Crée une ligne d'objet via BusinessObjectTool

Bouton Action qui Crée une ligne d'objet via BusinessObjectTool
0
Tags: #<Tag:0x00007fed49b24b78>

Bonjour,

Que serait le bon hook qui permettra de créer une nouvelle ligne d’objet en se basant sur un bouton d’action qui existe dans un autre objet.

Cas d’usage :
Quand je clique sur un bouton d’action qui existe dans un objet X, une ligne sera créée sur un Objet Y et remplie avec des copies de valeurs ramenées de l’objet X, et enfin enregistrée.

Merci

On ne parle pas de hook mais d’une action à configurer sur votre objet X qui appelle une méthode de la classe de votre objet X.

Cf. https://training.simplicite.io/training/business-objects-configuration/a110-create-a-specific-action/ (attention ici l’implémentation est sous forme d’une “processing expression” dans ce que je dis ci-dessus il faut renseigner un nom de méthode et laisser la processing expression vide).

Il y a un exemple dans la démo:


La méthode étant:

Dans votre cas dans le code de votre action vous devez écrire le code qui créé le record de votre objet Y, cf. https://docs.simplicite.io/documentation/01-core/basic-code-examples.md#businessobjects

Cela étant dit, à nouveau ce forum n’a pas vocation à se substituer à une formation. Les actions sont un concept de base de Simplicité qui fait partie du programme de formation de base. La réponse ci-dessus ne relève donc pas du support mais de la formation.

Pourriez vous m’envoyer un message privé afin que l’on puisse voir quels sont vos besoins et comment on peut vous accompagner. Merci

J’ai bien compris le fonctionnement d’action à travers le training.
En effet j’ai pu créer mon bouton d’action, et j’ai ajouter une méthode dans mon objet métier où se trouve le bouton d’action.
Ce qui reste encore flou dans mon cas, c’est comment créer un nouveau record dans l’objet Y à partir du bouton d’action.

J’ai utilisé le bout de code mentionné dans la documentation citée, mais ça ne me permet pas d’avoir un nouveau record.

Mon besoin exacte est de :

  • Créer le nouveau record sur objet Y en cliquant sur le bouton d’action sur Objet X
  • Valoriser les champs du nouveau record à partir des valeurs déjà existantes dans l’objet X (ça je sais comment le faire à partir des Get et Set)
  • Faire un save

Merci
cordialement

@david
Erreur de ma part, j’avais une erreur sur ma méthode.
Je suis arrivé finalement à résoudre mon problème.
Merci de votre aide.

Le code typique pour creer un record d’un objet est du genre:

ObjectDB obj = getGrant().getTmpObject("MyObject");
obj.resetValues(true); // Prepares object for creation
obj.getField("myField1").setValue("value 1");
// ...
obj.getField("myFieldN").setValue("value N");
new BusinessObjectTool(obj).validateAndSave();

Attention l’instance “tmp” object peut être accédée par ailleurs dans votre code ou par Simplicité (un autre thread comme la cron ou autre traitement asynchrone d’import/export…).

donc le code “typique” est plus complexe pour garantir :

  • les droits d’accès en création car rien ne dit si le user qui instancie l’objet à les droits de création
  • thread-safe, ne pas pouvoir toucher à l’instance en mémoire le temps des set/save.
// Add user rights : create + read + update
boolean crud[] = getGrant().changeAccess("MyObject", true, true, true, false);  
try {
  ObjectDB obj = getGrant().getTmpObject("MyObject");
  // Synchronize this instance in user's session
  synchronized(obj) {
    obj.resetValues(true); // Prepares object for creation
    obj.setRowId(ObjectField.DEFAULT_ROW_ID); // force a creation = 0
    obj.setFieldValue("myField1", "value 1");
    // ...
    obj.setFieldValue("myFieldN", "value N");
    new BusinessObjectTool(obj).validateAndSave();
  }
}
catch(Excpetion e) {
  AppLog.error(getClass(), "myMethod", "error during creation...", e, getGrant());
}
finally {
  // restore previous rights  
  getGrant().changeAccess("MyObject", crud); 
}

Il serait justicieux que le BusinessObjectTool fasse tout ça en lui passant le tuple à charger (comme un json object) de façon sûre car peu de développeur y pense et ça génère des pb aléatoires par la suite…

je passe ce post en Change Request

Oui on est d’accord. Ou alors il faut utiliser une instance ad hoc dont on est certain qu’elle n’est utilisée qu’ici genre getGrant().getObject("myMethod_MyObject", "MyObject");

En fait, je ne voulais pas donner une réponse trop compliquée car, cf. la demande initiale est extrêmement basique (= comment implémenter une action d’un objet X qui créé un record d’un objet Y).