関連レコードの集計について

お世話になっております。

関連レコードの集計についてご教授いただきたく投稿させていただきました。

 

・案件アプリというものを作成して、「年度」「案件名」「顧客名」「案件担当者」「売上予定月」「予定売上」「予定原価」「予定利益」を記入しています。

・集計アプリというものを作成し、「年度」をレコード条件として関連レコードを抽出し、絞り込み条件で「売上予定月」を設定し、4月~3月まで12個の売上予定月別関連レコードを表示しています。

・「予定売上」「予定原価」「予定利益」を月別に表示していますが、それぞれの月別合計を数値フィールドに表示したいと思っています。

クロス集計表を使えば3つの集計のうち1つは表示することもできますが全体像が把握しにくいのでなんとか実現させたいと思っています。

すでに抽出済みの関連レコードを列ごとに集計できる方法をご教授お願いいたします。

 

 

 

やるしかないんだ!様

お世話になっております。
cstapの江田です。

関連レコードの値を扱う場合は、「records.json」を用いてqueryに関連レコードの条件と一致するような記述をしてGETするのが一般的です。
ちょうど関連レコードのフィールドの合計値を求めているサンプル記事があるのでリンクを載せておきます。
関連レコードの項目を条件付きで集計

上記記事では「XMLHttpRequest」を用いていますが、現在非推奨とされているため「kintone.api」を用いることをお勧めします。
kintone API で Promise を使ってみよう!

江田様

いつも丁寧にアドバイスいただきましてありがとうございます。

ご教授いただきましたサンプル記事は以前から試してはいるのですが、どうも機能しません。

 

(function() {
"use strict";

//レコードの編集、詳細画面で適用する
var events = [
'app.record.detail.show',
'app.record.edit.show'
]
kintone.events.on(events, function(event) {
var record = event.record;
var client_rid = event.recordId;
var related = kintone.app.getRelatedRecordsTargetAppId('関連レコード一覧4'); **//←アプリ取得**
var offset = 0;
var loop_end_flg = false;
var records = new Array();
while(!loop_end_flg){
var query = 'レコード番号="' + client_rid +
'" and ドロップダウン in ("4月")' +  **//←参照先のフィールドコード「ドロップダウン」が「4月」の場合**
'" limit 100 offset ' + offset;
query = encodeURIComponent(query);


var appUrl = kintone.api.url('/k/v1/records') + '?app='+ related + '&query=' + query;

// 同期リクエストを行う
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("GET", appUrl, false);
xmlHttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
xmlHttp.send(null);

//取得したレコードをArrayに格納
var resp_data = JSON.parse(xmlHttp.responseText);

if(resp_data.records.length > 0){
for(var i = 0; resp_data.records.length > i; i++){
records.push(resp_data.records[i]);
}
offset += resp_data.records.length;
}else{
loop_end_flg = true;
}
}

var amount = 0;
for (var i = 0; i < records.length; i++) {
amount = amount + parseFloat(records[i].予定売上.value); **//←参照先のフィールドコード「予定売上」「予定原価」「予定利益」のうち「予定売上」**
}

var divTotalAmount = document.createElement('div');
divTotalAmount.style.fontWeight = 'bold';
divTotalAmount.style.textAlign = 'right';
divTotalAmount.style.fontSize = 12;
var wString = String(amount.toFixed(0).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,'));
divTotalAmount.innerHTML = "\\" + wString + "-";
kintone.app.record.getSpaceElement("TotalAmount4").appendChild(divTotalAmount); **//←表示したいスペース名「TotalAmount4」**  
  
return event;

});
})();

と記述しましたがスペースには何も表示されず、

'" and ドロップダウン in ("4月")' +

を削除すると「\0-」と表示される状態です。

「kintone.api」を用いていないことが原因なのでしょうか?

やるしかないんだ!様

お世話になっております。

返信遅くなりました。

レコード番号の条件が不要なのではないでしょうか?

var query = 'ドロップダウン in ("4月")' +  **//←参照先のフィールドコード「ドロップダウン」が「4月」の場合**
'" limit 100 offset ' + offset;

江田様

度々親切にアドバイスいただきましてありがとうございます。

本日時間が取れたのでいろいろいじってみました。

(function() {
"use strict";

//レコードの編集、詳細画面で適用する
var events = [
'app.record.detail.show',
'app.record.edit.show'
]
kintone.events.on(events, function(event) {
var record = event.record;
var client_rid = event.recordId;
var related = kintone.app.getRelatedRecordsTargetAppId('関連レコード一覧4'); **//←アプリ取得**
var offset = 0;
var loop_end_flg = false;
var records = new Array();
while(!loop_end_flg){
var query = '年度設定="' + client_rid + '" limit 100 offset ' + offset;
query = encodeURIComponent(query);


var appUrl = kintone.api.url('/k/v1/records') + '?app='+ related + '&query=' + query;

// 同期リクエストを行う
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("GET", appUrl, false);
xmlHttp.setRequestHeader('X-Requested-With','XMLHttpRequest');
xmlHttp.send(null);

//取得したレコードをArrayに格納
var resp_data = JSON.parse(xmlHttp.responseText);

if(resp_data.records.length > 0){
for(var i = 0; resp_data.records.length > i; i++){
records.push(resp_data.records[i]);
}
offset += resp_data.records.length;
}else{
loop_end_flg = true;
}
}

var amount = 0;
for (var i = 0; i < records.length; i++) {
amount = amount + parseFloat(records[i].予定売上.value); **//←参照先のフィールドコード「予定売上」「予定原価」「予定利益」のうち「予定売上」**
}

var divTotalAmount = document.createElement('div');
divTotalAmount.style.fontWeight = 'bold';
divTotalAmount.style.textAlign = 'right';
divTotalAmount.style.fontSize = 12;
var wString = String(amount.toFixed(0).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,'));
divTotalAmount.innerHTML = "\\" + wString + "-";
kintone.app.record.getSpaceElement("TotalAmount4").appendChild(divTotalAmount); **//←表示したいスペース名「TotalAmount4」**  
  
return event;

});
})();

ご指摘の通り、+ '" and ドロップダウン in ("4月")'を消すと「TotalAmount4」スペースには「 **\0-** 」と表示され、
+ '" limit 100 offset ' + offset;を消すと何も表示されなくなりました。
何かを見落としているのか一通りチェックしましたがお手上げです。
関連レコードを表示する条件として
「年度設定」が「2018」の場合でさらにドロップダウンが「4月」と設定しています。

↓集計アプリ


過去の質問も参照すると同様に「 **\0-** 」で**[悩まれている方](/hc/ja/community/posts/115020417683-%E9%96%A2%E9%80%A3%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E9%A0%85%E7%9B%AE%E3%82%92%E9%9B%86%E8%A8%88)**もいるようです。
もうすこし試行錯誤してみようと思いますが、もしお気づきのことがありましたらアドバイスいただければ助かります。

やるしかないんだ!様

お世話になっております。

○○=client_rid
という部分が不要なので、
var query = ‘ドロップダウン in (“4月”)’ + //←参照先のフィールドコード「ドロップダウン」が「4月」の場合
'" limit 100 offset ’ + offset;
に書き換えたら上手くいくのではと提案したつもりでした。

伝わりにくい表現でごめんなさい。

江田様

何度もアドバイスいただきましてありがとうございます。

こちらこそ素人すぎて理解出来ず申し訳ありませんでした。

ご指摘の部分等いろいろ何度も試してみましたが、やはりうまく表示できないので

今年度はkintoneでの売上管理を諦めることになりました。

貴重なお時間を無駄にしてしまいまして申し訳ありませんでした。