顧客ごとの自動採番

著者名:佐藤 紅志(サイボウズ)

目次

年次ごとの自動採番については、 年次ごとの自動採番を行うワザでも紹介されていますが、今回はこれを案件毎に採番する方法を解説します。
利用するアプリは2つです。

具体的には、アプリストアの「 営業支援(SFA)パック (External link) 」を利用します。
案件情報を登録する時の「案件名」に、任意のフィールド情報とともに、ルックアップで取得された「顧客ごとの連番」を文字列連結したうえで、デフォルト表示するというものです。

このアプリパックを kintoneアプリストア (External link) から追加してください。

デモ環境

デモ環境で実際に動作を確認できます。

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

フォームイメージ

案件情報アプリのフォームのイメージは次のとおりです。

採番フォーマット

採番フォーマットは、[顧客名]-[連番5桁]-[案件種類]です。

フィールドの設定

顧客情報アプリ

顧客ごとの連番を管理する必要があるので、顧客情報アプリに採番管理用のフィールドを以下の内容で追加します。
普段必要なフィールドではないので、グループで隠しておくのもよいかと思います。

追加するフィールド フィールド名 初期値 フィールドコード
数値 案件連番 0 案件連番

次に、上記案件連番を更新するため、顧客情報のアプリIDが必要になります。
このID検索をするためのアプリコードを設定します。
設定は、アプリの設定 > 詳細設定 > 高度な設定より行います。

案件情報アプリ

案件情報アプリにも、上記の顧客情報アプリ同様の数値フィールドを追加します。
また、のちほど顧客情報アプリの更新時に必要なレコード番号を取得するため、以下のフィールドを追加します。

追加するフィールド フィールド名 初期値 フィールドコード
数値 案件連番 0 案件連番
数値 顧客情報レコード番号 - 顧客情報レコード番号

上記2フィールドを追加した後、顧客名ルックアップフィールドの設定、[ほかのフィールドのコピー]にて、[案件連番]および[顧客情報レコード番号]の値を取得するように設定します。

次に[案件名]に付与する任意のフィールドとして、以下を追加します。
ルックアップフィールドの値を変更したときにはイベントが発生しないため、追加するフィールドの値の変更イベントで案件名を設定します。

追加するフィールド フィールド名 項目と順番 フィールドコード
ドロップダウン 案件種類 新規,追加,変更 案件種類

案件連番の取得と編集を行うソースコード

まず、レコード追加・編集画面で"案件種類"を変更した際に、「案件名」に採番を行うサンプルです。
sample.jsという名前で保存し、「案件情報」アプリに適用しましょう。

 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
/*
 * sample program
 * Copyright (c) 2014 Cybozu
 *
 * Licensed under the MIT License
 * https://opensource.org/license/mit/
 */

(() => {
  'use strict';

  // 案件種類フィールドの更新イベントを登録します
  const change_events = [
    'app.record.create.change.案件種類',
    'app.record.edit.change.案件種類'
  ];

  kintone.events.on(change_events, (event) => {
    const record = event.record;
    const matterName =
            record['顧客名'].value +
            '-' +
            ('00000' + record['案件連番'].value).slice(-5) +
            '-' +
            record['案件種類'].value;
    // 「案件名」フィールドに連番を設定します
    record['案件名'].value = matterName;
    return event;
  });

})();

連番を更新するソースコード

以下は、レコードを追加した際に連番を更新するコードです。
sample.jsの30行目に追加します。

 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
// Register the events.
const submit_events = [
  'app.record.create.submit'
];

kintone.events.on(submit_events, (event) => {

  const app_code = 'AppIdClient001'; // 顧客情報アプリのアプリコード

  kintone.api(kintone.api.url('/k/v1/apps.json', true), 'GET', {codes: [app_code]
  }, (resp) => {
    const app_id = resp.apps[0].appId;
    const record = event.record;
    const rec_id = record['顧客情報レコード番号'].value;
    const seq = parseInt(record['案件連番'].value, 10) + 1;

    // 案件連番更新リクエスト
    kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT',
      {
        app: app_id,
        id: rec_id,
        revision: -1,
        record: {
          案件連番: {value: seq}
        }
      }, (resp2) => {
        let errmsg = 'An error occurred while updating records.';
        if (resp2.message !== undefined) {
          errmsg += '\n' + resp2.message;
          alert(errmsg);
        }
      }
    );
  }, (resp) => {
    let errmsg = 'An error occurred while getting records.';
    if (resp.message !== undefined) {
      errmsg += '\n' + resp.message;
      alert(errmsg);
    }
  });
});

ソースコードの解説

顧客ごとの連番は、ルックアップフィールドの設定内容にある取得先の情報を使用します。

連番を更新するレコードの特定には、ルックアップで取得した顧客情報レコードIDを使用します。

アプリIDの取得には、 複数のアプリの情報を取得するを利用しました。
アプリ名や複数のアプリコードを利用して、アプリIDの一括取得が可能です。
ここでは設定したアプリコードから、アプリIDを取得しています。

注意事項など

顧客情報の案件連番更新に関する一連の処理は、案件登録時のapp.record.create.submitイベントを元に、別のアプリのフィールドを更新します。
しかし、顧客情報が更新中の場合や、削除されている場合、連番は更新されません。
また、サンプルコード内のchange_events変数に指定されていないフィールドの値を変更した場合は、手作業の修正による対応が必要となります。

以上のように、顧客ごとの連番整合性は限定的ですのでご注意ください。

information

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