自動採番について質問させていただきます。
例えば、G65YU001, G65YU002のような自動採番をしたいと思いますが、javascriptプログラムで可能でしょうか。
それぞれ、G=社員の部門、65=期、Y=月に紐付いており、U=固定です。
もし、可能であれば、サンプルコードなど提供していただけると助かります。
以上、よろしくお願いいたします。
自動採番について質問させていただきます。
例えば、G65YU001, G65YU002のような自動採番をしたいと思いますが、javascriptプログラムで可能でしょうか。
それぞれ、G=社員の部門、65=期、Y=月に紐付いており、U=固定です。
もし、可能であれば、サンプルコードなど提供していただけると助かります。
以上、よろしくお願いいたします。
甲斐 美幸さん
自動採番については、次のようなサンプルやTipsがありますね。
最もシンプルな1つ目をちょっと書き換えて、次のような感じでいかがでしょうか?
※フィールドコードを「部門」、「期」、「月」とするフィールドを足します。「期」と「月」は2桁想定で、他に元のサンプルにあった「No」のフィールドも必要です。
(function () {
"use strict";
var recNo = 1;
// レコード追加画面の保存前処理
kintone.events.on('app.record.create.submit', function (event) {
// 保存前の画面上のレコード
var record = event.record;
// アプリIDを取得する
var appId = kintone.app.getId();
// URLを設定する
var appUrl = kintone.api.url('/k/v1/records') + '?app='+ appId + '&query=' + encodeURI('order by レコード番号 desc limit 1&fields[0]=レコード番号');
var xmlHttp;
xmlHttp = new XMLHttpRequest();
// 同期リクエストを行う
xmlHttp.open("GET", appUrl, false);
xmlHttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
xmlHttp.send(null);
if (xmlHttp.status == 200){
if(window.JSON){
var obj = JSON.parse(xmlHttp.responseText);
if (obj.records[0] != null){
try{
recNo = parseInt(obj.records[0]['レコード番号'].value) +1;
} catch(e){
event.error = '番号が取得できません。';
}
}
//自動採番を見積番号に設定する
var autoEstNo = record['部門']['value'] + ('00'+record['期']['value']).slice(-2) + ('00'+record['月']['value']).slice(-2) + "U" + ('000' + recNo).slice(-3);
alert("番号 " + autoEstNo + " を登録します");
event.record['No']['value'] = autoEstNo;
} else{
event.error = xmlHttp.statusText;
}
} else{
record['No'].error = '番号が取得できません。';
}
return event;
});
})();
さっそく、ご回答いただきどうもありがとうございます。
ちょっと高度ですが、チャレンジしてみますっ!
甲斐 美幸さん
ちょっとずつ積み上げていくと良いのではないかと思います。
ご不明な点がありましたら、またお尋ねください!
本件に関しましてご回答いただきどうもありがとうございます。
なんとなく、自動採番のプログラムについてわかりました。
そこで、再度、質問させてください。
より具体的になりますが、目指している業務アプリにより近づく構成にしたいと思いまして、以下のような自動採番はできますでしょうか。
(あらかじめ、名前、部門は別アプリで登録済みとします。)
甲斐 美幸さん
(あらかじめ、名前、部門は別アプリで登録済みとします。)
- 自動採番のアプリで、名前を入力し、上記別アプリから該当する名前を選択する。
この名前を選択する部分ですが、(自動採番のアプリに)名前をキーにしたルックアップフィールを設け、別アプリから同機能で部門等採番に必要な値をコピーしてしまってはいかがでしょうか?ルックアップ完了後に
var autoEstNo = record['部門']['value'] + ('00'+record['期']['value']).slice(-2) + ('00'+record['月']['value']).slice(-2) + "U" + ('000' + recNo).slice(-3);
の行でコピーしてきたフィールド(record[‘部門’][‘value’]等)を使って番号を作るというのは割と簡単に実現できる方法になるかと思います。
Ryu Yamashitaさん
さっそくご回答ありがとうございます。
なるほど、その手がありましたか。
なんかできそうな気がするので、チャレンジしてみます。
おかげさまで、以下のプログラムで、G65M001, G65M002のように自動採番されるアプリをつくることができました。どうもありがとうございました。
ただ、まだ道半ばなので、恐縮ですが再度質問させてください。
以下のプログラムで、上記番号の"M"は、月なのですが、カレンダを取得する関数で、1-9月まではよいのですが、条件で、10=X, 11=Y, 12=Zを加えるにはどうすればよいでしょうか。
以上、よろしくお願いいたします。
(function () {
"use strict";
var recNo = 1;
// 本日をYYYYMMにする
var dateToday = function () {
var date = new Date();
var year = date.getFullYear() - 1949;
var month = date.getMonth() +1;
return year.toString() + month
};
// レコード追加画面の保存前処理
kintone.events.on('app.record.create.submit', function (event) {
// 保存前の画面上のレコード
var record = event.record;
// アプリIDを取得する
var appId = kintone.app.getId();
// URLを設定する
var appUrl = kintone.api.url('/k/v1/records') + '?app='+ appId + '&query=' + encodeURI('order by レコード番号 desc limit 1&fields[0]=レコード番号');
var xmlHttp;
xmlHttp = new XMLHttpRequest();
// 同期リクエストを行う
xmlHttp.open("GET", appUrl, false);
xmlHttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
xmlHttp.send(null);
if (xmlHttp.status == 200){
if(window.JSON){
var obj = JSON.parse(xmlHttp.responseText);
if (obj.records[0] != null){
try{
recNo = parseInt(obj.records[0]['レコード番号'].value) +1;
} catch(e){
event.error = '番号が取得できません。';
}
}
//自動採番を見積番号に設定する
var autoEstNo = record['部門No']['value'] + dateToday() +
('000' + recNo).slice(-3);
alert("番号 " + autoEstNo + " を登録します");
event.record['No']['value'] = autoEstNo;
} else{
event.error = xmlHttp.statusText;
}
} else{
record['No'].error = '番号が取得できません。';
}
return event;
});
})();
甲斐 美幸さん
X、Y、Zの意味が理解出来ていませんでしたが、dateTodayの部分だけ変更して、次のような感じでご所望の採番になるのではないでしょうか?
(function () {
"use strict";
var recNo = 1;
// 本日をYYYYMMにする
var dateToday = function () {
var date = new Date();
var year = date.getFullYear() - 1949;
var month = date.getMonth() +1;
console.log(month);
switch (month) {
case 10:
month = "X";
break;
case 11:
month = "Y";
break;
case 12:
month = "Z";
break;
}
return (year.toString() + month );
};
// レコード追加画面の保存前処理
kintone.events.on('app.record.create.submit', function (event) {
// 保存前の画面上のレコード
var record = event.record;
// アプリIDを取得する
var appId = kintone.app.getId();
// URLを設定する
var appUrl = kintone.api.url('/k/v1/records') + '?app='+ appId + '&query=' + encodeURI('order by レコード番号 desc limit 1&fields[0]=レコード番号');
var xmlHttp;
xmlHttp = new XMLHttpRequest();
// 同期リクエストを行う
xmlHttp.open("GET", appUrl, false);
xmlHttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
xmlHttp.send(null);
if (xmlHttp.status == 200){
if(window.JSON){
var obj = JSON.parse(xmlHttp.responseText);
if (obj.records[0] != null){
try{
recNo = parseInt(obj.records[0]['レコード番号'].value) +1;
} catch(e){
event.error = '番号が取得できません。';
}
}
//自動採番を見積番号に設定する
var autoEstNo = record['部門No']['value'] + dateToday() +
('000' + recNo).slice(-3);
alert("番号 " + autoEstNo + " を登録します");
event.record['No']['value'] = autoEstNo;
} else{
event.error = xmlHttp.statusText;
}
} else{
record['No'].error = '番号が取得できません。';
}
return event;
});
})();
Ryu Yamashitaさん
大変助かります。わたしのやりたいことがほぼできるようになりました。
どうもありがとうございます。
いまのところ、9割くらいの完成形です。
最後にひとつだけ、質問させていただいてよろしいでしょうか。
採番のG65Z001の"65"は、期を示していますが、弊社の期は4月から始まるため、来年の1-3月までは、"65"とし、次の4-3月を"66"となるような採番がしたいのです。
そのような条件を追加することは可能でしょうか。
以上、何度もすみませんが、よろしくお願いいたします。
前回に続きベタですが、こんな感じでいかがでしょうか?
var dateToday = function () {
var date = new Date();
var year = date.getFullYear() - 1949;
var month = date.getMonth() +1;
if(month>=1 && month<=3){ // 4月年度始めに対応
year = year-1;
}
switch (month) {
case 10:
month = "X";
break;
case 11:
month = "Y";
break;
case 12:
month = "Z";
break;
}
return (year.toString() + month );
};
Ryu Yamashitaさん
やった!!とうとう完成いたしました。
当初、できると思わなかったけど、粘り強く対応していただいたおかげでいっぱしのアプリができたことを感謝いたします。
今後、ますます、アプリの作成が楽しくなりそうです。
これからも、これに懲りずに対応していただきますようよろしくお願いいたします。
甲斐 美幸さん
サンプルでも思った動きに近づいていくと、嬉しくなってきますよね。
私も勉強中の身ですが、この「cybozu.com developer network」内であれば、「Tips」や「サンプル」、そしてこの「コミュニティ」がありますし、高度な内容が含まれます(その分情報豊富)が一般的には「http://stackoverflow.com/(日本語版)」等ありますので、色々参考にしてみてください!
すみません。もうひとつお聞きしたいことがあります。
このプログラムは、モバイル対応(android, iPhone)できますでしょうか。
もし、できるのであれば、どこをカスタマイズしてよいかご教授ください。
モバイルでも出来ると思います。こちらを参考にされてみてください。
Ryu Yamashitaさん
とうとう私の理解を超える分野にまで足を突っ込んでしまいました。。。
もし、よろしければ、時間があるときでいいので、以下のプログラムにモバイル対応
できるプログラムに書き換えていただきたいのですが。。。
(function () {
“use strict”;
var recNo = 1;
// 本日をYYYYMMにする
var dateToday = function () {
var date = new Date();
var year = date.getFullYear() - 1949;
var month = date.getMonth() +1;
if(month>=1 && month<=3){ // 4月年度始めに対応
year = year-1;
}
console.log(month);
switch (month) {
case 10:
month = “X”;
break;
case 11:
month = “Y”;
break;
case 12:
month = “Z”;
break;
}
return (year.toString() + month );
};
// レコード追加画面の保存前処理
kintone.events.on(‘app.record.create.submit’, function (event) {
// 保存前の画面上のレコード
var record = event.record;
// アプリIDを取得する
var appId = kintone.app.getId();
// URLを設定する
var appUrl = kintone.api.url('/k/v1/records') + '?app='+ appId + '&query=' + encodeURI('order by レコード番号 desc limit 1&fields[0]=レコード番号');
var xmlHttp;
xmlHttp = new XMLHttpRequest();
// 同期リクエストを行う
xmlHttp.open("GET", appUrl, false);
xmlHttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
xmlHttp.send(null);
if (xmlHttp.status == 200){
if(window.JSON){
var obj = JSON.parse(xmlHttp.responseText);
if (obj.records[0] != null){
try{
recNo = parseInt(obj.records[0]['レコード番号'].value) +1;
} catch(e){
event.error = '番号が取得できません。';
}
}
//自動採番を見積番号に設定する
var autoEstNo = record['部門No']['value'] + dateToday() + record['UTILITY']['value'] +
('000' + recNo).slice(-3);
alert("評価依頼No. " + autoEstNo + " を登録します");
event.record['No']['value'] = autoEstNo;
} else{
event.error = xmlHttp.statusText;
}
} else{
record['No'].error = '番号が取得できません。';
}
return event;
});
})();
こちらは、kintoneのドミュメントではなかなか分からない使い方や、サンプルやTipsに関する質問等を行う場だと思われます。
その過程で、サンプル等の軽微な修正や元々持ち合わせたサンプルを提供させていただくことは出来ると思いますが、正味のコードの作成や書き換えにはお応えするのはちょっと難しいと思います(^^;
Ryu Yamashitaさん
趣旨を間違えていたようで申し訳ありません。
自分なりにプログラムを解析して自力でできるようトライしてみます。