使用SuiteScript 2在NetSuite中搜索项目数组

时间:2017-11-29 18:11:02

标签: netsuite suitescript suitescript2.0

我正在尝试编写一个允许我将标识符数组传递给Netsuite中特定字段并返回结果的suitecript搜索。我已经尝试了'ANYOF',' ALLOF'和" WITHIN'但我一直在犯错误

到目前为止,这是我的代码:

List<String> list = Arrays.asList("1","2","3","4","5");
// Both functions are equivalent, I write both to clarify the concept using lambda expression.
//Function<? super String, ? extends Integer> function = stringElement -> Integer.parseInt(stringElement);
Function<? super String, ? extends Integer> function = Integer::parseInt;
list.stream().map(function);

有没有人知道创建一个多项搜索itemid的正确顺序?另外,对于奖金,有没有办法让结果集返回我需要的列只是想法?我需要createColumn吗?

2 个答案:

答案 0 :(得分:2)

在文本字段上过滤搜索时,您无法使用ANYOFALLOF等。您需要使用OR创建过滤器表达式以搜索多个值。

我会这样做:

if(params.type=='sku'){
    var filter_name = 'itemid';
}else{
    var filter_name = 'upccode';
}

var filters = [
    [filter_name, 'is', 'HERHR5201'], 'OR',
    [filter_name, 'is', 'HERHR5202'], 'OR',
    [filter_name, 'is', 'HERHR5203']
];

var s = search.create({
    'type': record.Type.INVENTORY_ITEM, 
    'filters':filters
}).run();

至于从搜索中返回特定列,您需要使用search.createColumn(),正如您所指出的那样。所以它就像:

//Previous code...
var s = search.create({
    'type': record.Type.INVENTORY_ITEM, 
    'filters':filters,
    'columns': [search.createColumn({name: 'internalid'}),
                search.createColumn({name: 'upccode'}),
                search.createColumn({name: 'itemid'})
                /*Other columns as needed*/]
}).run();

答案 1 :(得分:1)

提供的答案是正确的,但是根据您提供的示例代码,我假设搜索需要在某种程度上动态创建。这意味着你提到的'标识符数组'并不总是相同,也不会总是相同的长度。为了根据传入的“标识符数组”创建完全动态的搜索,您需要非常有创意。在下面的解决方案中,我假设函数参数'params'是一个具有'type'属性的对象,以及一个arrIn(字符串数组)属性。下面的搜索使用公式函数'DECODE',可以找到here的描述。

function execute(params) {
    var filter_name;
    var itemSearchObj;
    var stringArr = '';
    var arrIn = params.arrIn;
    var i;
    var count;

    // create search filter type
    filter_name = params.type === 'sku' ? 'itemid' : 'upccode';

    // create stringArr using incoming arrIn
    for (i = 0; arrIn && arrIn.length > i; i += 1) {
        stringArr += i > 0 ? ", '" + arrIn[i] + "', 'true'" : "'" + arrIn[i] + "', 'true'";
    }
    if (arrIn.length > 0) {
        itemSearchObj = nsSearch.create({
            type: 'item',
            filters: [
                ["formulatext: DECODE({" + filter_name + "}," + stringArr + ")", "is", 'true']
            ],
            columns: [
                'itemid', // dont need to get fancy here, just put the internal id of whichever fields you want in the columns
                'description'
            ]
        });
        count = itemSearchObj.runPaged().count;
        itemSearchObj.run().each(function (result) {
            // Do things for each result
        });
    }
}