取得したフィールド値をサブテーブルへ反映させたい

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

皆様のお力を借りてアプリを少しずつ構築しておりますが、また行き詰まってしまったので、アドバイスを頂けませんでしょうか。

目標:サブテーブルのフィールド「商品名」が商品マスタと一致した時、マスタに登録されている「仕入ベース価格」をサブテーブルのフィールド「仕入ベース価格」へ反映させたい。

上記記述の場合、 getRec[‘record’][‘テーブル’][‘value’][‘仕入ベース価格’][‘value’] = PBP;にCannot read property ‘value’ of undefinedのエラーが表示されます。

(思いつく幾通りかの記述方法を試しましたが、うまくいきませんでした)

恐れ入りますが、正しい記述方法をご教授頂けました幸いです。

よろしくお願いします。

テーブルの何行目か、の指定がぬけてそうですね。

テーブルの1行目に入れる場合はこうなります

getRec['record']['テーブル']['value'][0]['value']['仕入ベース価格']['value'] = PBP;

 

全部に反映させたい場合はfor文などでループする必要がありますね。

村濱さま

またまたありがとうございます。

やはり、event.changes.rowなどを用いて変更した行だけを反映させることは難しいでしょうか?

すいません、その部分完全に見落としておりました!

やりたいことはなんとなくわかりました、通常であればご認識のとおり、event.changes.row.value.仕入ベース価格.value = ‘任意の値’ と値を変更し、 return eventすれば反映されます。

今回はほかアプリからデータをとってくる都合上、それは無理そうですね。。

 

ただ、コードをみてると「商品名」でテーブルの中を検索できそうですね。なので、Forを使って特定する必要がありそうです。やろうとしていることは概ねただしくて、行だけ特定できればあとはなんとかなりそうだなという所感です。

 

村濱さま

色々説明が不足していてすみません。

実は「商品名」の他に、「寸法」「厚さ」「仕様」の変数があり、全て一致した"仕入ベース価格"を引っ張ってくるように組んでおります。

この場合、for文を組むと構文が煩雑になるのかな、と思ったり。

一方で、いま村濱様の過去の記事からPromise文を勉強始めたところですが、こちらを組み合わせれば、当初の「event.changes.row」を使った処理は可能となりますでしょうか。

もしかしたら、こちらの方が入り組んだ構文になるのかもしれませんが、勉強したい気持ちもあったり、でも他にもこなさないといけないものもあったりで悩んでいます。。。

恐れ入りますが、アドバイス頂けましたら幸いです。よろしくお願い致します。

記事を閲覧頂きありがとうございます。Promiseを使ってほしい…ところですが、ChangeイベントはPromise非対応で待ってくれないです。。(そのうち対応されるかもしれませんが)

ですので、sufureさんのような大筋にはなると思います。

 

その上で話しますが、for文を嫌がるのは正しいです。forは無限ループさせてしまったりバグを生みやすいので。。

なので、僕ならばforを使わないループ処理で書くかと思います。(というよりforは特段の理由がない限りつかいません


前書きが長くなってしまいましたが、配列にはすでに配列をループさせるための関数が定義されています。

forEach, map, filterなどをつかってkintoneのrecords配列をもっと上手に扱う

上記記事を参考に、試してみてはいかがでしょうか。配列の操作はかなりの頻度でありますので今後のためにもなります。

 


僕ならばどう書くかも一応残しておきます。

// PBPという変数にマスタの対象レコードをそのままいれます
const PBP = resp.records[0];

// Array.prototype.map()を使って新しい配列を作る
const updatedTable = getRec.record.テーブル.value.map(function(row) {
// 任意の一致条件を書きます(比較のためのisEqualPBP()などの関数を定義してもいいですね )
if (row.商品名.value === PBP.商品名.value && row.寸法.value === PBP.寸法.value && row.厚さ.value === PBP.厚さ.value && row.仕様.value === PBP.仕様.value) {
// 条件に一致する場合、仕入れベース価格を更新
row.仕入ベース価格.value = PBP.仕入ベース価格.value;
}
// 最後に行をreturnするのを忘れずに。変更がないものでも返す
return row;
});

// この時点でupdatedTable変数にアップデートされたテーブルの配列が格納されているので、それをもとのテーブル変数に代入する
getRec.record.テーブル.value = updatedTable;

// record.setする
kintone.app.record.set(getRec);

 

条件文に関してはマスタに条件一致させるためのキーをもたせたりと改善の余地はありそうですが、愚直に書くとこうなりそうです。

(動作確認してませんので参考程度におねがいします

村濱さま

遅くにまでコメントを頂きまして大変恐縮です。そして、ありがとうございます。

「ChangeイベントはPromise非対応」なのですね。(伺っておいて良かった!)

配列の関数を是非勉強させて頂きます。

明日以降になる思いますが、完成致しましたら改めてご報告させて頂きます。

貴重なアドバイス、大変ありがとうございます。

考えたら、ここで行番号まではわからなくとも、対象のレコード自体はとれてるのでそのデータと比較してもいいかもと思いました。

がんばってください!!

村濱さま

ありがとうございます。

ちょっとまだ理解が追いついてないので、作成した構文に対してより簡潔に書ける、などのアドバイスがありましたら是非、またよろしくお願い致します。

村濱さま

度々申し訳ありません。

頂いたアドバイスをprototypeから読み解いていざ、村濱さまの構文をベースに挑戦してみたのですが仕入ベース価格を反映できませんでした。。。

またアドバイスを頂けませんでしょうか。(確認しやすくする為、下記では頂いたコメントを削除させて貰っています)

上記、”updatedTable”のログを確認すると、「仕入ベース価格」にvalueが代入されていなかったことから、if文に誤りがあるのではないかと思っていますが、どこか見つけられずにおります。(”resp.records”では取得できています)

恐れ入りますが、またご確認頂けましたら幸いです。

追伸:構文をコメントに埋め込むにはどうすればよいでしょうか?合わせてご教授頂けないでしょうか。

> 上記、”updatedTable”のログを確認すると、「仕入ベース価格」にvalueが代入されていなかったことから、if文に誤りがあるのではないかと思っていますが、どこか見つけられずにおります。(”resp.records”では取得できています)

ブレークポイントなどでデバッグはできますか?if付近の実際の値をみてはいかがでしょうか
https://qiita.com/Shinji-Hashimoto/items/e6ab00be4f3dfbc20855

(該当の箇所に debugger; と仕込むでも強制的にブレークポイントはれます。

 

 

> 追伸:構文をコメントに埋め込むにはどうすればよいでしょうか?合わせてご教授頂けないでしょうか。

下記のコードを選ぶとシンタックスハイライトがつきます

村濱さま!

できました!どうやら、厚さクラスの定義づけ(別のJS)に用いている変数Tをこの構文にも用いていた為(create.change.Tとして)、処理の順番にズレが生じてif文の結果で合致しなかったようです。

ホントに様々なことを勉強させて頂きましてありがとうございました。(ブレークポイント、便利ですね)

まだアプリの完成まで少し道のりがありますが、引き続きせこせこと組んでいきたいと思います。

お時間と貴重なアドバイスを頂き、大変ありがとうございました。

おお、うまくバグ解消ができてよかったです!!!

わからないことがあったらまた質問してください :ok_hand:(だれかが答えてくれるはずです)