1

我正在尝试编写一个套件搜索,它允许我将一组标识符传递给 Netsuite 中的特定字段并返回结果。我尝试了“ANYOF”、“ALLOF”和“WITHIN”,但我不断收到错误

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

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


    var filters = [
       search.createFilter({
            name: filter_name,
            operator: search.Operator.ANYOF,
            values: ['HERHR5201','HERHR5202','HERHR5203']
       }),
    ];

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

    }).run();
    s = s.getRange(0,100);

    return JSON.stringify(s);

有谁知道创建 itemid 的多重搜索的正确顺序?另外,作为奖励,有没有办法让结果集返回我需要的列而不是想法?我需要创建列吗?

4

3 回答 3

2

过滤文本字段上的搜索时,不能使用ANYOF,ALLOF等。您需要创建一个带有 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();
于 2017-11-29T20:19:08.333 回答
2

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

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
        });
    }
}
于 2017-11-29T23:13:00.940 回答
0

当我想太多时,我发现这有点像曲线球。搜索需要一个数组:

results = search.create({
   type: search.Type.CUSTOMER,
   filters: [],
   columns: [ search.createColumn({ name: "internalid", sort: search.Sort.ASC }) ]
})

此过滤器数组由搜索词数组和逻辑运算符(AND、OR)组成。

['fieldid', 'is', yourValue], // search term array
'AND' // logical operator

因此,您可以根据需要通过推入搜索词和逻辑运算符来创建自己的过滤器数组。

例如,如果您想在数组中返回客户电子邮件的内部 id:

let email = ['abc@test.com', 'def@test.com'];
let myFilter = createFilter(email);

function createFilter(email){
  let filter = [];
  email.forEach((result, index) => {
    if(index > 0)
      filter.push('OR'); // Logical Operator
    
    filter.push(['email', 'is', result]);
  });
  return filter;
}

变量 myFilter 现在将等于:

[ ['email', 'is', 'abc@test.com'], 'OR', ['email', 'is', 'def@test.com'] ]

并且可以直接作为搜索中的过滤器引用。

let results = search.create({
   type: search.Type.CUSTOMER,
   filters: myFilter,
   columns: [ search.createColumn({ name: "internalid", sort: search.Sort.ASC }) ]
})
于 2022-01-18T01:25:12.867 回答