ifをつかってできるでしょうか?

数値の合計をAと
別の数値の合計Bがあるとします。

AからBを引いた答えが0以上なら、Cに0を表示。
0未満(マイナス)なら、Cのその答えを表示させたいのですがうまくいきません。

どのように書けばいいでしょうか?

足助 聖一様
cstapの落合です。

希望のプログラムは、以下のようなJSでよかったでしょうか?

(function() {
“use strict”;

kintone.events.on(["app.record.edit.submit", "app.record.create.submit"], function(event) {
    var record = event.record;
    var a = record.numberA.value;
    var b = record.numberB.value;

    if (a > b) {
        record.numberC.value = 0;
    } else {
        record.numberC.value = a - b;
    }

    return event;
});

})();

落合様

ご回答ありがとうございます。
上記の説明を再度詳しくさせて頂きます。

フィールドコードが下記の3つあります。
goukei_A
goukei_B
goukei_C

AとBには数値が自動計算で入っており、Cは空白です。
ゴールはgoukei_Cに数値を自動で出すことです。

goukei_Cには、
goukei_A から goukei_Bを引いて、
0以上なら0を出し、
0未満(マイナス)なら、そのまま解を出したいです。

どのように書けばよいでしょうか?
よろしくお願い致します。

足助

足助 聖一様
以下のプログラムでどうでしょうか?

合計Cは数値フィールドとして、JavaScriptで計算結果を入れています。
数値フィールドはデフォルトで編集可能なフィールドなため、編集負荷にする処理も追加しておきました。

/**
* 計算フィールド:goukei_A
* 計算フィールド:goukei_B
* 数値フィールド:goukei_C
*/
(function() {
“use strict”;

// 登録、編集画面表示時の処理
kintone.events.on(["app.record.edit.show", "app.record.create.show"], function(event) {
    // 合計Cを編集不可にする
    event.record.goukei_C.disabled = true;
    return event;
});

// 登録時、編集時のsubmit前処理
kintone.events.on(["app.record.edit.submit", "app.record.create.submit"], function(event) {
    var record = event.record;
    // 合計a,bの値を数値にキャスト
    var a = parseFloat(record.goukei_A.value);
    var b = parseFloat(record.goukei_B.value);

    // a,bの大きさを調べ、0以上の時は合計Cに0を入れる
    if (a > b) {
        record.goukei_C.value = 0;
    } else {
        record.goukei_C.value = a - b;
    }

    return event;
});

})();

落合様

ご回答ありがとうございます。
思っていた通りのものができました。

本当にありがとうございます!

足助

落合様

もう一つ教えてください。
同じ作業をA,B,CをD,E,Fに変えて2ヶ所以上で行いたいのですが、
D,E,Fに変えて作ったプログラムを上げてみたのですが、
動いているようですが保存ができません。

この場合どのように書けばいいでしょうか?
よろしくお願い致します。

足助

足助 聖一様
cstapの落合です。

原因は、プログラムに問題があるか、合計Fを計算フィールドで作成しているかのどちらかかと思います。

以下の3種類のフィールドは編集できないのでご注意ください。
・計算
・ルックアップコピー先フィールド
・添付ファイル
参考:https://developers.cybozu.com/ja/kintone-api/apprec-createjsapi.html#i-4

私の方で動作を確認したプログラムを置いておきます。
単純に処理を追加しただけですが、以下のプログラムでどうでしょうか?

/**
* 計算フィールド:goukei_A
* 計算フィールド:goukei_B
* 数値フィールド:goukei_C
* 計算フィールド:goukei_D
* 計算フィールド:goukei_E
* 数値フィールド:goukei_F
*/
(function() {
“use strict”;

// 登録、編集画面表示時の処理
kintone.events.on(["app.record.edit.show", "app.record.create.show"], function(event) {
    // 合計C,Fを編集不可にする
    event.record.goukei_C.disabled = true;
    event.record.goukei_F.disabled = true;
    return event;
});

// 登録時、編集時のsubmit前処理
kintone.events.on(["app.record.edit.submit", "app.record.create.submit"], function(event) {
    var record = event.record;
    // 合計a,bの値を数値にキャスト
    var a = parseFloat(record.goukei_A.value);
    var b = parseFloat(record.goukei_B.value);

    // a,bの大きさを調べ、0以上の時は合計Cに0を入れる
    if (a > b) {
        record.goukei_C.value = 0;
    } else {
        record.goukei_C.value = a - b;
    }

    var d = parseFloat(record.goukei_D.value);
    var e = parseFloat(record.goukei_E.value);

    // d,eの大きさを調べ、0以上の時は合計Cに0を入れる
    if (d > e) {
        record.goukei_F.value = 0;
    } else {
        record.goukei_F.value = d - e;
    }

    return event;
});

})();

