我刚开始使用net-suit并尝试使用rest-let拉出所有带有详细信息的项目。通过一些研究,我能够提取所有项目,但我现在的方式并不简单。我首先使用nlapiSearchRecord提取项目的所有ID并循环遍历每个id以使用nlapiLoadRecord获取每个项目的详细信息并添加到数组中。这样,它花费了很多时间。有没有其他方法可以提取所有项目的详细信息?以下是我的代码。
function getAllIDs() {
return nlapiSearchRecord('item', null, null, null);
}
function getRecord() {
var all_IDs = getAllIDs();
var len=all_IDs.length;
var result =new Array();
for(var i=0;i<all_IDs.length;i++) {
if(all_IDs[i].getRecordType()==="inventoryitem")
result[i]=nlapiLoadRecord(all_IDs[i].getRecordType(),all_IDs[i].id)
}
return result;
}
答案 0 :(得分:3)
您可以使用@Krypton建议的内容,但最多可获得1000个结果。
如果您要求获得超过1000(使用Suitescript 2.0),请尝试以下操作:
var columns = [];
var filters = [['isinactive', 'is', 'F']];
columns.push(search.createColumn({ name: "itemid"}));
columns.push(search.createColumn({ name: "displayname"}));
columns.push(search.createColumn({ name: "salesdescription"}));
columns.push(search.createColumn({ name: "baseprice"}));
var inventoryitemSearch = search.create({
type: search.Type.INVENTORY_ITEM, //Change the type as per your requirement
filters: filters,
columns: columns
});
var arrResults = [];
var count = 1000;
var startIndex = 0;
var endIndex = 1000;
var resultSet= inventoryitemSearch.run();
while (count == 1000) {
var results = resultSet.getRange(startIndex, endIndex);
arrResults = arrResults.concat(results);
startIndex = endIndex;
endIndex += 1000;
count = results.length;
}
log.debug({title: 'arrResults ', details: arrResults });
答案 1 :(得分:1)
您可以在搜索中包含所需的详细信息。因此,例如,您可以添加nlobjSearchFilter
,以便搜索仅返回广告资源项,并为您希望在详细信息中看到的每个字段添加nlobjSearchColumn
。这样,您想要查看的所有详细信息都会随搜索一起返回,您可以循环搜索结果,无需单独加载每条记录即可完成所需的操作 - 这将是大多数性能影响发生的地方。
一个例子:
var inventoryitemSearch = nlapiSearchRecord("inventoryitem",null,
[
["type","anyof","InvtPart"]
],
[
new nlobjSearchColumn("itemid",null,null).setSort(false),
new nlobjSearchColumn("displayname",null,null),
new nlobjSearchColumn("salesdescription",null,null),
new nlobjSearchColumn("baseprice",null,null)
]
);
然后您可以循环搜索结果以获取详细信息:
var name, displayName, description, price;
for ( var i = 0; inventoryitemSearch != null && i < searchresults.length; i++ ) {
var searchresult = inventoryitemSearch[ i ];
name = searchresult.getValue( 'itemid' );
displayName = searchresult.getValue( 'displayname' );
description = searchresult.getValue( 'salesdescription' );
price = searchresult.getValue( 'baseprice' );
}
在NetSuite中有很多关于脚本搜索的知识,所以我建议开始here(需要NetSuite登录)并按照链接继续阅读/试验,直到你的眼睛茫然。
答案 2 :(得分:1)
我只想使用接受搜索对象的通用函数......
const getAllResults = searchObj => {
try {
const Resultset = searchObj.run()
const maxResults = searchObj.runPaged().count
let ResultSubSet = null
let index = 0
const maxSearchReturn = 1000
let AllSearchResults = []
do {
let start = index
let end = index + maxSearchReturn
if (maxResults && maxResults <= end) {
end = maxResults
}
ResultSubSet = Resultset.getRange(start, end)
if (ResultSubSet.length === 0) {
break
}
// we could intriduce a record processor to lighetn up the load
AllSearchResults = AllSearchResults.concat(ResultSubSet)
index = index + ResultSubSet.length
if (maxResults && maxResults == index) {
break
}
} while (ResultSubSet.length >= maxSearchReturn)
return AllSearchResults
} catch (e) {
log.error(`getAllResults()`, `error : ${e}`)
}
}