简体   繁体   English

过滤器上的运算符“和”和“或” SuiteScript 2.0 (NetSuite)

[英]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.我当然在 SuiteScript 文档中搜索过,但没有提到这个主题。 Thank you for your help.感谢您的帮助。

It doesn't really work that way.它不是真的那样工作。 Filters created with search.createFilter are all implicitly ANDed together.使用 search.createFilter 创建的过滤器都隐式地 AND 在一起。

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:多亏了插件( https://chrome.google.com/webstore/detail/netsuite-search-export/gglbgdfbkaelbjpjkiepdmfaihdokglp ),我找到了将 AND 和 OR 放在带连接的过滤器之间的语法:

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]
        ]
    });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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