【发布时间】:2016-03-11 00:09:02
【问题描述】:
当我向 Netsuite 发送休息调用并通过 RESTlet 创建新的销售订单时,我发现如果销售订单的“项目”字段仅包含库存项目,我的代码可以完美运行。但是,当销售订单包含装配项目或套件/包装项目时,nlapiSubmitRecord() 函数将返回 null 并且不会创建销售订单。 (也不会抛出错误) 谁能告诉我原因?谢谢!
我创建新销售订单的RESTlet函数如下:
function createSalesorder(datain) {
// init message and sales order obj
var message = new Object();
var record = nlapiCreateRecord('salesorder');
// check if the sales order already exists in Netsuite
if(!datain['otherrefnum']){
message.status = 'failed',
message.message = 'missing Customer P.O.';
return message;
} else {
var filters = new Array();
var columns = new Array();
filters.push(new nlobjSearchFilter('otherrefnum', null, 'equalto', datain['otherrefnum']));
filters.push(new nlobjSearchFilter('entity', null, 'is', datain['entity']));
// columns.push(new nlobjSearchColumn('otherrefnum', null, null));
var search = nlapiSearchRecord(datain.recordtype, null, filters, columns);
if(search && search.length>0){
message.status = 'duplicated',
message.id = search[0].id;
return message;
}
}
// check input data has required fields
if(!datain['item']){
message.status = 'failed';
message.message = 'missing item';
return message;
}
if(!datain['entity']){
message.status = 'failed';
message.message = 'missing customer id';
return message;
}
// init fields with default values
if(!datain['custbody_shipping_reason']){
record.setFieldValue('custbody_shipping_reason',1);
}
if(!datain['custbody_order_type']){
record.setFieldValue('custbody_order_type',1);
}
if(!datain['shipmethod']){
record.setFieldValue('shipmethod', 4304);
}
if(!datain['location']){
record.setFieldValue('location', 21);
}
if(!datain['istaxable']){
record.setFieldValue('taxitem', -8);
}
// load data input
for(var fieldname in datain){
switch(fieldname){
case 'recordtype':
case 'type':
case 'id':
break;
case 'istaxable':
record.setFieldValue(fieldname, datain[fieldname]);
if(datain[fieldname] == 'T') record.setFieldValue('taxitem', 2908);
else record.setFieldValue('taxitem', -8);
case 'item':
for(var i = 0; i < datain[fieldname].length; i++){
for(var itemfield in datain[fieldname][i]){
record.setLineItemValue('item', itemfield, i+1, datain[fieldname][i][itemfield]);
}
}
break;
default:
record.setFieldValue(fieldname, datain[fieldname]);
break;
}
}
// submit record
var recordID = nlapiSubmitRecord(record, true);
nlapiLogExecution('DEBUG', 'Create a new salesorder, id = '+recordID);
// return results
message.status = 'create';
message.id = recordID;
var order_entity = nlapiLoadRecord('salesorder', message.id);
message.refid = order_entity.getFieldValue('tranid');
return message;
}
更新 1:我尝试在 Netsuite 调试器中运行相同的代码,结果成功编写了销售订单,此外还出现了警告:
warning Items on this line have been drop shipped or special ordered. Are you sure you want to modify it?
不确定这是否是阻止我在生产模式下正确保存销售订单的问题。
【问题讨论】:
-
您是否尝试过通过在 GUI 中手动执行相同的操作来模拟您的代码?您的装配项目可能对它们有一些限制,例如不同的部门或子公司。另外,您是否尝试过使用调试器调试 RESTlet?您也可以尝试在 Chrome 或 firefox 的控制台中运行代码的 sn-ps,作为另一种调试方法。
-
@TonyH 谢谢你的建议。我尝试过手动创建带有装配项目的销售订单,这对我来说似乎与我手动创建带有库存项目的销售订单的方式完全相同。但是我确实意识到,对于装配项目,系统将自动创建要构建的工作订单,而对于库存项目则不需要这样的东西。我想知道这是否有区别,但不太确定如何通过 RESTlet 构建工作订单。我将尝试使用 Netsuite 调试器调试代码。再次感谢!
标签: netsuite