Проблема с добавлением мульти фильтра в сервис odata - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть следующий код. Я пытаюсь прочитать 3 различных значения для PO из полей ввода, а затем отображать результат в списке. Программа работает нормально для одного входа, но для нескольких входов я сталкиваюсь с проблемами.

var oV1 = this.getView().byId("oInput").getValue();
var oV2 = this.getView().byId("oInput1").getValue();
var oV3 = this.getView().byId("oInput2").getValue();                                     


var oFilter = [new sap.ui.model.Filter("Ebeln", sap.ui.model.FilterOperator.Contains, oV1)];          
var oFilter1 = [new sap.ui.model.Filter("Ebeln", sap.ui.model.FilterOperator.Contains, oV2)];
var oFilter2 = [new sap.ui.model.Filter("Ebeln", sap.ui.model.FilterOperator.Contains, oV3)];



var orFilter =new Array(new sap.ui.model.Filter({filters:[oFilter, oFilter1, oFilter2],and:true}));

   var oView1 = this.getView();
   var oTable = oView1.byId("myTable");
   var oBinding = oTable.getBinding("items");
   if(oV1 === "")
   {
       oBinding.filter( [] );
       oBinding.refresh(true);
   }
   else
   {
     oBinding.filter(orFilter);

На вышеупомянутом oBinding.filter я получаю следующую ошибку. Фильтр в агрегации нескольких фильтров должен быть экземпляром sap.ui.model.Filter -

Невозможно получить свойство 'заменить' неопределенной или нулевой ссылки

Пожалуйста, помогите.

Ответы [ 3 ]

1 голос
/ 14 апреля 2020

Вы завернули свои фильтры в 1000 слоев массивов, что не имеет смысла.

Просто создайте один массив, который содержит фильтр объектов :

const aFilter = [
    new sap.ui.model.Filter("Ebeln", sap.ui.model.FilterOperator.Contains, oV1),          
    new sap.ui.model.Filter("Ebeln", sap.ui.model.FilterOperator.Contains, oV2),
    new sap.ui.model.Filter("Ebeln", sap.ui.model.FilterOperator.Contains, oV3)
];
...
oBinding.filter(aFilter)

На самом деле, вы не можете комбинировать фильтры для одного свойства (например, "Ebeln") с AND. Запись не может выполнить все три условия, поэтому вы получите нулевой результат.


Я знаю, что это не проверка кода, но некоторые предложения:

Никто не использует new Array() , Просто используйте [].

Также вы использовали венгерскую нотацию, но каждое из ваших имен переменных начинается с o. o означает объект. Некоторые из ваших переменных - это не объекты, а строки (например, oV1, лучше будет sV1) или массивы.

0 голосов
/ 14 апреля 2020

Спасибо всем. Я внес следующие изменения в свою цитату, и это решило проблему.

const aFilter = [
        new sap.ui.model.Filter("Ebeln", sap.ui.model.FilterOperator.Contains, sV1),          
        new sap.ui.model.Filter("Ebeln", sap.ui.model.FilterOperator.Contains, sV2),
        new sap.ui.model.Filter("Ebeln", sap.ui.model.FilterOperator.Contains, sV3)
    ];


oBinding.filter(aFilter);
       oBinding.refresh(true);
0 голосов
/ 14 апреля 2020

Для агрегации filters sap.ui.model.Filter принимает Filter[]. Но поскольку oFilter уже является Filter[], [oFilter, oFilter1, oFilter2] является Filter[][], так что это не будет работать.

Чтобы заставить его работать, просто удалите окружающий [] из определений фильтра , вот так: var oFilter = new Filter(...);.

...