自動採番のプログラムを作って動かしているのですが、不安定な動きをします。

お世話になっております。
自動採番のプログラムを作って動かしているのですが、不安定な動きをします。
原因がわかりませんのでお力をお貸しいただけないでしょうか。

レコード1つ1つに対して、識別コードである「受付No.」を付与しようとしています。
それに必要な自動採番のプログラムを作成中です。
基本的には、新規保存時に最大値 + 1 を付与してくれるのですが、前触れなく45 → 46 → 47 → 1 → 1 → 48 や 45 → 46 → 1 → 2 → 3 → 47 といった謎の採番をしてしまいます。

「受付No.」は「会社区分-yyyymm-自動採番」となっています。
画面上のドロップダウンである「会社区分」と「新規保存時の年月」と「月ごとリセットの自動採番値」をハイフンで結合しています。

javascriptに不慣れなもので、つたない部分があるかと思いますが宜しくお願いいたします。

 

$(function() {

   “use strict”;

/* レコード追加画面の保存実行前のイベント */

   var events4 = [‘app.record.create.submit’];

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

var record4 = event[‘record’];   

 

////////////////////////////////////////////////////////////////////////////////////////////////////////// 

//                     新規登録時のシステム日付を取得

//////////////////////////////////////////////////////////////////////////////////////////////////////////    

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

var dt = new Date();

// 保存時西暦

var dt_yyyy = dt.getFullYear();

// 保存時月

var dt_mm = dt.getMonth()+1;

// 保存時日にち

var dt_dd = dt.getDate();             

    

// 登録時日付にシステム日付を代入

record4[‘登録時日付’][‘value’] = dt_yyyy + ‘-’ + dt_mm + ‘-’ + dt_dd

 

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////    

//                            月を2桁にする

/////////////////////////////////////////////////////////////////////////////////////////////////////////    

 

// 月を2桁にする(2 → 02)

// 頭に0を付けて、右から2桁を取り出す

var dt_mm2        

dt_mm2 = ‘0’ + dt_mm;

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

 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////   

//                                max値検索の範囲を設定(dtmin ~ dtmax)    

//////////////////////////////////////////////////////////////////////////////////////////////////////////////    

    

//////////// dtmaxを作成 (来月1日)///////////////

var dtmax

// 保存時の月が12の場合は、12/1 ~ 来年1/1。

if(dt_mm === 12){

    dtmax = (parseInt(dt_yyyy, 10) + 1) + ‘-01-01’; 

}else{   

var dt_nmm 

// dtmaxを作成(保存時日付の来月の1日)

dt_nmm = ‘0’ + (parseInt(dt_mm, 10) + 1);

dt_nmm = dt_nmm.substring(dt_nmm.length - 2);    

dtmax = dt_yyyy + ‘-’ + dt_nmm + ‘-01’;

}   

 

//////////// dtminを作成(今月1日) ///////////////

// dtminは、保存時の月の1日

var dtmin = dt_yyyy + ‘-’ + dt_mm + ‘-01’;      

 

//////////////////////////////////////////////////////////////////////////////////////////////////////////

//                                           クエリの設定と実行    

//////////////////////////////////////////////////////////////////////////////////////////////////////////

    

// クエリ文の設定(上で設定した検索範囲で、「自動採番」フィールドのmax値とそのレコードを取得)

var query = {

// アプリのID

“app”: kintone.app.getId(),

// 条件

“query”: ‘登録時日付 >= "’ + dtmin + ‘" and 登録時日付 < "’ + dtmax + ‘" order by 自動採番 desc limit 1’

};       

            

// クエリの実行。設定された検索範囲で、最大の番号を取得する

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

var records = resp.records;   

 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////

//        新規保存するレコードに、番号(max値 + 1)を付与。文字を結合して受付noを作成。その月の最初のレコードだった場合は無条件で「会社区分-年月-01」

//////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

// 既に同月のレコードが存在する場合、同月のmax番号に+1

if (records.length > 0) {

var rec = records[0];

var autono = rec[‘自動採番’][‘value’];

var autononew = Number( autono ) + 1;

     

// 番号を2桁にする(2 → 02)

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

// 頭に0を付けて、右から2桁を取り出す

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

 

record4[‘自動採番’][‘value’] = Number(autononew);

record4[‘受付No’][‘value’] = record4[‘会社区分_DD’][‘value’] + “-” + dt_yyyy + dt_mm2  + “-” + String(autono2);

 

// 対象レコードがなかった場合は「yyyymm-01」

} else {

record4[‘自動採番’][‘value’] = 1;

record4[‘受付No’][‘value’] = record4[‘会社区分_DD’][‘value’] + “-” + dt_yyyy + dt_mm2 + “-01”;

    }

 

    return event;

            });    

   });

})();

問題の切り分けとして、下記あたりで実行している「最新のデータ取得」が想定通り言っているか見たほうが良いと思います。

仮に、レコードになにか権限が設定されている場合、ユーザーによってこのとれるレコードがかわるので自動採番の値がかわってしまいそうですね

// 条件
"query": '登録時日付 >= "' + dtmin + '" and 登録時日付 < "' + dtmax + '" order by 自動採番 desc limit 1'
};     

            

// クエリの実行。設定された検索範囲で、最大の番号を取得する
return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', query).then(function(resp) {
var records = resp.records;

お返事ありがとうございます。
その通りでした。「新規保存したユーザーが閲覧できるレコード」内で最大値を取得している状態でした。

レコードの権限をつけているととこういう問題があるんですね。
他に書き方があるか、採番管理のアプリを別途作るか色々考えてみます。
ありがとうございました。

 

採番管理のアプリつくるのはやり方としては良いと思いますね。

あとは閲覧権限を付与したトークンをつかうとかでしょうか。。(それだとそのトークンを読み取られるとすべてのレコードみえちゃいますが、社内だから最悪みられてもよし、ということですすめるとか…)