一括登録(アプリ自身)について

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

初期年度のデータを登録後、「一括登録」ボタンを押すことで、来年度のレコードの自動作成を試みております。今のところ、このコミュニティで色々と勉強させて頂いたお陰様で、来年度(年度+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;
});

// });

})();

利絵 さん

 

こんにちは!

更新にするか、登録時に一緒にデータを登録するかは運用次第なところがあるため、

何ともいえないところですが、レコード更新時にしかストック期間の計算が行われないのは、

レコード編集画面でのイベントで agecal 関数の処理が走るからです。

 

レコードの登録時にストック期間の計算した値を入れたいのであれば、

②一括登録のコードで以下のような処理を入れてあげるといいです。

 

var stock = ageCal(data['納品日'].value, data['基準日'].value);

var record = {
                   
                    '年度':{ 'value': nendo},
                    '基準日':{ 'value': day},
                    'ストック期間':{ 'value': stock},
                };

※ ① と ② でファイルを分けている場合、②のファイルで agecal 関数を定義するなり、

     agecal 関数が使用できる状態にする必要があります。

 

少しでも参考になれば嬉しいです!

文系男

お世話になっております。とても参考になりました!ありがとうございました。

ルックアップ先のデータが後になって変更になった場合、一括登録で作られたデータは変更されないので、もし一括登録後に更新となる運営をするであれば、かなり難しいコードになるのでしょうか?お手すきな際になにかアドバイス頂ければ幸いです。

 

利絵 さん

 

こんにちは!

仰るとおり、ルックアップフィールドは取得した値を保持し続けるので、

元のデータが変更された場合、再取得するなどの対応が必要となります。

 

元データが更新された場合に、REST API を利用して、一括更新することは可能です。

記述内容については、個人差はあると思いますが、特段、難しいことはないと思います。

 

以下のページが参考になると思います!

https://developer.cybozu.io/hc/ja/articles/204537310

文系男

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

貴重なアドバイスいただき、ありがとうございます。

試しにやってみます。本当にありがとうございました。