落合様

ご回答ありがとうございます。
無事に治りました!
ありがとうございます。

足助 聖一様
解決したようで良かったです。
また何かありましたら、お気軽にご質問ください!

落合様

何度もすいません!
また追加で少し教えてください。

先日お伺いしたプログラムで、
goukei_Bとgoukei_Dは
テーブルの中身を合計した数値になります。
このgoukei_Bとgoukei_Dは計算用に作成した為、
削除したいと考えていますが、その際どう書けばよいでしょうか?

また、上記に加え新しく別の数値を加えて下記の計算を
させたいと考えています。
お手数ですがご教示願えますでしょうか。

A,B,Cに対してX、
D,E,Fに対してYの数値を与えた時に、

Bそれぞれが、Xより小さい場合は、
Bのマイナスの数値をCに表示

Eそれぞれが、Yより小さい場合は、
Eのマイナスの数値をFに表示

Bそれぞれが、Xより多きい場合(同じも含む)は、
Xのマイナスの数値をCに表示
その時、X と B と Cの合計がAより多き
XとBの合計からAを引いたものをCに表示

Eそれぞれが、Yより多きい場合(同じも含む)は、
Yのマイナスの数値をFに表示
その時、Y と E と Fの合計がDより多き
YとEの合計からDを引いたものをFに表示

以上になります。

どういった計算をさせたいかをエクセルのまとめてみました。
みてみて頂けますでしょうか。

http://firestorage.jp/download/0d8c995f0158dc1158b05b3a861b4f5c40f3816c

足助 聖一様

このgoukei_Bとgoukei_Dは計算用に作成した為、
削除したいと考えていますが、その際どう書けばよいでしょうか?
途中計算用であれば、フィールドは作らずにJS内で計算してしまえば良いかと思います。

テーブル内のデータ(num1フィールドの場合)を合計するにはイベント内で以下のように記述します。
var record = event.record;
var table = record.Table.value; // Tableは任意のテーブルコード

// 合計Bを計算
    var b = 0;
    for (var i = 0, l = table.length; i < l; i++) {
        var row = table[i].value;
        b = b + parseFloat(row.num1.value);
    }

Excel拝見しました。
いくつか確認させてください。

入力データ(説明:フィールドコード)
・月額固定費:goukei_X
・契約単価(テーブル):契約単価_jk
・売上(テーブル):売上_jk
・調整額:調整額_ 契約単価_jk

途中計算用
・合計A:goukei_A
・合計B:goukei_B
・合計C:goukei_C

最終結果
・総合計-成果金額:?

同様のものをgoukeiD,E,F,Yなどでも行う

という認識で良かったでしょうか?

落合様

ご確認ありがとうございます。

入力データ(説明:フィールドコード)
・月額固定費:goukei_X
・契約単価(テーブル):契約単価_jk
・売上(テーブル):売上_jk
・調整額:調整額_ 契約単価_jk

途中計算用
・合計A:goukei_A
・合計B:goukei_B ※こちらはjs内で計算させて削除したいです。

最終結果
・合計C:goukei_C
月額固定(goukei_X)と成果報酬のテーブル(売上_jk)と
ご契約の総合計(goukei_A)の兼ね合いで成果金額の調整額(goukei_C)を出したいです。

同様のものをgoukeiD,E,F,Yなどでも行う
→その通りです!

こちらでわかりますでしょうか?
ご確認よろしくお願い致します。

足助

足助 聖一様
cstapの落合です。

フィールドコードはこちらで使いやすいものに変更したので、テンプレートを参考にしていただきたいと思います。
http://firestorage.jp/download/ec477a9a2863ad867f3b20fb9126737440cc830c

テンプレートについては、以下のヘルプに記載されています。
https://help.cybozu.com/ja/k/admin/template.html

JavaScriptは、こんな感じです。
参考になりますでしょうか?

