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

SuiteScript2.0 Getting values from a saved search formula column

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

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

单条数据的日志如我所料读取;

{
    "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"
    }
}

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

当我使用公式字段时,我总是使用列索引值。下面是我的一个例子。这与我创建的第五列相匹配(当然是从 0 开始)。希望对您有所帮助。

transactionSearch.run().each(function(r){
  var var1=r.getValue(r.columns[5]);
  var var2=r.getValue(r.columns[6]);
  var var3=r.getValue(r.columns[7]);
  var var4=r.getValue(r.columns[8]);
  var var5=r.getValue(r.columns[9]);
  return true;
});

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

问题

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

如您所见,记录结果对象将输出不正确的名称。如果你登录 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]));
      });
    });
    
  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]));
        }
      });
    });
    
  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
      });
    });
    

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