先日、日時フィールドについて問い合わせさせていただいた者ですが、
計算フィールでは、できないため、今回「計算」ボタンを作成し、押下したタイミングで処理する関数を作成したいのですが、
うまく実行できません。
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;
});
})();
Legacy_Account486
(cybozu developer network team(Legacy Account))
2016 年 7 月 8 日午前 5:11
2
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さん
>レコード追加画面で、「左辺」と「右辺」フィールドにデータを入力して、同じ画面にボタンを配置し、
ボタンクリックで入力したデータ(未保存)を取得して演算し、演算した結果を計算結果フィールドに表示させるというイメージであっていますか?
ご認識の通りです。
いろいろ試しているもののまだ現状もうまく行きません。
いろいろとアドバイスありがとうございます。
思うようにいきませんね。簡単にできそうでできず、今回質問させていただきましたが、
現状も引き続き対応しています。
何かありましたら、再度アドバイスいただけると幸いです。
Legacy_Account486
(cybozu developer network team(Legacy Account))
2016 年 7 月 8 日午前 5:55
4
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);
};