(著者:菊地 宏司)
今回はレコードの年次ごとの自動採番について紹介したいと思います。
顧客管理、物品管理など一意のIDを付けておきたい。しかも年ごとに番号を振りたいって事ありますよね。
そんな時に役立つJavaScriptを使った採番方法になります。
フォームイメージ
採番フォーマット
日付が2014-04-20の場合
- 14-00001,14-00002,14-00003
フィールドの設定
- 自動採番フィールドは「値の重複を禁止する」にチェックを入れる
- 日付フィールドは「必須項目にする」にチェックを入れる
ソースコード
/* | |
* Copyright (c) 2016 Cybozu | |
* Licensed under the MIT License | |
*/ | |
(function() { | |
"use strict"; | |
function autoNum(event) { | |
var record = event.record; | |
// 日付を取得し、2桁の年を取得する | |
var dt = record['日付'].value; | |
var dtyy = dt.substring(0, 4); | |
var dtmin = dtyy + '-01-01'; | |
var dtmax = (parseInt(dtyy, 10) + 1) + '-01-01'; | |
// クエリ文の設定 | |
var 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(function(resp) { | |
var records = resp.records; | |
// 対象レコードがあった場合 | |
if (records.length > 0) { | |
var rec = records[0]; | |
var 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(function(e) { | |
alert("レコードの取得でエラーが発生しました - error: " + e.message); | |
return false; | |
}); | |
} | |
//新規作成画面の保存 | |
kintone.events.on('app.record.create.submit', autoNum); | |
// 新規作成画面表示 | |
kintone.events.on('app.record.create.show', function(event) { | |
var record = event.record; | |
//フィールドを非活性にする | |
record['自動採番'].disabled = true; | |
return event; | |
}); | |
// 編集画面表示 | |
kintone.events.on(['app.record.edit.show', 'app.record.index.edit.show'], function(event) { | |
var record = event.record; | |
//フィールドを非活性にする | |
record['自動採番'].disabled = true; | |
record['日付'].disabled = true; | |
return event; | |
}); | |
})(); |
Copyクリップボードにコピーしました
ソースコードの解説
まず、クエリを使って対象年の一番新しいレコードを取得します。
クエリ文は次のようになります。
日付 >= "2014-01-01" and 日付 < "2015-01-01" order by 自動採番 desc limit 1
Copyクリップボードにコピーしました
上記のクエリ文は、「日付が2014-01-01~2014-12-31のレコードを、自動採番で降順(新しいID順)に並び替えした後の、1個目のレコード」という条件になります。
これで対象年の一番新しい自動採番のレコードが取得できました。
// 対象レコードがあった場合 | |
if (records.length > 0) { | |
var rec = records[0]; | |
var 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'; | |
} |
Copyクリップボードにコピーしました
こちらでは取得したレコードから採番処理を行います。
レコードがあった場合は取得したレコードの番号+1の番号を
レコードがない場合は00001の番号を設定します。
入力を制限する
自動採番するのは新規レコード保存のみとしたいので、他の画面で編集できないようにします。
これは、以下のようにフィールドをdisabledとする事で実現できます。
- 新規画面では自動採番フィールドを編集不可
- 詳細の編集画面と一覧の編集画面では自動採番と日付のフィールドを編集不可
// 新規作成画面表示 | |
kintone.events.on('app.record.create.show', function(event) { | |
var record = event.record; | |
//フィールドを非活性にする | |
record['自動採番'].disabled = true; | |
return event; | |
}); | |
// 編集画面表示 | |
kintone.events.on(['app.record.edit.show', 'app.record.index.edit.show'], function(event) { | |
var record = event.record; | |
//フィールドを非活性にする | |
record['自動採番'].disabled = true; | |
record['日付'].disabled = true; | |
return event; | |
}); |
Copyクリップボードにコピーしました
このTipsは、2016年8月版で確認したものになります。
デモ環境
https://dev-demo.cybozu.com/k/167/
※デモ環境についての説明はこちら
おかげさまで素人の私でも実装できました。
欲が出てしまったのですが、最初の2桁を年ではなく、4月で1増える年度にしたい場合はどうすればよろしいでしょうか?
(2015-11→15-00001、2016-01→15-00002、2016-04→16-00001)
でんさん
ちょうど、その方法を紹介しているブログがあるようです
https://www.joyzo.co.jp/blog/259
にしかわさん
ご紹介ありがとうございます。実は既にトライしてみたのですが、できなかった為、ここにコメントさせていただきました。
私が開発したわけではないので掲載はできませんが、年度表示はできるようになりました。
自動採番フォーマットはフォームで何を選択すれば、自動採番可能となるのでしょうか。
日本語であるとスペースでエラーが発生してしまいます。
伊藤さん
フォームで何のフィールドを選択すればよいかという疑問と認識しました。
私は、自動採番を振りたいフィールドを文字列(1行)にしてでできました。
僭越ですが、少しでもご参考になれば幸いです。
でんさん
文字列(1行)にし、行ったところ作成することが出来ました。
早々にコメントいただきありがとうございました。
伊藤さん
出来たそうで、良かったですね。
お役に立てて嬉しいです。
ソースコードをコピペで登録したのですが、
17-00001 は自動採番で取得できましたが、次に新規で作成すると 17-00002 にはなりません。
17-00001になってしまいます。
ご教授頂けましたら幸いです。
よろしくお願いします。
まつ 様
こんにちは。
cybozu developer network運営事務局です。
こちら、手元で確認したところ、問題なく動作しました。
設定した部分は以下になります。
【手順】
①アプリの作成
-文字列1行フィールド(フィールドコード: 自動採番)
-日付フィールド(フィールドコード: 日付)
②フィールドの設定
-文字列1行フィールドは「値の重複を禁止する」にチェックをいれる
-日付フィールトは「必須項目にする」にチェックをいれる
③記事の「ソースコード」の部分のコードをJS形式で保存
④アプリに適用して、レコードの新規追加(2回以上)
【完成イメージ】

設定に問題ないのに、正しい動きにならない場合はもう一度コメントいただければと思います。
お手数ですが、ご確認のほどよろしくお願いします。
ありがとうございます。
動作いたしました。お手数お掛け致しました。
ソースコードの部分が何も見れないのですが、どのようにすれば見れますでしょうか。
すぎ 様
こんにちは、cybozu developer network運営事務局です。
弊社環境ですと、ソースコード部分も閲覧できるのですが、
すぎ様が使用されているブラウザを教えていただけますでしょうか。
また、ソースコード部分がご覧いただけないのは、この記事のみでしょうか?
お世話になっております。
私が使用しているブラウザは、Google Chromeになります。
IE11でも同様に見ることができません。
ほかの記事においても、「サンプルプログラム」となっている箇所等何も表示されません。
すぎ 様
ご確認ありがとうございます。
Chrome,IEともにソースコード部分がご覧いただけないとなると、
すぎ 様がご使用のネットワークでGitHub(Gist)へのアクセスが禁止されている可能性があります。
GitHubへ直接アクセスできるか、ご確認いただけますでしょうか。
自動採番フィールドで「値の重複を禁止する」にチェックを入れると
フォーム画面で「64文字以下」と表示されます。
この表示を削除することは可能でしょうか。