Javascript NetSuite费用报告数组高效



好的,那么我需要做的是为netsuite创建一个脚本,该脚本循环遍历费用报告中的每个费用,并根据对自定义记录的搜索更新税法。我需要的是效率方面的帮助——通常会有同一类别的费用被搜索多次,由于分配的管理,我想让它成为搜索的最小次数,而不是多次搜索同一类别。以下是我的文件:

/*
 * Pseudocode:
 * search minimum amount of times - do not search same category multiple times
 * for loop cycle through each expense and save category to array
 * if category is first occurrence complete search for tax code
 * else if category is a repeat set tax code based on previous search
 * 
 */

function userEventBeforeSubmit(type){
    /*if(type!='create')
    {
        return;
    }
    */
    //amount of expenses per expense report
    var expenseNum = nlapiGetLineItemCount('expense');
    var intSubsidiary = nlapiGetFieldValue('subsidiary');
    //this for loop is attempting to push the unique categories into an array leaving out duplicates 
    for(var i = 0; i < expenseNum; i++){
        var intCategory = nlapiGetLineItemValue('expense', 'category', i);
        var arr = [];
        //if category not found push into array
        if(arr.indexOf(intCategory) === -1){
            arr.push(intCategory);
        }
        //search expense tax codes record
        var arrSearchFilters = new Array();
        arrSearchFilters[0] = new nlobjSearchFilter('custrecord_cv_expensesubsidiary', null, 'anyof', intSubsidiary);
        arrSearchFilters[1] = new nlobjSearchFilter('custrecord_cv_expensecategory', null, 'anyof', arr[i]);
        //field from expense tax codes record
        var arrSearchColumns = new Array();
        arrSearchColumns[0] = new nlobjSearchColumn('custrecord_cv_taxcode');
        var arrSearchResults = nlapiSearchRecord('customrecord_cv_expensetaxcodes', null, arrSearchFilters, arrSearchColumns);
    }



        //for loop to iterate through expenses in expense report
        for(var i =1; i < expenseNum+1; i++){
            //get value category for each line
            //var intCategory = nlapiGetLineItemValue('expense', 'category', i);
            var taxAmtTemp = nlapiGetLineItemValue('expense', 'taxamount', i);
            var searchResult = arrSearchResults[0];
            //set tax code 
            var taxCode = searchResult.getValue(arrSearchColumns[0]);
            nlapiSetLineItemValue('expense', 'taxcode', i, taxCode);
            //if tax amount changes set back to original amount
            if(taxAmtTemp != nlapiGetLineItemValue('expense', 'taxamount', i)){
                nlapiSetLineItemValue('expense', 'taxamount', i, taxAmtTemp);
            }  

        }


}

在创建记录后,用户是否需要查看适当的税法(基于自定义记录搜索返回值)?

如果您担心治理,您可以将其设置为调度脚本-这样分配的脚本使用就足够了。

然后,您可以将费用记录的内部id传递给预定的脚本,并使其在记录保存后立即执行。因此,您的用户提交事件将充当触发器,并将记录id作为参数传递,并执行预定的脚本。根据队列的不同,记录应该在几分钟内更新。但是,记录中的更改不会实时发生。

您编写的系统看起来相当合理,但是您可以进行一个简单的优化。'anyof'过滤器可以接受一个值数组。因此,在第一个循环中构建类别数组。

var arrExpenseCategory = [];
for(var i = 1; i < expenseNum+1; i++){
    var intCategory = nlapiGetLineItemValue('expense', 'category', i);
    if(arrExpenseCategory.indexOf(intCategory) === -1){
        arrExpenseCategory.push(intCategory);
    }
}

然后搜索这些记录。

//search expense tax codes record
var arrSearchFilters = [
   new nlobjSearchFilter('custrecord_cv_expensesubsidiary', null, 'anyof', intSubsidiary), 
   new nlobjSearchFilter('custrecord_cv_expensecategory', null, 'anyof', expenseCategoryArr)
]
//field from expense tax codes record
var arrSearchColumns = new Array();
arrSearchColumns[0] = new nlobjSearchColumn('custrecord_cv_taxcode');
arrSearchColumns[1] = new nlobjSearchColumn('custrecord_cv_expensecategory');

然后将这些记录放入数组中。

var arrSearchResults = nlapiSearchRecord('customrecord_cv_expensetaxcodes', null, arrSearchFilters, arrSearchColumns);
arrExpenseCategory = [];
for(var i = 0; i < arrSearchResults.length; i++){
    arrExpenseCategory[arrSearchResults.getValue(arrSearchColumns[1])] = arrSearchResults.getValue(arrSearchColumns[0]);
}

然后使用数组来填充您的字段。

for(var i =1; i < expenseNum+1; i++){
    var taxAmtTemp = nlapiGetLineItemValue('expense', 'taxamount', i);
    nlapiSetLineItemValue('expense', 'taxcode', i, arrExpenseCategory[nlapiGetLineItemValue('expense', 'category', i)]);
    //if tax amount changes set back to original amount
    if(taxAmtTemp != nlapiGetLineItemValue('expense', 'taxamount', i)){
        nlapiSetLineItemValue('expense', 'taxamount', i, taxAmtTemp);
        }  
    }

由于在最初的问题中没有说明,我假设这将在beforeSubmit事件上运行。在foresave事件之前,它也可以在客户端上正常运行。唯一需要注意的是,nlapiSearchRecord最多只返回1000个结果。如果您有超过1000个customrecord_cv_expensetaxcodes记录,那么这个脚本将不适合您。您实际上被困在eliseobeltran提到的预定脚本中运行该脚本。

最新更新