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

Use sap.ui.table.Table like PowerPivot table

本文关键字:一样 PowerPivot ui sap table Table 就像 使用      更新时间:2023-09-26

我有一个包含这些值的表:

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"},
];

我希望用户通过分面筛选器分组选项进行选择,就像在 PowerPivot 表中一样。例如,如果用户选择"产品",则返回的表应如下所示:

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。

捷轩

聚合绑定的分组不支持任何聚合函数,如 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);

这是您修改后的 jsbin .