お世話になっております。
テーブル内に数値フィールドが2つ、計算フィールドが1つあります。
数値フィールドはjsを用いて値が自動入力されるようになっており、
その値を元に数値1×数値2で計算フィールドが計算する仕組みとなっております。
その際、jsで入力した値を待たずに計算フィールドが計算してしまうため、
前に入力されていた値で計算されてしまいます。
このような場合、jsで入力された値を待ってから計算させるにはどのようにしたら良いのでしょうか。
ご教示いただければ幸いです。
お世話になっております。
テーブル内に数値フィールドが2つ、計算フィールドが1つあります。
数値フィールドはjsを用いて値が自動入力されるようになっており、
その値を元に数値1×数値2で計算フィールドが計算する仕組みとなっております。
その際、jsで入力した値を待たずに計算フィールドが計算してしまうため、
前に入力されていた値で計算されてしまいます。
このような場合、jsで入力された値を待ってから計算させるにはどのようにしたら良いのでしょうか。
ご教示いただければ幸いです。
mionix さん
こんにちは。ひよこです。
最後に return event していれば、js で入力された値を使って計算されるかと思います。
ただ、REST API を使っているときなど、状況によっては違うところに原因がある場合もあります。
ソースコードを貼っていただくと、アドバイスしやすいかなと思います!
// 計算フィールドの値は 6 になる
(function() {
'use strict';
kintone.events.on(['app.record.create.show','app.record.edit.show'], function(event) {
var table = event.record.テーブル.value;
table.forEach(function (row) {
row.value.数値1.value = 3;
row.value.数値2.value = 2;
});
return event;
});
})();
ご教示頂きありがとうございます。
再度確認したところ、正しく計算される時と前の値で計算される時と挙動が不安定です。
他の処理の影響でうまくいっていない気がしてきました…
以下、実際に適用させているjsになります。
質問文と処理が異なることご了承ください。
(function ()
{
'use strict';
/*
利益率設定と原価の値を基に、単価の計算をします。
原価 / ((100 - 利益率設定) / 100)
原価に値を入れたとき処理が走ります。
*/
var events = [
'app.record.create.change.原価',
'app.record.edit.change.原価',
];
kintone.events.on(events, function (event)
{
var record = event.record;
var row = event.changes.row;
if (!record['利益率設定']['value'] || !row.value['原価']['value']) return;
row.value['price']['value'] = parseInt(row.value['原価']['value'] / ((100 - record['利益率設定']['value']) / 100));
return event;
});
})();
mionix さん
すみません。わからなかったので教えて下さい。
フィールドコードが price のフィールドは、計算フィールドなのでしょうか?
数式を見ると、JS ではなく、計算式を設定したほうが良さそうに思います。
IF や OR 、ROUND 関数と組み合わせれば、JS でカスタマイズせずに計算できます。
https://jp.cybozu.help/k/ja/user/app_settings/form/autocalc.html
計算式フィールドは、値の書き換えに対応していません。(ので、そもそも書き換わらないはず?)
https://developer.cybozu.io/hc/ja/articles/201941984#step4
説明不足で大変申し訳ありません。
「原価(数値)」を入力すると「利益率設定(数値)」に設定した値を元に「price(数値)」に下記計算を行った値を入力します。
原価 / ((100 - 利益率設定) / 100)
計算フィールドは price * 数量(数値) で設定されており、jsで処理した price の処理を待ってから計算フィールドが反映してほしいといった内容です。
priceは自動計算を行う場合と、手入力する場合があるため、計算フィールドにすることはできません。
以上となります、申し訳ありませんでした。
横から申し訳ありません
以前実験したことがあるのですが、
changeイベントを使う場合にJavaScriptと計算フィールド混在させると正常に計算できません。
jsでの数値計算と
計算フィールドの計算は完全に非同期に動きます。
※計算フィールドの計算を待ってからJavaScriptを動かすというのはできないこともないですがおすすめできない処理です。
というわけで、
(1)全部計算フィールドで自動計算する
(2)全部JavaScriptで自動計算する
の、どちらかに寄せたほうが良いです。
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。