新規投稿
フォローする

kintoneの大量レコード挿入(数百件単位)に関しての不具合

kintoneにて大量レコード(数百件単位)を更新or挿入すると一部のレコードが更新
されないといったような状況がありえるでしょうか?

JavaScriptにおいてXMLHttpRequestを使用し、データの挿入、更新をおこなって
いますが、1000件近くのレコードの更新を行おうとしたところ、一部処理に失敗すると
いう事象が発生しました。

同じ処理を行ったところ入ったり、入らなかったりすることがあるので、
プログラムの瑕疵ではないと考えております。

このような現象について詳しい情報、対処法をお持ちの方がいれば教えていただけると
助かります。

0

7件のコメント

Avatar
落合 雄一

松本賀生様
cstapの落合です。

まず、データの登録/更新には、XMLHttpRequestではなくkintone.apiを利用することをお勧めいたします。
https://cybozudev.zendesk.com/hc/ja/articles/202166310

また、もしrecords.jsonで1レコードずつ処理を行っている場合は、records.jsonで一括処理されることをお勧めいたします。
https://cybozudev.zendesk.com/hc/ja/articles/202166160#step2
https://cybozudev.zendesk.com/hc/ja/articles/201941784#step2

次にプログラムについてですが、処理の流れとしてはfor文でrequestを行うような形でしょうか?
それとも、request成功のcallbackで次のrequestを行う形でしょうか?

前者の場合、非同期処理のためresponseが返ってくる前に次のrequestがどんどん投げられます。そのため、APIの同時アクセス数制限により希望の動作を得られない可能性があります。
https://www.cybozu.com/jp/service/restrictions.html

以上、ご参考になりますでしょうか?

0
Avatar
松本賀生

cstap
落合さま

いつも大変迅速なご回答ありがとうございます。

まず、データの登録/更新には、XMLHttpRequestではなくkintone.apiを
利用することをお勧めいたします。

ありがとうございます。
基本的にXMLHttpRequestを使うのはデータを取得する時だけですかね?
(kintone.apiの場合、取得したデータの同期的な処理ができないため。)

また、もしrecords.jsonで1レコードずつ処理を行っている場合は、>records.jsonで一括処理されることをお勧めいたします。
https://cybozudev.zendesk.com/hc/ja/articles/202166160
#step2
https://cybozudev.zendesk.com/hc/ja/articles/201941784
#step2

こちらも情報ありがとうございます。

次にプログラムについてですが、処理の流れとしてはfor文でrequestを行うよう>な形でしょうか?
それとも、request成功のcallbackで次のrequestを行う形でしょうか?

forで100件ずつ処理をしております。

こちらが原因ですかね。

前者の場合、非同期処理のためresponseが返ってくる前に次のrequest
がどんどん投げられます。そのため、APIの同時アクセス数制限により希望の動
作を得られない可能性があります。

なるほど!おそらくこちらが原因ですかね。

ということは大量データの登録もkintone.apiでrequest成功のcallbackで次のrequestを行えば問題ないという認識でよろしいでしょうか?

こちら早速試してみます。

いつも大変丁寧なレクチャーありがとうございます。

0
Avatar
落合 雄一

基本的にXMLHttpRequestを使うのはデータを取得する時だけですかね?
(kintone.apiの場合、取得したデータの同期的な処理ができないため。)

データの取得もkintone.apiを使ってください。
ajaxで処理を行う場合は、可能な限り非同期処理で実装した方が良いと思います。
同期処理にする場合は、一時的にブラウザをロックし、一切のアクションを受け付けなくなることに注意してください。

ということは大量データの登録もkintone.apiでrequest成功のcallbackで次のrequestを行えば問題ないという認識でよろしいでしょうか?

そう認識しております。

また何かありましたら、ご質問ください!

0
Avatar
松本賀生

落合さま

休日にもかかわらず丁寧なレクチャーありがとうございます。

いろいろ伺ってしまって申し訳ないのですが、

データの取得もkintone.apiを使ってください。
ajaxで処理を行う場合は、可能な限り非同期処理で実装した方が良いと思います。

ということですが、データの取り出しなどはrestAPIですと下記の場合undefinedに
なってしまいます。

var param={
"app":518,
"query": ' レコード番号 > "1460" and レコード番号 < "2000" order by レコード番号 asc limit 100 offset 0 '
};

var result;
kintone.api( "/k/v1/records.json?", "GET", param ,function(res){
result = res["records"];
},function(error){
result = false;
});

console.log(result); //非同期なためundefinedになる

他アプリからデータを取り出したい場合、落合さまはどのようにされていますでしょうか?
kintone.apiの中に処理をかけば終了なのですがこれだと外に変数を出すことができないので・・・

いろいろ伺って申し訳ありませんがご教授いただければ幸いです。

0
Avatar
落合 雄一

松本様

私はこんな感じで記述しています。
以下は、レコード番号が2000以下を全レコード取得し、そのcallbackで取得後の処理を記述しています。

(function() {
    "use strict";

    // レコード一覧画面
    kintone.events.on('app.record.index.show', function(event) {
        var manager = new KintoneRecordManager;
        manager.appId = 518;
        manager.query = 'レコード番号 < "2000"';
        manager.records = [];
        manager.getRecords(function(records) {
            console.log(records);
            // 行いたい処理
        });
    });

})();

/**
* Kintoneと通信を行うクラス
*/
KintoneRecordManager = (function() {
    KintoneRecordManager.prototype.query = '';

    KintoneRecordManager.prototype.records = [];

    KintoneRecordManager.prototype.appId = null;

    KintoneRecordManager.prototype.query = '';

    KintoneRecordManager.prototype.limit = 100;

    KintoneRecordManager.prototype.offset = 0;

    function KintoneRecordManager() {
        this.appId = kintone.app.getId();
    }

    // すべてのレコード取得する
    KintoneRecordManager.prototype.getRecords = function(callback) {
        kintone.api('/k/v1/records', 'GET', {
            app: this.appId,
            query: this.query + (' limit ' + this.limit + ' offset ' + this.offset)
        }, (function(_this) {
            return function(res) {
                var len;
                Array.prototype.push.apply(_this.records, res.records);
                len = res.records.length;
                _this.offset += len;
                if (len < _this.limit) {
                    _this.ready = true;
                    if (callback !== null) {
                        callback(_this.records);
                    }
                } else {
                    _this.getRecords(callback);
                }
            };
        })(this));
    };

    return KintoneRecordManager;
})();

以上、参考になりますでしょうか?

0
Avatar
松本賀生

落合さま

松本です。
サンプルコードまで丁寧に書いていただきありがとうございます。

大変レベルの高いソースで参考になります。

こちらを参考にkintoneApiでのレコードの取得、登録の
ソースを書いていこうと思います。

本当にいろいろとありがとうございました!

0
Avatar
落合 雄一

いえいえ(^^)
また、何かありましたらご質問ください!

0
サインインしてコメントを残してください。