以下代码可以很好地完成我想在netsuite中实现的目标,但是我无法找到使其更快的方法。我尝试不经常使用系统nlapi,但我似乎无法在不提交记录的情况下使其工作。任何指导将不胜感激。
function WonLost(type, name) {
if (name == 'custbody138') {
var recordid = nlapiGetRecordId();
var record = nlapiLoadRecord('estimate', recordid);
if ((nlapiGetFieldValue('custbody138')) == 'T') {
var itemsall = "";
var lineCount = parseInt(record.getLineItemCount('item'));
var x = 1;
while (x <= lineCount) {
nlapiSelectLineItem('item', x);
nlapiSetCurrentLineItemValue('item', 'custcol55', 'T', 'false');
nlapiCommitLineItem('item');
x++;
}
}
else {
var itemsall = "";
var lineCount = parseInt(record.getLineItemCount('item'));
var x = 1;
while (x <= lineCount) {
nlapiSelectLineItem('item', x);
nlapiSetCurrentLineItemValue('item', 'custcol55', 'F', 'false');
nlapiCommitLineItem('item');
x++;
}
}
}
}
答案 0 :(得分:0)
这是什么类型的脚本?
看起来您正在加载部署脚本的记录。这完全没必要,您可以使用nlapi*
函数代替record.*
函数。加载整个记录是您可以执行的更昂贵的操作之一。
recordid
和record
变量record.getLineItemCount
来电替换为nlapiGetLineItemCount
答案 1 :(得分:0)
另一种方法是在客户端脚本的Recalc Function上设置'custcol55'
为'T',这样就不需要迭代整个项目列表了。
答案 2 :(得分:-3)
我在大学里睡过这种开销的概念,但我的基本理解是循环可能很昂贵。 (表现密集)
因此,如果有100行并且你一次循环1个,那就是100个循环,但是如果你每个循环可以处理5行,那么它只有20个循环。它被称为&#34;循环展开&#34;,http://en.wikipedia.org/wiki/Loop_unrolling
所以不要这样做......
while (x<= lineCount)
{
//do stuff on line x
x++;
}
相反试试这个......
while (x<= lineCount)
{
//do stuff on line x
//do stuff on line x+1
//do stuff on line x+2
//do stuff on line x+3
//do stuff on line x+4
x=x+5;
}
你还必须处理有47行的情况,所以你只能循环到((int)(linecount / 5)* 5)然后在最后做一个迷你1-a-time循环处理46和47(行数%5)。
这导致了非常丑陋但不优雅的代码,但我发现它对性能非常有帮助,特别是在分块长sql查询时。你必须玩大块的大小,5可能太小或太大而没有好处,所以调整它并记录你的时间直到找到最佳位置。