过滤" OR"并且" AND"多个领域的条件

时间:2017-02-24 07:42:47

标签: sapui5

我想实现下面的 where 条件。如何在UI5中创建过滤器?

field-A NE 'O' and ( field-B contains 'search-text' or field-C contains 'search-text' )

后端业务场景:

  1. 在绑定列表时应用过滤器field-A NE 'O'
  2. 应用过滤器( field-B contains 'search-text' or field-C contains 'search-text' )以在搜索字段上实现搜索功能。
  3. 过滤实例:

    new sap.ui.model.Filter("field-A", sap.ui.model.FilterOperator.NE, "O");
    new sap.ui.model.Filter("field-B", sap.ui.model.FilterOperator.contains, search-text);
    new sap.ui.model.Filter("field-C", sap.ui.model.FilterOperator.contains, search-text);
    

3 个答案:

答案 0 :(得分:9)

以下是使用Northwind的OData组合多个过滤器的最小示例:https://embed.plnkr.co/AoIZI4/。完整列表可以找到here

在实例化过滤器时,而不是pathoperatorvalue1,请使用属性filtersand组合多个过滤器,如下所示API reference

在我们的例子中,我们定义了三个过滤器:

  • 一个用于第一个field-A NE 'O',它也用于上面的Plunker示例中的初始绑定(过滤器1)
  • 对于搜索事件处理程序中的其他两个,and: false表示OR(过滤器​​2)。

过滤器1:

getInitialFilter: function() {
  return new Filter("Field-A", FilterOperator.NE, "O");
}

过滤器2:

getSearchFilters: function(query) {
  return new Filter({
    filters: [
      new Filter("Field-B", FilterOperator.Contains, query),
      new Filter("Field-C", FilterOperator.Contains, query)
    ],
    and: false
  });
}

最后,当用户输入搜索查询时,我们会将这两个过滤器与and: true应用于ODataListBinding进行合并。

onSearch: function(event) {
  this.getList().getBinding("items").filter(new Filter({
    filters: [
      this.getInitialFilter(),
      this.getSearchFilters(event.getParameter("query"))
    ],
    and: true
  }));
}

答案 1 :(得分:2)

var andFilter = [];

var orFilter = [];

orFilter.push(new sap.ui.model.Filter("title", sap.ui.model.FilterOperator.Equal, "filtervalue"));

orFilter.push(new sap.ui.model.Filter("status", sap.ui.model.FilterOperator.Equal, "filtervalue"));

andFilter.push(new sap.ui.model.Filter(orFilter, false));

orFilter = [];

orFilter.push(new sap.ui.model.Filter("title", sap.ui.model.FilterOperator.Equal, "filtervalue1"));

orFilter.push(new sap.ui.model.Filter("status", sap.ui.model.FilterOperator.Equal, "filtervalue1"));

andFilter.push(new sap.ui.model.Filter(orFilter, false));

oBinding.filter(new sap.ui.model.Filter(andFilter, true));

那应该转化为:

title=filtervalue || status=filtervalue && title=filtervalue1 || status=filtervalue1

答案 2 :(得分:0)

对具有OR条件的多个过滤器使用以下语法:(对于AND,将false更改为true)

var InputFilter = new sap.ui.model.Filter({
  filters: [
    new sap.ui.model.Filter("Name", sap.ui.model.FilterOperator.EQ, inptval),
    new sap.ui.model.Filter("ID", sap.ui.model.FilterOperator.EQ, inptval)
  ],
  and: false
});

this.oModel.read("/Products", {
  filters: [InputFilter],
  success: jQuery.proxy(this._fnSuccessGet, this),
  error: jQuery.proxy(this._fnErrorGet, this)
});