3種類のアプリのレコードのGET、JOINの方法

Kintoneの3つの別のアプリから必要な情報を集めて

外部のWebAPIへPOSTしようと思っています

更新登録時はうまく動作しますが、

新規登録時が動作しません・・・

 

新規登録時は会社情報の取得まで到達していないような動きです

PromiseがReturn されて、処理が終了している??

新規登録時は登録後、レコード一覧画面へ遷移しますが、

編集画面はレコードの詳細画面のままで遷移しないことが原因でしょうか?

 

色々と試してみましたが、行き詰まりました。

どなたかご教授いただけないでしょうか??

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

 


参照ライブラリ:alasql.min.js, CybozuLabs.js, https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js


var obj = {};
var ContractApp = appId[0];
var CompanyApp = appId[1];
var PersonApp = appId[2];
var Contractno = 0

console.log(PersonID);

// 人名情報取得
fetchRecords(PersonApp, "$id = " + PersonID).then(function(records) {

obj.rs1 = convertToRows(records);
console.log(‘rs1’, JSON.stringify(obj.rs1));

return obj.rs1[0].record_company

}).then(function(recordCompany) {

if (recordCompany>0) {

// 会社情報取得
return fetchRecords(CompanyApp, "record_company = " + recordCompany).then(function(records1) {

obj.rs2 = convertToRows(records1);
console.log(‘rs2’, JSON.stringify(obj.rs2));
if (convertToRows(records1).length != 0) {
return fetchRecords(ContractApp, "ContractNo = " + obj.rs2[0].ContractNo).then(function(records) {
if (records.length != 0) {
obj.rs3 = convertToRows(records);
console.log(‘rs3’, JSON.stringify(obj.rs3));
return obj;
}
});
}

}).then(function() {

var result = “”
var SqlFlg = 0
// 場合に応じたクエリで結果を取得
for (var temp in obj){
switch(temp){
case ‘rs1’: if (SqlFlg == 0) SqlFlg = 1; break;
case ‘rs2’: if (SqlFlg < 2) SqlFlg = 2; break;
case ‘rs3’: if (SqlFlg < 3) SqlFlg = 3; break;
}
}
switch(SqlFlg){
case 1: result = alasql(“SELECT * FROM ? AS Person” , [obj.rs1]); break;
case 2: result = alasql(“SELECT * FROM ? AS Person LEFT JOIN ? AS Company ON Company.record_company = Person.record_company” , [obj.rs1, obj.rs2]); break;
case 3: result = alasql(“SELECT * FROM ? AS Person LEFT JOIN ? AS Company ON Company.record_company = Person.record_company LEFT JOIN ? AS Contract ON Company.ContractNo = Contract.ContractNo” , [obj.rs1, obj.rs2, obj.rs3]); break;
}

console.log(‘result’, JSON.stringify(result));

for (var i = 0, l = result.length; i < l; i++) {
console.log(result[i]);
};

}).catch(function(reason){
console.log(reason)
});

}
});


// アプリのレコードを取得する関数
function fetchRecords(appId, opt_where, opt_fields, opt_offset, opt_limit, opt_records) {

var where = opt_where || ‘’;
var offset = opt_offset || 0;
var limit = opt_limit || 100;
var allRecords = opt_records || [];
console.log(“offset =” + offset +", limit = " + limit);

var params = {app: appId, query: where + ’ limit ’ + limit + ’ offset ’ + offset};
if (opt_fields) params.fields = opt_fields;
return kintone.api(‘/k/v1/records’, ‘GET’, params).then(function(resp) {
allRecords = allRecords.concat(resp.records);
if (resp.records.length === limit) {
return fetchRecords(appId, where, opt_fields, offset + limit, limit, allRecords);
}
else{
return allRecords;
}
});

}

function convertToRows(records) {
var rows = records.map(function(record){
var keys = Object.keys(record);
var row = {};
keys.map(function(key){
row[key] = record[key].type === ‘NUMBER’ ? Number(record[key].value) : record[key].value;
});
return row;
});
return rows;
}

 

Ryo Saidoさん

 

こんにちは。

下記3点ほど確認して頂いて追加情報頂けるでしょうか。

 

1.エラーハンドリングを追加する
fetchRecords(PersonApp, "$id = " + PersonID).then(function(records) {

}).then(function(recordCompany) {

}).catch(function(reason) { // ← 追加する
console.log(reason)
});

2.「PersonID」はは新規作成の場合も値は入ってきますか?

3.then(function(){})の引数が空となっている

// 会社情報取得
return fetchRecords(CompanyApp, "record_company = " + recordCompany).then(function(records1) {

obj.rs2 = convertToRows(records1);
console.log(‘rs2’, JSON.stringify(obj.rs2));
if (convertToRows(records1).length != 0) {
return fetchRecords(ContractApp, "ContractNo = " + obj.rs2[0].ContractNo).then(function(records) {
if (records.length != 0) {
obj.rs3 = convertToRows(records);
console.log(‘rs3’, JSON.stringify(obj.rs3));
return obj ; // ← ここの値が
}
});
}

}).then(function() { // ← ここに入ってきていない

var result = “”
var SqlFlg = 0
// 場合に応じたクエリで結果を取得
for (var temp in obj) {