複数レコードの更新について

AのテーブルとBのテーブルで同じPK項目に対してN:Nの更新を行いたいのですが、KINTONEAPIを使用すると非同期のため最後の項目のみ更新する状態になってしまいます。

Promiseを使用しても現象変わらずです。

この場合、どのようなロジックを組んだらよろしいでしょうか。

アドバイスをいただけたらと思います。

 

以下サンプルソースです。

(function() {
“use strict”;
kintone.events.on(‘app.record.index.show’, function(event) {
    if (document.getElementById(‘my_index_button’) !== null) {
    return;
    }

    var myIndexButton = document.createElement(‘button’);
    myIndexButton.id = ‘my_index_button’;
    myIndexButton.innerHTML = ‘取込実行’;

    // ボタンクリック時の処理
    myIndexButton.onclick = function() {
        // 更新処理
        set_Kousin();
    };

    kintone.app.getHeaderMenuSpaceElement().appendChild(myIndexButton);
});

//**************************************
// 登録処理
//**************************************
function set_Kousin(){

// 顧客情報アプリのアプリID
var updateAppId = 42;
// リクエストパラメータ
var requestParam = {
    ‘app’: kintone.app.getId()
};

//更新対象取得
kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, requestParam, function(resp)
{
    var records = resp.records;
    if (!records || !records.length) {
    window.alert(‘取り込むレコードがありません’);
    return;
}

// データごとに処理
for (var i = 0; i < records.length; i++) {
var record =records[i];
// リクエストパラメータ
var requestParam2 = {
    ‘app’: updateAppId,
    ‘query’: "ID = " + record.ID.value
};
//更新先データ取得
kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, requestParam2, function(resp2) {
    var records2 = resp2.records;
    if (!records2 || !records2.length) {
        // 新規
        set_Insert(updateAppId,record);
    }
    else
    {
        // 更新対象のレコード番号取得のため
        var record2 = records2[0];
        // 更新
        set_Update(updateAppId,record,record2.レコード番号.value);
        }
    });
    }
    });
}

//**************************************
// データチェック
//**************************************
function CheckData(updateAppId,record){
var result = 1;
// リクエストパラメータ
var requestParam = {
    ‘app’: updateAppId,
    ‘query’: "ID = " + record.ID.value
};
//更新先データ取得
return new kintone.Promise(function(resolve, reject) {
kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, requestParam, function(resp) {
    var records2 = resp.records;
    if (!records2 || !records2.length) {
    result = 0;
}
else
{
    result = records2[0].レコード番号.value;
}
    resolve(result);
});
});
}

//**************************************
// 新規(POST)
//**************************************
function set_Insert(updateAppId,record){
// 必要情報セット
var body = {
    “app”: updateAppId,
    “record”:{
    “ID”:{“value”:record.ID.value}
    ,“PK”:{“value”:record.得意先CD.value + ‘_’ + record.事業所CD.value}
    ,“得意先CD”:{“value”:record.得意先CD.value}
    ,“事業所CD”:{“value”:record.事業所CD.value}
    ,“得意先名”:{“value”:record.得意先名.value}
    }
};

// 更新
kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘POST’, body, function(resp) {
    // success
    console.log(resp);
    location.reload();
    }, function(resp) {
    // error
    window.alert(‘取込に失敗しました。’);
    console.log(resp);
    return;
});
}

//**************************************
// 更新(PUT)
//**************************************
function set_Update(updateAppId,record,id){

// 必要情報セット
var body = {
    “app”: updateAppId,
    “id”: id,
    “record”:{
    “ID”:{“value”:record.ID.value}
    ,“PK”:{“value”:record.得意先CD.value + ‘_’ + record.事業所CD.value}
    ,“得意先CD”:{“value”:record.得意先CD.value}
    ,“事業所CD”:{“value”:record.事業所CD.value}
    ,“得意先名”:{“value”:record.得意先名.value}
    }
};

// 更新
kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘PUT’, body, function(resp) {
    // success
    console.log(resp);
    location.reload();
}, function(resp) {
    // error
    window.alert(‘取込に失敗しました。’);
    console.log(resp);
    return;
    });
}
})();

Toshihiro.M さん

for ループ内で、単純に kintone.api 呼び出しを行うと、kintone.api の完了を待たずに、ループが進んでいきます。

こういう場合は、for ループでは無く、api 完了後に、再起呼び出しで順番に処理します。

参考 kintone.Promiseオブジェクトを使った方法に書き換える

 

ただし、今回のような場合は、全レコード数分のAPI発行になりますので、まとめてレコード取得、まとめて追加・更新を行った方がよいと思われます。

kintone Utility for JavaScript を使ってみたよ が参考になると思います。

kintoneUtility.rest.upsertRecords で、複数のレコードを登録もしくは更新が出来ます。

rex0220 さま

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

そのような機能があるとは知りませんでした。

上記を参考にしてチャレンジいたします。