SuiteScript使用afterSubmit更新NetSuite记录问题排查
NetSuite 销售订单代发货PO供应商字段同步问题解决
需求
当用户在销售订单子列表行设置创建代发货PO并保存后,NetSuite生成PO,需自动读取PO的vendorname字段,赋值给销售订单对应行的自定义字段custcol_vencode。
现有问题
- beforeSubmit事件:仅在用户创建PO后重新编辑提交销售订单时生效,需要二次操作,体验差
- afterSubmit事件:当前脚本无报错但不更新字段;添加
commitLine后触发“Please Choose an Item to Add”错误
问题根源分析
- 动态模式操作子列表错误:使用
isDynamic: true加载记录时,setCurrentSublistValue必须先调用selectLine定位行,直接循环赋值会导致操作失效或触发验证错误 - PO关联逻辑不严谨:仅读取
links子列表第0行的PO,无法处理多代发货PO的场景,且未对应到销售订单的具体行 - 行匹配逻辑缺失:直接按行索引同步PO和销售订单的
vendorname,未考虑代发货PO行与销售订单行的关联关系,容易导致字段赋值错误
修正后的脚本
/** *@NApiVersion 2.1 *@NScriptType UserEventScript */ define(['N/record', 'N/search'], (record, search) => { function afterSubmit(context) { if (context.type === context.UserEventType.DELETE) return; const salesOrderId = context.newRecord.id; // 用静态模式加载销售订单,避免动态模式的子列表操作问题 const salesOrderRecord = record.load({ type: record.Type.SALES_ORDER, id: salesOrderId, isDynamic: false }); // 搜索当前销售订单关联的所有代发货PO const poSearch = search.create({ type: search.Type.PURCHASE_ORDER, filters: [ ['createdfrom', 'anyof', salesOrderId], ['type', 'anyof', 'PurchOrd'], ['trandate', 'notempty'] ], columns: [ 'internalid', search.createColumn({name: 'item', join: 'item'}), 'vendorname' ] }); const poResults = poSearch.run().getRange({start: 0, end: 1000}); if (!poResults.length) return; // 构建PO行的商品与供应商映射 const itemVendorMap = {}; poResults.forEach(result => { const itemId = result.getValue({name: 'item', join: 'item'}); const vendorName = result.getValue('vendorname'); if (itemId && vendorName) { itemVendorMap[itemId] = vendorName; } }); // 更新销售订单对应行的自定义字段 const itemLineCount = salesOrderRecord.getLineCount({sublistId: 'item'}); for (let i = 0; i < itemLineCount; i++) { const lineItemId = salesOrderRecord.getSublistValue({ sublistId: 'item', fieldId: 'item', line: i }); if (itemVendorMap[lineItemId]) { salesOrderRecord.setSublistValue({ sublistId: 'item', fieldId: 'custcol_vencode', line: i, value: itemVendorMap[lineItemId] }); } } // 保存销售订单,禁用字段验证避免不必要的报错 salesOrderRecord.save({ enableSourcing: false, ignoreMandatoryFields: true }); } return { afterSubmit }; });
关键优化点
- 改用静态模式加载记录:避免动态模式下子列表操作的复杂逻辑,直接通过行索引操作更稳定
- 精准关联PO与销售订单行:通过搜索获取所有关联的代发货PO,构建商品-供应商映射,确保对应行的字段赋值准确
- 优化保存逻辑:添加
enableSourcing: false和ignoreMandatoryFields: true,避免保存时触发不必要的字段验证错误 - 支持多PO场景:不再局限于
links子列表的单行PO,适配多个代发货PO的业务场景
内容的提问来源于stack exchange,提问作者Nineoneo
相关产品推荐
相关产品推荐

