我们正在开发一个客户端脚本,它将自动更新费率或单价(*这是一个自定义列),但它会引发错误,我认为这是因为如果我们更改费率,它将自动更新单价和在单价更新后,它也将更新费率,依此类推,直到达到最大调用堆栈,我们正在寻找任何解决方法,为此不会发生,请参阅下面的代码。感谢
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()));
}
}
答案 0 :(得分:2)
nlapiSetCurrentLineItemValues()
有一个名为firefieldchanged
的第四个参数,可以将其设置为false以防止出现此问题
使用火场更改参数
创建脚本时,可以为一个字段监视字段 改变,然后写回更改的字段,风险 创建无限循环存在如下:
- 客户端脚本监视要更改的fieldA。
- fieldA更改。
- 脚本写入fieldA,导致Field Changed事件触发, 将代码返回到第2步,此循环无限重复。
醇>要防止此循环行为,您可以设置可选项 客户端脚本中的
firefieldchanged
参数。
firefieldchanged
参数可用于所有写入功能。 如果设置为true,则该参数会导致触发任何字段更改事件 像平常一样。这是默认设置。如果设置为false,则字段已更改 事件不会被解雇。