像PowerPivot表一样使用sap.ui.table.Table

时间:2016-03-15 13:13:48

标签: javascript powerpivot sapui5

我有一张包含这些值的表格:

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。

JSBIN

1 个答案:

答案 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。