kintoneでRDBのように複数アプリからデータを取得するサンプル

kintoneのカスタマイズをしていると、多くの方がRDB(リレーショナルデータベース)でない点で何かしらの問題にぶつかると思います。そこで、APIを利用して、複数のアプリ(テーブル)から共通するキーを利用して紐づけるJavaScriptを作りました。

今回の想定イメージ

顧客管理システムのようなもので、企業情報に先方担当者や案件情報が紐づくようなシステムで、
任意のレコード番号の企業に紐づく、先方担当者・案件情報を取得するプログラム例です。

アプリ1「企業情報」 ⇒ 親アプリ。子アプリとはレコード番号で紐づいている。
アプリ2「先方担当者」 ⇒ 子アプリ。「企業ID」で企業情報アプリと紐づいている。
アプリ3「案件情報」 ⇒ 子アプリ。「企業ID」で企業情報アプリと紐づいている。

取得する企業情報のレコード番号 1001、1002、1003

var appId_1 = 1; // 企業情報のアプリID
var appId_2 = 2; // 先方担当者のアプリID
var appId_3 = 3; // 案件情報のアプリID

var arr =[];
var arr_ids =[];
var query_src = '$id in ("1001","1002","1003") ';

fetchRecords ( appId_1, query_src )
.then(function(result1) {
	arr['企業'] = result1;
	// 親テーブルの紐づけキーを配列に取得
	for (var i = 0 ; i < arr['企業'].length ; i++){
	arr_ids.push( arr['企業'][i].$id.value );
}
	return fetchRecords ( appId_2, '企業ID in (' + arr_ids + ') ');

}).then(function(result2) {
	arr['担当者'] = result2;
	return fetchRecords(appId_3, '企業ID in (' + arr_ids + ') ');

}).then(function(result3) {
	arr['案件']= result3;

	var marge_arr = arr['企業'];
	for (var i = 0 ; i < arr['企業'].length ; i++){
		marge_unit(marge_arr[i],arr,'$id','担当','企業ID');
		marge_unit(marge_arr[i],arr,'$id','案件','企業ID');
	}

});




/*
=================================================
2テーブルの結合関数
=================================================
■引数
marge_arr_i :マージ結果を保存する配列(対象の1レコードのみ)
arr :取得した全データ
parent_key :親テーブル側の紐づけキー
child_table :マージ対象の子テーブルの名前(「ビル」と「フロア」であれば「フロア」)
child_key :子テーブル側の紐づけキー
*/
function marge_unit ( marge_arr_i, arr, parent_key, child_table, child_key ) {
	marge_arr_i[child_table] = [];
	// 子テーブルの各レコードについて、紐づけキーが合致したら、当該親テーブルの指定するフィールドへ配列を追加
	for ( var j = 0 ; j < arr[child_table].length ; j++ ) {
		if ( marge_arr_i[parent_key]['value'] == arr[child_table][j][child_key]['value'] ) {
			marge_arr_i[child_table].push( arr[child_table][j] );
		}
	}
}


//レコード取得
function fetchRecords ( appId, query_src, opt_offset, opt_limit, opt_records ) {
	var offset = opt_offset || 0;
	var limit = opt_limit || 500;
	var allRecords = opt_records || [];
	var params = { app: appId, query: query_src + ' limit ' + limit + ' offset ' + offset } ;
	return kintone.api ( '/k/v1/records', 'GET', params ).then( function ( resp ) {
		allRecords = allRecords.concat ( resp.records ) ;
		if ( resp.records.length === limit ) {
			return fetchRecords ( appId,query_src,offset + limit, limit, allRecords ) ;
		}
		return allRecords ;
	});
}


シェアする

  • このエントリーをはてなブックマークに追加

フォローする