kintone

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

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

kintone(キントーン)の標準機能でできないところをJavaScriptやCSSを使って実現しています。

今回はレコード保存後に請求書番号などの番号を自動採番する方法です。JavaScriptサンプルコードをご紹介します。

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

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

ピンキー
ピンキー
JavaScriptで自動採番ができるんだね
モンキー
モンキー
自動採番のタイミングがポイントだよ

フィールド定義

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

kintoneで請求書番号を自動採番
フィールド名 フィールドタイプ フィールドコード
部署 ドロップダウン section
請求書番号 文字列(1行) bill_no
連番(非表示) 数値フィールド(初期値:0) serial_number

最初のレコードの採番

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

編集時、部署を選択

kintoneで請求書番号を自動採番

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

kintoneで請求書番号を自動採番

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

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

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

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

JavaScript サンプルコード

変数宣言「var」は必要に応じて「let」「const」に変更してください。
必要な部分のみ参考にされてくださいね。コメント多すぎですが・・・

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

(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の管理などいろいろな機能で応用できると思います。
kintoneで請求書番号を自動採番

サンプルコード補足説明

上記のJavaScriptサンプルコードの中でいくつかポイントになる部分を説明します。

数値フィールドの取得

54行目
連番(数値フィールド)を取得している部分。「parseInt」を使います。

var valSerialNumber = parseInt(record['serial_number']['value']);  // 連番

ドロップダウンフィールドを検索条件に書く方法

75行目
ドロップダウンは配列で格納されていますので「XXX in ‘YYY’」を使います。今回の部署の取得は「section in ‘営業部’」のようになります。

valQuery += 'section in ("' + valSection + '") ';   // 部署

kintone.Promiseを使ったレコードの読込み

79行目
連番の最大値を取得するため、同じアプリを読む処理。131行目で定義している「fetchRecords」の呼出し部分です。

return fetchRecords(valAppId, valQuery)

数字の桁数を合わせるゼロパディング

90行目
請求書番号の数字部分を3桁に揃えるための処理です。148行目「comPadZero」の呼出し部分です。

valBillNo = valSectionChar + comPadZero(valSerialNumber, 3);

この記事は、2021.6.10時点の情報です。