フィールドの条件による動的な自動採番

採番について、質問お願い致します。 部門(A.B.C)ドロップダウン 店舗(1.2)ルックアップ 上記の選択によって、例として

部門A、店舗1の選択をしたレコード1の場合「1-A1000」

部門B、店舗2の選択をしたレコード2の場合「2-B1000」

部門A、店舗2の選択をしたレコード3の場合「2-A1000」

部門A、店舗1の選択をしたレコード4の場合「1-A1001」

といった2つの条件別による連番で採番したいのですが(伝え方難しくて伝わらなかったらスミマセン)、方法ありますかね?

gsc-hnd-dadさん

こんにちは。下記はいかがでしょうか。

(function() {

 'use strict';

 // レコード追加画面保存時
 var events = ['app.record.create.submit'];
 kintone.events.on(events, function(event) {

  var record = event.record;

  var body = {
   'app': event.appId,
   'query': '部門 in ("' + record.部門.value + '") and 店舗 = "' + record.店舗.value + '" order by 識別数字 desc limit 1',
   'fields': ['識別番号', '識別数字']
  };

  return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body).then(function(resp) {

   if (resp.records.length == 0) {
    // 採番(1番目)
    record.識別数字.value = 1000;
    record.識別番号.value = record.店舗.value + '-' + record.部門.value + 1000;
   } else {
    // 採番(2番目以降)
    var myId = Number(resp.records[0].識別数字.value) + 1;
    record.識別数字.value = myId;
    record.識別番号.value = record.店舗.value + '-' + record.部門.value + myId;
   }

   return event;

  }).catch(function(error) {
   console.log(error);
  });

 });

})();

採番されるフィールドを「識別番号」(文字列1行)としています。

GET時に現在の最終番号を取得(order by 識別数字 desc limit 1)するため、別途、連番部分を数値で保持しておく必要があります。

ここでは、「識別数字」(数値)というフィールドを設けています。

※文字列の場合、仮に連番が10000に到達した際、文字コードで9999 > 10000となるため、10001が発番されません。

 

識別番号は、上記例のようにコード内で更新する他に、文字列1行フィールドの自動計算を使用しても良いと思います。

自動計算式 : 店舗 & “-” & 部門 & 識別数字

早速のご回答ありがとうございます。

動作確認致しました。

しかしながら、上記"店舗"ルックアップにて1番目の選択の時は"1000"の値がついたのですが、2番目選択肢の時"1"となってしまったのは何か考えれる要因ありますでしょうか。

gsc-hnd-dadさん

フィールドの種類は、下記のようになってますでしょうか。

部門:ドロップダウン

店舗:ルックアップ(参照元アプリでは数値)

識別番号:文字列1行

期別数字:数値

また、今回登録されたレコード以外に、同アプリ内にはレコードが無い(部門と店舗の組合せが同じレコードは無い)状態でしょうか。

部門:ドロップダウン(5項目)

店舗:ルックアップ(文字列)

識別番号:文字列1行

期別数字:数値

 

となっております。また、同アプリ内において、現状はテストレコード含め数レコード(複数組み合わせ)がある状態です。

gsc-hnd-dadさん

期別数字→識別数字の誤記でした。ただ、フィールドは問題ないようです。

アプリ設定内の「アプリの動作テスト」内でテスト実行しているということもないでしょうか。

また、差し支えないようでしたら、今回設定した部分のコードを貼り付けていただくこと可能でしょうか。

何かわかるかもしれません。

gsc-hnd-dadさん

もう1点補足です。

既存レコードの中で、識別数字が空欄のものがあると、識別数字が「1」になるかもしれません。

 

■既存レコード

部門:A、店舗:2、識別数字:空欄

 

■新規レコード

部門:A、店舗:1で登録 → 識別数字:1000 になる。

部門:A、店舗:2で登録 → 識別数字:1 になる。

 

クエリを下記のようにしても良いかもしれません。識別数字が空欄のものを除外できます。

'query':'識別数字 != "" and 部門 in ("'+ record.部門.value +'") and 店舗 = "'+ record.店舗.value +'" order by 識別数字 desc limit 1',