初めて質問させていただきます。
見積書のテーブルの各行に「単価」「数量」とそれを自動計算した「小計」が存在します。そして、テーブル外に「小計」を自動計算した「総合計」を出しています。
プリントクリエイタで印刷する際に、見積書の項目として金額部分が空欄としたいものがあります。
そのため、同じテーブル内に「単価コピー」「数量コピー」「小計コピー」欄を作成し、それぞれに値を入れる際に「0」ならば空欄となるよう、以下のようにJSを作成しましたが、更新画面を開いても期待する動作とならず、保存もできなくなります。
/**
* テーブル名:table
* 数値フィールド:tan 単価
* 数値フィールド:tan_0 単価コピー
* 数値フィールド:kaz 数量
* 数値フィールド:kaz_0 数量コピー
* 計算フィールド:kin 小計
* 数値フィールド:kin_0 小計コピー
*/
(function() {
“use strict”;
// 登録時、編集時のsubmit前処理
kintone.events.on([“app.record.edit.submit”, “app.record.create.submit”], function(event) {
var tableRecords = event.record.table.value;
var a = tableRecords.value.tan.value;
// aが0の時は空欄にする
if (a = 0) {
tableRecords.value.tan_0.value = "";
} else {
tableRecords.value.tan_0.value = a;
}
var b = tableRecords.value.kaz.value;
// bが0の時は空欄にする
if (b = 0) {
tableRecords.value.kaz_0.value = "";
} else {
tableRecords.value.kaz_0.value = b;
}
var c = parseFloat(tableRecords.value.kin.value);
// cが0の時は空欄にする
if (c = 0) {
tableRecords.value.kin_0.value = "";
} else {
tableRecords.value.kin_0.value = c;
}
return event;
});
})();
ご教授いただけますでしょうか。よろしくお願いいたします。
sawa さん
こちらに書いてある通り、テーブルの取得時のレスポンスでは<フィールドコード>.valueは配列となっています。
そのためtableRecordsは配列なのでtableRecordsの各要素に対して操作を行う必要があると思われます。
瀧ヶ平 さん
早速のお返事、ありがとうございます。
アドバイス通りに以下のように修正してみました。(b、cも同様に修正)
// aが0の時は空欄にする
if (a = 0) {
tableRecords.value['koumoku'].value = ;
tableRecords.value['tan'].value = ;
tableRecords.value['kaz'].value = ;
tableRecords.value['dropdown'].value = ;
tableRecords.value['kin'].value = ;
tableRecords.value['tan_0'].value = "";
tableRecords.value['kaz_0'].value = ;
tableRecords.value['kin_0'].value = ;
tableRecords.value['bikou'].value = ;
} else {
tableRecords.value['koumoku'].value = ;
tableRecords.value['tan'].value = ;
tableRecords.value['kaz'].value = ;
tableRecords.value['dropdown'].value = ;
tableRecords.value['kin'].value = ;
tableRecords.value['tan_0'].value = a;
tableRecords.value['kaz_0'].value = ;
tableRecords.value['kin_0'].value = ;
tableRecords.value['bikou'].value = ;
}
今回は修正画面から保存はできるようになりました。ただし、期待する動作とはなりませんでした。
他にお気づきの点ありましたら、お願いいたします。
sawa さん
tableRecordsは配列となっており、テーブルの各行のデータがtableRecordsの要素となり、tableRecords[n]のような形でn番目の行のデータオブジェクトを取得することになります。
また、一つ前では指摘し忘れていたのですが、JavaScriptでは’=‘は代入の演算子のため、この場合は条件式には’='ではなく '=='を 使うのが適切です。
そのため、 var tableRecords = … 以下のコードを
for(var i =0; i < tableRecords.length; i++){
var data = tableRecords[i];
var a = data.tan.value;
if(a == 0){
data.tan_0.value = "";
} else {
data.tan_0.value = a;
}
var b = data.kaz.value;
if(b == 0){
data.kaz_0.value = "";
} else {
data.kaz_0.value = b;
}
var c = parseFloat(data.kin.value);
if(c == 0){
data.kin_0.value = "";
} else {
data.kin_0.value = c;
}
}
return event;
の様にすれば解決すると思います。
なにか問題がありましたらお気軽にご質問ください。
瀧ヶ平 さん
ご教授いただいたように、以下のように作成してみましたが、やはりうまく動作しませんでした。
(function() {
“use strict”;
// 登録時、編集時のsubmit前処理
kintone.events.on([“app.record.edit.submit”, “app.record.create.submit”], function(event) {
var tableRecords = for(var i =0; i < tableRecords.length; i++){
var data = tableRecords[i];
var a = data.tan.value;
if(a == 0){
data.tan_0.value = “”;
} else {
data.tan_0.value = a;
}
var b = data.kaz.value;
if(b == 0){
data.kaz_0.value = "";
} else {
data.kaz_0.value = b;
}
var c = parseFloat(data.kin.value);
if(c == 0){
data.kin_0.value = "";
} else {
data.kin_0.value = c;
}
}
return event;
});
})();
「tan」のみでもやってみましたがだめなようです。(保存はできます。)
何か手がありましたらお教えください。
sawa さん
説明が不足して申し訳ありません。
var tableRecords = event.record.table.value;
の行以下を先ほどのコードに差し替える、という意味です。
瀧ヶ平 さん
お返事ありがとうございます。
たぶんそういう意味かなあ、と思い、「var tableRecords = event.record.table.value;」の次の行から埋め込んだのですが、そうすると保存もできなくなったため、あのように置換しました。
今もう一度指示通りにしてみましたが、やはり保存もできませんでした。
sawaさん
すいません私のコードにミスがありました。
var data = tableRecords[i];
の部分を
data = tableRecords[i].value;
とすれば問題ないと思います。また問題ありましたらご質問ください。
瀧ヶ平 さん
ありがとうございました!
最初はだめでしたが、
「data = tableRecords[i].value;」の前に「var」をつけて
「var data = tableRecords[i].value;」としたところ、完璧に動作しました!
本当にありがとうございました!^^