如何从表单的子列表中检索所有数据?即,理想情况下将子列表中的所有行检索为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
};
});
答案 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。但是您可以修改此代码以返回较小的数据集。