データを追加する時、
jsで既存データと比較する方法を知りたいです。
たとえば施設予約のアプリで、
以下のような2つの既存データがあった場合、
・A室 8/1 0:00 ~ 8/3 0:00
・B室 8/1 0:00 ~ 8/3 0:00
「A室 8/2 0:00 ~ 8/4 0:00」の入力を「保存」使用とした場合、
「A室 8/1 0:00 ~ 8/3 0:00」とブッキングしていることを判定したいです。
欲を言うのであれば、
ブッキングした時は、エラーで入力情報の確認を促し、
入力できないようにしたいのですが、
これは別の質問として相談させていただいております。
なにか情報をご存知でしたら、
教えていただけませんでしょうか。
Legacy_Account631
(cybozu developer network team(Legacy Account))
2
kawamuraさん
ご質問いただきありがとうございます。
データの重複確認については、レコード保存時イベントで該当アプリのレコードを全件取得して、
取得した配列のlength(配列の要素数)が0の場合はそのまま保存、1以上の場合はエラー表示という作りにするといいかと思います。
全件取得の箇所については、こちらの記事を参考にしていただけると嬉しいです。
▼Promiseを利用したモダンなアプリの全レコード取得の書き方
https://developer.cybozu.io/hc/ja/articles/204730600
▼kintoneの大量レコード取得を高速化
https://developer.cybozu.io/hc/ja/articles/360000826766
よろしくお願いします。
kawamura さん
こんにちは!
開始日と終了日を他のレコードの開始日、終了日と比較して
重複がないか、チェックを行い、重複している場合はエラーが表示される、
という処理を書いてみました!
私自身、まだまだうまく理解できていないところもあり、
恥ずかしい記述内容となっているかもしれませんが、少しでも
参考になれば嬉しいです。
(function () {
"use strict";
kintone.events.on(['app.record.create.submit', 'app.record.edit.submit'], function (event) {
var record = event.record;
var startDate1 = new Date(record.開始日.value);
var endDate1 = new Date(record.終了日.value);
var startDate2;
var endDate2;
var body = {
"app" : event.appId,
"fields" : ["開始日", "終了日"]
}
return new kintone.Promise(function(resolve, reject) {
kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body, function(resp) {
for(var i = 0; i < resp.records.length; i++) {
startDate2 = new Date(resp.records[i].開始日.value);
endDate2 = new Date(resp.records[i].終了日.value);
if(startDate1 <= endDate2 && endDate1 >= startDate2) {
event.error = "予定が重複しています。";
resolve(event);
} else {
resolve(event);
}
}
console.log(resp);
}, function(error) {
console.log(resp);
});
});
return event;
});
})();