右記エラーについて「レコードを再読み込みしてください。編集中に、ほかのユーザーがレコードを更新しました」

エラー:レコードを再読み込みしてください。編集中に、ほかのユーザーがレコードを更新しました
エラーコード:GAIA_UN03

以下のjavascriptを有効にすると、新規作成 → アクション と進んだ時に上記のエラーが出てしまいます。自動採番のプログラムです。新規作成後にブラウザ更新など挟むとエラーは出ません。
まだそこまで自分で調べられていませんが、影響範囲が広くて少し焦っているので先に質問させていただきます。こちらで何かわかれば追記いたします。大変恐縮ですがご協力いただけると幸いです。

 

// 稟議の新規レコード保存後イベント

//// ・採番管理アプリのレコード、max値を取得

//// ・max +1 を 稟議に付与し、採番管理にmax値として返す

//// ・レコードが月初めである場合は、稟議と採番管理に 1 を返す 

 

(function() {

    “use strict”;

    //稟議アプリのID

    var ringiAppId = 226;

    //採番アプリのID

    var saibanAppId = 239;

    

    // 新規保存成功後イベント

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

        // 開いているレコードを取得

        var rec = event.record;

        

        // システム日付(年、月、日をそれぞれ取得)

        var dt = new Date();

        // 保存時西暦

        var dt_yyyy = dt.getFullYear();

        // 保存時月

        var dt_mm = dt.getMonth()+1;

        // 保存時日にち

        var dt_dd = dt.getDate();

    

        //保存した稟議アプリのレコード取得

        console.log(rec);

        var recId = rec.$id.value;

    

        // 採番アプリのレコード取得(アプリID:239 / レコードID:226)

        var paramGet = {

            ‘app’: saibanAppId,

            ‘query’: ‘アプリID = 226’

        };

        

        // 採番アプリのレコード取得を実行

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

            // 取得したレコードをresp2に代入

            var records = resp.records;

            var resp2 = records[0];

 

            function showSuccess(){

                window.alert(‘受付No:’ + regNo);

            }

           

            // 採番管理の項目「最大値」を取得

            var autono = resp2[‘最大値’].value;

            // 「最大値」に + 1 

            var autononew = Number( autono ) + 1;

            // 番号を2桁にする(左に0を付けて右から2文字とる)

            var autono2 = ‘0’ + String( autononew );

            autono2 = String(autono2).substring( String(autono2).length - 2 );

            

            // 月を2桁にする(左に0を付けて右から2文字とる)

            var dt_mm2 = ‘0’ + String(dt_mm);

            dt_mm2 = String(dt_mm2).substring(String(dt_mm2).length - 2);

            

            // 受付noを作る

            var regNo = rec[‘会社区分_DD’].value + “-” +String(dt_yyyy) + String(dt_mm2)  + “-” + autono2;

            var regNo1 = rec[‘会社区分_DD’].value + “-” +String(dt_yyyy) + String(dt_mm2)  + “-” + “01”;

            // 採番管理アプリのレコード番号を取得

            var saibanId = resp2.$id.value;

            // レコード新規保存時の年月を取得

            var saibanYm = String(dt_yyyy) + String(dt_mm);

 

            // 「最大値」が登録された年月と、新規保存時の年月が同じである場合更新(PUT)

            if(resp2[‘最大値登録年月’].value === String(dt_yyyy) + String(dt_mm)){

                // 「受付No_文字列」にregNoを代入

                var query = {

                   ‘受付No_文字列’: {

                       value: regNo

                    }

                };

                // 新規保存したレコードを更新

                var paramPut = {

                    ‘app’: ringiAppId,

                    ‘id’: recId,

                    ‘record’: query

                };

                //「最大値登録年月」[最大値]をそれぞれ代入

                var query2 = {

                    ‘最大値登録年月’: {

                        value: saibanYm

                    },

                    ‘最大値’: {

                        value: autononew

                    }

                };

                // 採番管理アプリを更新

                var paramPut2 = {

                    ‘app’: saibanAppId,

                    ‘id’: saibanId,

                    ‘record’: query2

                };

 

                /*

                alert(‘今月パターン’ + 

                ’ autono:’ + autono + 

                ’ autononew:’ + autononew + 

                ’ regNo:’ + regNo + 

                ’ id:’ + recId +

                ’ ringiAppId:’ + ringiAppId);    */

                

                // 更新を実行

                kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘PUT’, paramPut);

                //alert(‘ringi’);

                

                kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘PUT’, paramPut2);

                //alert(‘saiban’);

            }else{

                

                // 月初めのレコードである場合、受付NOの末尾に 01 を付与  

                // 「受付No_文字列」にregNo1を代入

                var query3 = {

                    ‘受付No_文字列’: {

                        value: regNo1

                    }

                };

                // 新規保存したレコードを更新

                var paramPut3 = {

                    ‘app’: ringiAppId,

                    ‘id’: recId,

                    ‘record’: query3

                };

                //「最大値登録年月」[最大値]をそれぞれ代入

                var query4 = {

                    ‘最大値登録年月’: {

                        value: saibanYm

                    },

                    ‘最大値’: {

                        value: 1

                    }

                };

                // 採番管理アプリを更新   

                var paramPut4 = {

                    ‘app’: saibanAppId,

                    ‘id’: saibanId,

                    ‘record’: query4

                };

                    

                /*

                alert(‘月初めパターン’ + 

                ’ regNo:’ + regNo + 

                ’ id:’ + recId +

                ’ ringiAppId:’ + ringiAppId);  */

                

                // 更新を実行

                kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘PUT’, paramPut3);

                //alert(‘ringi’);

                    

                kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘PUT’, paramPut4);

                //alert(‘saiban’);

 

            }

        });

   });

})(); 

 

 

