Javascript SAPUI5 JS将多个过滤器与或组合在一起
我想将多个筛选器与我的OData请求的Javascript SAPUI5 JS将多个过滤器与或组合在一起,javascript,filter,sapui5,Javascript,Filter,Sapui5,我想将多个筛选器与我的OData请求的或组合。如果我试着把它们分开,过滤效果会很好。现在我需要把它们结合起来。这些是单个筛选器(aFilterBetween、aFilterLeftBorder、AFILTERLIGHTBORDER): 这三个过滤器应与或组合,以便结果将显示与这三个过滤器之一匹配的所有内容。这三个组合过滤器必须用于我的OData请求,如下所示 oDataModel.read("/Initiatives", { filters: ***here has to be the
或组合。如果我试着把它们分开,过滤效果会很好。现在我需要把它们结合起来。这些是单个筛选器(aFilterBetween、aFilterLeftBorder、AFILTERLIGHTBORDER):
这三个过滤器应与或组合,以便结果将显示与这三个过滤器之一匹配的所有内容。这三个组合过滤器必须用于我的OData请求,如下所示
oDataModel.read("/Initiatives", {
filters: ***here has to be the filter***,
urlParameters: {
"$top": "50",
"$select": "StartDate,EndDate"
},
success: function(oData, oResponse) {
... }
我尝试使用和:false连接三个过滤器(这里甚至只有两个),但不知怎的,它对我不起作用:
var aFilterCombined = [];
aFilterCombined.push(new Filter({
filters: [
aFilterBetween,
aFilterLeftBorder
],
and: false
}));
有什么想法吗?试试这个:
var oFilterCombined = new Filter({
filters: [
oFilter1,
oFilter2
],
and: false
});
另外,对于其他过滤器,我将创建过滤器对象,而不是将其推入数组,并使用sap常量,而不是过滤器操作符()的字符串:
读者希望:
oDataModel.read("/Initiatives", {
filters: oFilterCombined,
urlParameters: {
"$top": "50",
"$select": "StartDate,EndDate"
},
success: function(oData, oResponse) {
...
}
请注意:
问题可能不是ui5代码,而是后端。如果这不起作用,请在浏览器发送的批次中发布您的邮件
如果您正在使用ABAP后端和SEGW生成的OData服务:
映射不能在和以及或过滤器之间区分!你需要手动实现它 根据SAP注释:
可以使用或运算符在同一个对象上应用不同的筛选器
领域但是,不能使用或条件对两个对象应用筛选器
不同的领域。例如:
?$filter=Name eq
“牛奶”或名称eq“面包”
我曾多次遇到这种限制,无论您使用服务开发(DPC_EXT中的手动实现)还是服务生成(基于RFC、BOR、CDS等的实现),这都无关紧要
我建议您在实体类型中添加一个新的“dummy”属性,并将过滤器设置为仅此属性。在ABAP代码中,可以从该属性获取信息,并在内部使用OR。由于在需要OR子句的列中可能有不同的数据类型,我建议在该伪属性中使用“Edm.String”类型
因此,不要像这样打电话:
?$filter=名称eq‘牛奶’或名称eq‘面包’
你可以将就一下
?$filter=GenericFilterProperty等式'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\u fdt\u json,方法json\u to\u data
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) {
... }