# POST時（サブテーブル）エラーについて

**URL:** <https://community.cybozu.dev/t/topic/1088>\
**Category:** kintone 開発相談\
**Created:** [2022 年 10 月 27 日午前 9:09 UTC](https://community.cybozu.dev/t/topic/1088 "2022-10-27T09:09:50Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Legacy\_Account833](https://avatars.discourse-cdn.com/v4/letter/l/9de0a6/32.png) [@Legacy\_Account833](https://community.cybozu.dev/u/Legacy_Account833)\
**Post date:** [2022 年 10 月 27 日午前 9:09 UTC](https://community.cybozu.dev/t/topic/1088/1 "2022-10-27T09:09:50Z")

</div>

いつもお世話になっております。

下記、Aアプリ（通常フィールド＋サブテーブル）→Bアプリ（通常フィールド＋サブテーブル）にPOSTする際に400エラーが出ています。

色々試してみましたが、わからず、お力を貸してください。

サブテーブルを除外するとPOSTできたので、サブテーブルの記載が悪いのだと思いますが…

アドバイスよろしくお願いします。

```
…

for (var i = 0; i < mainTable.length; i++) {
  …
    table = {"value": []};
    for (var j = 0; j < meisaiTbl.length; j++) {
          if(meisaiTbl[j].value['明細番号1'].value == hyoshiNo){
               //同じ集計番号の明細を取得
               var row = {};
               var tblNo = meisaiTbl[j].value;
               row['分類'] = {value: tblNo['明細分類'].value};
               row['番号'] = {value: Number(tblNo['明細番号'].value)};
              row['品名'] = {value: tblNo['明細品名'].value};
               row['数'] = {value: Number(tblNo['明細数'].value)};
               row['単位'] = {value: tblNo['明細単位'].value};
               row['単価'] = {value: Number(tblNo['明細単価'].value)};
               row['金額'] = {value: Number(tblNo['明細金額'].value)};
               row['定価'] = {value: Number(tblNo['明細定価'].value)};
               row['原価'] = {value: Number(tblNo['明細原価'].value)};
               row['原価率'] = {value: Number(tblNo['明細原価率'].value)};
               row['備考'] = {value: tblNo['明細備考'].value};
               table.value.push({value: row});
           }
     }
                  
     //新規登録
     var iBody={
          app:meisaiAppId,
          record:{
          ['見積表紙レコード番号']:{value:insertRecNo},
          ['見積集計番号']:{value:hyoshiNo},
          ['名称']:{value:daiBunrui},
          ['明細合計']:{value:Number(daiSyoukei)},
          ['明細テーブル']:table
      }
      };
      kintone.api(kintone.api.url('/k/v1/record', true), 'POST', iBody).then(function(resp5) {
      }, function (resp5){
           console.log("見積明細登録エラー");
      });

```

---

<div class="post-metadata">

**Author:** ![Legacy\_Account2534](https://avatars.discourse-cdn.com/v4/letter/l/e9a140/32.png) [@Legacy\_Account2534](https://community.cybozu.dev/u/Legacy_Account2534)\
**Post date:** [2022 年 10 月 27 日午後 11:33 UTC](https://community.cybozu.dev/t/topic/1088/2 "2022-10-27T23:33:32Z")

</div>

matsu さん

下記コードで試した限りデータ構造的には問題がないので、エラーの可能性があるとすればコピー元のデータの不備、またはフィールドの値が不一致（変換不可）、が考えられます。APIの失敗処理でエラーを出力してみてはいかがでしょうか。

```
var table = { value: [] };
for (var j = 0; j < 1; j++) {
  var row = {};
  row['分類'] = { value: 'A' };
  row['番号'] = { value: 1 };
  table.value.push({ value: row });
}
var iBody = {
  app: kintone.app.getId(),
  record: {
    ['明細テーブル']: table,
  },
};
kintone.api(kintone.api.url('/k/v1/record', true), 'POST', iBody).then(
  function (resp5) {},
  function (resp5) {
  console.error('見積明細登録エラー', iBody, resp5);
  }
);

```

以上になります。参考になれば幸いです。

---

<div class="post-metadata">

**Author:** ![Legacy\_Account2925](https://avatars.discourse-cdn.com/v4/letter/l/7ab992/32.png) [@Legacy\_Account2925](https://community.cybozu.dev/u/Legacy_Account2925)\
**Post date:** [2022 年 10 月 28 日午前 12:22 UTC](https://community.cybozu.dev/t/topic/1088/3 "2022-10-28T00:22:16Z")

</div>

matsu 様  
横槍になってしまうかもしれませんが、ChromeやEdgeのデベロッパツールでステータス400が出たときにペイロードを確認できますので、確認してみてはいかがでしょうか？  
ペイロードの確認をするとデータ構造が視覚的に見えやすいのかなと感じました。

Chromeでのペイロードの確認の仕方：  
[https://www.tsukimi.net/chrome-developer-tools\_post.html](https://www.tsukimi.net/chrome-developer-tools_post.html)&nbsp;

---

<div class="post-metadata">

**Author:** ![Legacy\_Account833](https://avatars.discourse-cdn.com/v4/letter/l/9de0a6/32.png) [@Legacy\_Account833](https://community.cybozu.dev/u/Legacy_Account833)\
**Post date:** [2022 年 10 月 28 日午前 12:59 UTC](https://community.cybozu.dev/t/topic/1088/4 "2022-10-28T00:59:13Z")

</div>

川村様

お世話になります。

とても参考になりました！今後エラー出力重宝します！

エラー出力で確認すると、どうやらこの記述の前の処理が問題でした。

Promise処理で同じレコードがある場合DELETEしてからPOSTする、という流れにしているのですが、

Promiseがどうやらうまくいってなく、DELETEする前にPOSTして重複エラーになっていました。

```
…
.then((resp3) =\>{
   //①アプリBにデータがあるか検索、ある場合は削除データ作成
    var param3 = {
      app: meisaiAppId,
      query:'見積表紙レコード番号 = "'+ recordNo +'"',
    };
  kintone.api('/k/v1/records','GET', param3, function (resp3) {
      var record3 = kintone.app.record.get();
     if(resp3.records.length >0) {
       //全件削除
       for(var i =0; i < resp3.records.length; i++) {
          delList.push(resp3.records[i]['レコード番号'].value);
        }
    }
    });
  })
  .then((resp4) =\>{
   //②削除データがある場合、アプリB削除
   if(delList.length >0) {
      const dbody = {
        app: meisaiAppId,
        ids: delList,
      };
    kintone.api(kintone.api.url('/k/v1/records',true),'DELETE', dbody)
        .then(
          function (resp4) {
           console.log('削除完了');
          },
         (error) =\>{
           console.log(error);
          }
        );
  }
  })
  .then((resp5) =\>{
   //③今回の処理 アプリAの情報をアプリBに登録
  }));

```

---

<div class="post-metadata">

**Author:** ![Legacy\_Account833](https://avatars.discourse-cdn.com/v4/letter/l/9de0a6/32.png) [@Legacy\_Account833](https://community.cybozu.dev/u/Legacy_Account833)\
**Post date:** [2022 年 10 月 28 日午前 1:00 UTC](https://community.cybozu.dev/t/topic/1088/5 "2022-10-28T01:00:44Z")

</div>

[Yuki Minamitani](https://community.cybozu.dev/hc/ja/profiles/903517216706-Yuki-Minamitani)様

お世話になります。

ペイロード確認、初めて知りました。

今後活用させていただきます！

ありがとうございました！

---

<div class="post-metadata">

**Author:** ![Legacy\_Account2534](https://avatars.discourse-cdn.com/v4/letter/l/e9a140/32.png) [@Legacy\_Account2534](https://community.cybozu.dev/u/Legacy_Account2534)\
**Post date:** [2022 年 10 月 28 日午前 1:41 UTC](https://community.cybozu.dev/t/topic/1088/6 "2022-10-28T01:41:24Z")

</div>

matsu さん

お役に立てて嬉しいです。

Promise で処理の完了を待つ場合、コールバックの関数内で Promise を return する必要があります。

元のコードに少し手を加え、「※」付きでコメントさせていただきました。

```
  .then((resp3) => {
    //①アプリBにデータがあるか検索、ある場合は削除データ作成
    var param3 = {
      app: meisaiAppId,
      query: '見積表紙レコード番号 = "' + recordNo + '"',
    };
    // ※ kintone.api は Promise を返すのでここの処理が終わったら次の then が実行
    return kintone.api('/k/v1/records', 'GET', param3, function (resp3) {
      var record3 = kintone.app.record.get();

      if (resp3.records.length > 0) {
        //全件削除
        for (var i = 0; i < resp3.records.length; i++) {
          delList.push(resp3.records[i]['レコード番号'].value);
        }
      }
      // ※ ここで return した値は次の then の関数の引数 resp4 に渡せる
    });
  })
  .then((resp4) => {
    //②削除データがある場合、アプリB削除
    if (delList.length > 0) {
      const dbody = {
        app: meisaiAppId,
        ids: delList,
      };
      // ※ kintone.api は Promise を返すのでここの処理が終わったら次の then が実行
      return kintone
        .api(kintone.api.url('/k/v1/records', true), 'DELETE', dbody)
        .then(
          function (resp4) {
            console.log('削除完了');
            // ※ ここで return した値は次の then の関数の引数 resp5 に渡せる
          },
          (error) => {
            console.log(error);
          }
        );
    }

    // ※ return しなければ resp5 = undefined が設定されて次の then が実行
  })
  .then((resp5) => {
    //③今回の処理 アプリAの情報をアプリBに登録
  }));

```

参考：[プロミスの使用 - MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Using_promises)

以上になります。何か不明な点がありましたら、気兼ねなくご質問ください。

&nbsp;

---

<div class="post-metadata">

**Author:** ![Legacy\_Account833](https://avatars.discourse-cdn.com/v4/letter/l/9de0a6/32.png) [@Legacy\_Account833](https://community.cybozu.dev/u/Legacy_Account833)\
**Post date:** [2022 年 10 月 28 日午前 1:57 UTC](https://community.cybozu.dev/t/topic/1088/7 "2022-10-28T01:57:43Z")

</div>

川村様

お世話になります。

詳しい説明、ありがとうございます！

returnが全部抜けていたせいなんですね！追加したらちゃんと動作してくれました。

やっと次に進めます～(泣）ありがとうございました★

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex015/uploads/cybozu/original/1X/d5c841c3c5a6cb66eed514001c1b45147c9e1f4f.png) [@system](https://community.cybozu.dev/u/system)\
**Post date:** [2024 年 6 月 3 日午前 6:25 UTC](https://community.cybozu.dev/t/topic/1088/8 "2024-06-03T06:25:52Z")

</div>

クローズされました: 2024 年 6 月 3 日午前 6:25 UTC

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