Javascript SAPUI5 JS将多个过滤器与或组合在一起

Javascript SAPUI5 JS将多个过滤器与或组合在一起,javascript,filter,sapui5,Javascript,Filter,Sapui5,我想将多个筛选器与我的OData请求的或组合。如果我试着把它们分开,过滤效果会很好。现在我需要把它们结合起来。这些是单个筛选器(aFilterBetween、aFilterLeftBorder、AFILTERLIGHTBORDER): 这三个过滤器应与或组合,以便结果将显示与这三个过滤器之一匹配的所有内容。这三个组合过滤器必须用于我的OData请求,如下所示 oDataModel.read("/Initiatives", { filters: ***here has to be the

我想将多个筛选器与我的OData请求的
组合。如果我试着把它们分开,过滤效果会很好。现在我需要把它们结合起来。这些是单个筛选器(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) {
    ... }