SAPUI5 JS将多个过滤器与OR

时间:2018-10-18 08:01:14

标签: javascript filter sapui5

我想为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
}));

有什么想法吗?

2 个答案:

答案 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服务一起使用: 映射无法区分andor过滤器!您需要手动实现!

答案 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