如何在kitlet Netsuite中优化运行大量数据的代码

时间:2016-11-25 06:52:47

标签: 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","@NONE@"]
               "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"," greaterthan"," 0"]它正在运行,因为结果只有400和打印总数。

当我删除过滤器时,它变得无限并且在浏览器中加载并且数据永远不会显示,因为结果是20000

如何使其适用于更大的数据。我正在使用沙盒帐户。

3 个答案:

答案 0 :(得分:1)

试试这段代码,我添加了一个可以获得所有结果的函数。请小心,因为可能有其他方法来优化您的搜索。另外,请记住,Suitelets具有超时设置(30秒)。

catch <- data.frame(catch) #ncol=1,nrow=671
w.int <- data.frame(wind) #ncol=1, nrow=671
plot(w.int,catch,type="p") 

答案 1 :(得分:1)

您可能真的不希望您的用户必须涉及20k行。如果您的用例只是创建搜索并显示搜索结果(例如,这样用户可以导出它们或进一步播放结果但是不检查某些框以重新提交以进行进一步处理)然后您可以使用nlobjSearch.setRedirectURLToSearchResults();

e.g。

var itemSearch =  nlapiCreateSearch("item", 
          [
             ["formulanumeric: {quantityavailable} - {reorderpoint}","lessthanorequalto","0"], 
           "AND", 
           ["parent","noneof","@NONE@"]
           "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保存的搜索窗格将处理分页等。

答案 2 :(得分:0)

由于您的代码只计算总数,因此无需检索所有数据。只需将保存的搜索返回总数即可。

这是基本的想法(我没有测试代码,因此可能会出现一些错误,但总体思路应该有效)。

function suitelet(request, response) {

    var results = nlapiSearchRecord('item', null,
        [
            ["formulanumeric: {quantityavailable} - {reorderpoint}","lessthanorequalto","0"], "AND",
            ["parent","noneof","@NONE@"]
        ], 
        [
            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);
    }

}