我很好奇是否有人遇到过这个问题。我认为这可能是sublistChanged()被触发时发生的某种递归,但我不知道如何修复它。
export function sublistChanged (ctx: EntryPoints.Client.sublistChangedContext) {
const rec = X.getTx(ctx)
const total = _.sumBy(rec.item, (line: POItemSublist | TOItemSublist) => line.quantity * line.custcol_atlas_item_weight!)
rec.custbody_totalitemweightorder = total
}
看起来你在使用带有下划线和其他库的Typescript。
IMO努力使Netsuite更像"传统"的环境是相当令人担忧的。
大多数列表推导可以很容易地管理,只需一个更Netsuite友好的迭代器。我有一个片段:
function iter(rec:record.Record, listName, cb, doReverse? :boolean){
var i = 0;
var getV = function (fld){
return rec.getSublistValue({sublistId:listName, fieldId:fld, line:i});
};
if(doReverse){
i = rec.getLineCount({sublistId:listName}) - 1;
for(; i>= 0; i--){
cb(i, getV);
}
}else{
var lim = rec.getLineCount({sublistId:listName});
for(; i< lim; i++){
cb(i, getV);
}
}
}
所以你的代码看起来像:
export function sublistChanged (ctx: EntryPoints.Client.sublistChangedContext) {
const rec = ctx.currentRecord;
let total = 0;
iter(rec, 'item', (idx, getV)=>{
total += getV('quantity') * getV('custcol_atlas_item_weight')!;
});
rec.setValue({fieldId:'custbody_totalitemweightorder' ,value:total, ignoreFieldChange:true, forceSyncSourcing: true});
}
ignoreFieldChange可以跳过,如果你想要触发正常的下游事件处理,但在设置总权重字段通常也会触发脚本的情况下,你可能需要这个。
forceSyncSourcing导致setValue动作在下一个动作发生之前完全完成。