【问题标题】:Netsuite RESTlet - nlapiSubmitRecord() return null when create sales order containing assembly itemsNetsuite RESTlet - 创建包含装配项目的销售订单时,nlapiSubmitRecord() 返回 null
【发布时间】: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


【解决方案1】:

我认为这是因为组装项或套件/包装项具有不同的必填字段,因此您应该手动向它们添加值。

请尝试让我知道问题。

【讨论】:

  • 您好,格兰特,感谢您的建议!请问您是否知道如何检查组装项或套件/包装项所需的字段?在我看来,在销售订单中手动添加库存项目和装配项目的过程是一样的。谢谢!
【解决方案2】:

最后我解决了这个问题......它来自角色权限。我意识到我用来进行 REST 调用的角色是自定义角色,而不是管理员。要使用装配或套件/包装项目创建销售订单,该角色需要具有创建工作订单的权限。所以解决方法是给你的角色添加创建工单的权限,如下:

它位于设置 - 用户/角色 - 管理角色 - [您的角色名称] - 权限 - 交易。

如果您使用管理员角色进行 REST 调用,这不会有任何问题,因为您已经(在我的理解中)拥有对所有资源的完全访问权限。

再次感谢您的帮助和 cmets!也希望这可以帮助任何有同样问题的人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多