Sapui5 如何获取OData(V2)属性的聚合值?

Sapui5 如何获取OData(V2)属性的聚合值?,sapui5,Sapui5,我想显示一个图表(sap.viz.ui5.controls.VizFrame),它可以可视化来自OData服务的数据。但是,必须对服务的数据进行操作。请参见下面的示例: Main.view.xml Chart.fragment.xml Main.controller.js sap.ui.define([ “sap/ui/core/mvc/Controller”, “sap/ui/model/json/JSONModel”, “sap/ui/core/Fragment” ],函数(控制器,

我想显示一个图表(
sap.viz.ui5.controls.VizFrame
),它可以可视化来自OData服务的数据。但是,必须对服务的数据进行操作。请参见下面的示例:

Main.view.xml

Chart.fragment.xml

Main.controller.js
sap.ui.define([
“sap/ui/core/mvc/Controller”,
“sap/ui/model/json/JSONModel”,
“sap/ui/core/Fragment”
],函数(控制器,JSONModel,片段){
“严格使用”;
返回Controller.extend(“demo.chart.Controller.Main”{
onInit:function(){
const mDefault=this.getOwnerComponent().getModel();
const mManipulatedData=新的JSONModel([{
性别:“F”,
金额:0
}, {
性别:“M”,
金额:0
}, {
性别:“X”,
金额:12
}]);
this.getView().setModel(mManipulatedData,“操纵数据”);
log(this.getView().getModel(“操纵数据”);
mDefault.read(“/ContactSet”{
成功:oData=>{
常量aManipulatedData=mManipulatedData.getData();
oData.results.forEach(条目=>{
aManipulatedData.forEach(类型=>{
if(entry.Sex==type.Sex){
类型.金额++
}
})
});
片段加载({
名称:“demo.chart.view.chart”,
控制员:这个
}).then(OFRAGN=>{
this.getView().addDependent(of ragment);
此.byId(“页面”).addContent(标签);
});
}
})
}
});
});
服务的结构(
GWSAMPLE\U BASIC/ContactSet
{
“d”:{
“结果”:[
{
“_元数据”:{
“id”:”https://sapes5.sapdevcenter.com/sap/opu/odata/IWBEP/GWSAMPLE_BASIC/ContactSet(guid'0050568c-901d-1eda-bcae-e8394de7e116')”,
“uri”:https://sapes5.sapdevcenter.com/sap/opu/odata/IWBEP/GWSAMPLE_BASIC/ContactSet(guid'0050568c-901d-1eda-bcae-e8394de7e116')”,
“类型”:“GWU基本联系人”
},
“地址”:{
“_元数据”:{
“类型”:“GWSAMPLE\U BASIC.CT\U地址”
},
“城市”:“沃尔多夫”,
“PostalCode”:“69190”,
“街道”:“罗伯特·科赫大街”,
“建筑”:“1”,
“国家”:“德”,
“地址类型”:“02”
},
“联系人GUID”:“0050568c-901d-1eda-bcae-e8394de7e116”,
“BusinessPartnerID”:“0100000000”,
“名称”:“名称”,
“名字”:“卡尔”,
“中间名”:“,
“姓氏”:“Müller”,
“昵称”:“,
“姓名首字母”:“,
“性”:“M”,
“电话号码”:“0622734567”,
“传真号码”:“0622734004”,
“电子邮件地址”:“请勿”。reply@sap.com",
“语言”:“EN”,
“出生日期”:空,
“ToBusiness Partner”:{
“推迟”:{
“uri”:https://sapes5.sapdevcenter.com/sap/opu/odata/IWBEP/GWSAMPLE_BASIC/ContactSet(guid'0050568c-901d-1eda-bcae-e8394de7e116')/ToBusiness Partner“
}
}
}
]
}
}

如您所见,我只对
Sex
属性的聚合值感兴趣。我当前的解决方案是循环遍历实体集的所有条目,并在自定义JSON模型中增加属性。这不仅因为您在客户端执行繁重的工作,而且还要求您立即知道图表中显示的数据的所有可能值,因此性能非常好。OData查询是否有办法做到这一点,或者我是否必须在我的SAP系统中使用计算数据创建一个新的实体集?

OData应该能够进行计数和分组,如本问题中所述:

但我怀疑您的SAP OData服务在大多数情况下不会实现完整的OData规范

您可以通过不使用两个嵌套for循环来改进js,但类似于以下内容:

mGender = {};
oData.results.forEach(entry => {
    if (!mGender[entry.Sex])
        {mGender[entry.Sex] = 0
    }
    mGender[entry.Sex]++
});

谢谢你的回复,我将按照你的建议更改js。但是我不认为ODataV2能够实现groupby,所以我可能会用聚合数据实现另一个实体集。我认为您的代码片段不起作用,因为
VizFrame
元素的聚合绑定需要模型中有一个数组。使用您的解决方案,模型仅由对象组成。您仍然可以将mGender重新映射到您使用
Object.keys(mGender)
。最后,你需要决定你想要关注什么——如果这是一个移动/离线应用程序,或者主要在计算机上运行,你的决定可能会有所不同。如果您只需要性别百分比,那么当前的主要瓶颈可能是获取所有这些数据。我的项目类似于一个自定义SAPUI5应用程序,因此我在上半部分显示一些视觉过滤器,在下半部分显示一个包含服务数据的表。因此,我必须以任何一种方式获取数据。您认为在前端转换数据或获取另一个ent更快吗