NetSuite developers frequently run into the SSS_SEARCH_FOR_EACH_LIMIT_EXCEEDED error when using forEachResult() to iterate large search result sets.
What Causes the Error?
NetSuite SuiteScript has a limitation: you can’t return more than 4,000 records using .forEachResult(callback) or .each(callback).
The error looks like this:
SSS_SEARCH_FOR_EACH_LIMIT_EXCEEDED:
No more than 4000 search results may be returned at one time from nlobjSearchResultSet.forEachResult(callback)
Using getRange(start, end) in a loop lets you retrieve results in batches of 1,000, avoiding the 4,000 limit.
define([‘N/search’], function(search) {
function getAllResults() {
var allResults = [];
var pageSize = 1000;
var start = 0;
var resultSet;
var mySearch = search.create({
type: search.Type.SALES_ORDER,
filters: [[‘status’, ‘anyof’, ‘SalesOrd:A’]],
columns: [‘internalid’, ‘tranid’, ‘entity’]
});
do {
resultSet = mySearch.run().getRange({
start: start,
end: start + pageSize
});
if (resultSet && resultSet.length > 0) {
allResults = allResults.concat(resultSet);
start += pageSize;
}
} while (resultSet.length === pageSize);
log.debug(‘Total Results Retrieved’, allResults.length);
return allResults;
}
return { execute: getAllResults };
});
Alternate Solution :
var pagedResults = mySearch.runPaged({ pageSize: 1000 });
pagedResults.pageRanges.forEach(function(pageRange) {
var page = pagedResults.fetch({ index: pageRange.index });
page.data.forEach(function(result) {
log.debug(‘Result ID’, result.id);
});
});