サブテーブルのデータを別アプリで取得する方法

現在受注履歴アプリAと注文商品集計アプリBを用意しています。

アプリBは毎日前日の日付で手動でレコードを追加し、

その際に、アプリAの同じ日付の受注レコードの商品データ(サブテーブル)から、商品名と商品コード、個数を抜き出して、アプリBにサブテーブルとして登録したいと思っています。

アプリAには1注文1レコードで登録されていて、アプリBに登録する際に、商品コードが同じものについては個数が合算されるようにしたいです。

 

アプリAのサブテーブルの項目は下記のようになっていてます。

商品コード|商品名|出荷区分|価格|利益|個数|販売額|利益合計

 

ここから商品名と商品ID、個数を抜き出しアプリBのサブテーブルに登録したいのですが、どうすればいいのかわからず、サンプルコードなどあれば教えて頂ければ幸いです。

 

アプリBのフィールドは

日付、注文商品テーブルのみのシンプルなものです。

 

okaさん、こんにちは。

以下のようなコードをアプリBに入れればいけると思います。

 

流れは、アプリBの日付を変更した際にイベントが発生し、アプリAから同日付のデータを取得します。

取得する際に、同じ商品コードがあれば、個数を合算していくように処理しています。

最後に商品コード別にまとめたデータを、アプリBのサブテーブルに追加します。

 

※[“日付”]や[“テーブル”]などとなっている部分はフィールドコードを入れてください。

(function() {
    "use strict";
    kintone.events.on(["app.record.create.change.日付", "app.record.edit.change.日付"], function(e) {
        var date = e.record["日付"].value;

        // アプリAから取得したデータ格納用
        var orderdatas = {};
        var body = {
            'app': 0000, // アプリAのアプリID
            'query': '日付 = "' + date + '"'
        }

        kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body, function(resp) {
            resp.records.forEach(function(record) {
                var Table = record["テーブル"].value;

                for (var t = 0; t < Table.length; t++) {
                    var code = Table[t].value["商品コード"].value;
                    var name = Table[t].value["商品名"].value;
                    var num = Table[t].value["個数"].value;

                    // 同じ商品コードは、個数をプラスしていく
                    if (orderdatas[code]) {
                        var Num = Number(orderdatas[code]["個数"]) + 1;
                        orderdatas[code] = {
                            "商品コード": code,
                            "商品名": name,
                            "個数": Num
                        }
                    }
                    else {
                        orderdatas[code] = {
                            "商品コード": code,
                            "商品名": name,
                            "個数": Number(num)
                        }
                    }
                }
            });
            setData();
        });

        function setData() {
            var record = kintone.app.record.get().record;
            var TableB = record["テーブル"].value;
            var index = TableB.length - 1;

      // テーブル初期化
            for (var i = 0; i <= index; i++) {
                TableB.splice(0, 1);
            }

      // 取得したデータを追加
            for (var key in orderdatas) {
                TableB.push({
                    value: {
                        "商品名": {value: orderdatas[key]["商品名"], type: "SINGLE_LINE_TEXT"},
                        "商品コード": {value: orderdatas[key]["商品コード"], type: "SINGLE_LINE_TEXT"},
                        "個数": {value: Number(orderdatas[key]["個数"]), type: "NUMBER"}
                    }
                });
            }
            kintone.app.record.set({record: record});
        }
    });
})();

Ryokke様

 

サンプルコードありがとうございます!

教えて頂いたコードを参考にさせていただき、思っている動きができました。本当にありがとうございました!

 

それで、一点追加で教えてほしいのですが、このコードの場合は日付を変えないとデータを取得できないのですが、

レコードを新規に追加したときや編集して保存したときに取得するようにできないでしょうか?

kintone.events.on([“app.record.create.change.日付”, “app.record.edit.change.日付”], function(e)

この部分を

kintone.events.on([‘app.record.edit.submit’, ‘app.record.create.submit’], function(e)

にするとデータがすべてない状態で保存されてしまいます。

(保存が完了する前に一瞬だけデータが表示されて、保存完了時にテーブルの内容がすべてなくなってしまいます。)

 

お手数おかけして申し訳ないのですが、ご教授いただければ幸いです。

 

 

恐らく、最後の処理までいかずに保存が完了してしまっているんだと思います。

以下のようにしてはどうでしょうか?

(function() {
"use strict";

kintone.events.on(["app.record.edit.submit", "app.record.create.submit"], function(e) {
var record = e.record;
var date = record["日付"].value;
var orderdatas = {};

var body = {
'app': 1003, // アプリAのアプリID
'query': '日付 = "' + date + '"'
}

return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body).then(function(resp) {
resp.records.forEach(function(record) {
var Table = record["テーブル"].value;

for (var t = 0; t < Table.length; t++) {
var code = Table[t].value["商品コード"].value;
var name = Table[t].value["商品名"].value;
var num = Table[t].value["個数"].value;

// 同じ商品コードは、個数をプラスしていく
if (orderdatas[code]) {
var Num = Number(orderdatas[code]["個数"]) + 1;
orderdatas[code] = {
"商品コード": code,
"商品名": name,
"個数": Num
}
}
else {
orderdatas[code] = {
"商品コード": code,
"商品名": name,
"個数": Number(num)
}
}
}
});
return setData();
});

function setData() {
var TableB = record["テーブル"].value;
var index = TableB.length - 1;

      // テーブル初期化
for (var i = 0; i <= index; i++) {
TableB.splice(0, 1);
}

      // 取得したデータを追加
for (var key in orderdatas) {
TableB.push({
value: {
"商品名": {value: orderdatas[key]["商品名"], type: "SINGLE_LINE_TEXT"},
"商品コード": {value: orderdatas[key]["商品コード"], type: "SINGLE_LINE_TEXT"},
"個数": {value: Number(orderdatas[key]["個数"]), type: "NUMBER"}
}
});
}
return e;
}
});
})();

 

 

ご返信が遅くなり申し訳ございませんでした。

ご教授いただいた内容でうまく動くようになりました。

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

上記のコードで正常に動作していたのですが、

日ごとでなく月ごとの集計にしようと検索条件を変更したら、100件分しかデータが取得できないようで、

どうすれば取得件数を増やすことができるのか教えて頂ければ幸いです。

 

kintone.events.on([“app.record.edit.submit”, “app.record.create.submit”], function(e) {
var record = e.record;
var date = record[“日付”].value;
var orderdatas = {};

var body = {
‘app’: 1003, // アプリAのアプリID
‘query’: ‘日付 = "’ + date + ‘"’
}

  kintone.events.on([“app.record.create.change.日付2”, “app.record.edit.change.日付2”], function(e) {
var f_date = e.record[“日付”].value;
var b_date = e.record[“日付2”].value;

var orderdatas = {};
var body = {
‘app’: ●●, // アプリAのアプリID
‘query’: ‘注文日 >= "’ + f_date + ‘" and 注文日<= "’ + b_date + ‘"’
}