計算結果のフィールドを触れるようにすることはできますか。

通常計算結果のフィールドは、グレーアウトになり触れないようになっていますが、そこを通常のフィールドと同じように、触れるようにすることはできるのでしょうか。

というのは、発注書のアプリを作成しています。

たとえば1ケース10個入りのものを3ケース発注する場合は、

数量のフィールドに3、個数の欄に10を入力して、発注数の欄には、数量×個数の計算式で発注数が表示されるようになっています。

ただ、ケースではなく、バラ数で発注したいものもあるので、1ケース未満の数の場合は発注数のところに手入力で数字を入力したいのです。

このようなことは可能なのでしょうか。ド素人なので的外れな質問をしていたらすいません。

伊東 純 さん

LOOKUPで値を代入するフィールドの、グレーアウト解除は、JavaScriptで可能だったと思います。

(Disable=false みたいな感じで)

ただ、計算結果のフィールドのグレーアウトの解除は、私はやったことがないです。

仮にできたとしても、何かの拍子で再計算されてしまい、発注数に影響がでると怖いので、

数量、単位、入数を分けて 画面作成する方が、無難な設計かなという気もします。

計算式は 発注数 = 数量 * 入数 でも良いと思いますし、お好みによっては、入数=発注数/数量 の

入数逆計算パターンでもよいかと。

このあたりは、実際に使う方のご意見を聞きたいところですね。

ご参考になれば幸いです。

伊東 純 さま

私なら、自動計算フィールドは使わずに、JavaScriptで作ります。

A,B,Cという3つのフィールドを作るとしますと。。。

A,Bに数値が入力されたらC=A*Bをセットし、

Cに数値が入力されたらA,Bの内容をクリアする。

そういうコードを書くと思います。

お二方ともご回答ありがとうございます。何分初心者中の初心者でわからないことだらけなので、本当に助かります。

ちなみに、milkyway0307様の内容でできたらいいなと思うのですが、もし可能でしたら簡単でいいので、コードの例などを教えていただけると非常に助かります。。

伊東 純 さま

ちょっと面倒なコードに思えるかもしれませんが、こんな感じでいかがでしょうか。

A,Bに入力されたらC=A*Bをセットする機能だけならもっとシンプルですが、一方でCに入力されたらA,Bをクリアするという機能も共存させようとすると、こういうコードになりました。

手入力したことで変更時イベントが発火しているのか、JavaScriptで書き換えたことで変更時イベントが発火しているのかを区別しないとおかしくなってしまうため、ちょっと複雑になっています。

 

(function () {
"use strict";

var changeA = false;
var changeB = false;
var changeC = false;

function setValueIfChanged(obj, val){
if (obj.value===val){
return false;
} else {
obj.value=val;
return true;
}
}


// A
kintone.events.on([
'app.record.create.change.A', 'app.record.edit.change.A'
], function(event){

var record = event.record;

if (changeA===false) {
if (record['A'].value === undefined || record['B'].value === undefined) {
changeC=setValueIfChanged(record['C'], undefined);
} else {
changeC=setValueIfChanged(record['C'], record['A'].value * record['B'].value);
}
}
changeA=false;

return event;
});

 

// B
kintone.events.on([
'app.record.create.change.B', 'app.record.edit.change.B'
], function(event){

var record = event.record;

if (changeB===false) {
if (record['A'].value === undefined || record['B'].value === undefined) {
changeC=setValueIfChanged(record['C'], undefined);
} else {
changeC=setValueIfChanged(record['C'], record['A'].value * record['B'].value);
}
}
changeB=false;

return event;
});

 

// C
kintone.events.on([
'app.record.create.change.C', 'app.record.edit.change.C'
], function(event){

var record = event.record;

if (changeC===false){
changeA=setValueIfChanged(record['A'], undefined);
changeB=setValueIfChanged(record['B'], undefined);
}
changeC=false;

return event;
});

})(); // End of function

milkyway0307様

ご返信が遅くなってしまい申し訳ございません。コードありがとうございました。

テストで3つのフィールドを設置して試してみたところ、正常に動作いたしました。

ただ、質問するときの私の文章がおかしかったのですが、実際の使用するアプリは、数量、入数、発注数はテーブルになっています。そのアプリでJavaSprictを使用したのですが、こちらでは動作しませんでした。テーブルの場合は、また違うコードを使用しないといけないということでしょうか??

伊東 純 さま

仰る通り、サブテーブルの場合はちょっと改造する必要があります。そのままでは動きません。

基本的な考え方は同じでいいと思いますが、変更時イベントの作り方もちょっと変わるのと、changeA, changeB, changeCといったフラグも配列にすべきでしょうね。。。

私も似たようなものを作っている最中ですので、お急ぎでなければコードは提供できると思います。

サブテーブルの扱いについては下のページが少しは参考になるかも知れません。ただ、今回のことと直接関わる内容ではありませんので、今回に限ってはどれだけ役に立つかはわかりません。ただ、サブテーブルのデータの構造については理解が深まるかと思います。

 https://cybozudev.zendesk.com/hc/ja/articles/202422244-%E7%AC%AC6%E5%9B%9E-%E3%82%B5%E3%83%96%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E5%80%A4%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B

 

伊東 純 さま

テーブルバージョンに書き換えてみました。

前提として、A,B,Cが同じサブテーブルのフィールドになっているものとします。

前回のものと異なるのは、

var record = event.record;

となっているところが

var changesRow = event.changes.row.value;

になり、それにともなって

   record

になっている部分が

   changesRow

になります。フラグは配列にしなくても大丈夫でした。

 

というわけで、以下のコードで試してみてください。

(function () {
"use strict";

var changeA = false;
var changeB = false;
var changeC = false;

function setValueIfChanged(obj, val){
if (obj.value===val){
return false;
} else {
obj.value=val;
return true;
}
}


// A
kintone.events.on([
'app.record.create.change.A', 'app.record.edit.change.A'
], function(event){

var changesRow = event.changes.row.value;


if (changeA===false) {
if (changesRow['A'].value === undefined || changesRow['B'].value === undefined) {
changeC=setValueIfChanged(changesRow['C'], undefined);
} else {
changeC=setValueIfChanged(changesRow['C'], changesRow['A'].value * changesRow['B'].value);
}
}
changeA=false;

return event;
});

 

// B
kintone.events.on([
'app.record.create.change.B', 'app.record.edit.change.B'
], function(event){

var changesRow = event.changes.row.value;


if (changeB===false) {
if (changesRow['A'].value === undefined || changesRow['B'].value === undefined) {
changeC=setValueIfChanged(changesRow['C'], undefined);
} else {
changeC=setValueIfChanged(changesRow['C'], changesRow['A'].value * changesRow['B'].value);
}
}
changeB=false;

return event;
});

 

// C
kintone.events.on([
'app.record.create.change.C', 'app.record.edit.change.C'
], function(event){

var changesRow = event.changes.row.value;

if (changeC===false){
changeA=setValueIfChanged(changesRow['A'], undefined);
changeB=setValueIfChanged(changesRow['B'], undefined);
}
changeC=false;

return event;
});

})(); // End of function