いつもお世話になっております。
このように、同じ会社に対する料金の差額を表示したいです。
今のところ、「アクション」を使えば、差額を表示できるようになっておりますが、「アクション」を使わず、なにかの方法で前年度との差額を出すことは可能でしょうか?(実際の運営するアプリには料金項目がいっぱいあるため、一つ一つ前年度の項目を設置するのはかなり無理があります)
理想としては、製品A昨年、製品B昨年、昨年合計の項目を持たずに差額を出したいですが、初心者のためどうすればよろしいかわからなくて悩んでおります。アドバイスいただければ幸いです。よろしくお願い致します。
玲香 さん、こんにちは。
昨年のデータをREST APIを使用して取得し、今年のデータと計算することで、フォームに昨年の項目が無くても実現できそうです。
処理の流れの例を以下に記載します。(画面にボタンを設置し、ボタンが押されたタイミングで計算してます)
- 画面にボタンを設置する
- ボタンが押されたタイミングで入力中の会社名と年度を取得する
- kintone REST API(レコードの取得)を使用し、クエリに会社名と年度を指定する
- 取得した一年前のデータと入力中のデータを計算して差額を入力する
上記を実現するためのサンプルコードを以下に載せますので、参考にしてみてください。
(function() {
'use strict';
// レコード作成時とレコード編集時のイベント
var recordEvent = ["app.record.create.show", "app.record.edit.show"];
// 製品の一覧
var itemList = ["製品A", "製品B"];
// 差額の一覧
var resultList = ["製品A差額", "製品B差額"];
// 差額を計算して返す
function calc(thisData, lastData) {
var result = "0";
// 各入力欄が空(undefined)だった場合は分岐
if (thisData !== undefined && lastData !== undefined) {
// 入力値は文字列のため、数値に変換して計算
result = Number(thisData) - Number(lastData);
} else if (thisData !== undefined && lastData === undefined) {
result = Number(thisData);
} else if (thisData === undefined && lastData !== undefined) {
result = Number(lastData) * -1;
}
return String(result);
}
// 差額を現在表示中のレコードにセット
function setRecord(lastRecord) {
var thisRecord = kintone.app.record.get();
// 製品の数だけループ
for (var i = 0; i < itemList.length; i++) {
var item = itemList[i];
var result = resultList[i];
// 今年の金額
var thisData = thisRecord['record'][item]['value'];
// 昨年の金額
var lastData = lastRecord[item]['value'];
thisRecord['record'][result]['value'] = calc(thisData, lastData);
}
kintone.app.record.set(thisRecord);
}
// 昨年のレコードを取得
function getRecord(body) {
kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body, function(resp) {
// 昨年のデータが1件の場合にのみ差額を計算する
if (resp.records.length === 1) {
window.console.log("差額をセットします");
setRecord(resp.records[0]);
} else {
window.console.log("昨年のデータが存在しないか、複数検出されました");
}
}, function(error) {
// エラー
window.console.log(error);
});
}
kintone.events.on(recordEvent, function(event) {
// 画面上にボタンを設置
var calcButton = document.createElement('button');
calcButton.id = 'calc_button';
calcButton.innerHTML = '差額計算';
calcButton.onclick = function() {
var record = kintone.app.record.get();
var name = record['record']['会社名']['value'];
var year = record['record']['年度']['value'];
// 会社名と年度が入力済みの場合のみ動作
if (name !== undefined && year !== undefined) {
var lastYear = Number(year) - 1;
var body = {
"app": kintone.app.getId(),
"query": "会社名 = \"" + name + "\" and 年度 in (\"" + String(lastYear) + "\")"
};
getRecord(body);
}
};
kintone.app.record.getHeaderMenuSpaceElement().appendChild(calcButton);
});
})();
本田智明 様
お世話になっております。ソースまで頂き、本当にありがとうございます。
初心者のため、ソースを
// 昨年のレコードを取得
function getRecord(body) {
kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body, function(resp) {
V1のところだけアプリ番号に差し替えて、他のところはそのままコピーして貼り付けてみたら、添付のようなエラーになっております。
ソースを貼り付けるに当たって、ボタンの配置は必要でしょうか?なにもボタン設置してないですが、画面上には表示されてます。
ほかになにか必要なものを追加しないといけないでしょうか?
お手数をおかけしますが、ぜひアドバイスいただけますようお願い致します。
玲香 さん、こんにちは。
kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body, function(resp) {
上記の記述は、kintone REST APIのレコードの取得(GET)を使用する際に、
一般的に記述する内容となっております。
そのため、上記部分を変更するとエラーになると思います。
内容(アプリ番号ってどこで指定するの?)等詳細については、以下のページで説明されています。
https://developer.cybozu.io/hc/ja/articles/202331474
ご自身で組む際にも大変参考になるページですので、ぜひ読んでみてください。
(サンプルコードでは、自身のアプリ番号を取得するテクニックを使っていますので、
それらしい記述をdeveloper networkで検索して探してみてください)
ボタンについては、サンプルコード内で作成して配置しているため、
配置したフィールドのフィールドコードが合っていれば動作すると思います。
製品と差額の項目を増やしたい場合は、サンプルコード上部の
// 製品の一覧
var itemList = ["製品A", "製品B"];
// 差額の一覧
var resultList = ["製品A差額", "製品B差額"];
上記部分に項目(フィールドコード)を追加してください。
ただし、あくまでサンプルコードのため、使い方によっては動かない場合があります。
本田智明 様
お世話になっております。
やりたい操作ができました。ほんとうにありがとうございました。
今後ともどうぞよろしくお願い致します。