顧客ごとの自動採番

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

目次

はじめに

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

アプリは、アプリストアの「 営業支援パック (External link) 」を利用するので、追加しておいてください。
追加方法は次のページを参考してください。
サンプルアプリを追加する (External link)

動作イメージ

案件情報を登録する時の「案件名」の初期値には、次のフィールドの値を連結した値が設定されます。

  • 顧客名
  • 案件連番
  • 案件種類

「案件種類」フィールドの値を変更すると、「案件種類」の値に合わせて「案件名」の値が変わります。

また、顧客管理アプリの「案件連番」フィールドに、顧客ごとの最新の案件連番を記録します。
そのため、案件情報レコードを保存するタイミングで、顧客管理アプリの「案件連番」フィールドを更新します。

デモ環境

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

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

アプリの設定

顧客管理アプリ

顧客ごとの最新の案件連番を管理するためのフィールドを追加します。
普段必要なフィールドではないので、グループで隠しておくのもよいかと思います。

フィールドタイプ フィールド名 フィールドコード 説明
数値 案件連番 案件連番 初期値を0に設定します。

案件管理アプリ

案件管理アプリにも、次のフィールドを追加します。

フィールドタイプ フィールド名 フィールドコード 説明
数値 案件連番 案件連番 案件ごとの最新の連番を特定するために使います。
数値 顧客情報レコード番号 顧客情報レコード番号 顧客管理アプリを更新する際に、レコードを特定するために使います。
ドロップダウン 案件種類 案件種類 項目を次のように設定します。
  • 新規
  • 追加
  • 変更

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

サンプルコード

サンプルソースコードは次のとおりです。
エディタにコピーして、38行目の顧客管理アプリのアプリIDをご自身の環境に合わせて書き換えてください。
ファイル名を「sample.js」、文字コードを「UTF-8」で保存し、案件管理アプリに適用してください。

 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
/*
 * 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;
  });

  // 最新の案件番号で顧客管理アプリの「案件番号」フィールドを更新します
  const submit_events = [
    'app.record.create.submit'
  ];

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

    const app_id = '1'; // 顧客管理アプリのアプリID
    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}
        }
      }, (resp) => {
        let errmsg = 'An error occurred while updating records.';
        if (resp.message !== undefined) {
          errmsg += '\n' + resp.message;
          alert(errmsg);
        }
      }
    );
    return event;
  });
})();

サンプルコードの解説

フィールドの値を取得・編集する

レコード追加・編集画面で「案件種類」を変更した際に、次のフィールドの値を取得して結合し、「案件名」にセットします。

  • 顧客名
  • 案件連番
  • 案件種類

案件ごとの最新の連番を特定するために、ルックアップで取得した顧客管理アプリの「案件連番」の値を使用します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
// 案件種類フィールドの更新イベントを登録します
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;
});

連番を更新する

レコードを保存する際に、「案件連番」フィールドの値をインクリメントしてから、その結果を使って、顧客管理アプリの「案件連番」フィールドの値を更新します。
連番を更新するレコードの特定には、ルックアップで取得した顧客情報レコードIDを使用します。

 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
// 最新の案件番号で顧客管理アプリの「案件番号」フィールドを更新します
const submit_events = [
  'app.record.create.submit'
];

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

  const app_id = '1'; // 顧客管理アプリのアプリID
  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}
      }
    }, (resp) => {
      let errmsg = 'An error occurred while updating records.';
      if (resp.message !== undefined) {
        errmsg += '\n' + resp.message;
        alert(errmsg);
      }
    }
  );
  return event;
});

注意事項など

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

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

information

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