Javascript NetSuite restlet写入性能差

Javascript NetSuite restlet写入性能差,javascript,performance,netsuite,suitescript,Javascript,Performance,Netsuite,Suitescript,编辑:我已经编辑了实际数字,并用伪誓言代替,因为有人告诉我共享性能数据是违反Netsuite的TOS的。 我正在使用RESTlet将我们的会计系统与NetSuite集成,总的来说,除了性能之外,它运行得非常好。从性能的角度来看,我发现nlapiLoadRecord是Satan自己的孩子,所以我尽量避免使用搜索api,现在我的read Restlet非常简洁。然而,每当我要求restlet写任何东西时,它的速度就像困在冰冷焦油中的乌龟一样慢。我通常在慢和真的很慢秒之间分析NLAPIsubitRec

编辑:我已经编辑了实际数字,并用伪誓言代替,因为有人告诉我共享性能数据是违反Netsuite的TOS的。

我正在使用RESTlet将我们的会计系统与NetSuite集成,总的来说,除了性能之外,它运行得非常好。从性能的角度来看,我发现nlapiLoadRecord是Satan自己的孩子,所以我尽量避免使用搜索api,现在我的read Restlet非常简洁。然而,每当我要求restlet写任何东西时,它的速度就像困在冰冷焦油中的乌龟一样慢。我通常在真的很慢秒之间分析NLAPIsubitRecord本身。我觉得这很疯狂。如果写的时候性能总是这么差,没有人会使用NetSuite。下面我将包括几个代码示例。任何关于加快NetSuite restlet写入性能的提示都将不胜感激

在第一个示例中,receivedInvoice是传入的数据,findCurrencyCode和findCustomerByCustomerNumber是执行这些操作的性能良好的函数。我只是在一个几乎难以置信的神圣猴子的时间里记录下了这个,对于一个简单的发票,一个行项目的速度是慢的秒,几乎所有的时间都在我等待NLAPIsubitRecord完成的过程中流逝

var createdInvoice = nlapiCreateRecord('invoice');

createdInvoice.setFieldValue('customform', Number(receivedInvoice.transactionType));
createdInvoice.setFieldValue('memo', receivedInvoice.message);
createdInvoice.setFieldValue('duedate', receivedInvoice.dateDue);

createdInvoice.setFieldValue('currency', findCurrencyCode(receivedInvoice.currencyUnit));
createdInvoice.setFieldValue('location', Number(receivedInvoice.location));
createdInvoice.setFieldValue('postingperiod', findPostingPeriod(receivedInvoice.datePosted));
var customer = findCustomerByCustomerNumber(receivedInvoice.customerNumber);

createdInvoice.setFieldValue('entity', customer.customerId );
createdInvoice.setFieldValue('custbody_end_user', customer.customerId );
createdInvoice.setFieldValue('department', customer.departmentId);

var itemCount = receivedInvoice.items.length;
for(var i = 0; i < itemCount; i++)
{
  createdInvoice.selectNewLineItem('item');
  createdInvoice.setCurrentLineItemValue('item', 'item',receivedInvoice.items[i].item);
  createdInvoice.setCurrentLineItemValue('item', 'quantity', receivedInvoice.items[i].quantity);
  createdInvoice.setCurrentLineItemValue('item', 'rate',receivedInvoice.items[i].price);
  createdInvoice.setCurrentLineItemValue('item', 'custcol_list_rate',receivedInvoice.items[i].price);
  createdInvoice.setCurrentLineItemValue('item', 'amount',receivedInvoice.items[i].totalAmount);
  createdInvoice.setCurrentLineItemValue('item', 'description',receivedInvoice.items[i].description);
  createdInvoice.commitLineItem('item');
}

