背景・実現したいこと
初めての投稿で至らぬ点がありましたら申し訳ございません。
- 実現したいこと(知りたいこと):kintoneのテーブルの以下の挙動は仕様なのか、直せるものなのか教えて頂きたいです。
製造業でkintoneを使っているのですが、製造された商品管理アプリを作ろうと思い商品コード、原価、数量だけでなく複数の日付フィールド(製造日、出庫期限など)を商品マスタで使いました。
新たなアプリ内に、この商品マスタの商品コードをルックアップ元のフィールドとして、商品マスタと同じ名前のフィールドを作成しテーブルにいれ、計算フィールドも追加したところレコード入力時にテーブル内の計算フィールド内の数値が正しく表記されたり、「0」になったりする現象が起こってしまいます。
テーブルの行を新たに増やす、もしくは一度ルックアップフィールドの値を「クリア」か「取得」をすることで正しい数値は一応当てはまります。レコードを追加してレコード詳細を確認すると正しい計算結果は一応入っていますが、レコード数が多くなった際に間違った数値で登録されないか心配です。
【この挙動が起こる条件】
- 1つの同じテーブル内にルックアップと連動した日付、数値、計算フィールドがあり、日付フィールドは複数ある
- 複数ある日付フィールドのうち、ルックアップフィールドと一番近い日付フィールドが2フィールド分以上間がある、または複数ある日付フィールドの間に計算フィールドが入ってしまっているとき
当方でも試して確認できました。どうやら画面内に映っているかどうかが計算実行の条件のようです(同じ条件でもブラウザの表示倍率を落としたところ計算されるのを確認しました)。描画コストを落とすための処置なのではないかと思います。
いずれにしても保存時にも再度計算されるので、間違った値が入ることはないと思われます。
mls-hashimoto様
お忙しい中ご回答頂きありがとうございます。
別のアプリを作る際に参考にしていたTipsの作成者であるmls-hasimoto様から
ご回答を頂き大変光栄です。
今回の件でブラウザの表示倍率の件をご指摘の通り試してみたのですが、私の場合挙動は特に変わりませんでした。
社内では「テーブルの行が増えた際に、テーブル内数値の表記がおかしいと混乱しレコード詳細をもう一度念のため確認
しないといけないため手間がかかる」との声があり、再度コメントさせて頂きました。
大変恐縮ではありますが、もし他に思いあたる要因、原因があればご提案頂ければ幸いです。
度々の投稿、大変失礼いたしました。
吉田 貴彦 さま
早計でした。申し訳ありません。当方でもブラウザの倍率に関係なく発生することを確認しました。
(() => {
'use strict';
let changeRowIndex = (event) => {
for (let i = 0; i < event.record['テーブル'].value.length; i++) {
if (event.record['テーブル'].value[i] === event.changes.row) return i;
};
};
kintone.events.on([
'app.record.create.change.数字1', 'app.record.edit.change.数字1',
'app.record.create.change.数字2', 'app.record.edit.change.数字2'
], (event) => {
let rowIndex = changeRowIndex(event);
setInterval(() => {
let rec = kintone.app.record.get().record;
let row = rec['テーブル'].value[rowIndex].value;
console.log(row['数字1'].value, row['数字2'].value, row['計算'].value)
}, 10);
return event;
});
})();
試しに上のコードを実行して計算フィールドの値がどうなっているか見てみたところ、
一瞬だけ正しく計算されたり0に戻ったり(画像にはありませんが数字が文字列になったり、最終的な値が0になったり)と、ルックアップを取得する度に違う動作をしていました。
恐らくは計算フィールドで使用する数値が両方ともルックアップから取得しているフィールドであるのが原因ではないかと思いますが、私では原因が突き止められませんでした。代替案として、計算フィールドを数値フィールドにし、計算フィールドと同じ機能をJavaScriptで作成すれば即時計算されるかと思います。
(() => {
'use strict';
kintone.events.on([
'app.record.create.change.数字1', 'app.record.edit.change.数字1',
'app.record.create.change.数字2', 'app.record.edit.change.数字2'
], (event) => {
let row = event.changes.row;
let result = 0;
if (!isNaN(row.value['数字1'].value) && !isNaN(row.value['数字2'].value)) result = Number(row.value['数字1'].value) * Number(row.value['数字2'].value);
row.value['計算'].value = result;
return event;
});
kintone.events.on([
'app.record.create.show', 'app.record.edit.show',
'app.record.create.change.テーブル', 'app.record.edit.change.テーブル'
], (event) => {
let record = event.record;
record['テーブル'].value.forEach((row) => {
row.value['計算'].disabled = true;
});
return event;
});
})();
mls-hashimoto様
お世話になっております。
お忙しい中、こんなにもわかりやすくご丁寧にお調べして頂き本当にありがとうございます。
承知いたしました。そのように対応してみようと思います。まだ私の方でも原因は分かってないのですが
もし判明した場合はmls-hashimoto様にこのスレッドでご報告し共有させて頂ければと思います。
system
(system)
Closed
6
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。