Javascript NetSuite费用报告数组高效
好的,那么我需要做的是为netsuite创建一个脚本,它循环遍历开支报告中的每个开支,并基于对自定义记录的搜索更新税码。我需要的是效率方面的帮助-通常会多次搜索同一类别的费用,并且由于分配的治理,我希望这样做,因此我将搜索称为最小次数,而不是多次搜索同一类别。以下是我所拥有的:Javascript NetSuite费用报告数组高效,javascript,arrays,duplicates,netsuite,Javascript,Arrays,Duplicates,Netsuite,好的,那么我需要做的是为netsuite创建一个脚本,它循环遍历开支报告中的每个开支,并基于对自定义记录的搜索更新税码。我需要的是效率方面的帮助-通常会多次搜索同一类别的费用,并且由于分配的治理,我希望这样做,因此我将搜索称为最小次数,而不是多次搜索同一类别。以下是我所拥有的: /* * Pseudocode: * search minimum amount of times - do not search same category multiple times * for loop c
/*
* 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);
}
}
然后将这些记录放入数组中
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事件上运行。它在客户端上也可以在保存事件之前正常运行。我唯一需要注意的是,nlapiSearchRecord最多只能返回1000个结果。如果您与该子公司的customrecord\u cv\u expensetaxcodes记录超过1000条,则此脚本将不适用于您。正如eliseobeltran所提到的,您基本上无法在计划脚本中运行它
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);
}
}