SuiteScript2.0 从保存的搜索公式列中获取值

Tom*_*son 2 netsuite suitescript2.0

我正在尝试从保存的搜索中的公式字段获取值。我正在获取所有结果,然后这样循环它们。

for(key in itemReplenishResults){
    log.debug("Single Data", JSON.stringify(itemReplenishResults[key]));
    var thisNumber = Number(itemReplenishResults[key].getValue("formulanumeric_1"))
}
Run Code Online (Sandbox Code Playgroud)

正如我所期望的那样读取单个数据的日志;

{
    "recordType": "inventoryitem",
    "id": "2131",
    "values": {
        "itemid": "ITEMCODE",
        "displayname": "DISPLAYNAME",
        "salesdescription": "SALESDESCRIPTION",
        "type": [
            {
                "value": "InvtPart",
                "text": "Inventory Item"
            }
        ],
        "location": [],
        "locationquantityonhand": "",
        "locationreorderpoint": "0",
        "locationpreferredstocklevel": "1",
        "formulatext": "Yes",
        "formulanumeric": "1",
        "locationquantityonorder": "",
        "formulanumeric_1": "1",
        "formulatext_1": "Yes"
    }
}
Run Code Online (Sandbox Code Playgroud)

但是 thisNumber 的值返回为 0。我不明白为什么这不起作用?

Ada*_*dam 5

原因thisNumber是 0 是因为该列formulanumeric_1实际上不存在,因此Number()将 null 值转换为 0。

问题

公式列在内部具有相同的名称,这就是为什么您无法直接单独获取它们的值。例如,如果您的搜索中有两个公式(数字)列,则两个内部列名称都将为“formulanumeric”。因此,使用getValue('formulanumeric')只会得到第一个公式值。

如您所见,记录 Result 对象将输出不正确的名称。如果您登录,Result.columns您将看到列名实际上是相同的。

您的选择

  1. 使用索引直接获取列(如果您关心排序)。

    require(['N/search'], function(search) {
      // A saved search containing multiple formula result columns
      var s = search.load(1234);
    
      s.run().each(function(result) {
        log.debug(result.getValue(result.columns[5]));
        log.debug(result.getValue(result.columns[1]));
        log.debug(result.getValue(result.columns[3]));
      });
    });
    
    Run Code Online (Sandbox Code Playgroud)
  2. 循环遍历每一列(如果您不关心顺序)。

    require(['N/search'], function(search) {
      // A saved search containing multiple formula result columns
      var s = search.load(1234);
    
      s.run().each(function(result) {
        for (var i = 0; i < result.columns.length; i++) {
          // Log each column's value in order
          log.debug(result.getValue(result.columns[i]));
        }
      });
    });
    
    Run Code Online (Sandbox Code Playgroud)
  3. 手动定义列并引用它们(最通用的选项)。列名称必须以“公式[类型]”开头,并且可以附加任何其他内容。

    require(['N/search'], function(search) {
      var s = search.create({
        type: 'salesorder',
        columns: [{
          name: 'formulanumeric1',
          formula: 'CASE WHEN 100 > 10 THEN 100 END'
        }, {
          name: 'formulanumeric2',
          formula: 'CASE WHEN 30 > 20 THEN 30 END'
        }]      
      });
    
      s.run().each(function(result) {
        log.debug(result.getValue('formulanumeric2')); // 30
        log.debug(result.getValue('formulanumeric1')); // 100
      });
    });
    
    Run Code Online (Sandbox Code Playgroud)

注意:如果您选择第一个选项,则必须小心重新排序初始搜索中的列,因为这会影响结果中的索引。