自動採番を年度毎に初期化する

kintoneには文字列や数値、日付、ラジオボタンなど様々なフィールドタイプがありますが、自動採番をしてくれるフィールドタイプがありません。

見積書などで見積番号を発番する時は、常に新しい番号を自動的に発番できないと不便です。

cybozu.com developersサイトに自動採番するjavascriptカスタマイズのサンプルがありますので、これを使用する事で自動採番することができます。

ただ、このサンプルはレコード登録時に作成されるレコード番号の最大値を取得してそれに1を足す例になっていますので、例えば年度切替時に見積番号を0に戻したいといった時にはこのままでは活用できません。

年度毎に見積番号をクリアされて発番する

そこで、ここでは毎年1月になると見積番号を初期化(1から始める)するカスタマイズ例を紹介します。

仕様は以下のとおりです。

  • 見積番号の書式を「yy-xxxx」とする。(yyは西暦下2桁)
  • 年度切替を1月とする
  • 年度切替時に見積番号の枝番を0001から始める

見積フィールドが空のままで「保存」すると

こんな感じで見積番号が採番されます。

コードは以下のとおりです。

(function () {
  "use strict";
   
  function createNo(event) {
      var maxNum = 0;       //見積番号の枝番の最大値
      var date = new Date();
      var year = date.getYear().toString().substr(1,2); //西暦の下2桁を取得する
      var month = date.getMonth() + 1;
      var day = date.getDay();
      
      // アプリIDを取得する
      var appId = kintone.app.getId();
 
      //最新の見積番号を取得するためのURLを生成
      var sch = year + "-";
      var tmpNo = 0;
      var query_string = 'no like "' + sch + '" order by no desc limit 1&fields[0]=no'  //見積番号の最大値を取得するクエリ
      var apiUrl = kintone.api.url('/k/v1/records') + '?app=' + appId + '&query=' + encodeURI(query_string);
   
      var xmlHttp;
      xmlHttp = getXmlHttp();
 
      // 同期リクエストを行う
      xmlHttp.open("GET", apiUrl, false);
      xmlHttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
      xmlHttp.send(null);

      if (xmlHttp.status == 200){
        if(window.JSON){
          var obj = JSON.parse(xmlHttp.responseText);
          if (obj.records[0] != null){
            tmpNo = obj.records[0]['no'].value.split("-");	//見積番号を-で区切る(年度と見積番号を分ける)
            maxNum = parseInt(tmpNo[1]);	//最後の数字(枝番)を取得                     
          }else{
            maxNum = 0;  //データが存在しない = 新年度なので枝番を初期化
          }
          
          if (maxNum === null) {
            event.record['no'].error = '見積番号が取得できませんでした';
            return event;
          } else {
            var num = parseInt(maxNum) + 1; //最新の見積番号を発番
            event.record['no']['value'] = year + "-" + ('0000' + num).slice(-4); // 発番した見積番号を設定する
          }
        } else{
            event.record['no'].error = xmlHttp.statusText;
        }
      } else{
           event.record['no'].error = '見積番号取得に失敗しました。';
      }
      
      return event;
  }
  
  //xmlhttpオブジェクトを生成
  function getXmlHttp() {
    var xmlhttp = false;
  
    if(typeof ActiveXObject != "undefined"){  //IE
      try {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {
        xmlhttp = false;
      }
    }
  
    if(!xmlhttp && typeof XMLHttpRequest != "undefined") {    //IE以外
       xmlhttp = new XMLHttpRequest();
    }
  
    return xmlhttp;
  
  }   
  // 新規作成画面から保存時のイベント
  kintone.events.on('app.record.create.submit', createNo);
})();

基本的な部分はdevelopersサイトを同じで検索対象がレコード番号ではなく見積番号フィールドとしています。

さらに検索条件を「年度 + “-“」のLIKE検索にすることで当年度の見積番号のMax値を取得しています。

//最新の見積番号を取得するためのURLを生成
var sch = year + "-";
var tmpNo = 0;
var query_string = 'no like "' + sch + '" order by no desc limit 1&fields[0]=no'  //見積番号の最大値を取得するクエリ
var apiUrl = kintone.api.url('/k/v1/records') + '?app=' + appId + '&query=' + encodeURI(query_string);

もし検索結果が0の場合はその年度の見積番号が無いということで新年度扱いと判断し、枝番を初期化(0000)します。

var obj = JSON.parse(xmlHttp.responseText);
if (obj.records[0] != null){
  tmpNo = obj.records[0]['no'].value.split("-");	//見積番号を-で区切る(年度と見積番号を分ける)
  maxNum = parseInt(tmpNo[1]);	//最後の数字(枝番)を取得                     
}else{
  maxNum = 0;  //データが存在しない = 新年度なので枝番を初期化
}

あとは最大枝番(もしくは0000)に1を追加して新しい見積番号を発行し、見積フィールドに値をいれます。

var num = parseInt(maxNum) + 1; //最新の見積番号を発番
event.record['no']['value'] = year + "-" + ('0000' + num).slice(-4); // 発番した見積番号を設定する

ひとつだけ注意点があり、レコードを連続して登録をしていくと最新の見積番号の取得できずに最大値の一つ前の値を取得してしまう場合があります。

kintoneはレコード登録してから数十秒してから全文検索用(かな?)のインデックスが作られます。LIKE検索はこのインデックスを見ているのかレコードを新規作成した直後にその作成したレコードを検索しようとしてもひっかかりません。

そうすると1回めに新規作成したレコードの見積番号と続けて登録したレコードの見積番号がおなじになってしまいます。

なので、ここは見積番号フィールドの設定で「値の重複を禁止する」にチェックを入れて、重複登録を回避させます。

見積番号等の自動採番ルールなどは会社によって色々と異なると思いますが、上記のようにカスタマイズを入れることで自社にあった形式で採番することができるようになります。

同じカテゴリーの記事