我有一张包含这些值的表格:
var aTableData = [
{Product: "A", Sales:120, Group:"001"},
{Product: "A", Sales:82, Group:"002"},
{Product: "B", Sales:10, Group:"002"},
{Product: "C", Sales:14, Group:"001"},
{Product: "A", Sales:8, Group:"001"},
{Product: "A", Sales:39, Group:"001"},
{Product: "B", Sales:3, Group:"002"},
{Product: "C", Sales:2, Group:"001"},
{Product: "D", Sales:1002, Group:"003"},
];
我希望用户通过facetFilter分组选项来选择,就像在PowerPivot表中一样。例如,如果用户选择Product,则返回的表应如下所示:
var aTableData = [
{Product: "A", Sales:249},
{Product: "B", Sales:13},
{Product: "C", Sales:16},
{Product: "D", Sales:1002},
];
但是如果用户选择产品和组,则表格应如下所示:
var aTableData = [
{Product: "A", Sales:167, group: "001"},
{Product: "A", Sales:82, group: "001"},
{Product: "B", Sales:13, group: "002"},
{Product: "C", Sales:16, group: "001"},
{Product: "D", Sales:1002, group: "003"},
];
目前我只能过滤一个方面,过滤器只能工作一次(因为我覆盖了表格数据)。那么这个" PowerPivot"背后的逻辑应该怎么做?要过滤多于一个或两个值,是否可以使用过滤器和分组(因此我不需要覆盖表数据)?
我已将我的代码复制到jsbin。
答案 0 :(得分:1)
聚合绑定的分组不支持任何聚合函数,如sum。所以我想你必须自己做。
我建议使用$ .ajax调用(或使用专用模型)加载未聚合数据,并将其保存在控制器或组件的成员中。然后将您的数据与某些JavaScript行汇总到副本中,并将其分配给绑定表的JSONModel
。
使用这样的算法,您可以重用groupBy
函数:
var fnAggregate = function(aItems){
var result = aItems[0];
result.Sales = aItems.reduce(function(prev, curr){ return prev+curr.Sales;},0);
return result;
};
var groupBy = function(aData, fnKey, fnAggregate){
var map = {};
aData.forEach(function(item){
var key = fnKey(item);
if (!(key in map)){
map[key] = [];
}
map[key].push(item);
});
var result = [];
for(key in map){
result.push(fnAggregate(map[key]));
}
return result;
};
在您的handleSelect
功能中,您可以使用它们
var fnKey = function(item){
return selectedKeysArray.map(function(key){ return item[key]; }).join(";");
};
var groupedTableData = groupBy(aTableData, fnKey, fnAggregate);
var oTable = sap.ui.getCore().byId("Table_ID");
var oTableModel = oTable.getModel().setProperty("/modelData", groupedTableData);
Here's你修改过的jsbin。