for文内でのGET処理について

下記2つのアプリを作成しています。

アプリ①:案件管理

アプリ②:受注書

1つの案件について、受注書が複数登録されます。

 

案件管理アプリに案件合計金額という項目があり、

受注書アプリには受注書金額があり、

案件管理アプリ:案件合計金額=(受注書アプリ:受注書金額)の合計 となる想定です。

 

上記金額チェックを案件管理アプリの一覧が表示されたときに登録されているデータ全て(ステータスが未完了のデータ)に対して実行し、

その結果(○、×)を案件管理のデータに更新をしたいと思っております。

 

処理としては、

①一覧画面のデータ分ループ処理(for文(以下、②③④⑤の処理を繰り返し実行))

②案件管理のステータス判定(未完了の場合は、③④⑤を実行)

③案件に関する受注書アプリのデータを取得(GET)

④金額チェック

⑤チェック結果に応じて、案件管理データを更新(PUT)

のように考えておりますが、

処理の順番が思っているのと違うようで、④のチェックがうまく出来ない状況です。

 

ソースは下記のように記述しています。

kintone.events.on(‘app.record.index.show’, function(event) {

var recs = event.records;

for (var i = 0; i < recs.length; i++) {
var rec = recs[i];
if ( rec[‘ステータス_’][‘value’] == ‘未完了’) {
var param = {
app: 37,
query: '案件管理番号 = ’ + rec[‘案件管理番号’][‘value’]
};

kintone.api(‘/k/v1/records’, ‘GET’, param,
function(resp) {

取得した受注書データの受注書金額を合計

案件管理データの案件合計金額(rec['案件合計金額']['value'])と(受注書金額の合計)を判定

※※この判定がうまくいかない

判定結果により、PUT

}, function(resp) {

 エラー処理

});

 

デバックで見ると、for文のループだけ先にしてしまい、

for文が終わった後に、for文のループ回数分、REST API の処理をしているようです。

 

色々と調べて、PROMISEを使うと処理順を制御できるようなのも見たのですが、

どのようにすればよいのかよくわかりませんでした。。

 

どのようにすればよいのかご教示頂けないでしょうか。

よろしくお願い致します。

 

加藤雅之さま

やりたいことは理解できるのですが、アルゴリズムそのものを再検討していただいたほうがいい気がします。

というのも、これだと、表示しているのが100件であればGETとPUTで合計200回のAPIリクエストが発生することになりますよね?

1アプリあたり、1日で10000リクエストという上限値をあっという間に超えてしまいそうな気がするのですが…

こういうリレーショナルな処理は、kintoneは苦手ですね。。。

javascriptで動くSQL(たとえば↓みたいなもの)を使った方がいい気がしますが。

https://qiita.com/rex0220/items/d1030b293c1021d28750

milkyway0307 様

 

投稿ありがとうございます。

>1アプリあたり、1日で10000リクエストという上限値をあっという間に超えてしまいそうな気がするのですが…

このことをまったく考えておりませんでした。(認識していませんでした。。)

 

案件管理の一覧が表示されるたびにこの処理をするのも無駄な気がしますので、

受注書アプリのデータが保存された後に、案件管理の項目を更新する処理にしようと思います。

 

教えて頂いたjavascriptで動くSQLも勉強のため、参考にさせて頂きます。

 

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