SuiteScript 2.0:通过已保存搜索创建库存调整单
解决NetSuite中通过已保存搜索批量生成库存调整单行的问题
我之前尝试用已保存搜索来批量创建库存调整单,目的是把出现负库存的占位项调回正常数量,自动化这个流程。一开始写的代码基础功能能跑,但搞不清楚创建库存调整单行的循环该放在哪里,同时也不确定获取已保存搜索值的循环位置对不对。
初始的问题代码片段:
if(resultRange) { var newAdjust = record.create({ type:record.Type.INVENTORY_ADJUSTMENT, isDynamic:true }); newAdjust.setValue({ fieldId: 'account', value: 288, }); newAdjust.setValue({ fieldId: 'customform', value: 142, }) for(i=0;i < resultRange.length;i++) { var adjLocation = resultRange[i].getValue({ name : 'name', join : 'inventoryLocation' }); var adjItem = resultRange[i].getValue('itemid'); var adjQty = resultRange[i].getValue('locationquantityonhand') * -1; }
后来我把问题解决了,下面是可以正常运行的完整计划脚本代码,关键是把子列表行的创建逻辑放到遍历搜索结果的循环内部,这样每一条搜索结果都会对应生成一行库存调整明细:
/** * @NApiVersion 2.0 * @NScriptType ScheduledScript */ define(['N/record', 'N/search','N/runtime'], /** * @param{record} record * @param{search} search */ function(record, search, runtime) { function execute(context) { var mySearch = search.load({ id: 'customsearch_bom_negative_inventory' }); var myResultSet = mySearch.run(); var resultRange = myResultSet.getRange({ start: 0, end: 50 }); if(resultRange) { var newAdjust = record.create({ type:record.Type.INVENTORY_ADJUSTMENT, isDynamic:true }); newAdjust.setValue({ fieldId: 'subsidiary', value: '1' }); newAdjust.setValue({ fieldId: 'account', value: '288' }); // 遍历搜索结果,每一条生成一行调整明细 for(i=0;i < resultRange.length;i++) { var adjLocation = resultRange[i].getValue({ name : 'internalid', join : 'inventoryLocation' }); var adjItem = resultRange[i].getValue('itemid'); var adjQty = resultRange[i].getValue('locationquantityonhand') * -1; // 动态模式下创建子列表行的步骤:选中新行→设置字段→提交行 newAdjust.selectNewLine({ sublistId: 'inventory' }); newAdjust.setCurrentSublistValue({ sublistId: 'inventory', fieldId: 'item', value: 3405 }); newAdjust.setCurrentSublistValue({ sublistId: 'inventory', fieldId: 'location', value: adjLocation }); newAdjust.setCurrentSublistValue({ sublistId: 'inventory', fieldId: 'adjustqtyby', value: adjQty }); newAdjust.commitLine({ sublistId: 'inventory' }); log.debug('当前处理的位置ID', adjLocation); } // 所有明细行创建完成后,保存整个调整单 var adjustId = newAdjust.save(); log.debug('库存调整单创建成功', '单据ID:' + adjustId); } } return { execute: execute }; });
关键修改说明
- 子列表循环位置:把
selectNewLine、setCurrentSublistValue、commitLine这些子列表操作放到遍历搜索结果的循环里,这样每遍历一条结果就生成一行明细,这是解决问题的核心。 - 位置字段修正:把获取位置的字段从
name改成了internalid,因为NetSuite的库存调整单子列表里,location字段需要传入内部ID而不是名称,否则会报错。 - 完整流程闭环:在所有明细行创建完成后再调用
newAdjust.save(),确保整个单据一次性保存,避免重复创建单据。 - 动态模式规范用法:因为用了
isDynamic:true创建单据,所以必须严格遵循「选中新行→设置当前行字段→提交行」的步骤来操作子列表。
内容的提问来源于stack exchange,提问作者Mikemacx
相关产品推荐
相关产品推荐

