javascript - How to get all items list on NetSuite? - Stack Overflow

admin2025-04-19  0

I am just starting with NetSuite and trying to pull all items with details using Restlet. With some research, I am able to pull all the items but the way I am doing now is not straightforward. I first pull the all ids of item using nlapiSearchRecord and loop through each id to get details of each item using nlapiLoadRecord and added to array. This way, it is taking to much time. Is there other way to pull all items with their details? Below is my code.

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;
}

I am just starting with NetSuite and trying to pull all items with details using Restlet. With some research, I am able to pull all the items but the way I am doing now is not straightforward. I first pull the all ids of item using nlapiSearchRecord and loop through each id to get details of each item using nlapiLoadRecord and added to array. This way, it is taking to much time. Is there other way to pull all items with their details? Below is my code.

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;
}
Share edited Apr 25, 2021 at 6:18 cja 10.1k22 gold badges79 silver badges135 bronze badges asked Feb 21, 2018 at 11:37 AmirAmir 2,0523 gold badges26 silver badges41 bronze badges
Add a ment  | 

3 Answers 3

Reset to default 4

You can use what @Krypton suggested but you will always get 1000 results at max.

Try following if you have requirement to get more than 1000 (using 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 });

You can include the details you want in the search. So, for example, you can include an nlobjSearchFilter so that the search only returns inventory items, and add an nlobjSearchColumn for each field you want to see in the details. This way all the details you want to see are returned with the search and you can loop through the results to do what you want with them without loading every record individually - which will be where most of the performance hit is happening.

An example:

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)
]
);

Then you can loop through the results to get details:

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' ); 
}

There is a lot to learn about scripted searches in NetSuite, so I'd remend starting here (NetSuite login required) and follow the links and keep reading / experimenting until your eyes glaze over.

I just like to use a generic function that accepts a search object...

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}`)
  }
}
转载请注明原文地址:http://conceptsofalgorithm.com/Algorithm/1745073102a283405.html

最新回复(0)