サブテーブル内の項目Aの重複チェック方法を教えてください
チェックする条件は次の通りです
①登録時のサブテーブル内に重複がないこと
②既存レコード(サブテーブル内)の項目Aに重複がないこと
サブテーブル内の項目Aの重複チェック方法を教えてください
チェックする条件は次の通りです
①登録時のサブテーブル内に重複がないこと
②既存レコード(サブテーブル内)の項目Aに重複がないこと
こんな感じで、チェックできます。フィールドコードやメッセージ等はアプリに合わせて変更してください。
(function() {
'use strict';
const checkFcode = '項目A';
const errMessage1 = '重複エラー: ';
const errMessage2 = '項目A 重複エラー';
const events = [
'app.record.create.show', 'app.record.edit.show',
'app.record.create.submit', 'app.record.edit.submit',
'app.record.create.change.Table', 'app.record.edit.change.Table',
'app.record.create.change.' + checkFcode, 'app.record.edit.change.' + checkFcode,
];
kintone.events.on(events, function(event) {
var record = event.record;
var keys = {};
var table = record.Table.value;
table.forEach(function(row, index) {
row.value[checkFcode].error = null;
var val = row.value[checkFcode].value;
if (val) {
if (keys.hasOwnProperty(val))
keys[val].push(index);
else
keys[val] = [index];
}
});
Object.keys(keys).forEach(function(val) {
if (keys[val].length > 1) {
keys[val].forEach(function(pos) {
table[pos].value[checkFcode].error = errMessage1 + val;
if (event.type.slice(-7) == '.submit')
event.error = errMessage2;
});
}
});
return event;
});
})();
あとご参考に、有償ですが項目検証プラグインの重複チェック例です。
rex0220さん
コメントありがとうございます。
すいません。伝え方が悪かったみたいですね。
やりたいことが、サブテーブル内の項目Aを入力した場合に
既存テーブルに同一のデータが存在するときはエラー表示を行いデータ登録させたくない要件でした(^^;
<例1>
【画面】項目A⇒1001
【DB】項目A⇒…998, 999, 1000
⇒DB/項目Aに1001が登録される
<例2>
【画面】項目A⇒1001
【DB】項目A⇒…998, 999, 1000, 1001
⇒エラー表示して登録させない
いい方法ありますかね?
単純に REST API で、該当データが存在するかチェックして、あったらエラーにするだけでいいと思います。
処理タイミングは、項目Aのフィールド値変更時イベント
レコードの一括取得(クエリで条件を指定)で、項目Aの値を条件にレコード取得してください。
rex0220さん
コメントありがとうございます。
ご教示頂いた通り、REST APIで検索後にエラーを出力するコードを書いたのですが
エラーとならず正常終了(登録)されます。
リクエスト後の個所でエラー表示は出来ないのでしょうか?
submit イベントで、非同期処理の REST API を実行する場合は、Promise 対応しなければなりません。
現在のコードだと、REST API の終了を待たずに、for ループが回り、イベント処理が終了します。
あと、項目の値毎に REST API を呼び出していますが、項目の値を全部まとめて in の中に指定すれば、1回の REST API で済むと思います。
kintone API で Promise を使ってみよう!
sample.js(kintone.api コールバック関数省略版) が、参考になると思います。
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。