我想为OData请求将多个过滤器与or
结合使用。如果我分别尝试过滤器,则它们可以正常工作。现在,我需要将它们结合起来。这些是单个过滤器(aFilterBetween,aFilterLeftBorder,aFilterRightBorder):
var aFilterBetween = [];
aFilterBetween.push(new Filter({
filters: [
new Filter("StartDate", "GE", calenderStartDate),
new Filter("EndDate", "LE", calenderEndDate)
],
and: true
}));
var aFilterLeftBorder = [];
aFilterLeftBorder.push(new Filter({
filters: [
new Filter("StartDate", "LT", calenderStartDate),
new Filter("EndDate", "GT", calenderStartDate)
],
and: true
}));
var aFilterRightBorder = [];
aFilterRightBorder.push(new Filter({
filters: [
new Filter("StartDate", "LT", calenderStartDate),
new Filter("EndDate", "GT", calenderEndDate)
],
and: true
}));
这三个过滤器应与or
结合使用,以便结果将显示与这三个过滤器之一匹配的所有内容。这三个的组合过滤器必须用于我的OData请求,如下所示...
oDataModel.read("/Initiatives", {
filters: ***here has to be the filter***,
urlParameters: {
"$top": "50",
"$select": "StartDate,EndDate"
},
success: function(oData, oResponse) {
... }
我尝试使用and: false
连接三个过滤器(这里甚至只有两个),但不知怎么对我不起作用:
var aFilterCombined = [];
aFilterCombined.push(new Filter({
filters: [
aFilterBetween,
aFilterLeftBorder
],
and: false
}));
有什么想法吗?
答案 0 :(得分:1)
尝试一下:
var oFilterCombined = new Filter({
filters: [
oFilter1,
oFilter2
],
and: false
});
还有其他过滤器,我将创建过滤器对象而不是放入数组,并使用sap常量而不是字符串作为过滤器运算符(https://sapui5.hana.ondemand.com/1.54.8/#/api/sap.ui.model.FilterOperator):
var oFilterSingle= new Filter({
filters: [
new Filter("XXX", FilterOperator.EQ, "bla"),
new Filter("YYY", FilterOperator.EQ, "blub")
],
and: true
});
阅读内容如下:
oDataModel.read("/Initiatives", {
filters: oFilterCombined,
urlParameters: {
"$top": "50",
"$select": "StartDate,EndDate"
},
success: function(oData, oResponse) {
...
}
请注意:
问题可能不是ui5代码,而是后端。如果这不起作用,请发布您的浏览器发送的批处理。
如果您将ABAP后端与SEGW生成的OData服务一起使用:
映射无法区分and
和or
过滤器!您需要手动实现!
答案 1 :(得分:0)
根据SAP注释2377685:
您可以使用OR运算符对同一过滤器应用不同的过滤器 领域。但是,您不能使用OR条件将过滤器应用于两个 不同的领域。例如: http://services.odata.org/OData/OData.svc/Products?$ filter =名称eq “牛奶”或名称“面包”
我几次遇到此限制,无论您使用服务开发(DPC_EXT中的手动实现)还是服务生成(基于RFC,BOR,CDS等的实现)都没有关系。
我建议您在实体类型中添加一个新的“虚拟”属性,并将过滤器设置为仅此属性。在您的ABAP代码中,您可以从此属性获取信息并在内部使用OR。由于在需要OR子句的列中可能具有不同的数据类型,因此建议在该虚拟属性中使用“ Edm.String”类型。
所以不要像这样打电话:
http://services.odata.org/OData/OData.svc/Products?$ filter =名称“牛奶”或名称“面包”
您可以解决
http://services.odata.org/OData/OData.svc/Products?$ filter = GenericFilterProperty eq'FilterValue'
在您的特定情况下,“ FilterValue”可能是一个很长的字符串,因为您使用的是多个日期范围。不要害怕。您可以将过滤条件表示为JavaScript对象,然后将其转换为JSON。
var aFilterBetween = [];
aFilterBetween.push(new Filter({
filters: [
new Filter("StartDate", "GE", calenderStartDate),
new Filter("EndDate", "LE", calenderEndDate)
],
and: true
}));
var aFilterLeftBorder = [];
aFilterLeftBorder.push(new Filter({
filters: [
new Filter("StartDate", "LT", calenderStartDate),
new Filter("EndDate", "GT", calenderStartDate)
],
and: true
}));
var aFilterRightBorder = [];
aFilterRightBorder.push(new Filter({
filters: [
new Filter("StartDate", "LT", calenderStartDate),
new Filter("EndDate", "GT", calenderEndDate)
],
and: true
}));
// represent filters as a String
var sFilterValue = JSON.stringify(aFilterRightBorder);
然后...
oDataModel.read("/Initiatives", {
filters: [new Filter({
path: "GenericFilterProperty",
operator: "EQ",
value: sFilterValue
})],
urlParameters: {
"$top": "50",
"$select": "StartDate,EndDate"
},
success: function(oData, oResponse) {
... }
使用这种方法,您将需要将JSON转换为某种ABAP数据结构(工作区或内部表)。为此,我建议使用类 cl_fdt_json ,方法 json_to_data 。