今回はレコードの年次ごとの自動採番について紹介したいと思います。
顧客管理、物品管理など一意のIDを付けておきたい。しかも年ごとに番号を振りたいということがあります。
そんな時に役立つJavaScriptを使った採番方法です。
デモ環境で実際に動作を確認できます。
https://dev-demo.cybozu.com/k/167/
ログイン情報は
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;
});
|