下面的验证行功能似乎仅在第二次单击添加时起作用。因此,如果金额为500并且我将折扣设置为100,则在点击添加按钮时它应该是400.它不起作用。如果我再次单击该行,则看起来折扣应用两次 - 金额变为300.如何解决此问题?
function OnValidateLine(type, name) {
var count = nlapiGetLineItemCount('expense')
var total = nlapiGetFieldValue('usertotal')
for (var x = 1; x <= count; x++) {
var amount = nlapiGetCurrentLineItemValue('expense', 'amount');
var discount = nlapiGetCurrentLineItemValue('expense', 'custcolptc_discount');
if (discount) {
nlapiSetCurrentLineItemValue('expense', 'amount', amount - discount)
}
return true;
}
return true;
}
答案 0 :(得分:2)
你实际上并没有对你的循环做任何事情。
此外,你的方式充满了问题。
您应该在recalc事件中执行此操作,而不是行验证事件。
如果我这样做,我倾向于管理一个合成的&#39;费用行,即计算折扣的总和。如果有人更改费用说明,您目前正在执行此操作的方式,您将最终应用两次折扣。如果您使用折扣行,那么您只需总计折扣并添加或更新折扣行。
通常,对于客户端脚本,您需要为您正在查看的每一行提前指针。在&#39; id字段下方未经测试的示例中?&#39;将是备忘录或帐户列(您无论如何都必须设置帐户):
var totalDiscount = 0;
var discountExpenseAt = 0;
for(var i = nlapiGetLineItemCount('expense'); i> 0; i--){
if(nlapiGetLineItemValue('expense', 'id field?', i) == 'discount identifier') {
discountExpenseAt = i;
continue;
}
totalDiscount += parseFloat(nlapiGetLineItemValue('expense', 'custcolptc_discount', i)) ||0;
}
if(totalDiscount) {
if(discountExpenseAt){
nlapiSelectCurrentLineItem('expense', discountExpenseAt);
nlapiSetCurrentLineItemValue('expense', 'amount', totalDiscount.toFixed(2));
nlapiSetCurrentLineItemValue('expense', 'id field?', 'discount identifier');
nlapiCommitCurrentLineItem('expense');
}