REST APIの繰り返し(for文)について

販売品管理アプリと在庫管理アプリがあり、販売品管理アプリのサブテーブルで利用数が入力されたら、在庫管理アプリのサブテーブルに追加する処理を行いたいです。

一通り記述したつもりなのですが、for文でうまく回らず販売品管理アプリのサブテーブル最初の1行分しか在庫管理アプリへ追加が出来ない状態です。

ソースコードのどこが不足しているのかご教授いただけないでしょうか。

 

■ソースコード

kintone.events.on(events5, function(event) {  //作成画面と編集画面の保存後に実行

      const record = event.record;

      const year = record.年.value;

      const month = record.月.value;

      const sellItemTable = record.販売品.value

      for (var o = 0; o < sellItemTable.length; o++) {  //ここのfor文サブテーブルに5行分のデータが入っていたとしてもが1回で終わってしまう

        const getsellItemDays = sellItemTable[o].value[“販売品_日付”].value

        const getsellItemID = sellItemTable[o].value[“利用品ID_販売品”].value

        const getsellItemUse = sellItemTable[o].value[“販売品利用数”].value

        const getsellItemlineID = sellItemTable[o].value[“行ID_販売品”].value  //販売品管理のサブテーブル1行ずつに一意のコードを割り当て済み

      //在庫アプリの年・月・利用品IDが一致するレコードを探す

        const paramForGetStock1 = {

          ‘app’: stockAPP_ID,

          ‘query’: ‘年 in ("’ + year + ‘“) and 月 in (”’ + month + ‘") and 利用品ID = "’ + getsellItemID + ‘" limit 500’,

        }

        return kintone.api(kintone.api.url(‘/k/v1/records’,true), ‘GET’, paramForGetStock1).then(function (resp) {

          console.log(“GETの後:” + o);

          console.log(resp);

          if(!resp.records.length) return;

          //在庫管理アプリ出庫テーブル取得

          resp.records.forEach(function(record) {

          const syukkoTable = record[“出庫”].value;

          //在庫管理アプリ出庫テーブルのID(列)を取得

          let syukkoTable_ID = [];

          for (var m = 0; m < syukkoTable.length; m++) {

            syukkoTable_ID[m] = syukkoTable[m].value[“ID”].value;

          }

          let appended_subtable = [];

          let subtable = [];

          //在庫アプリの出庫テーブルの中に利用管理のサブテーブルと同じ行IDがあるか。無ければ追加。あれば追加しない。

            if (!syukkoTable_ID.includes(getsellItemlineID)) {

              for (let n = 0; m < syukkoTable.length; m++) {

                subtable.push(syukkoTable[m]);

              }

            subtable.push({

              value: {

                “出庫日付”: {

                  “value”: getsellItemDays

                },

                “出庫数”: {

                  “value”: getsellItemUse

                },

                “ID”: {

                  “value”: getsellItemlineID

                }

              }

            });

            const paramForPut1 = {

              “app”: stockAPP_ID,

              “id”: resp.records[0].$id.value,

              “record”: {

                “出庫日付”: {

                  “value”: getsellItemDays

                },

                “出庫数”: {

                  “value”: getsellItemUse

                },

                “ID”: {

                  “value”: getsellItemlineID

                },

                “出庫”: {

                  “value”: subtable

                }

              }

            }

            appended_subtable.push(paramForPut1);

            subtable = subtable.concat(appended_subtable); // 既存と追加分のサブテーブルを結合

            var put_record = {}; // レコード更新用オブジェクト

            put_record[“出庫”] = {

            value: subtable

            }

          return kintone.api(kintone.api.url(“/k/v1/record.json”, true), “PUT”, paramForPut1).then(function(resp) {

            console.log(resp);

          },

              ).catch(function(error) {

                console.log(error);

                });

            }else {

          }

        })

        })

      }

      window.alert(“在庫管理に反映しました。”);

    return event;

  });

1900324877088 様

 

ご返信ありがとうございます。

恥ずかしながらpromise処理を理解できておらず、今回の場合どのように記述すればよいかお手数をお掛けしますがご教授いただけないでしょうか…。

daikonsan

自分も恥ずかしながらpromiseを理解しておらず記述例を出すことができません。申し訳ございません。

自分の場合はpromiseと同様の動きができる await asyncを使って処理を回しています。

promiseと違い理解しやすいと思います。

1900324877088 様

 

何度も申し訳ありません。

