他アプリへのサブテーブル追加

アプリAのレコード内に利用品IDフィールドとサブテーブル(日付・数・利用者名(ルックアップ)・利用者ID)があり、各行に異なる利用者名・利用者IDが入っています。
アプリBのレコード内には、利用者ID・利用者名フィールドとサブテーブル(日付・利用品ID(ルックアップ)・数)があります。

アプリA側でプログラムを走らせ、
アプリAのサブテーブル内の利用者IDとアプリBの利用者IDフィールドが一致すれば、アプリAの一致した利用者IDがある行をアプリBのサブテーブルに追加する処理を作成しております。

基本的には意図した通り動くのですが、時々アプリBに一致する利用者IDがあるのに追加されないでそのまま次の行に行ってしまうことがあります。
await / async を使って非同期処理の対応はしているつもりなのですが、不十分なのでしょうか。

プログラム的にはアプリAのサブテーブルの行数分forで回し、一致する利用者ID行があれば都度PUTするといった形です。(効率悪いですが)

どこが間違っているかお教えいただけると助かります。

//shipがアプリAのテーブル

for (var i = 0; i < ship.length; i++) {

                                    let userID = ship[i].value[‘利用者ID’].value;

//アプリBにuserIDと同じ利用者IDがあるか確認する

                                    const paramforGet = {

                                        ‘app’: APP_B, //アプリB

                                        ‘query’: query,

                                    };

 

                                    const get_resp = await kintone.api(kintone.api.url(‘/k/v1/records’,true), ‘GET’, paramforGet);

                                        //console.log(get_resp);

 

                                    if (!get_resp.records.length) {

                                        //なければ何もしない

 

                                    } else { //あればアプリA→アプリBへその行だけサブテーブルに追加する

                                        let appended_subtable = [];

                                        let subtable = [];

                                        const sellItemTable = get_resp.records[0][“販売品”].value;

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

                                            subtable.push(sellItemTable[m]);

                                        };

 

                                        subtable.push({

                                            “value”: {

                                                “販売品_日付”: {

                                                    “value”: ship[i].value[‘出庫日付’].value

                                                },

                                                “販売品利用数”: {

                                                    “value”: ship[i].value[‘出庫数’].value

                                                },

                                                “利用品ID_販売品”: {

                                                    “value”: record.利用品ID.value,

                                                    “lookup”: true

                                                },

                                            }

                                        });

                                        const sellItemPut = {

                                            “app”: userItem,

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

                                            “record”: {

                                                “販売品”: {

                                                    “value”: subtable

                                                }

                                            }

                                        };

 

                                        appended_subtable.push(sellItemPut);

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

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

                                        put_record[“販売品”] = {

                                            value: subtable

                                        };

 

                                        const put_resp = await kintone.api(kintone.api.url(“/k/v1/record.json”, true), “PUT”, sellItemPut);

                                    };

                                };

let userID = ship[i].value['利用者ID'].value;
//アプリBにuserIDと同じ利用者IDがあるか確認する
const paramforGet = {
    'app': APP_B, //アプリB
    'query': query,
};

この部分のqueryはどうなっていますか?恐らくここは「‘アプリBの利用者ID = "’ + userID + ‘"’」となっているのではないかと思いますが、全文がないため判別できません(userIDは宣言されているものの、どこにも使われていません)。

また、

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

ここでサブテーブルの値(subtable)にPUTのリクエストボディ(sellItemPut)を追加しているようです。
その後のput_recordが何も使われないのであれば問題ないと思いますが、何かに使われている場合エラーになると思われます。

mls-hashimoto 様

 

ご回答ありがとうございます。

queryの中は
年 in (“’ + year + '”) and 月 in (“’ + month + '”) and 利用者ID = “’ + userID + '” order by 利用者ID asc limit 500

となっております。
年・月は別ボタンを用意してそこから入力する形としております。

put_recordに関しては記述しているところ以外では使用しておりません。
コンソール画面にもエラーなどは特に出ていない状況です。

daikonsan さま

更新ができないのは必ず決まったレコードの決まった行でしょうか?他に考えられる原因として

①ルックアップに問題がある
他のAPIは成功しているため可能性としてはありませんが、ルックアップをAPIで更新する場合は登録元のフィールドを重複禁止に設定しておく必要があります。

②レコードが取得できていない
if (!get_resp.records.length) {…}があるので、この判定文の中でalert等を出すと良いかもしれません。

③APIを1件ずつ行うのに問題がある
行数によりますが簡単に同時リクエストの上限に達することはないのでこちらも可能性としては低いですが、レコードの一括更新 等を使ってリクエストをまとめた方が良いかもしれません(その場合はサブテーブル内に「同じレコードを更新する行」が複数あった場合等の対応も必要ですが…)。

④その他
コンソールにエラーが表示されているかもしれません。

 

見た限りコードやasync/awaitに問題があるようには見えません。

mls-hashimoto 

 

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

一部引用にて失礼します。

更新が出来ないのは決まったレコード、サブテーブル行ではなく常にランダムで発生します。

①ルックアップに問題がある

→ユニークなIDとして重複禁止で設定しておりますので、考えにくいかと思います。

 

②レコードが取得できていない

→反映出来なかった場合にこの中に入る可能性があるので、試してみます。ありがとうございます。

 

③APIを1件ずつ行うのに問題がある

→運用上、100件ないのであまりないかと考えております。別手段として一括更新の方向も検討してみます。

 

④その他

→実行~完了までコンソール上は特にエラーが出ておりませんでした。

 

コードに問題が無いとしたら、やはり1行ずつPUTする処理に問題があるのですかね…(法則性もなにもないので手探り状態です)

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