for分の記述について

(function() {

“use strict”;

// 在庫アプリ操作
var syohinDao = {};
syohinDao.APP_ID = 373;

// 新規レコードの保存イベント
kintone.events.on(‘app.record.create.submit’, function(event) {

var tabRec = event.record.入出庫.value;
for (var i = 0; i < tabRec.length; i++) {

console.log(tabRec.length);

var record = event.record;
var params = {
“app”: syohinDao.APP_ID,
“query”: ‘部品コード ="’ + tabRec[i].value[‘部品コード’][‘value’] + ‘"’,
“fields”: [‘$id’, ‘$revision’, ‘在庫数’]
};

console.log(params);

return kintone.api(‘/k/v1/records’, ‘GET’, params).then(function(resp) {
var syohinRecord = resp[‘records’][0];

if (syohinRecord.length !== 0) {
var updQuantity = 0;
// 入庫、等の場合
if (tabRec[i].value[‘入庫数’][‘value’]) {
updQuantity = Number(syohinRecord[‘在庫数’][‘value’]) + Number(tabRec[i].value[‘入庫数’][‘value’]);
}
// 出庫、等の場合
if (tabRec[i].value[‘出庫数’][‘value’]) {
updQuantity = Number(syohinRecord[‘在庫数’][‘value’]) - Number(tabRec[i].value[‘出庫数’][‘value’]);
}
if (updQuantity < 0) {
// 更新後の在庫数がマイナスになる場合はエラーにして中断
alert(“在庫が足りません。”);
tabRec[i].value[‘出庫数’][‘error’] = “在庫が足りません。”;
event[‘error’] = “在庫が足りません。”;
return event;
}

// 更新パラメータ
var params2 = {
// 商品アプリ番号
“app”: syohinDao.APP_ID,
// レコード番号
“id”: syohinRecord[‘$id’][‘value’],
// レビジョン
“revision”: syohinRecord[‘$revision’][‘value’],
// 登録データ
“record”: {
“在庫数”: {
“value”: updQuantity
}
}
};
/*
// 商品レコードを更新
return kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘PUT’, params2).then(function(resp2) {
alert(“商品レコードを更新しました。”);
}, function(resp2) {
alert(“商品レコードを取得できません。”);
});
*/
}
},function(resp) {
alert(“商品レコードを取得できません。”);
event[‘error’] = “商品レコードを取得できません。”;
return event;
});
}
});
});

↑上記のコードで、for文を使用しているのですが、データが複数あっても、一度しかfor文が動作しません。
正しい記述方法をご教示願います

kintone_TS44様

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

for文内でreturnが処理されるとそれ以降のループは処理されません.
全ての処理を終えた後でreturnするような記述が良いかと思います.
非同期処理が絡んでいるので,Promise.all()で全てのPromiseが解決するのを待つと良いと思います.

(function () {

  "use strict";

  // 在庫アプリ操作
  var syohinDao = {};
  syohinDao.APP_ID = 373;

  // 新規レコードの保存イベント
  kintone.events.on('app.record.create.submit', function (event) {

    var tabRec = event.record.入出庫.value;
    return kintone.Promise.all(tabRec.map(function(row){
      console.log(tabRec.length);

      var record = event.record;
      var params = {
        "app": syohinDao.APP_ID,
        "query": '部品コード ="' + row.value['部品コード']['value'] + '"',
        "fields": ['$id', '$revision', '在庫数']
      };

      console.log(params);

      return kintone.api('/k/v1/records', 'GET', params).then(function (resp) {
        var syohinRecord = resp['records'][0];

        if (syohinRecord.length !== 0) {
          var updQuantity = 0;
          // 入庫、等の場合
          if (row.value['入庫数']['value']) {
            updQuantity = Number(syohinRecord['在庫数']['value']) + Number(row.value['入庫数']['value']);
          }
          // 出庫、等の場合
          if (row.value['出庫数']['value']) {
            updQuantity = Number(syohinRecord['在庫数']['value']) - Number(row.value['出庫数']['value']);
          }
          if (updQuantity < 0) {
            // 更新後の在庫数がマイナスになる場合はエラーにして中断
            alert("在庫が足りません。");
            row.value['出庫数']['error'] = "在庫が足りません。";
            event['error'] = "在庫が足りません。";
            return event;
          }

          // 更新パラメータ
          var params2 = {
            // 商品アプリ番号
            "app": syohinDao.APP_ID,
            // レコード番号
            "id": syohinRecord['$id']['value'],
            // レビジョン
            "revision": syohinRecord['$revision']['value'],
            // 登録データ
            "record": {
              "在庫数": {
                "value": updQuantity
              }
            }
          };
          /*
          // 商品レコードを更新
          return kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', params2).then(function(resp2) {
          alert("商品レコードを更新しました。");
          }, function(resp2) {
          alert("商品レコードを取得できません。");
          });
          */
        }
      }).catch(function (resp) {
        alert("商品レコードを取得できません。");
        event['error'] = "商品レコードを取得できません。";
        return event;
      });
    }));
  });
});

江田篤史様
お世話になっております。

ご回答頂いた、コードでアプリを実行したのですが、
思った通りに動作しませんでした。

コードのどこの箇所を気をつければよいか、ご教示願います。
※``console.log(tabRec.length);でテーブルの数が取得できませんでした。

kintone_TS44様

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

現状でコンソール画面には何が表示されていますか?

江田篤史様
お世話になっております。

何も表示されず保存されてしまいます。

kintone_TS44様

お世話になっております.
ご確認ありがとうございます.

即時関数の括弧が不足していました.
最終行を修正してお試しいただけますでしょうか.

});

})();

江田篤史様
お世話になっております。

コンソールは表示されるようになりました。
誠に、ありがとうございます。

ですが、保存をすると
カスタマイズ用のJavaScriptの実行時にエラーが発生しました。アプリの管理者にお問い合わせください。

  • event.record が不正です。
    とメッセージが表示されます。

何度も申し訳ございませんが、ご教示願います。

kintone_TS44様

お世話になっております.
こちらこそ確認不足で申し訳ございません.

eventオブジェクトをreturnしないといけませんね.
kintone.Promise.all()にメソッドチェーンして,eventオブジェクトをreturnしてください.

...
    return kintone.Promise.all(tabRec.map(function(row){
      ...
    })); //75行目
  });
})();

...
    return kintone.Promise.all(tabRec.map(function(row){
      ...
    })).then(function(){ //75行目
      return event;
    });
  });
})();

江田篤史様
お世話になっております。

無事、動作いたしました。
ご教示頂き、ありがとうございました。

江田篤史様
お世話になっております。

先ほどご教示頂いたコードに、詳細情報を追加したいと考えたおりますが、
下記の方法ですと、テーブルが上書きされてしまいます。

// 登録データ
“record”: {
“在庫数”: {
“value”: updQuantity
},
//テーブルデータの追加
“詳細情報”: {
“value”: [{
“value”: {
“日付”: {“value”: row.value[‘入出庫日’][‘value’]},
“入庫”: {“value”: Number(row.value[‘入庫数’][‘value’])},
“出庫”: {“value”: Number(row.value[‘出庫数’][‘value’])},
“会社名”: {“value”: record[‘会社名’][‘value’]}
}
}]
}
}

度々、申し訳ございませんがご教示願います。