SuiteScript 2.0多发货单转移订单转收货单问题求助
解决SuiteScript 2.0中多发货单转移订单转收货单的问题
问题核心
当转移订单(TO)关联多个发货单时,直接用record.transform生成的收货单只会默认关联第一个发货单,且收货单的item子列表属于静态列表,无法通过脚本直接增删行,defaultValues参数也无法直接添加商品行。
正确解决方案
通过关联所有对应发货单的方式,让系统自动合并所有发货单的商品到收货单中,具体步骤如下:
- 查询转移订单对应的所有发货单
用搜索获取目标TO关联的所有转移发货单(Transfer Shipment)的内部ID。 - 生成初始收货单
调用record.transform从TO生成收货单,此时会自动关联第一个发货单。 - 添加剩余发货单关联
在收货单的shipments子列表中添加其余发货单,系统会自动将这些发货单的商品合并到item子列表。 - 保存收货单
代码示例
/** * @NApiVersion 2.x * @NScriptType UserEventScript */ define(['N/record', 'N/search'], function(record, search) { function createCombinedItemReceipt(toId) { // 1. 查询转移订单关联的所有发货单 var shipmentSearch = search.create({ type: search.Type.TRANSFER_SHIPMENT, filters: [['createdfrom', 'anyof', toId]], columns: ['internalid'] }); var shipmentIds = []; shipmentSearch.run().each(function(result) { shipmentIds.push(result.getValue('internalid')); return true; }); if (shipmentIds.length === 0) { throw new Error('转移订单未关联任何发货单'); } // 2. 生成初始收货单(默认关联第一个发货单) var itemReceipt = record.transform({ fromType: record.Type.TRANSFER_ORDER, fromId: toId, toType: record.Type.ITEM_RECEIPT, isDynamic: true }); // 3. 给收货单添加剩余的发货单关联 for (var i = 1; i < shipmentIds.length; i++) { itemReceipt.selectNewLine({ sublistId: 'shipments' }); itemReceipt.setCurrentSublistValue({ sublistId: 'shipments', fieldId: 'id', value: shipmentIds[i] }); itemReceipt.commitLine({ sublistId: 'shipments' }); } // 4. 保存收货单 var receiptId = itemReceipt.save({ enableSourcing: true, ignoreMandatoryFields: false }); return receiptId; } // 示例调用(根据实际业务场景调整触发逻辑) // createCombinedItemReceipt(orderingTransaction.internalId); return { // 根据脚本类型暴露对应入口函数,比如beforeSubmit等 }; });
关键说明
- 收货单的
item子列表是静态列表,数据完全来源于关联的发货单,因此不能直接手动添加商品行,必须通过关联发货单让系统自动填充。 shipments子列表是可编辑的动态子列表,添加发货单行后,系统会自动将对应发货单的商品合并到item子列表,重复商品会自动合并数量。- 确保脚本拥有操作转移订单、发货单和收货单相关字段的权限。
内容的提问来源于stack exchange,提问作者NettleRick
相关产品推荐
相关产品推荐

