如何优化代码中suitelet运行大量数据的NetSuite
问题描述:
我有这样小的代码如何优化代码中suitelet运行大量数据的NetSuite
function suitelet(request, response){
var fromIndex = 0;
var toIndex = 500;
var totalItems= 0;
var itemSearch = nlapiCreateSearch("item",
[
["formulanumeric: {quantityavailable} - {reorderpoint}","lessthanorequalto","0"],
"AND",
["parent","noneof","@[email protected]"]
"AND",
["locationquantityavailable","greaterthan","0"]
],
[
new nlobjSearchColumn("itemid",null,null).setSort(false),
new nlobjSearchColumn("parent",null,null),
new nlobjSearchColumn("othervendor",null,null),
new nlobjSearchColumn("department",null,null),
new nlobjSearchColumn("location",null,null)
]
);
var resultSet = itemSearch.runSearch();
var results = resultSet.getResults(fromIndex,toIndex);
while(results != null && results.length > 0)
{
totalItems += results.length;
fromIndex = toIndex;
toIndex += 500;
results = resultSet.getResults(fromIndex,toIndex);
}
response.write(totalItems);
}
当我使用该过滤器的问题是[“locationquantityavailable”,“大于”,“0”]它正在工作,因为结果只有400,并且打印总数。
因为结果是20000如何使之成为大数据的工作,当我取出那张无限和加载在浏览器和数据永远不会显示的过滤器
。我正在使用沙箱帐户。
答
由于您的代码只计算总数,因此不需要检索所有数据。只要保存的搜索返回总数。
下面是基本的想法(我没有测试代码,所以可能有一些错误,但总的想法应该工作)。
function suitelet(request, response) {
var results = nlapiSearchRecord('item', null,
[
["formulanumeric: {quantityavailable} - {reorderpoint}","lessthanorequalto","0"], "AND",
["parent","noneof","@[email protected]"]
],
[
new nlobjSearchColumn("formulanumeric",null,'GROUP').setFormula('1'),
new nlobjSearchColumn('itemid',null,'COUNT')
]
);
if(results) {
var totalItems = results[0].getValue('itemid',null,'COUNT');
response.write(totalItems);
}
}
答
试试这个代码,我添加了一个函数来获取所有的结果。请小心,因为可能有其他方式可以优化您的搜索。另外,请记住Suitelets具有超时设置(30秒)。
function suitelet(request, response) {
var itemSearch = nlapiCreateSearch("item",
[
["formulanumeric: {quantityavailable} - {reorderpoint}", "lessthanorequalto", "0"],
"AND",
["parent", "noneof", "@[email protected]"]
"AND",
["locationquantityavailable", "greaterthan", "0"]
],
[
new nlobjSearchColumn("itemid", null, null).setSort(false),
new nlobjSearchColumn("parent", null, null),
new nlobjSearchColumn("othervendor", null, null),
new nlobjSearchColumn("department", null, null),
new nlobjSearchColumn("location", null, null)
]);
var results = fullSearch(itemSearch);
var totalItems = results.length;
response.write(totalItems);
}
function fullSearch(search) {
var resultset = search.runSearch();
var resultsets = [];
var returnSearchResults = [];
var searchid = 0;
var startdate, enddate, resultslice;
do {
resultslice = getResultSlice(resultset, searchid);
for (rs in resultslice) {
returnSearchResults.push(resultslice[rs]);
searchid++;
}
} while (resultslice.length == 1000);
return returnSearchResults;
//*********** HELPER FUNCTION ***********/
function getResultSlice(resultset, searchid) {
var resultslice = resultset.getResults(searchid, searchid + 1000);
return resultslice;
}
}
答
你可能真的不希望你的用户必须通过20K涉水rows.If你的使用情况仅仅是创建一个搜索并显示搜索结果(例如,使用户可以导出,或进一步发挥与结果,但不检查一些箱子重新提交进一步处理),那么你可以使用nlobjSearch.setRedirectURLToSearchResults();
eg
var itemSearch = nlapiCreateSearch("item",
[
["formulanumeric: {quantityavailable} - {reorderpoint}","lessthanorequalto","0"],
"AND",
["parent","noneof","@[email protected]"]
"AND",
["locationquantityavailable","greaterthan","0"]
],
[
new nlobjSearchColumn("itemid",null,null).setSort(false),
new nlobjSearchColumn("parent",null,null),
new nlobjSearchColumn("othervendor",null,null),
new nlobjSearchColumn("department",null,null),
new nlobjSearchColumn("location",null,null)
]
);
itemSearch.setRedirectURLToSearchResults();
现在NetSuite的保存的搜索窗格将处理分页等
不错,但我想用nlapiCreateSearch,计算总只是一个例子。我也想要其他数据的行..这是工作400记录,但是当有更多的项目像20000它不工作.. –
你到底想要完成什么? – erictgrubaugh