ドロップダウンの値によって、自動採番の値も変更したいと考えています。
例えば、ドロップダウンの値が1の時、①20220511(年月日)-1(ドロップダウンの値)-001(採番)
といった形です。ご教授いただけないでしょうか。
(function(){
'use strict';
kintone.events.on([
// レコード保存実行前イベント(「保存」をクリックした時)
'app.record.detail.show',
'app.record.create.show',
'app.record.edit.show',
], function(event){
// GETのパラメータ
const body = {
// 当月中の最新レコードから一つ前
'app':event.appId,
'query':'作成日時 = THIS_MONTH() order by 作成日時 desc limit 1',
};
// kintone.Promiseを使用した同期的処理
return kintone.api(kintone.api.url('/k/v1/records.json', true),'GET', body).then(function(resp){
const records = resp.records;
const rec = records[0];
var autono = '';
// 日付のフォーマット関数
function dateToStr(date) {
return date.getFullYear() +('0'+(date.getMonth()+1)).slice(-2);
}
// 当月のレコードが存在する場合の処理
if (records.length > 0){
autono = rec['自動採番'].value.substring(7);
autono = ('000'+(Number(autono)+1)).slice(-4);
autono = dateToStr(new Date())+'_'+autono;
}
// 当月のレコードが存在しない場合(月初のレコードの場合)の処理
else {
autono = dateToStr(new Date())+'_0001';
}
// autonoをフィールドに入れる
if (event.record.計量機No.value === 1) event.record.自動採番.value = autono;
return event;
});
});
}) ();
G.Qさん
こんにちは。
処理的にはほぼ出来上がっているように見えるのですが、ドロップダウンのvalueを間に挟めば良いと思います。
他のポイントでお困りでしょうか?
autono = dateToStr(new Date()) + '_' + autono;
↓以下に変更
autono = dateToStr(new Date()) + '_' + event.record.ドロップダウン.value + '_' + autono;
保存前イベントであれば ‘app.record.create.submit’ となります。
koichiさん
いつもありがとうございます!
上記のように直しましたが、ドロップダウンの「計量機No」を1にしても、「自動採番」欄に入力されません。
保存をクリックしたタイミングで入力されるようにしたいです。
(function(){
'use strict';
kintone.events.on([
// レコード保存実行前イベント(「保存」をクリックした時)
'app.record.create.submit',
'app.record.create.show',
'app.record.edit.show',
], function(event){
// GETのパラメータ
const body = {
// 当月中の最新レコードから一つ前
'app':event.appId,
'query':'作成日時 = THIS_MONTH() order by 作成日時 desc limit 1',
};
// kintone.Promiseを使用した同期的処理
return kintone.api(kintone.api.url('/k/v1/records.json', true),'GET', body).then(function(resp){
const records = resp.records;
const rec = records[0];
var autono = '';
// 日付のフォーマット関数
function dateToStr(date) {
return date.getFullYear() +('0'+(date.getMonth()+1)).slice(-2);
}
// 当月のレコードが存在する場合の処理
if (records.length > 0){
autono = rec['自動採番'].value.substring(7);
autono = ('000'+(Number(autono)+1)).slice(-4);
autono = dateToStr(new Date()) + '_' + event.record.計量機No.value + '_' + autono;
}
// 当月のレコードが存在しない場合(月初のレコードの場合)の処理
else {
autono = dateToStr(new Date())+'_0001';
}
// autonoをフィールドに入れる
if (event.record.計量機No.value === 1) event.record.自動採番.value = autono;
return event;
});
});
}) ();
ご確認ありがとうございます。
添付の画像では「計算機No」が選択されていませんが
実際の流れは、レコード新規登録時に「計算機No」を選択した上で保存する流れでしょうか。
(編集保存時 ‘app.record.edit.submit’ ではなく)
ご返信ありがとうございます。
実際の流れは「計量機No」を選択、保存し登録する流れになります。
現状では、上記手順で登録しても「自動採番」に入力されません。
if (event.record.計量機No.value === 1)
この記述が原因でした。
===ですので型まで判定しています。
左辺のドロップダウンの値は数字であっても文字列型です。
対して右辺は数値型です(クォーテーションが無いため)。
「==」に変えるか、「===」のまま両辺の型を合わせることで解決するかと思います。
ご確認ありがとうございます。
上記通りで、自動採番に入力されました。ありがとうございました。
ただ続けて登録すると0001→0002ではなく添付画像のようになってしまします。
また下記の実装じたいは可能でしょうか?
①年月だけではなく202205 16 _1_0001のように日付も加える。
②ドロップダウンの値を2や別の値を選択した場合に、「20220516_ 2 _0001」のようにそれぞれで採番を付けていく。
③日毎でリセットする
以上、申し訳ありませんが、ご教授をお願い致します。
これですと7文字目から取ることになるので
autono = rec['自動採番'].value.substring(7);
以下のように末尾から4文字取るようにすると良いです。
autono = rec['自動採番'].value.slice(-4);
①日付まで取るのであれば、フォーマット関数に日付を加えると良いです。
return date.getFullYear() + ('0' + (date.getMonth() + 1)).slice(-2) + ('0' + (date.getDate())).slice(-2);
②③はGETする際のqueryで制御すれば良いです。
・作成日時が今日(TODAY())
・計量機Noが現在選択されている値
'query': '作成日時 = TODAY() and 計量機No in ("' + event.record.計量機No.value + '") order by 作成日時 desc limit 1'
先ほど回答した最後の条件文も変えないといけないですね。
もしくは、必ず自動採番するなら条件なしでも良いかもしれません。
koichiさん
何から何までありがとうございます。
上記通りで実装できました。1点だけ初めの登録(0001)の場合に
ドロップダウンで選択した値が入りません。
// 当月のレコードが存在しない場合(月初のレコードの場合)の処理
else {
autono = dateToStr(new Date())+'_0001';
}
このelse部分の処理にドロップダウンの値を入れる処理が入っていないからかと思います。
可能か否かですと可能です。但し、処理はより複雑になります。
作業記録アプリは「①テーブルから行が削除される時」「②レコード自体が削除される時」が想定され、この2つに対応させる必要があります。
テーブルは、初回登録後は変更しないというケースであれば、②だけで完結します。
方法としては、採番番号をキーとして自動単重計算アプリをGETし、
そのGETしたレコードのレコード番号を使ってDELETEするというAPI処理になります。
ここから先は内容がタイトルと変わりますので、ご不明な点は新しくを投稿を立てていただけますと幸いです。