/**
* フィールドは全て数値フィールド
*
* 1
* 月額固定費1:fixed_price1
* 調整額1(Table1):adjust_unit_price1
* 契約単価1(Table1):unit_price1
* 売上1:sales1
* 契約単価の合計1:total_price1
* 成果金額の調整額1:total_adjust_price1
*
* 2
* 月額固定費2:fixed_price2
* 調整額2(Table2):adjust_unit_price2
* 契約単価2(Table2):unit_price2
* 売上2:sales2
* 契約単価の合計2:total_price2
* 成果金額の調整額2:total_adjust_price2
*/
(function() {
“use strict”;

/**
 * 成果金額の調整額を算出
 */
var calTotalAdustPrice = function (fixed, sumUnit, total) {
    var tmp = - fixed;
    if (sumUnit <= fixed) {
        tmp = - sumUnit;
    }

    var total_adjust = tmp;
    if (total < fixed + sumUnit + tmp) {
        total_adjust = total - (fixed + sumUnit);
    }

    return total_adjust;
};

/**
 * メインの計算処理
 */
var myCalculate = function (record, n) {
    // 月額固定費
    var fixed = parseFloat(record['fixed_price' + n].value);
    // 調整額
    var adjust = parseFloat(record['adjust_unit_price' + n].value);
    // テーブル
    var table = record['Table' + n].value;

    // 契約単価の合計を計算
    var sumUnit = 0;
    for (var i = 0, l = table.length; i < l; i++) {
        var row = table[i].value;
        sumUnit = sumUnit + parseFloat(row['unit_price' + n].value);
    }

    // 契約単価の合計を計算
    var total = fixed + adjust + sumUnit;
    record['total_price' + n].value = total;

    // 成果金額の調整額を計算
    record['total_adjust_price' + n].value = calTotalAdustPrice(fixed, sumUnit, total);
};

// 登録、編集画面表示時の処理
kintone.events.on(["app.record.edit.show", "app.record.create.show"], function(event) {
    // 計算する数値フィールドを編集不可にする
    event.record.total_price1.disabled = true;
    event.record.total_price2.disabled = true;
    event.record.total_adjust_price1.disabled = true;
    event.record.total_adjust_price2.disabled = true;

    return event;
});

// 登録、編集時の処理
kintone.events.on(["app.record.edit.submit", "app.record.create.submit"], function(event) {
    var record = event.record;

    // 1と2で同じ計算処理を行う
    myCalculate(record, 1);
    myCalculate(record, 2);

    return event;
});

})();

落合様

ご回答ありがとうございます。

お伝えする際に間違っていることがございました。

同様のものをgoukeiD,E,F,Yなどでも行う
→その通りです!

と書きましたが、こちらは月額固定はいらないので、
それまでに書いて頂いたものままでOKでした。
失礼しました。

あと、頂いたjsのコメントの欄で修正がございます。

  • 1
  • 月額固定費1:fixed_price1
  • 調整額1(Table1):adjust_unit_price1
  • 契約単価1(Table1):unit_price1
  • 売上1:sales1
  • 契約単価の合計1:total_price1
  • 成果金額の調整額1:total_adjust_price1

3行目の「調整額1」はテーブルではなく、
5行目の「売上1」がテーブルでございます。

こちらで再度お願い出来ますでしょうか?
お手数ですがよろしくお願い致します。

足助

足助 聖一様
cstapの落合です。

これまで多くのサンプルや情報をご提供できたかと思います。
しかし、私の説明不足やサンプルの不備などで、まだ解決できない技術的な課題があるのかと思います。
技術的にわからない点はどういった点になりますでしょうか?

落合様

何度もすいません。

D,E,Fの方はお教え頂いた内容を組み合わせて、
できるようになりました。


/**
* 計算フィールド:goukei_仕入単価合計_jk
* 計算フィールド:goukei_E
* 数値フィールド:goukei_ 原価_jk
*/

(function() {
“use strict”;

// 登録、編集画面表示時の処理
kintone.events.on([“app.record.edit.show”, “app.record.create.show”], function(event) {
// 合計Fを編集不可にする
event.record.goukei_原価_jk.disabled = true;
return event;
});

// 登録時、編集時のsubmit前処理
kintone.events.on([“app.record.edit.submit”, “app.record.create.submit”], function(event) {
var record = event.record;

//Table内を合計する
var table = record.Table.value;

var f = 0;
for (var i = 0, l = table.length; i < l; i++) {
var row = table[i].value;
f = f + parseFloat(row.原価_jk.value);
}

// 合計d,eの値を数値にキャスト
var d = parseFloat(record.goukei_仕入単価合計_jk.value);
//var e = parseFloat(record.goukei_E.value);

// d,eの大きさを調べ、0以上の時は合計goukei_原価_jkに0を入れる
if (d > f) {
    record.goukei_原価_jk.value = 0;
} else {
    record.goukei_原価_jk.value = d - f;
}

return event;

});
})();