ひとまずお教えいただいた、async / awaitを使って複数の登録することは確認できました。

ただ、for文の中でGETが走り、サブテーブルにプッシュする処理が走り、PUTリクエストボディを作って更新といった想定ですが、async / await の書き方がダメなのか

for文入る→GET→PUTリクエストボディ作成→for文の先頭に戻る(oが+1された状態)→PUTする

(PUTする前にfor文の先頭に戻ってしまう)

といった流れになってしまいます。

そのためか、同じ利用品IDの行が3つ(行IDは別)あった場合、1つ目・3つ目は登録されますが、2つ目が登録されずに終わってしまいます。

※行IDは在庫管理アプリに既に同じ行IDがあれば登録しないようにするためのもので、一意のコードが割り当てられています。

 

ソースコード、どこが間違っているかご教授いただけないでしょうか。

 

■ソースコード

kintone.events.on(events5, async function(event) {

      const record = event.record;

      const year = record.年.value;

      const month = record.月.value;

      const sellItemTable = record.販売品.value

      for (var o = 0; o < sellItemTable.length; o++) {

        const getsellItemDays = sellItemTable[o].value[“販売品_日付”].value

        const getsellItemID = sellItemTable[o].value[“利用品ID_販売品”].value

        const getsellItemUse = sellItemTable[o].value[“販売品利用数”].value

        const getsellItemlineID = sellItemTable[o].value[“行ID_販売品”].value

      //在庫アプリの年・月・利用品IDが一致するレコードを探す

        const paramForGetStock1 = {

          ‘app’: stockAPP_ID,

          ‘query’: ‘年 in ("’ + year + ‘“) and 月 in (”’ + month + ‘") and 利用品ID = "’ + getsellItemID + ‘" limit 500’,

        }

        console.log(“GETの前:” + o);

        await kintone.api(kintone.api.url(‘/k/v1/records’,true), ‘GET’, paramForGetStock1).then(async function (resp) {

          console.log(resp);

          if(!resp.records.length) return;

          //在庫管理アプリ出庫テーブル取得

          await resp.records.forEach(async function(record) {

          const syukkoTable = record[“出庫”].value;

          //在庫管理アプリ出庫テーブルのID(列)を取得

          let syukkoTable_ID = [];

          for (var m = 0; m < syukkoTable.length; m++) {

            syukkoTable_ID[m] = syukkoTable[m].value[“ID”].value;

          }

          let appended_subtable = [];

          let subtable = [];

          //在庫アプリの出庫テーブルの中に利用管理のサブテーブルと同じ行IDがあるか。無ければ追加。あれば追加しない。

            if (!syukkoTable_ID.includes(getsellItemlineID)) {

              for (let m = 0; m < syukkoTable.length; m++) {

                subtable.push(syukkoTable[m]);

              }

              subtable.push({

                value: {

                  “出庫日付”: {

                    “value”: getsellItemDays

                  },

                  “出庫数”: {

                    “value”: getsellItemUse

                  },

                  “ID”: {

                    “value”: getsellItemlineID

                  }

                }

              });

              const paramForPut1 = {

                “app”: stockAPP_ID,

                “id”: resp.records[0].$id.value,

                “record”: {

                  “出庫日付”: {

                    “value”: getsellItemDays

                  },

                  “出庫数”: {

                    “value”: getsellItemUse

                  },

                  “ID”: {

                    “value”: getsellItemlineID

                  },

                  “出庫”: {

                    “value”: subtable

                  }

                }

              }

              appended_subtable.push(paramForPut1);

              subtable = subtable.concat(appended_subtable); // 既存と追加分のサブテーブルを結合

              var put_record = {}; // レコード更新用オブジェクト

              put_record[“出庫”] = {

              value: subtable

              }

//ここまでは走る。次のPUT行く前にfor文の先頭に戻ってoが加算されてしまう。

              await kintone.api(kintone.api.url(“/k/v1/record.json”, true), “PUT”, paramForPut1).then(function(resp) {

                console.log(resp);

              }).catch(function(error) {

                    console.log(error);

              });

            }else {

          }

        })

        })

      }

      window.alert(“在庫管理に反映しました。”);

    return event;

  });

回答になっているかわかりませんが

ここまで回っているところまででparamを作成し、

putは複数のレコード一括更新ができるので最後にput処理をするのはどうでしょうか。

https://developer.cybozu.io/hc/ja/articles/201941784-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B4%E6%96%B0-PUT-#step2 

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