获取子列表行数据

时间:2017-05-11 00:08:10

标签: netsuite suitescript

如何从表单的子列表中检索所有数据?即,理想情况下将子列表中的所有行检索为array of objects

/**
 * @NApiVersion 2.x
 * @NScriptType Suitelet
 * @NModuleScope SameAccount
 */

define(['N/ui/serverWidget', 
        'N/email', 
        'N/runtime', 
        'N/search',
        'N/file', 
        'N/log'],

/**
 * @param {ui} ui
 * @param {email} email
 * @param {runtime} runtime
 * @param {search} search
 * @param {file} file
 * @param {log} log
 */
function(ui, email, runtime, search, file, log) {


    function onRequest(context) {
        // On GET I create a form and add a sublist inline editor to it.

        if (context.request.method === 'POST') {
            var sublistData = context.request.parameters.sublistdata;

            // sublistData is not an array its funny string. See below:
            // 2017-5-16\u000111\u00012017-5-19\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u00011\u0001\u0001Me\u0001\u0001\u0001\u0001\u00012\u0001\u0001F\u0001\u0001\u0001INSERT\u00011\u0001F\u0001\u0001\u0001\u0001\u0001\u00022017-5-22\u000111122122\u00012017-5-12\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u00011\u0001\u0001Me\u0001\u0001\u0001\u0001\u00012\u0001\u0001F\u0001\u0001\u0001INSERT\u00011\u0001F\u0001\u0001\u0001\u0001\u0001

            //How can I get the sublist row data in a better format?
        }
    }

    return {
        onRequest: onRequest
    };

});

2 个答案:

答案 0 :(得分:4)

发生的事情是NetSuite通过不可打印的Unicode控制字符\u0001(字段之间)和\u0002(行之间)界定请求对象中的子列表值。

您可以使用request.getLineCount()request.getSublistValue()来检索结果。

var lines = context.request.getLineCount({ group: "sublist" });
for(var i = 0; i < lines; i++) {
  var field1 = context.request.getSublistValue({ group: 'sublist', name: 'field1', line: i });
  var field2 = context.request.getSublistValue({ group: 'sublist', name: 'field2', line: i });
}

答案 1 :(得分:0)

现在,SuiteScript 2.1在Beta中并支持ES6,您可以按以下方式填充整个记录。首先,在脚本中使用NApiVersion 2.1

 * @NApiVersion 2.1

然后确保您需要N / record模块

 define(['N/record'],  function (record) {
   // ... your code in here ...
 }

然后在代码中的某处定义此函数...

function buildRecordData() {
  // load the record you want
  const rec = r.load({
    id: '1234',         // your record's internal id here
    type: 'salesorder'  // your record's type here
  })

  let data = {}
  const sublistIds = rec.getSublists()

  // loop through all sublists for this record type
  for (let sublistId of sublistIds) {
    // add a property to the object for each sublistId
    data[sublistId] = []

    // get the columns of the sublist
    let sublistFields = rec.getSublistFields({ sublistId })
    let count = rec.getLineCount({ sublistId })

    // loop through the lines of the sublist and build an object for each
    for(let line = 0; line < count; line++) {
      let x = {}
      for (let fieldId of sublistFields) {
        x[fieldId] = rec.getSublistValue({ sublistId, fieldId, line })
      }
      data[sublistId].push(x)
    }
  }
  return data
}    

调用此脚本时,它将为您提供一个对象。返回对象的属性对应于记录的子列表。每个子列表是一个对象数组,该数组的每个元素代表该子列表的一行。

很明显,这可能是过大了。如果您只想要一个子列表并且知道它的ID,或者如果您只希望该行中的几个字段并且您知道它们的ID。但是您可以修改此代码以返回较小的数据集。