岩本 凌さん

こんにちは。

 

はじめに前提条件を確認したいため、認識が誤っていればご指摘ください。

 

GET、PUTだけ見ると、大枠のフローは以下と認識しています。

①稟議のレコード保存成功 → レコードXとする

②採番管理のレコード取得(GET) → レコードYとする

③稟議のレコードXを更新(PUT)

④採番管理のレコードYを更新(PUT)

 

稟議レコードXを登録後に、画面リロードしないまま編集モードに入り保存する。

このタイミングでエラーになる、というご質問で合ってますでしょうか?

 

上記であれば、PUT処理成功後に、画面リロード処理を入れれば、エラーは解消されると思います。

手動か自動かの違いにはなりますが、画面リロードは挟む必要があります。

koichi様

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

前提条件に関して、まず大枠のフローはご認識の通りです。
エラーに関してですが、正確には
稟議レコードXを登録後に、画面リロードしないまま「申請」(プロセス管理で設定しているアクション)をクリックし実行すると
エラーが出てしまいます。

言葉足らずで失礼いたしました。

ご確認ありがとうございます。

プロセス管理の実行ですね。

その場合もやはりPUT処理の後(イベント内の最後)に画面リロード処理を入れた方が良いと思います。

 

もう一点、別の視点から補足させていただくと、差し支えなければ

app.record.create.submit.successイベント内ではなく

app.record.create.submitイベント内で処理すると、色々と便利が良くなると思います。

 

①稟議のレコード保存前(app.record.create.submit)

②採番管理のレコード取得(GET) → レコードYとする

③保存中の稟議自レコードの受付Noをセット(rec.受付No.value = 値)

④採番管理のレコードYを更新(PUT)

 

※②~④はGETやPUTを同期処理にする必要がありますので「async/await」「kintone.Promise」を使います。

これをしないと、稟議レコードの保存が先に完了してしまい、採番管理へのPUTが行われません。

 

上記に変えると、稟議レコードの保存完了後、kintoneの仕様で自動的に画面リロードしますので

当初のご質問であるエラーも発生しなくなります。

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

とりあえず自動リロードを試しました。結論から言うと、それでもエラーが出てしまいます。

ただその間に分かったこと追記します。

① イベントの最後にlocation.reload(); を付けた場合は、自動採番でputされた受付Noが保存ボタンクリック時すぐに反映される。
(今までは、保存クリック後に画面遷移かリロードをしないと反映されなかった。)
② 他のカスタマイズを全てコメントアウトして自動採番単独ならエラーが出ない。
逆に、前述のように自動採番だけをコメントアウトした場合もエラーが出ない。

自動採番と邪魔しあっている?カスタマイズがあるならそれを特定するべきでしょうか。
それとも後半で書いて頂いているように、そもそも自動採番の書き方を見直すべきでしょうか。

何から始めるべきか迷っているのでアドバイスいただけると幸いです。

ご確認ありがとうございます。

画面リロードの旨を申しましたが、私の認識違いでした。

最初に記載のコードのみでしたら、画面リロードなしでもエラーが出ないと思います(私の環境では出ませんでした)。

 

そのため、おっしゃる通り他のカスタマイズ側が起因している可能性が高いです。

例えば

・レコード詳細画面表示イベント(app.record.index.show)で自レコードにPUTする処理がある

・レコード保存後に自レコードが更新されるようなプラグインを入れている

 

変更履歴の機能を有効にしている場合は、エラーが出た際にレコード画面右側で変更履歴を確認してみてください。

一番直近にある更新処理が原因となる処理と思います。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。