カテゴリー内の他の記事

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

(著者:菊地 宏司)

 

はじめに

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

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

デモ環境

こちらのデモ環境から実際に動作を確認できます。
https://dev-demo.cybozu.com/k/167/

デモ環境の利用は、事前に cybozu developer network のメンバー登録が必要です。画面右上の「サインイン」ボタンよりご登録ください。
デモ環境アカウントとパスワードは、サインイン後にこちらのページでご確認ください。

フォームイメージ

 

採番フォーマット

日付が2014-04-20の場合

  • 14-00001,14-00002,14-00003

フィールドの設定

  • 自動採番フィールドは「値の重複を禁止する」にチェックを入れる
  • 日付フィールドは「必須項目にする」にチェックを入れる

ソースコード

ソースコードの解説

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

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

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

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

 

入力を制限する

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

  • 新規画面では自動採番フィールドを編集不可
  • 詳細の編集画面と一覧の編集画面では自動採番と日付のフィールドを編集不可

このTipsは、2016年8月版で確認したものになります。

記事に関するフィードバック

記事のコメント欄は記事に対するフィードバックをする場となっております。
右の記事フィードバックのためのガイドを参照してコメントしてください。
記事のリンク切れなど、気になる点がある場合も、こちらのフォームからフィードバックいただけますと幸いです。

Avatar
でん

おかげさまで素人の私でも実装できました。
欲が出てしまったのですが、最初の2桁を年ではなく、4月で1増える年度にしたい場合はどうすればよろしいでしょうか?
(2015-11→15-00001、2016-01→15-00002、2016-04→16-00001)

Avatar
にしかわ

でんさん
ちょうど、その方法を紹介しているブログがあるようです
https://www.joyzo.co.jp/blog/259

Avatar
でん

にしかわさん
ご紹介ありがとうございます。実は既にトライしてみたのですが、できなかった為、ここにコメントさせていただきました。
私が開発したわけではないので掲載はできませんが、年度表示はできるようになりました。

Avatar
いとう

自動採番フォーマットはフォームで何を選択すれば、自動採番可能となるのでしょうか。

日本語であるとスペースでエラーが発生してしまいます。

Avatar
でん

伊藤さん

フォームで何のフィールドを選択すればよいかという疑問と認識しました。

私は、自動採番を振りたいフィールドを文字列(1行)にしてでできました。

僭越ですが、少しでもご参考になれば幸いです。

Avatar
いとう

でんさん

 

文字列(1行)にし、行ったところ作成することが出来ました。

早々にコメントいただきありがとうございました。

Avatar
でん

伊藤さん

 

出来たそうで、良かったですね。

お役に立てて嬉しいです。

Avatar
まつ

ソースコードをコピペで登録したのですが、

17-00001 は自動採番で取得できましたが、次に新規で作成すると 17-00002 にはなりません。

17-00001になってしまいます。 

ご教授頂けましたら幸いです。

よろしくお願いします。 

 

Avatar
cybozu Development team

まつ 様

こんにちは。
cybozu developer network運営事務局です。

こちら、手元で確認したところ、問題なく動作しました。
設定した部分は以下になります。

【手順】
①アプリの作成
 -文字列1行フィールド(フィールドコード: 自動採番)
 -日付フィールド(フィールドコード: 日付)

②フィールドの設定
 -文字列1行フィールドは「値の重複を禁止する」にチェックをいれる
 -日付フィールトは「必須項目にする」にチェックをいれる

③記事の「ソースコード」の部分のコードをJS形式で保存

④アプリに適用して、レコードの新規追加(2回以上)

【完成イメージ】

 


設定に問題ないのに、正しい動きにならない場合はもう一度コメントいただければと思います。
お手数ですが、ご確認のほどよろしくお願いします。

Avatar
まつ

ありがとうございます。

動作いたしました。お手数お掛け致しました。

Avatar
すぎ

