Search code examples
sapui5

Logical negation SAP UI5 Filter


I have smartFilter with smart table and I am trying to exclude item from result. I have following code:

var oBindingParameters = oEvent.getParameter("bindingParams");

var currVal = this._aItemsForLink[0];
    var filter = new Filter({filters:[
        new sap.ui.model.Filter("RevisionNumber", sap.ui.model.FilterOperator.EQ, currVal.RevisionNumber),
        new sap.ui.model.Filter("CompanyCode", sap.ui.model.FilterOperator.EQ, currVal.CompanyCode),
        new sap.ui.model.Filter("FiscalYear", sap.ui.model.FilterOperator.EQ, currVal.FiscalYear),
        new sap.ui.model.Filter("Invoice", sap.ui.model.FilterOperator.EQ, currVal.Invoice),
        new sap.ui.model.Filter("InvoiceYear", sap.ui.model.FilterOperator.EQ, currVal.InvoiceYear)
                ],and : true});

        oBindingParameters.filters = [filter];

Is there a way to implement logical negation for this filter? Something like:

WHERE NOT ( companycode = '...' and revisionnumber = '...' and accountingdocument = '...' and invoice = '...' and fiscalyear = '...' )

Solution

  • A logical expression of the form NOT ( V1 = C1 and V2 = C2 and ... Vn = Cn ) is identical to this: V1 ne C1 or V2 ne C2 or ... Vn ne Cn. So, in your case it would be:

    var filter = new Filter({filters:[
                new sap.ui.model.Filter("RevisionNumber", sap.ui.model.FilterOperator.NE, currVal.RevisionNumber),
                new sap.ui.model.Filter("CompanyCode", sap.ui.model.FilterOperator.NE, currVal.CompanyCode),
                new sap.ui.model.Filter("FiscalYear", sap.ui.model.FilterOperator.NE, currVal.FiscalYear),
                new sap.ui.model.Filter("Invoice", sap.ui.model.FilterOperator.NE, currVal.Invoice),
                new sap.ui.model.Filter("InvoiceYear", sap.ui.model.FilterOperator.NE, currVal.InvoiceYear)
                ],and : false});
    

    Keep in mind though that NE (Not Equal) operator in SQL WHERE clause can be very expensive when applied to key fields.