A,B,Cの方を自分なりに修正してみたのですが、
動きません。

もう一度だけ見て頂けますでしょうか。

流れとしましては、

1)
「fixed_price」 と 「unit_priceのテーブル合計」を比べて

「fixed_price」<=「unit_priceのテーブル合計」の場合はマイナスの「fixed_price」を、

「fixed_price」>「unit_priceのテーブル合計」の場合はマイナスの「unit_priceのテーブル合計」を

仮に調整額1とします。

2)
「total_price」 と 「fixed_price + unit_priceのテーブル合計 + 調整額1」を比べて、

「total_price」<「fixed_price + unit_priceのテーブル合計 + 調整額1」の場合は、
「total_price」-「fixed_price + unit_priceのテーブル合計」を、

「total_price」>=「fixed_price + unit_priceのテーブル合計 + 調整額1」の場合は、調整額1をそのまま

total_adjust_priceに表示させたい。

以上の内容で下記のjsの確認頂けますでしょうか。
よろしくお願い致します。

/**
* フィールドは全て数値フィールド
*
* 月額固定費:fixed_price
* 契約単価(Table):unit_price
* 調整額:adjust_unit_price
* 売上(Table):sales
* 契約単価の合計:total_price
* 成果金額の調整額:total_adjust_price
*

(function() {
“use strict”;

/**
* 成果金額の調整額を算出
*/
var calTotalAdustPrice = function (fixed, sumUnit, total) {
var tmp = - fixed;
if (sumUnit <= fixed) {
tmp = - sumUnit;
}

var total_adjust = tmp;
if (total < fixed + sumUnit + tmp) {
    total_adjust = total - (fixed + sumUnit);
}

return total_adjust;

};

/**
* メインの計算処理
*/
var myCalculate = function (record) {
// 月額固定費
var fixed = parseFloat(record.fixed_price.value);
// 調整額
var adjust = parseFloat(record.adjust_unit_price.value);
// テーブル
var table = record.Table.value;

// 契約単価の合計を計算
var sumUnit = 0;
for (var i = 0, l = table.length; i < l; i++) {
    var row = table[i].value;
    sumUnit = sumUnit + parseFloat(row.unit_price.value);
}

// 契約の総合計を計算
var total = fixed + adjust + sumUnit;
record.total_price.value = total;

// 成果金額の調整額を計算
record.total_adjust_price.value = calTotalAdustPrice(fixed, sumUnit, total);

};

// 登録、編集画面表示時の処理
kintone.events.on([“app.record.edit.show”, “app.record.create.show”], function(event) {
// 計算する数値フィールドを編集不可にする
event.record.total_price.disabled = true;
event.record.total_adjust_price.disabled = true;

return event;

});

// 登録、編集時の処理
kintone.events.on([“app.record.edit.submit”, “app.record.create.submit”], function(event) {
var record = event.record;

// 1で計算処理を行う
myCalculate(record);

return event;

});
})();

足助 聖一 様

以下の部分に問題があります。
/**
* フィールドは全て数値フィールド
*
* 月額固定費:fixed_price
* 契約単価(Table):unit_price
* 調整額:adjust_unit_price
* 売上(Table):sales
* 契約単価の合計:total_price
* 成果金額の調整額:total_adjust_price
*

(function() {
“use strict”;

/**
* 成果金額の調整額を算出
*/


/**
* フィールドは全て数値フィールド
*
* 月額固定費:fixed_price
* 契約単価(Table):unit_price
* 調整額:adjust_unit_price
* 売上(Table):sales
* 契約単価の合計:total_price
* 成果金額の調整額:total_adjust_price
*/

(function() {
“use strict”;

/**
 * 成果金額の調整額を算出
 */

にしてみてください。
コメントアウトが正しくできていないだけで、記述されているプログラムとしては正しく動作するのではないかと思います。

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。