简体   繁体   中英

Operators 'and' & 'or' on filters SuiteScript 2.0 (NetSuite)

I need to make conditions on my filters in my search. I have browsed through a lot of forums without finding functional solutions. After many inconclusive tests, I come to you for help. My code :

function retrieveVendor(vendorValues){

    var subsidiaryIdFilter = SEARCHMODULE.createFilter({
            name: 'internalid',
            join: 'subsidiary',
            operator: SEARCHMODULE.Operator.ANYOF,
            values: vendorValues.companyCode
    });
    var addressFilter = SEARCHMODULE.createFilter({
        name: 'address',
        join: 'vendor',
        operator: SEARCHMODULE.Operator.CONTAINS,
        values: vendorValues.street
    });
    var cityFilter = SEARCHMODULE.createFilter({
        name: 'city',
        join: 'vendor',
        operator: SEARCHMODULE.Operator.CONTAINS,
        values: vendorValues.city
    });
    var zipFilter = SEARCHMODULE.createFilter({
        name: 'zipcode',
        join: 'vendor',
        operator: SEARCHMODULE.Operator.CONTAINS,
        values: vendorValues.postalCode
    });
    
    var vendorIdTest = SEARCHMODULE.create({
        type: SEARCHMODULE.Type.VENDOR_SUBSIDIARY_RELATIONSHIP,
        columns: [
            SEARCHMODULE.createColumn({name:'entityid', join: 'vendor'}),
            SEARCHMODULE.createColumn({name:'internalid', join: 'subsidiary'}),
            SEARCHMODULE.createColumn({name:'address', join: 'vendor'})
            ],
        filters: [
            subsidiaryIdFilter, 'and', [addressFilter, 'or', zipFilter]
        ]
    });
    var nbOfResults = vendorIdTest.runPaged().count;
    var resultArray = [];

    var aa = vendorIdTest.run().each(function(result){
        var obj ={};
        obj['vendorName'] = result.getValue({
            name: 'entityid',
            join: 'vendor'
        });
        obj['idOfSubsidiary'] = result.getValue({
            name: 'internalid',
            join: 'subsidiary'
        });
        obj['vendorAddress'] = result.getValue({
            name: 'address',
            join: 'vendor'
        });
        resultArray.push(obj);
        return true;
    });
    var result = nbOfResults + ' : ' + JSON.stringify(resultArray);
    
    return result;
}

And here are all the syntaxes tried on the 'filters' parameter of my search :

subsidiaryIdFilter, 'and', [addressFilter, 'or', zipFilter]

[subsidiaryIdFilter, 'and', [addressFilter, 'or', zipFilter]]

subsidiaryIdFilter, 'and', (addressFilter, 'or', zipFilter)

subsidiaryIdFilter && (addressFilter, 'or', zipFilter)

subsidiaryIdFilter && (addressFilter || zipFilter)

I have of course searched in the SuiteScript documentation but nothing is mentioned on this subject. Thank you for your help.

It doesn't really work that way. Filters created with search.createFilter are all implicitly ANDed together.

What you need is filter expressions which have a different syntax. You cannot mix filters and filter expressions so:

var vendorIdTest = SEARCHMODULE.create({
    type: SEARCHMODULE.Type.VENDOR_SUBSIDIARY_RELATIONSHIP,
    columns: [
        SEARCHMODULE.createColumn({name:'entityid', join: 'vendor'}),
        SEARCHMODULE.createColumn({name:'internalid', join: 'subsidiary'}),
        SEARCHMODULE.createColumn({name:'address', join: 'vendor'})
        ],
    filters: [
        ['subsidiary', 'anyof', vendorValues.companyCode], 'AND',
        [
            [
                ['vendor.address', 'contains', vendorValues.street ], 'AND',
                ['vendor.city', 'is', vendorValues.city] // i'm guessing you meant to include this
            ], 'OR',
            ['vendor.zipcode', 'contains', vendorValues.postalCode]
        ]
    ]

});

Thanks to the Plugin ( https://chrome.google.com/webstore/detail/netsuite-search-export/gglbgdfbkaelbjpjkiepdmfaihdokglp ), I found the syntax to put AND and OR between my filters with joins:

var subsidiaryIdFilter = ["subsidiary.internalid", "anyof", vendorValues.companyCode];
var addressFilter = ["vendor.addresslabel", "contains", vendorValues.street];
var cityFilter = ["vendor.city", "contains", vendorValues.city];
var vendorNameFilter = ["vendor.entityid", "contains", vendorValues.name];
var zipFilter = ["vendor.zipcode", "contains", vendorValues.postalCode];
    
var addressSearch = SEARCHMODULE.create({
        type: SEARCHMODULE.Type.VENDOR_SUBSIDIARY_RELATIONSHIP,
        columns: [
                SEARCHMODULE.createColumn({name:'entityid', join: 'vendor', sort : SEARCHMODULE.Sort.ASC})
            ],
        filters: [
            subsidiaryIdFilter, "AND", [zipFilter, "OR", cityFilter, "OR", addressFilter]
        ]
    });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM