NetSuite restlet写入性能差

时间:2017-08-01 23:01:45

标签: javascript performance netsuite restlet suitescript

编辑:我已经修改了实际数字并将其替换为伪服务,因为我被告知共享性能数据是针对Netsuite的服务条款。

我正在使用restlet将我们的会计系统与NetSuite集成,总体而言,它与性能的明显异常相当不错。从性能的角度来看,我已经发现nlapiLoadRecord是撒旦自己的孩子,所以我尽可能地避免使用它来支持搜索API,现在我读取的restlet非常活泼。然而,每当我要求一个restlet写任何东西时,它就像一只卡在冷焦油中的乌龟一样慢。我通常在 SLOW REALLY DAMN SLOW 秒之间分析nlapiSubmitRecord本身。这对我来说似乎很疯狂。没有人会使用NetSuite,如果表现总是这么差写作。我将在下面提供几个代码示例。有关加速NetSuite restlet写入性能的任何提示都将受到赞赏。

在第一个中,receivedInvoice是传入的数据,findCurrencyCode和findCustomerByCustomerNumber是执行这些操作的良好函数。我只是在一个几乎令人难以置信的 HOLY MONKEYS,这是一个很短的时间秒钟,这个简单的发票包含一个项目,几乎所有的时间都在我等待nlapiSubmitRecord完成时。

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);

在这一部分中,我认为我通过在动态模式下打开记录来表现性能异端,但我不确定如何获得可能的行项目。只需在动态模式下打开一个新记录,在 SLOW 秒左右。再一次,提交是大部分时间被吃掉的地方(通常在 OH亲爱的甜蜜的母亲身边秒),虽然这个因为我弄乱了订单项而吃了相当多的时间,这可能是因为我已经以动态模式打开了记录。

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);

2 个答案:

答案 0 :(得分:1)

一些想法:

  1. (只是为了让它脱离我的胸膛)将您的会计系统与Netsuite整合起来听起来很奇怪。 Netsuite是一个会计系统,通常是使用它的组织的记录会计系统。如果您没有使用Netsuite进行会计处理,您可能需要考虑它具有哪些实用价格并将其取消。
  2. 当我将外部系统与Netsuite集成时,我通常会尝试将其设为异步。我这样做是通过将原始信息放入自定义记录,然后启动计划脚本来处理排队更新。这让我的api快速返回。当我处理队列时,我将错误存储在队列记录中,这样如果出现任何问题,我可以修复数据或代码并重新提交。
  3. 一个明显主要的缓慢交易提交来源(除了缓慢的UE脚本)是你的书的状态。我有一个创业客户,他做得非常好,但他们从未关闭过他们的书,他们正在使用IIRC平均成本计算。每次他们保存一个发布交易时,Netsuite都会重新计算整个期间(在一个非常繁忙的网站上,事情正在停止的时候是大约两年的记录)。当他们开始关闭期间,交易保存时间减少了。当他们转换为标准成本计算交易时,保存时间再次下降(我想LIFO会比Avg快,而且比标准慢但是YMMV)
  4. 还要注意您的代码。

    创建发票的常规方法是

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

    我从未测试过这是否会对提交时间产生影响,但它可能会有所帮助,因为NS会从稍微好一些的地方开始保存(抓住吸管但有时NS会有非明显的变化有速度效益)

    也不确定如何在动态模式下更改自定义窗体。当您知道表单时,您还可以将其添加到init默认值:

    {recordmode:'dynamic', customform:receivedInvoice.transactionType}

答案 1 :(得分:0)

提交的原因之一可能是记录附加了很多用户事件脚本。由于它是保存记录的Restlet,因此它将触发用户事件脚本。