見出し画像

【kintone】レコード保存後の自動採番|JavaScriptサンプルコード

kintone(キントーン)の標準機能でできないところをJavaScriptやCSSを使って実現しています。 今回はレコード保存後に請求書番号などの番号を自動採番する方法です。JavaScriptサンプルコードをご紹介します。

■ kintoneでも自動採番できるのか

JavaScriptで書けば、見積書や請求書を発行して見積書番号や請求書番号を自動採番することができます。ポイントはどのタイミングで採番処理をするかですね。

■ フィールド定義

部署ごとに請求書番号を採番するので、部署・請求書番号・番号カウント用の連番を設定します。連番は非表示とし初期値を「0」とします。

画像2

画像1

■ 最初のレコードの採番

部署「営業部」を選択して保存ボタンを押します。部署が営業部なら「S001」、開発部なら「E001」となるように採番します。

編集時、部署を選択

画像3

保存ボタンクリック後、自動採番される

画像4

2件目以降は、SQLで部署ごとの連番の最大値を1件取得します。それにプラス1した値を連番にセットします。

■ 自動採番のタイミングは、保存成功後の処理

kintoneでは保存ボタンクリック後「保存実行前(保存ボタンクリック時)」と「保存成功後」の2つのイベントが発生します。今回の自動採番では、レコード自分自身の「請求書番号」と「連番」を更新しに行くので「保存成功後」の処理に記述します。

なので、保存ボタンで項目全体が更新された後、JavaScriptでまた更新という2段階の更新になります。

■ JavaScript サンプルコード

必要な部分のみ参考にされてくださいね。コメント多すぎですが・・・

/* レコード保存後の自動採番 */

(function() {
"use strict";

/*
* 登録画面・編集画面・一覧画面/保存ボタンクリック時
*/
function editSubmit(event) {

 // ここには書かない
 return event;
}

/*
* 登録画面・編集画面・一覧画面/保存成功後
*/
function editSubmitSuccess(event) {

 // レコード取得
 var record = event.record;

 // 請求書番号 採番処理
 return getBillNo(record);

 return event;
}

/* ------------------------------------------------------------------ */

// 登録画面・編集画面・一覧画面/保存ボタンクリック時
kintone.events.on(['app.record.create.submit',
                  'app.record.edit.submit',
                  'app.record.index.edit.submit'], editSubmit);

// 登録画面・編集画面・一覧画面/保存成功後
kintone.events.on(['app.record.create.submit.success',
                  'app.record.edit.submit.success',
                  'app.record.index.edit.submit.success'], editSubmitSuccess);

})();


/*
* 請求書番号 採番処理
*/
function getBillNo(record) {
 var i;
 var valAppId = '167';                  // アプリID
 var valQuery = '';                    // クエリ文字列
 var valMessage  ='';                  // 終了メッセージ
 var valRecordId;                      // レコードID

 var valSerialNumber = parseInt(record['serial_number']['value']);  // 連番
 var valSerialNumberMax = 0;                          // 連番(MAX)
 var valSection;                                      // 部署
 var valSectionChar;                                  // 部署(英字):営業部(S)・開発部(E)
 var valBillNo;                                       // 請求書番号

 valRecordId = record['$id']['value'];                // レコードID

 // 部署:営業部(S)・開発部(E) 設定
 valSection = record['section']['value'];
 if (valSection == '営業部') {
   valSectionChar = 'S';
 } else if (valSection == '開発部') {
   valSectionChar = 'E';
 }

 // 連番「0」かつ部署に入力がある時
 if ((valSerialNumber == 0) &&
     (valSection)) {

   // レコード読込み(kintone.Promise):当アプリ
   valQuery += 'section in ("' + valSection + '") ';   // 部署
   valQuery += 'order by ';
   valQuery += 'serial_number desc ';                  // 連番:降順
 
   return fetchRecords(valAppId, valQuery)
   .then(function(records) {
     for (i = 0; i < records.length; i += 1) {
       // 同じ部署の連番(最大1件)を取得
       valSerialNumberMax = parseInt(records[i]['serial_number']['value']);    // 連番(MAX)
       valSerialNumber = valSerialNumberMax;
       break;
     }  // for end

     // 請求書番号 設定
     valSerialNumber = valSerialNumber + 1;    // 連番+1
     valBillNo = valSectionChar + comPadZero(valSerialNumber, 3);

     // レコード更新(kintone.Promise):当アプリ
     var objParam = {
         'app' : valAppId,
         'id'  : valRecordId,
         'record': {
         'bill_no'        : {'value': valBillNo},
         'serial_number'  : {'value': valSerialNumber}
         }
     };

     return kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', objParam).then(function(resp) {
       return event;

     }).catch(function(resp) {
       console.log('アプリ更新エラー');
       console.log('メッセージ:' + error.message);
       valMessage = 'アプリの更新に失敗しました。管理者に連絡してください。';
       alert(valMessage);
       return event;
     });
   })
 
   .catch(function(error) {
     console.log('アプリ読込みエラー');
     console.log('検索条件:' + valQuery);
     console.log('メッセージ:' + error.message);
     valMessage = 'アプリの読込みに失敗しました。管理者に連絡してください。';
     alert(valMessage);
     return event
   });
 }

 return event
}


/*
* 全レコード 読込み(kintone.Promise)
*/
function fetchRecords(app_id, query, opt_offset, opt_limit, opt_records) {
 var offset = opt_offset || 0;
 var limit = opt_limit || 500;
 var allRecords = opt_records || [];
 var params = {app: app_id, query: query + ' limit ' + limit + ' offset ' + offset};
 return kintone.api('/k/v1/records', 'GET', params).then(function(resp) {
   allRecords = allRecords.concat(resp.records);
   if (resp.records.length === limit) {
       return fetchRecords(app_id, query, offset + limit, limit, allRecords);
   }
   return allRecords;
 });
}

/*
* ゼロパディング
*/
function comPadZero(value, length){
 return new Array(length - ('' + value).length + 1).join('0') + value;
}

■ 請求書番号 自動採番後

請求書番号の数字部分はゼロパディングで3桁に揃えます。IDの管理などいろいろな機能で応用できると思います。

画像5


この記事が気に入ったらサポートをしてみませんか?