プロセス管理のステータス更新時に採番したい

お世話になっております。

他の採番アプリに年度の連番を保持しておき(18000など)、案件アプリのプロセス管理に「採番する」で「事案NO」「受付日」フィールドに採番された番号と日付をセットして、「発行済み」としようとしています。

実行すると、初めは読み込んだ値ではなく0が採番され、次に実行すると「値が重複している」とエラーになり、連続した採番ができません。

また、本来ですと、「事案NO」と「受付日」は、編集不可としてプロセス実行時に担当者にしか、いじれないようにしたいのですが、うまくいきません。

初歩的なことが間違っていると思うのですが、どうぞ宜しくお願いします。

お手数おかけしますが宜しくお願いします。

 

 

 

kintone.api()は非同期通信のため、通信処理をしている間に次の処理に進んでしまいます。

そのため、GETが終わるより先にvalueのセットとreturn eventが動き、0が採番されます。

 

改善するためには、kintone.Promiseを使ってpromiseチェーンを行ってください。

https://developer.cybozu.io/hc/ja/articles/204564604-kintone-API-%E3%81%A7-Promise-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86-)

 

下記、動作試してませんがサンプルです。

 

(function(){
    ‘use strict’;

    kintone.events.on(‘app.record.detail.process.proceed’, function(event) {
        var record = event.record;
        var nStatus = event.nextStatus.value;

        var NO = 0;

        var dt = new Date();
        var today = dt.getFullYear() + ‘-’ + zeroFormat((dt.getMonth()+1), 2) + ‘-’ + zeroFormat(dt.getDate(), 2);

        if(nStatus === ‘発行済み’) {
            return new kintone.Promise(function(resolve, reject) {
                Promise.resolve().then(function() {
                    return kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘GET’, {
                        app: 15,
                        id: 1,
                    }).then(function(resp) {
                        return resp.record;
                    }).catch(function(error) {
                        event.error = error.message;
                        reject(event);
                    });
                }).then(function(resp) {
                    NO = Number(resp[‘事案NO’].value) + 1;

                    record[‘事案NO’].value = NO;
                    record[‘受付日’].value = today;

                    return kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘GET’, {
                        app: 15,
                        id: 1,
                        record: {
                            事案NO: {
                                value: NO
                            }
                        }
                    }).then(function(resp) {
                        resolve(event);
                    }).catch(function(error) {
                        event.error = error.message;
                        reject(event);
                    });
                }).catch(function(error) {
                    event.error = error.message;
                    reject(error);
                });
            });
        }

        return event;
    });

    function zeroFormat(v, n) {
        var v1 = String(v).length;
        if(n > v1) {
            return (new Array((n - v1) + 1).join(0)) + v;
        } else {
            return v;
        }
    }
})();

大西さん

早速のご対応ありがとうございました。

素人には少し難しく単純にいただきましたサンプルに乗せ変えたのですが、1回の採番はうまくいったのですが、その後は他のレコードと重複していますとなり、採番できません。

番号を保持している側のアプリに+1の更新されなかったようです。

お手数おかけして申し訳ありませんが、どのような現象なのでしょうか。

 

どうぞ宜しくお願いします。

 

 

 

依田さん

 

失礼しました。一部コードが誤っていて、APIを両方GETにしていました。後半はPUTですね。

 

(function(){
    ‘use strict’;

    kintone.events.on(‘app.record.detail.process.proceed’, function(event) {
        var record = event.record;
        var nStatus = event.nextStatus.value;

        var NO = 0;

        var dt = new Date();
        var today = dt.getFullYear() + ‘-’ + zeroFormat((dt.getMonth()+1), 2) + ‘-’ + zeroFormat(dt.getDate(), 2);

        if(nStatus === ‘発行済み’) {
            return new kintone.Promise(function(resolve, reject) {
                Promise.resolve().then(function() {
                    return kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘GET’, {
                        app: 15,
                        id: 1,
                    }).then(function(resp) {
                        return resp.record;
                    }).catch(function(error) {
                        event.error = error.message;
                        reject(event);
                    });
                }).then(function(resp) {
                    NO = Number(resp[‘事案NO’].value) + 1;

                    record[‘事案NO’].value = NO;
                    record[‘受付日’].value = today;

                    return kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘PUT’, {
                        app: 15,
                        id: 1,
                        record: {
                            事案NO: {
                                value: NO
                            }
                        }
                    }).then(function(resp) {
                        resolve(event);
                    }).catch(function(error) {
                        event.error = error.message;
                        reject(event);
                    });
                }).catch(function(error) {
                    event.error = error.message;
                    reject(error);
                });
            });
        }

        return event;
    });

    function zeroFormat(v, n) {
        var v1 = String(v).length;
        if(n > v1) {
            return (new Array((n - v1) + 1).join(0)) + v;
        } else {
            return v;
        }
    }
})();

 

これでいかがでしょう。

お世話になっております。

2番目のAPIがGET となっておりました。

修正したらうまくいきました。

本当にありがとうございました。

勉強します。

 

今後とも宜しくお願いします。

 

 

なぜかコメントが送れなかったので、いいねのみで失礼いたしました。

無事に解決されましたようで、何よりです。

 

Promiseは理解が難しいですが、覚えてしまえば強力です。

どうぞ素晴らしいkintoneカスタマイズライフを。

ありがとうございました。