ソースコードの部分が何も見れないのですが、どのようにすれば見れますでしょうか。

Avatar
cybozu Development team

すぎ 様

こんにちは、cybozu developer network運営事務局です。

弊社環境ですと、ソースコード部分も閲覧できるのですが、

すぎ様が使用されているブラウザを教えていただけますでしょうか。

また、ソースコード部分がご覧いただけないのは、この記事のみでしょうか?

cybozu Development teamにより編集されました
Avatar
すぎ

お世話になっております。

私が使用しているブラウザは、Google Chromeになります。

IE11でも同様に見ることができません。

ほかの記事においても、「サンプルプログラム」となっている箇所等何も表示されません。

Avatar
cybozu Development team

すぎ 様

ご確認ありがとうございます。

Chrome,IEともにソースコード部分がご覧いただけないとなると、

すぎ 様がご使用のネットワークでGitHub(Gist)へのアクセスが禁止されている可能性があります。

GitHubへ直接アクセスできるか、ご確認いただけますでしょうか。

cybozu Development teamにより編集されました
Avatar
oga

自動採番フィールドで「値の重複を禁止する」にチェックを入れると
フォーム画面で「64文字以下」と表示されます。

この表示を削除することは可能でしょうか。

Avatar
cybozu Development team

oga 様

ご質問ありがとうございます。cybozu developer network運営事務局です。

DOM要素をいじったら可能は可能ですが、お勧めいたしません。
理由としては、各要素に付与されているid/class属性の値は、予告なく変更されることがあります。また、DOM構造についても変更されることがあります。

詳細は「kintone JavaScript コーディングガイドライン」の
「kintoneで使われているid/class属性について」をご参考ください。

cybozu Development teamにより編集されました
Avatar
テスターPPP

こちらのソースコードで自動採番できるようにしてみたのですが

自分のアクセス権のあるレコードでのみ番号を取得しているようで

アクセス権が無いレコードと同じ番号を採番してしまう可能性があるかと思います。

 

自分のアクセス権の無いレコードを含めて番号をカウントアップできるように出来ないでしょうか?

Avatar
cybozu Development team

テスターPPP 様

お世話になっております。cybozu developer network 運営事務局です。

レコードにアクセス権をつけ、採番する場合は自動採番プラグインの API トークン設定機能が利用できるかと思います。

また、こちらのコメント欄は記事内容のフィードバック目的となっております。
具体的な実装方法など、技術的なご質問はcybozu developer コミュニティをぜひご活用ください。
 
 
Avatar
Shinri

初心者です。

こちらのソースコードを導入してみました。

年度は、date関数からでなく、指定した数値フィールド(フィールドコード:対象年度)、

自動採番したあとの番号は、文字列結合せずに、数値フィールド(フィールドコード:管理NO)に

入れようと思っています。

最新の数値までは取得できているのですが、その番号に+1しようとすると、

// 対象レコードがあった場合

if (records.length > 0) {
var rec = records[0];
var autono = rec['管理NO'].value;
autono = autono + 1 ;
//autono = '000' + autono;
//autono = autono.substring(autono.length - 3);
event.record['管理NO'].value = autono;

最新番号=1 → +1した結果 =11

と文字列結合したようになってしまいます。

フィールドの属性を変更したり、Number()や, toString()などで置き換えるとエラーが出るので、

変数 autono と フィールドコード「管理NO」にはいずれも文字ではなく数値が入っていると思っています。

 

試しに、フィールドの属性を文字列(1行)にし、

// 対象レコードがあった場合
if (records.length > 0) {
var rec = records[0];
var autono = rec['管理NO'].value;
autono = autono + 1 ;
autono = '000' + autono;
autono = autono.substring(autono.length - 3);
event.record['管理NO'].value = autono;

としても、001 の次は、 011 が帰ってきます。

何を間違ってしまったのか教えていただければ幸いです。

Shinriにより編集されました
サインインしてコメントを残してください。