如何确保在 Netsuite Onfieldchange 中我所在的行上设置了值
How do I make sure the value is set on the line that I am on in Netsuite Onfieldchange
在 netsuite 中,我试图自动计算销售订单上项目子列表的利润,并根据最近的利润设置价格水平,然后向用户显示成本和价格水平。我的一切正常,除非用户输入边距,然后单击另一行,然后它将计算出的平均成本和价格水平添加到您单击的行,而不是添加信息的行。我如何保证它会将值添加到我输入边距的那一行?
if (name == 'custcol61') {
var margincalcfield = nlapiGetCurrentLineItemValue('item', 'custcol61');
if (margincalcfield > 0 && margincalcfield * 1 == margincalcfield) {
var uid = nlapiGetCurrentLineItemValue('item', 'item');
var lineitemid = nlapiGetCurrentLineItemValue('item', 'line');
var itemRecord = nlapiLoadRecord('inventoryitem', uid);
var preferedvendorrate = itemRecord.getFieldValue('cost');
var itemaveragecost = itemRecord.getFieldValue('averagecost');
var newPG = nlapiGetCurrentLineItemValue('item', 'custcol61') / 100;
var itemBP = itemRecord.getLineItemMatrixValue('price', 'price', 1, 1);
var itemPG = itemRecord.getFieldValue('pricinggroup');
var newSP = (preferedvendorrate / (1 - newPG)).toFixed(2);
var newPriceLevel = 1 - ((newSP / itemBP).toFixed(2));
// alert(itemBP );
// alert(newSP );
// alert(newPriceLevel);
var pricelineCount = parseInt(itemRecord.getLineItemCount('price'));
for (x = 1; x <= pricelineCount; x++) {
var pricelevelprice = itemRecord.getLineItemMatrixValue('price', 'price', x, 1);
var priceleveldiscount = itemRecord.getLineItemValue('price', 'discount', x);
var pricelevel = itemRecord.getLineItemValue('price', 'pricelevel', x);
if (newSP >= pricelevelprice && priceleveldiscount != null) {
if (newSP != pricelevelprice) {
var y = x - 1;
var pricelevel = itemRecord.getLineItemValue('price', 'pricelevel', y);
var pricelevelprice = itemRecord.getLineItemMatrixValue('price', 'price', y, 1);
}
// alert(pricelevelprice );
// nlapiSelectLineItem(type, lineitemid );
nlapiSetCurrentLineItemValue('item', 'price', pricelevel);
// /////-----------------------------start set margin values-------------------------------------
var ppMargin = ((1 - (preferedvendorrate / pricelevelprice)) * 100).toFixed(2);
var avgcostMargin = ((1 - (itemaveragecost / pricelevelprice)) * 100).toFixed(2);
if (itemaveragecost > 0) {
var avgmargintext = "\nAC:" + avgcostMargin + "%";
}
var purchasepricemargintext = "PP:" + ppMargin + "% ";
var marginfieldvalue = purchasepricemargintext + avgmargintext;
nlapiSetCurrentLineItemValue('item', 'custcol61', marginfieldvalue);
// /////-----------------------------end set margin values-------------------------------------
return true;
}
}
}
}
我怀疑它与获取 currentline 项目并为其设置值而不是 "nlapiSetCurrentLineItemValue" 有关,但到目前为止我还没有能够让它工作。
你的怀疑是正确的;显然 fieldChanged
事件在选择新行之前没有完成。您的 fieldChanged
事件处理程序将按以下顺序传递三个参数:
type
- 更改的子列表的 ID
name
- 更改的字段 ID
linenum
- 更改行的索引
最后一个参数是您感兴趣的。确保您的 fieldChanged
处理程序函数接受三个参数,并结合使用 linenum
参数和 nlapiSetLineItemValue
而不是 setCurrentLineItemValue
.
在 netsuite 中,我试图自动计算销售订单上项目子列表的利润,并根据最近的利润设置价格水平,然后向用户显示成本和价格水平。我的一切正常,除非用户输入边距,然后单击另一行,然后它将计算出的平均成本和价格水平添加到您单击的行,而不是添加信息的行。我如何保证它会将值添加到我输入边距的那一行?
if (name == 'custcol61') {
var margincalcfield = nlapiGetCurrentLineItemValue('item', 'custcol61');
if (margincalcfield > 0 && margincalcfield * 1 == margincalcfield) {
var uid = nlapiGetCurrentLineItemValue('item', 'item');
var lineitemid = nlapiGetCurrentLineItemValue('item', 'line');
var itemRecord = nlapiLoadRecord('inventoryitem', uid);
var preferedvendorrate = itemRecord.getFieldValue('cost');
var itemaveragecost = itemRecord.getFieldValue('averagecost');
var newPG = nlapiGetCurrentLineItemValue('item', 'custcol61') / 100;
var itemBP = itemRecord.getLineItemMatrixValue('price', 'price', 1, 1);
var itemPG = itemRecord.getFieldValue('pricinggroup');
var newSP = (preferedvendorrate / (1 - newPG)).toFixed(2);
var newPriceLevel = 1 - ((newSP / itemBP).toFixed(2));
// alert(itemBP );
// alert(newSP );
// alert(newPriceLevel);
var pricelineCount = parseInt(itemRecord.getLineItemCount('price'));
for (x = 1; x <= pricelineCount; x++) {
var pricelevelprice = itemRecord.getLineItemMatrixValue('price', 'price', x, 1);
var priceleveldiscount = itemRecord.getLineItemValue('price', 'discount', x);
var pricelevel = itemRecord.getLineItemValue('price', 'pricelevel', x);
if (newSP >= pricelevelprice && priceleveldiscount != null) {
if (newSP != pricelevelprice) {
var y = x - 1;
var pricelevel = itemRecord.getLineItemValue('price', 'pricelevel', y);
var pricelevelprice = itemRecord.getLineItemMatrixValue('price', 'price', y, 1);
}
// alert(pricelevelprice );
// nlapiSelectLineItem(type, lineitemid );
nlapiSetCurrentLineItemValue('item', 'price', pricelevel);
// /////-----------------------------start set margin values-------------------------------------
var ppMargin = ((1 - (preferedvendorrate / pricelevelprice)) * 100).toFixed(2);
var avgcostMargin = ((1 - (itemaveragecost / pricelevelprice)) * 100).toFixed(2);
if (itemaveragecost > 0) {
var avgmargintext = "\nAC:" + avgcostMargin + "%";
}
var purchasepricemargintext = "PP:" + ppMargin + "% ";
var marginfieldvalue = purchasepricemargintext + avgmargintext;
nlapiSetCurrentLineItemValue('item', 'custcol61', marginfieldvalue);
// /////-----------------------------end set margin values-------------------------------------
return true;
}
}
}
}
我怀疑它与获取 currentline 项目并为其设置值而不是 "nlapiSetCurrentLineItemValue" 有关,但到目前为止我还没有能够让它工作。
你的怀疑是正确的;显然 fieldChanged
事件在选择新行之前没有完成。您的 fieldChanged
事件处理程序将按以下顺序传递三个参数:
type
- 更改的子列表的 IDname
- 更改的字段 IDlinenum
- 更改行的索引
最后一个参数是您感兴趣的。确保您的 fieldChanged
处理程序函数接受三个参数,并结合使用 linenum
参数和 nlapiSetLineItemValue
而不是 setCurrentLineItemValue
.