var recordNumber = nlapiSubmitRecord(createdInvoice,false,true);
var createdInvoice=nlapiCreateRecord(“发票”);
createdInvoice.setFieldValue('customform',Number(receivedInvoice.transactionType));
createdInvoice.setFieldValue('memo',receivedInvoice.message);
createdInvoice.setFieldValue('duedate',receivedInvoice.dateDue);
createdInvoice.setFieldValue('currency',findCurrencyCode(receivedInvoice.currencyUnit));
createdInvoice.setFieldValue('location',Number(receivedInvoice.location));
createdInvoice.setFieldValue('postingperiod',findPostingPeriod(receivedInvoice.datePosted));
var customer=findCustomerByCustomerNumber(receivedVoice.customerNumber);
createdInvoice.setFieldValue('entity',customer.customerId);
createdInvoice.setFieldValue('custbody\u end\u user',customer.customerId);
createdInvoice.setFieldValue('department',customer.departmentId);
var itemCount=receivedInvoice.items.length;
对于(变量i=0;i
在本例中,我认为我在动态模式下打开记录是在犯性能异端,但我不确定如何获得可能的行项目。只需在动态模式下打开一条新记录,时钟就会在秒左右。同样,提交是消耗时间最多的地方(通常是哦,亲爱的可怕的甜蜜母亲秒),尽管这一次在我处理行项目时消耗了相当多的时间,同样可能是因为我在动态模式下打开了记录

var customerPayment = nlapiCreateRecord('customerpayment',{recordmode: 'dynamic'});

customerPayment.setFieldValue('customer', parseInt(customerId));
customerPayment.setFieldValue('payment', paymentAmount);
customerPayment.setFieldValue('paymentmethod', paymentMethod);
customerPayment.setFieldValue('checknum', transactionId);
customerPayment.setFieldValue('currency', currency);
customerPayment.setFieldValue('account', account);

var applyCount = customerPayment.getLineItemCount('apply');

if(applyCount>0)
{
    for(var i=1;i<=applyCount;i++)
    {
        var thisInvoice = customerPayment.getLineItemValue('apply','refnum',i);

        if(thisInvoice == invoiceToPay)
        {
            customerPayment.selectLineItem('apply', i);
            customerPayment.setCurrentLineItemValue('apply','apply','T');
            customerPayment.setCurrentLineItemValue('apply', 'amount',paymentAmount);
            customerPayment.commitLineItem('apply');
        }
    }

}
nlapiSubmitRecord(customerPayment,false,true);
var customerPayment=nlapiCreateRecord('customerPayment',{recordmode:'dynamic'});
customerPayment.setFieldValue('customer',parseInt(customerId));
customerPayment.setFieldValue(“付款”,paymentAmount);
customerPayment.setFieldValue('paymentmethod',paymentmethod');
customerPayment.setFieldValue('checknum',transactionId);
customerPayment.setFieldValue(“货币”,货币);
customerPayment.setFieldValue(“账户”,账户);
var applyCount=customerPayment.getLineItemCount('apply');
如果(应用计数>0)
{

对于(var i=1;i您提交缓慢的原因之一可能是记录附加了大量用户事件脚本。由于保存记录的是Restlet,它将触发用户事件脚本。

一些想法:

  • (只是为了把它放在我的胸前)整合你的会计系统和NETSu套听起来很奇怪。NETSu套是一个会计系统,通常是使用它的OrgS的会计系统。如果你不使用NETSu套作为会计,你可能想考虑它对价格有什么效用,然后放弃它。<
  • 当我将外部系统与Netsuite集成时,我通常会尝试使其异步。我通过将原始信息获取到自定义记录中,然后启动一个计划脚本来处理排队的更新。这使我的api能够快速返回。当我处理队列时,我会将错误存储在队列记录中,以便在出现任何问题时,我可以修复data或代码,然后重新提交
  • 交易提交缓慢的一个明显的主要原因(除了缓慢的UE脚本)是您的账簿状态。我有一个创业客户,他做得非常好,但他们从未关闭过自己的账簿,他们使用IIRC平均成本。每次他们保存一笔过账交易时,Netsuite都会重新计算整个期间(对于一个非常繁忙的站点来说,当事情逐渐停止时,大约有2年的记录)。当他们开始结算期时,交易节省时间大大减少。当他们转换为标准成本计算时,交易节省时间再次减少(我想后进先出会比平均速度快,比标准速度慢,但YMMV)
  • 还有关于代码的注释

    创建发票的常规方法是

    nlapiTransformRecord('customer',customer.customerId,'invoice');
    nlapiTransformRecord('customer',customer.customerId,'invoice',{recordmode:'dynamic'});

    我从来没有试过