NetSuite - OnValidateLine不起作用

时间:2016-08-30 12:39:55

标签: netsuite suitescript

下面的验证行功能似乎仅在第二次单击添加时起作用。因此,如果金额为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;
}

1 个答案:

答案 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');
}