計算ボタン押下時に処理される関数作成について

先日、日時フィールドについて問い合わせさせていただいた者ですが、

計算フィールでは、できないため、今回「計算」ボタンを作成し、押下したタイミングで処理する関数を作成したいのですが、

うまく実行できません。

javascriptの書き方の問題かと思われますが、ご教示ください。

※以下、簡単な計算式としておりますが、以前より対応している条件式を組み込む予定で

複雑になるため、計算フィールドは使いません。


var myMenuButton = document.createElement(‘button’);
myMenuButton.id = ‘my_menu_button’;
myMenuButton.innerHTML = ‘計算’;

(function () {
    “use strict”;
    kintone.events.on(‘app.record.create.show’, function (event) {

        kintone.app.record.getSpaceElement(‘button_space’).appendChild(myMenuButton);
       
        myMenuButton.onclick = function () {

           var SubA = record[‘左辺’].value;
           var SubB = record[‘右辺’].value;
           var Total = SubA * SubB;
       
           record[‘計算結果’].value = Total;

        };
    return event;
        
    });
})();

Mizushiさん

簡単に見えますが、なかなかうまくいけませんね。私もはまってしまいました><

レコード追加画面で、「左辺」と「右辺」フィールドにデータを入力して、同じ画面にボタンを配置し、
ボタンクリックで入力したデータ(未保存)を取得して演算し、演算した結果を計算結果フィールドに表示させるというイメージであっていますか?

まず、recordを定義しないといけないですね。
⇊ ⇊
var record = event.record;

後、app.record.create.showでは、入力したデータ(未保存)を取得できないようです。

編集画面で未保存データを取得するにはchangesイベントを使います。

ただし、同じ画面にボタンを配置して、ボタンクリックで演算して計算結果フィールドにセットするのは難しいようです。

 

ボタンをレコード詳細画面に配置す ると、REST APIで行けそうです。

(function () {
“use strict”;

kintone.events.on(‘app.record.detail.show’,function (event) {
var myMenuButton = document.createElement(‘button’);
myMenuButton.id = ‘my_menu_button’;
myMenuButton.innerHTML = ‘計算’;
kintone.app.record.getSpaceElement(‘button_space’).appendChild(myMenuButton);
myMenuButton.onclick = function(){
var record = event.record;
var subA = record[‘左辺’].value;
var subB = record[‘右辺’].value;
var total = subB * subA;
var params={
“app”:kintone.app.getId(),
“id”:kintone.app.record.getId(),
“record”:{
“計算結果”:{“value”:total}
}
};
kintone.api(
kintone.api.url(‘/k/v1/record’, true),
‘PUT’,
params,
function(resp){
}
);

location.reload();
};
return event;
});
})();


ボタンを使わない場合、
app.record.create.submitを使えば、簡単にできます。


(function () {
“use strict”;

kintone.events.on(‘app.record.create.submit’,function (event) {

var record = event.record;
var subA = record[‘左辺’].value;
var subB = record[‘右辺’].value;
var total = subB * subA;
record[‘計算結果’][‘value’] = total;
return event;
});
})();


Qiuxiang Suさん                                      

>レコード追加画面で、「左辺」と「右辺」フィールドにデータを入力して、同じ画面にボタンを配置し、
ボタンクリックで入力したデータ(未保存)を取得して演算し、演算した結果を計算結果フィールドに表示させるというイメージであっていますか?

ご認識の通りです。

いろいろ試しているもののまだ現状もうまく行きません。

いろいろとアドバイスありがとうございます。

思うようにいきませんね。簡単にできそうでできず、今回質問させていただきましたが、

現状も引き続き対応しています。

何かありましたら、再度アドバイスいただけると幸いです。

 

 

 

Mizushiさん

うまく行けるといいですね。

また何かありましたら、いつでもお気軽に相談してください。

私もいろいろ勉強になりました。

Mizushiさん

ボタンを使うと、レコード取得、計算、レコード反映という手順が必要になります。

ボタンを使わず、項目のチェンジイベントで処理したほうが簡単なので、サンプルコードを作成しました。

 

(function() {
“use strict”;

kintone.events.on([“app.record.create.show”,“app.record.edit.show”], function(event) {
event.record[“計算結果”][“disabled”] = true;
return event;
});

var changeEvents = [
“app.record.create.change.左辺”,
“app.record.create.change.右辺”,
“app.record.edit.change.左辺”,
“app.record.edit.change.右辺”,
];

kintone.events.on(changeEvents, function(event) {
var record = event.record;
record[“計算結果”][“value”] = “-”;
if (checkNumber(record[“左辺”])) return event;
if (checkNumber(record[“右辺”])) return event;
record[“計算結果”][“value”] = Number(record[“左辺”][“value”]) * Number(record[“右辺”][“value”]);

return event;
});

function checkNumber(pField){
pField[“error”] = null;
if (!pField[“value”]){
return true;
}
if (isNaN(Number(pField[“value”]))){
pField[“error”] = “数字エラー”;
return true;
}
return false;
}

})();


一応、数字チェックも入れました。こんな感じでいかがでしょうか?

 

rex0220さん
アドバイスいただきありがとうございます。ただ、以下の2点の理由により「ボタンを使わない場合」は、考えていません。
(というよりむしろ、要望によりできません。)
・今回はフィールドの計算としていますが、実際には日時フィールドであること。
(日時フィールドであるとchangeイベントで日付を選択するタイミングで初期値0:00が入って勝手に計算してしまう。詳細は、以前問い合わせしている「日時フィールドについて」を参照)
・計算結果については、人の判断によって0もしくはそれ以外の数値に上書き保存することもありうる。
(保存するタイミングで更新はかけられない。)

Mizushiさん

なるほど、ユーザー要望ですか。
レコードの取得・設定は、下記のようにすると設定できると思います。
エラーチェックなども必要だと思いますので、検討してみてください。

myMenuButton.onclick = function () {

var record = kintone.app.record.get();

var SubA = record[‘左辺’].value;
var SubB = record[‘右辺’].value;
var Total = SubA * SubB;

record[‘計算結果’].value = Total;

kintone.app.record.set(record);

};

rex0220さん

ありがとうございます。引き続き対応しております。