errorを入れてもreturn falseを返してもsubmitがキャンセルされない

「昨日までのレコードの値の中で重複している値があったら、エラーでsubmitをキャンセルする」

という処理を実装したいのですが、

 

var events05 = [

        ‘app.record.create.change.伝票番号’,

        ‘app.record.edit.change.伝票番号’,

    ];

    kintone.events.on(events05, function(event) {

        var record = event.record;

        console.log(record);

    

    

        var body = {

            ‘app’: kintone.app.getId(),

            ‘query’: ‘作成日時 >= YESTERDAY()’,

        };

        var records = ‘’;

        kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, body).then(function(resp) {

        // success

        console.log(resp);

        records =resp.records;

        // 伝票番号の加工

        var result02 = ‘’;

        var result03 = ‘’;

        var result04 = ‘’;

        var result05 = ‘’;

        var result06 = ‘’;

        const regexp = new RegExp(/^\w\d{12}\w$/);

        for(var i = 0;i < record.伝票一覧.value.length;i++){

            var denpyoNo = record.伝票一覧.value[i].value.伝票番号.value;

            const result = regexp.test(denpyoNo);

            if(result){

                result02 = denpyoNo.substring( 1, 13 );

                result03 = result02.substring( 0, 4 );

                result04 = result02.substring( 4, 8 );

                result05 = result02.substring( 8, 12 );

                result06 = result03 + ‘-’ + result04 + ‘-’ + result05;

                record.伝票一覧.value[i].value.伝票番号.value = result06;

            }

            for(var j = 0; j< records.length;j++){

                for(var k = 0; k< records[j].伝票一覧.value.length;k++){

                    console.log(records[j].伝票一覧.value[k].value.伝票番号.value+’ & '+record.伝票一覧.value[i].value.伝票番号.value);

                    if(records[j].伝票一覧.value[k].value.伝票番号.value == record.伝票一覧.value[i].value.伝票番号.value){

                        window.alert(‘すでに登録している伝票登録があります。→’+record.伝票一覧.value[i].value.伝票番号.value);

                        record.伝票一覧.value[i].value.伝票番号.error = ‘すでに登録している伝票登録があります’;

                        event.error = ‘すでに登録している伝票登録があります’;

                        kintone.app.record.set({record: record});

                    }

                }

            }

        }

        return event;

        });

 

 

まず、これで重複した値を入れた場合はエラーメッセージが表示されるように実装しました。

このまま保存してもエラーのまま保存ができてしまうので、

そしてsubmitイベントで「エラーメッセージがある場合はキャンセル」を実装しました。

 

 var events04 = [

    ‘app.record.create.submit’,

    ‘app.record.edit.submit’,

 ];

 kintone.events.on(events04, function(event) {

    var record = event.record;

    for(var i = 0;i < record.伝票一覧.value.length;i++){

        if(record.伝票一覧.value[i].value.伝票番号.error == ‘すでに登録している伝票登録があります’){

            return false;

        }

    }

 });

 

しかしこれでもエラーメッセージが表示された状態でもキャンセルせずに保存が実行されてしまいます。

 

「エラーを判別するロジック自体をsubmitイベントに入れてたらキャンセルされるか?」

 

も試してみましたが、保存されてしまいました。

 

「昨日までのレコードの値の中で重複している値があったら、エラーでsubmitをキャンセルする」

 

はどうすれば実現可能でしょうか?

 

よろしくお願いします。

こんにちは!

サブテーブル内に伝票番号を登録するのでしょうか?
仕組みが

 

    for(var i = 0;i < record.伝票一覧.value.length;i++){

        if(record.伝票一覧.value[i].value.伝票番号.error == ‘すでに登録している伝票登録があります’){

            return false;

        }

    }

 

return false; までたどり着かないということでしょうか??

それとも、return false;が実行されているのに保存されてしまうということでしょうか??

また、

        var body = {

            ‘app’: kintone.app.getId(),

            ‘query’: ‘作成日時 >= YESTERDAY()’,

        };

ここのqueryで、作成日が昨日以上(昨日と、昨日より未来)のレコードを取りに行くようになっていますが、もしかしたら不等号が逆ではないでしょうか?

juridonさん

コメントありがとうございます。

どうやら return false;にたどり着く前に保存が実行されているようです。

for文の後にテストの処理を入れるとそっちがfor文より先に実行されます。

なので、for文の後(kintone.events.onメソッドの直下)に return false;を入れれば、それが返されて保存されません。

しかしメソッドの直下では切り分けができません。。

>作成日が昨日以上(昨日と、昨日より未来)のレコードを取りに行く

こちらは「今入力した伝票」が「昨日より未来に入力したの伝票の中に重複していないか?」のチェックなのでこれで大丈夫です。

昨日入力したり当日入力したのに、忘れて2重登録してしまった場合に重複エラーで保存されないようにしたい処理なので。

こんばんは!

色々と思い違いをしておりました:sweat_drops:

events05は上手く行っている方で、

events04 では重複エラーがあればreturn false;するけど動かない

という内容だったのですね!

events04 でたとえば↓のように、return falseになるようにしてrecordの中を見てみてください。events05で設定したはずのエラーがなくなっているとおもいます。

 kintone.events.on(events04, function(event) {

    var record = event.record;

    console.log(record);

    return false;

 

    //for(var i = 0;i < record.伝票一覧.value.length;i++){

    //    if(record.伝票一覧.value[i].value.伝票番号.error == ‘すでに登録している伝票登録があります’){

    //        return false;

    //    }

 

    }

 });

 

events05はchangeイベント、events04は保存前イベントで、それぞれ別のイベントなので
events05で変更した内容(設定したエラー内容など)はevents04のevent.recordに引き継がれないと思います。

エラーを表示する場合はevents04と同じようにevents05でもフィールドにエラーを設定しないといけないかと思います(><)!
※get,setは使わずrecordに直接エラーを書き込む感じになると思います。

juridonさん

返答ありがとうございます!

早速おっしゃるとおりにevents04にevent05のエラー処理をset,getではなくreturn falseで実装みました。

    var body = {

        ‘app’: kintone.app.getId(),

        ‘query’: ‘作成日時 >= YESTERDAY()’,

    };

    var records = ‘’;

    kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, body).then(function(resp) {

        // success

        for(var i = 0;i < record.伝票一覧.value.length;i++){

            for(var j = 0; j< records.length;j++){

                for(var k = 0; k< records[j].伝票一覧.value.length;k++){

                    if(records[j].伝票一覧.value[k].value.伝票番号.value == record.伝票一覧.value[i].value.伝票番号.value){

                        window.alert(‘すでに登録している伝票登録があります。→’+record.伝票一覧.value[i].value.伝票番号.value);

                        record.伝票一覧.value[i].value.伝票番号.error = ‘すでに登録している伝票登録があります’;

                        event.error = ‘すでに登録している伝票登録があります’;

                        return false;

                    }

                }

            }

        }

    });

    return event;

 

重複していた場合はエラーメッセージがきちんと表示されました!

しかし、そのまま保存されてしまいます・・・(return falseにならない)。

どうやらエラーチェックの処理より先に、return eventが実行されているようです。

ここをreturn falseに直書きにしてしまうと、すべてfalseで返されて保存そのものができなくなってしまいます。

こんにちは!

kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, body).then(function(resp) {

のところでAPIを叩いている間に下のreturn event;が通ってしまいますので、

↓こちらを参考にして、
https://developer.cybozu.io/hc/ja/articles/360023047852

 

return kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, body).then(function(resp) {

}

と変えると良いと思います!

追記)OKのときにreturn event;とするのをお忘れなく:eyes::sweat_drops:

juridonさん

ありがとうございます!

解決しました!

助かりました!!