Netsuite 创建销售订单时超出了RangeError最大调用堆栈大小

Netsuite 创建销售订单时超出了RangeError最大调用堆栈大小,netsuite,Netsuite,我们正在开发一个客户端脚本,它将自动更新速率或单价(*这是一个自定义列),但它会抛出一个错误,我认为这是因为如果我们更改速率,它将自动更新单价,在单价更新后,它也将更新速率,依此类推,直到达到最大调用堆栈,我们正在寻找任何不发生这种情况的解决办法,请参阅下面我的代码。谢谢 function fieldChanged(type, name, linenum) { var context = nlapiGetContext(); var user = context.getUser(

我们正在开发一个客户端脚本,它将自动更新速率或单价(*这是一个自定义列),但它会抛出一个错误,我认为这是因为如果我们更改速率,它将自动更新单价,在单价更新后,它也将更新速率,依此类推,直到达到最大调用堆栈,我们正在寻找任何不发生这种情况的解决办法,请参阅下面我的代码。谢谢

function fieldChanged(type, name, linenum)
{
    var context = nlapiGetContext();
    var user = context.getUser();
    var execution = context.getExecutionContext();

try {
    switch (name) {
        case "custcol_cqwst_po_uprice":
            if (execution == "userinterface") {
                var qty = nlapiGetCurrentLineItemValue('item', 'quantity');
                var taxCode = nlapiGetCurrentLineItemValue('item', 'taxcode');

                if (!isNullOrEmpty(taxCode) && !isNullOrEmpty(qty)) {

                    var taxRate = nlapiGetCurrentLineItemValue('item', 'taxrate1');
                    var unitprice = nlapiGetCurrentLineItemValue('item', 'custcol_cqwst_po_uprice');
                    var vatRate = 1 + ((taxRate.replace('%', '')) / 100);
                    var unitRate = unitprice / vatRate;
                    nlapiSetCurrentLineItemValue('item', 'rate', unitRate);
                }
            }
            break;
        //case "taxcode":
            //break;

        case "rate":
            if (execution == "userinterface") {
                var qty = nlapiGetCurrentLineItemValue('item', 'quantity');
                var taxCode = nlapiGetCurrentLineItemValue('item', 'taxcode');

                if (!isNullOrEmpty(taxCode) && !isNullOrEmpty(qty)) {

                    var taxRate = nlapiGetCurrentLineItemValue('item', 'taxrate1');
                    var rate = nlapiGetCurrentLineItemValue('item', 'rate');
                    var vatRate = 1 + ((taxRate.replace('%', '')) / 100);
                    var unitPrice = rate * vatRate;
                    nlapiSetCurrentLineItemValue('item', 'custcol_cqwst_po_uprice', unitPrice);

                    nlapiLogExecution('debug', "Rate Value", "Rate: " + rate + " Vat Rate: " + vatRate + " Unit Price: " + unitPrice + " Execution: " + execution);
                }
            }
            break;
    }
}
catch (ex) {
    alert("A scripting problem occurred during the onFieldChange event please inform an administrator quoting the following error: " + ((ex instanceof nlobjError) ? ex.getCode() + '\n' + ex.getDetails() : ex.toString()));
}
}

nlapiSetCurrentLineItemValues()
有第四个参数,名为
firefieldchanged
,可以将其设置为false以准确防止此问题

使用火灾现场更改参数

创建脚本时,可以监视字段中的 更改,然后写回更改的字段,存在 创建无限循环的过程如下所示:

  • 客户端脚本监视fieldA的更改
  • 菲尔达改变了
  • 脚本写入fieldA,引发Field Changed事件, 将代码返回到步骤2,此循环将无限期重复
  • 要防止这种循环行为,可以设置可选的
    firefield已更改客户端脚本中的
    参数

    firefieldchanged
    参数可用于所有写入函数。 如果设置为true,则该参数会触发任何字段更改事件 像平常一样。这是默认设置。如果设置为false,则字段已更改 事件不会被触发


    谢谢,我忘了火场发生了变化。这很有帮助。