お世話になっております。
初期年度のデータを登録後、「一括登録」ボタンを押すことで、来年度のレコードの自動作成を試みております。今のところ、このコミュニティで色々と勉強させて頂いたお陰様で、来年度(年度+1年、基準日+1年)のレコードは自動作成できております。
⇊ただ、例えば「ストック期間」についてですが、その出来上がったレコードを再度編集を押さないと自動計算ができなくて・・
このような場合「一括登録」後に「一括更新」にするという考えになるでしょうか?それとも「一括登録」の際に、ストック期間を求めるコードも加えるでしょうか?
コードは以下のようになっております。まだまだ初心者で、知識が浅くて詰まっております。どうかご指導いただけたら幸いです。
どうぞよろしくお願い致します。
①ストック期間計算コード
(function() {
"use strict";
kintone.events.on([
"app.record.edit.change.納品日","app.record.create.change.納品日","app.record.index.edit.change.納品日",
"app.record.edit.change.基準日","app.record.create.change.基準日","app.record.index.edit.change.基準日",
"app.record.create.show","app.record.edit.show","app.record.index.edit.show","app.record.detail.show",
"app.record.create.submit", "app.record.edit.submit","app.record.index.edit.submit",
], function(event) {
var record = event.record;
moment.locale("ja");
if (["app.record.create.show","app.record.edit.show","app.record.index.edit.show"].indexOf(event.type) >= 0) {
// フィールド制御
record["ストック期間"]["disabled"] = true;
//基準日=今日
//record["基準日"].value = moment().format("YYYY-MM-DD");
}
record["ストック期間"].value = ageCal(record["納品日"].value,record["基準日"].value);
return event;
});
// ストック期間計算
function ageCal(wkDate, wkReferenceDate) {
if (wkDate && wkReferenceDate) {
var mDate = moment(wkDate);
var mReferenceDate = moment(wkReferenceDate);
if (!mReferenceDate.isBefore(moment(mDate), "day")) {
var years = mReferenceDate.diff(moment(mDate), "years");
var months = mReferenceDate.diff(moment(mDate), "months") % 12;
return years + "年 " + months + "ヶ月";
}
}
return "";
}
})();
②一括登録コード
(function() {
'use strict';
var event = [
'app.record.index.show'
];
kintone.events.on(event, function(event) {
var records = event.records;
// ヘッダースペース要素の取得
var headerSpace = kintone.app.getHeaderMenuSpaceElement();
// ボタン要素の作成
var button = document.createElement('input');
button.value = '一括登録';
button.type = 'button';
// ボタンがクリックされた時の処理
var submit = function() {
// PUTするRecordsを用意する。
var put_records = [];
// レコード一覧のイベントで取得したレコードそれぞれに対して登録の処理を行う
records.forEach(function(data) {
var nendo = parseInt(data['年度'].value ,10) + 1;
var day = moment(data['基準日'].value)
.add(1, 'year')
.format('YYYY-MM-DD');
var record = {
'年度':{ 'value': nendo},
'基準日':{ 'value': day},
};
// レコードそれぞれに対して決定するフィールドを定義
record['商品'] = data['商品'];
record['単価'] = data['単価'];
record['納品日'] = data['納品日'];
console.log(data)
put_records.push(record);
});
var param = {
'app': kintone.app.getId(),
'records': put_records
};
kintone.api(kintone.api.url('/k/v1/records', true), 'POST', param, function(resp) {
// success
alert('来年度へ登録成功しました。');
console.log(resp);
}, function(error) {
// error
console.log(error);
});
};
// ボタンをヘッダースペースに追加
headerSpace.appendChild(button);
// ボタンのクリックイベントに処理を登録
button.onclick = submit;
});
// });
})();
4件のコメント
利絵 さん
こんにちは!
更新にするか、登録時に一緒にデータを登録するかは運用次第なところがあるため、
何ともいえないところですが、レコード更新時にしかストック期間の計算が行われないのは、
レコード編集画面でのイベントで agecal 関数の処理が走るからです。
レコードの登録時にストック期間の計算した値を入れたいのであれば、
②一括登録のコードで以下のような処理を入れてあげるといいです。
※ ① と ② でファイルを分けている場合、②のファイルで agecal 関数を定義するなり、
agecal 関数が使用できる状態にする必要があります。
少しでも参考になれば嬉しいです!
文系男様
お世話になっております。とても参考になりました!ありがとうございました。
ルックアップ先のデータが後になって変更になった場合、一括登録で作られたデータは変更されないので、もし一括登録後に更新となる運営をするであれば、かなり難しいコードになるのでしょうか?お手すきな際になにかアドバイス頂ければ幸いです。
利絵 さん
こんにちは!
仰るとおり、ルックアップフィールドは取得した値を保持し続けるので、
元のデータが変更された場合、再取得するなどの対応が必要となります。
元データが更新された場合に、REST API を利用して、一括更新することは可能です。
記述内容については、個人差はあると思いますが、特段、難しいことはないと思います。
以下のページが参考になると思います!
https://developer.cybozu.io/hc/ja/articles/204537310
文系男様
お世話になっております。
貴重なアドバイスいただき、ありがとうございます。
試しにやってみます。本当にありがとうございました。