Champ calculé à partir d'autres champs

Salut tout le monde,

Je voudrais que la valeur d’un champ « nombre de végétarien » soit calculée à partir des 3 autres champs ( regime_alim1, regim_alim2_regim_alim3) de type sélectionner.

Est-ce que c’est possible ?

Merci :slight_smile:

Bonjour @Mylo,

Il est possible de rajouter un Script Client pour effectuer des calculs lors du changement d’une valeur dans un document sur le bureau. Pour un Formulaire Web, il est aussi possible de rajouter un script un peu plus primitif pour faire des calculs. Enfin, il est possible de rajouter un Script Serveur pour effectuer les mêmes calculs côté serveur, mais ça ne sera pas interactif.

Le choix de faire le script côté client (JavaScript, interactif) ou le script côté serveur (Python, non-interactif) dépend du besoin, généralement il vaut mieux faire les deux pour des données critiques (faire la somme totale de valeurs, etc.), ou éviter que certaines valeurs soient manquantes.

Si jamais la valeur n’est jamais affichée à des utilisateurs finaux, ou alors que ça ne dérange pas qu’elle ne soit pas mise à jour immédiatement, le Script Serveur suffit. Je recommande de commencer par un Script Serveur.


Ci-dessous quelques cas simplistes où on reprend la valeur du « type de repas » pour définir une case à cocher « est végétarien ». Si je comprends bien ton cas d’usage, tu devras plutôt faire une table enfant avec une for-of-loop sur les lignes mais l’idée reste là.

Script Serveur

doc.est_vege = 0

if doc.type_repas == "Végé":
  doc.est_vege = 1

Script Client

frappe.ui.form.on("Mon Inscription Repas", {
  type_repas(frm) {
    frm.trigger("recalcul")
  },
  recalcul(frm) {
    let vege = 0

    if (frm.doc.type_repas === "Végé") {
      vege = 1
    }

    frm.set_value("est_vege", vege)
  },
})

Formulaire Web

frappe.ready(function() {
  frappe.web_form.after_load = () => {
    frappe.web_form.on("type_repas", (field, value) => {
      recalculer()
    })
  }
})

function recalculer() {
  const type_repas = frappe.web_form.get_value("type_repas")

  let vege = 0
  if (type_repas === "Végé") {
    vege = 1
  }

  frappe.web_form.set_value("est_vege", vege)
}

La solution du script serveur est simple et efficace, merci @corentin

1 « J'aime »