年次ごとの自動採番を行うワザ

著者名:菊地 宏司

目次

はじめに

今回はレコードの年次ごとの自動採番について紹介したいと思います。

顧客管理、物品管理など一意の ID を付けておきたい。しかも年ごとに番号を振りたいということがあります。
そんな時に役立つ JavaScript を使った採番方法です。

デモ環境

デモ環境で実際に動作を確認できます。
https://dev-demo.cybozu.com/k/167/ (External link)

ログイン情報は cybozu developer network デモ環境 で確認してください。

フォームイメージ

採番フォーマット

「日付」フィールドの西暦の末尾 2 桁を利用します。
たとえば「日付」フィールドの値が 2014 年 4 月 20 日の場合、「14-00001」「14-00002」「14-00003」のように採番します。

フィールドの設定

フィールドの種類 フィールド名 フィールドコード 備考
文字列(1行) 自動採番 自動採番 「値の重複を禁止する」にチェックを入れる
日付 日付 日付 「必須項目にする」にチェックを入れる
文字列(1行) タイトル タイトル
文字列(複数行) 詳細 詳細

ソースコード

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/*
 * Copyright (c) 2016 Cybozu
 * Licensed under the MIT License
 * https://opensource.org/license/mit/
 */

(() => {
  'use strict';

  const autoNum = (event) => {
    const record = event.record;

    // 日付を取得し、2桁の年を取得する
    const dt = record['日付'].value;
    const dtyy = dt.substring(0, 4);
    const dtmin = `${dtyy}-01-01`;
    const dtmax = `${(parseInt(dtyy, 10) + 1)}-01-01`;

    // クエリ文の設定
    const query = {
      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((resp) => {
      const records = resp.records;

      // 対象レコードがあった場合
      if (records.length > 0) {
        const rec = records[0];
        let autono = rec['自動採番'].value;
        autono = parseInt(autono.substring(3), 10) + 1;
        autono = `00000${autono}`;
        autono = `${dt.substring(2, 4)}-${autono.substring(autono.length - 5)}`;
        event.record['自動採番'].value = autono;

        // 対象レコードがなかった場合
      } else {
        event.record['自動採番'].value = `${dt.substring(2, 4)}-00001`;
      }
      return event;
    }).catch((e) => {
      alert(`レコードの取得でエラーが発生しました  - error: ${e.message}`);
      return false;
    });
  };

  // 新規作成画面の保存
  kintone.events.on('app.record.create.submit', autoNum);

  // 新規作成画面表示
  kintone.events.on('app.record.create.show', (event) => {
    const record = event.record;
    // フィールドを非活性にする
    record['自動採番'].disabled = true;
    return event;
  });

  // 編集画面表示
  kintone.events.on(['app.record.edit.show', 'app.record.index.edit.show'], (event) => {
    const record = event.record;
    // フィールドを非活性にする
    record['自動採番'].disabled = true;
    record['日付'].disabled = true;
    return event;
  });

})();

ソースコードの解説

まず、クエリを使って対象年の一番新しいレコードを取得します。
クエリ文は次のようになります。

1
日付 >= "2014-01-01" and 日付 < "2015-01-01" order by 自動採番 desc limit 1

上記のクエリ文は、「日付が 2014-01-01~2014-12-31 のレコードを、自動採番で降順(新しい ID 順)に並び替えした後の、1 個目のレコード」という条件になります。
これで対象年の一番新しい自動採番のレコードが取得できました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
      // 対象レコードがあった場合
      if (records.length > 0) {
        const rec = records[0];
        let autono = rec['自動採番'].value;
        autono = parseInt(autono.substring(3), 10) + 1;
        autono = `00000${autono}`;
        autono = `${dt.substring(2, 4)}-${autono.substring(autono.length - 5)}`;
        event.record['自動採番'].value = autono;

        // 対象レコードがなかった場合
      } else {
        event.record['自動採番'].value = `${dt.substring(2, 4)}-00001`;
      }

こちらでは取得したレコードから採番処理を行います。
レコードがあった場合は取得したレコードの番号+1 の番号をレコードがない場合は 00001 の番号を設定します。

入力を制限する

自動採番するのは新規レコード保存のみとしたいので、他の画面で編集できないようにします。
これは、以下のようにフィールドを disabled とすることで実現できます。

  • 新規画面では自動採番フィールドを編集不可
  • 詳細の編集画面と一覧の編集画面では自動採番と日付のフィールドを編集不可
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
  // 新規作成画面表示
  kintone.events.on('app.record.create.show', (event) => {
    const record = event.record;
    // フィールドを非活性にする
    record['自動採番'].disabled = true;
    return event;
  });

  // 編集画面表示
  kintone.events.on(['app.record.edit.show', 'app.record.index.edit.show'], (event) => {
    const record = event.record;
    // フィールドを非活性にする
    record['自動採番'].disabled = true;
    record['日付'].disabled = true;
    return event;
  });
information

この Tips は、2022 年 10 月版 kintone で動作を確認しています。