2017-08-01 47 views
2

编辑:我已经编辑了实际的数字,并用pseudoswears替换了它们,因为我被告知共享性能数据是针对Netsuite的TOS。NetSuite restlet写入性能差

我正在使用restlets将我们的会计系统与NetSuite集成在一起,总的来说,它的表现非常出色。我从性能的角度认识到nlapiLoadRecord是撒旦自己的孩子,所以我尽可能地避免使用搜索api,现在我的阅读restlets非常活泼。然而,每当我要求一个restlet写任何东西,它就像一只乌龟卡在冷焦油中一样慢。我通常会在SLOW之间分析nlapiSubmitRecord本身的真实时间,其结果为秒。这对我来说似乎很疯狂。没有人会使用NetSuite,如果表现总是这么差写作。我将在下面包含几个代码示例。任何关于加速NetSuite restlet写入性能的提示都将不胜感激。

在这第一个receivedInvoice是传入的数据,并且findCurrencyCode和findCustomerByCustomerNumber是执行这些事情的功能良好的函数。我只是在几乎难以置信的时间点钟,这几乎令人难以置信圣母徒步旅行时间很短秒用于一个简单的发票与一个行项目,几乎所有的时间通过,而我等待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); 
+0

谢谢你的pseudoswears - 他们让我笑。另外:分享表现违反了他们的TOS ...? NetSuite是否默认他们的表现是悲惨的? – Krypton

+0

看来公司不幸的是不幸的是:https://stackoverflow.com/questions/12115397/is-it-against-license-to-publish-oracle-and-sql-server-performance-test – gabrielf

+0

Powercow,你是否曾经能够解决你的性能问题?你在Netsuite的沙箱或生产环境中执行过测试吗?生产环境中的性能是否更好? – gabrielf

回答

0

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

+0

虽然我的发票确实附加了很多用户事件,但看起来并不像关闭它们可以节省大量提交时间。为了测试的目的,我将其全部更改为取消部署,虽然很难确定,但由于即使系统不忙,保存发票的差异范围也很大,因此并未发现时间差异巨大(提交时间在沙盒系统中一整天保存相同的数据时,变化为100%)。 – Powercow

1

的一点想法:

  1. (只是把它从我的胸部)与NetSuite的集成财务系统只是听起来很奇怪。 Netsuite是一个会计系统,通常是使用它的组织的记录会计系统。如果您没有使用Netsuite进行会计核算,您可能需要考虑它对价格有什么实用性,然后才能实现。
  2. 当我将外部系统与Netsuite集成时,我通常会尝试将其设置为异步。我通过将原始信息放入自定义记录然后启动预定脚本来处理排队更新来完成此操作。这让我的API快速返回。当我处理队列时,我将错误存储在队列记录中,以便如果出现任何问题,我可以修复数据或代码并重新提交。
  3. 缓慢交易提交的一个显然主要来源(除了缓慢的UE脚本)是您书籍的状态。我有一个初创客户,他的表现非常出色,但他们从未关闭过书籍,他们使用IIRC平均成本计算。每次他们保存了一个帖子交易时,Netsuite正在重新计算整个期间(在一个非常繁忙的站点,事情正在停止的时间大约是两年)。当他们开始关闭期间时,交易保存时间减少了。当他们转换为标准成本计算交易时,保存时间再次下降(我想LIFO会比平均速度更快并且比标准速度慢但是YMMV)

还有关于您的代码的注释。

正常的方式创建发票是

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

我从来没有测试过是否对提交时间,但它可能会帮助,因为NS将开始从稍微保存的效果更好的地方(抓住吸管,但与NS有时不明显的变化有速度的好处)

也不知道如何更改动态模式下的自定义形式工作。当你知道了表格,您还可以添加到init默认值:

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

+0

感谢您的想法。通过“与会计系统整合”,我想我有点不清楚 - 我的意思是将它与我​​们的财务团队用来记录会计事件的工具整合在一起。 NetSuite是会计记录系统,但我们有各种会计工具/前端/您提交会计数据的是什么。我想我应该说'将NetSuite集成到我们的会计生态系统'。感谢您使用转换创建发票的提示。我会看看这是否会改变性能。 – Powercow

+0

使用转换确实提高了提交速度,但是创建记录需要更长时间,因此整体方法执行时间大致相同。 – Powercow