差額計算について

いつもお世話になっております。

このように、同じ会社に対する料金の差額を表示したいです。

今のところ、「アクション」を使えば、差額を表示できるようになっておりますが、「アクション」を使わず、なにかの方法で前年度との差額を出すことは可能でしょうか?(実際の運営するアプリには料金項目がいっぱいあるため、一つ一つ前年度の項目を設置するのはかなり無理があります)

理想としては、製品A昨年、製品B昨年、昨年合計の項目を持たずに差額を出したいですが、初心者のためどうすればよろしいかわからなくて悩んでおります。アドバイスいただければ幸いです。よろしくお願い致します。

玲香 さん、こんにちは。

昨年のデータをREST APIを使用して取得し、今年のデータと計算することで、フォームに昨年の項目が無くても実現できそうです。

処理の流れの例を以下に記載します。(画面にボタンを設置し、ボタンが押されたタイミングで計算してます)

  1. 画面にボタンを設置する
  2. ボタンが押されたタイミングで入力中の会社名と年度を取得する
  3. kintone REST API(レコードの取得)を使用し、クエリに会社名と年度を指定する
  4. 取得した一年前のデータと入力中のデータを計算して差額を入力する

上記を実現するためのサンプルコードを以下に載せますので、参考にしてみてください。

(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差額"];

上記部分に項目(フィールドコード)を追加してください。

ただし、あくまでサンプルコードのため、使い方によっては動かない場合があります。

本田智明 様

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

やりたい操作ができました。ほんとうにありがとうございました。

今後ともどうぞよろしくお願い致します。