NetSuite ClientScript问题:销售订单首行商品加载异常
NetSuite脚本问题求助:销售订单首行商品履行时被排除
我是NetSuite开发新手,开发了一个按钮触发的脚本,用来读取库存转移单信息并转换为销售订单。目前大部分功能正常,但遇到一个问题:生成的销售订单首行商品未正确加载,执行履行操作时该商品会被系统排除。
相关截图情况:
- 库存转移单包含7个商品行
- 脚本生成的销售订单显示7个商品行
- 履行单仅包含6个商品,首行商品被排除
以下是填充商品行的代码片段:
var itSearch = search.create({ type: "inventorytransfer", filters: [ ["type","anyof","InvTrnfr"], "AND", ["internalid","anyof",it.id], "AND", ["mainline","is","F"], "AND", ["location","anyof",it.getValue('transferlocation')] ], columns: [ search.createColumn({name: "item", label: "Item"}), search.createColumn({name: "quantity", label: "Quantity"}), search.createColumn({ name: "formulanumeric", formula: "0", label: "Rate" }), search.createColumn({name: "unit", label: "Units"}), search.createColumn({name: "location", label: "Location"}), search.createColumn({ name: "class", formula: it.getValue('class'), label: "Class" }), search.createColumn({name: "custcol_kx_revenue_start_date", label: "Kx Revenue Start Date"}), search.createColumn({name: "custcol_kx_revenue_end_date", label: "Kx Revenue End Date"}), search.createColumn({name: "custcol_celigo_sfio_order_id", label: "Salesforce Order Line Id (IO)"}), search.createColumn({name: "custcol_celigo_sfio_sf_id", label: "Salesforce Opportunity Line Id (IO)"}), search.createColumn({name: "custcol1", label: "Purchase order"}) ] }); var sResult = itSearch.run(); var resultRange = sResult.getRange({ start: 0, end: 100 }); var sLines = resultRange.length; for (var i=0 ; i<sLines ; i++){ so.selectNewLine({sublistId:'item'}); so.setCurrentSublistValue({ sublistId:'item', fieldId:'item', value:resultRange[i].getValue({name: 'item'}), ignoreFieldChange: true, forceSyncSourcing: true }); so.setCurrentSublistValue({ sublistId:'item', fieldId:'quantity', value:resultRange[i].getValue({name: 'quantity'}), ignoreFieldChange: true, forceSyncSourcing: true }); so.setCurrentSublistValue({ sublistId:'item', fieldId:'rate', value:'0', ignoreFieldChange: true, forceSyncSourcing: true }); so.setCurrentSublistValue({ sublistId:'item', fieldId:'amount', value:'0', ignoreFieldChange: true, forceSyncSourcing: true }); so.setCurrentSublistValue({ sublistId:'item', fieldId:'price', value:null, ignoreFieldChange: true, forceSyncSourcing: true }); so.setCurrentSublistValue({ sublistId:'item', fieldId:'class', value:resultRange[i].getValue({name: 'class'}), ignoreFieldChange: true, forceSyncSourcing: true }); so.setCurrentSublistValue({ sublistId:'item', fieldId:'location', value:resultRange[i].getValue({name: 'location'}), ignoreFieldChange: true, forceSyncSourcing: true }); so.setCurrentSublistValue({ sublistId:'item', fieldId:'units', value:resultRange[i].getValue({name: 'units'}), ignoreFieldChange: true, forceSyncSourcing: true }); so.setCurrentSublistValue({ sublistId:'item', fieldId:'custcol_kx_revenue_start_date', value:resultRange[i].getValue({name: 'custcol_kx_revenue_start_date'}), ignoreFieldChange: true, forceSyncSourcing: true }); so.setCurrentSublistValue({ sublistId:'item', fieldId:'custcol_kx_revenue_end_date', value:resultRange[i].getValue({name: 'custcol_kx_revenue_end_date'}), ignoreFieldChange: true, forceSyncSourcing: true }); so.setCurrentSublistValue({ sublistId:'item', fieldId:'custcol_celigo_sfio_order_id', value:resultRange[i].getValue({name: 'custcol_celigo_sfio_order_id'}), ignoreFieldChange: true, forceSyncSourcing: true }); so.setCurrentSublistValue({ sublistId:'item', fieldId:'custcol_celigo_sfio_sf_id', value:resultRange[i].getValue({name: 'custcol_celigo_sfio_sf_id'}), ignoreFieldChange: true, forceSyncSourcing: true }); so.setCurrentSublistValue({ sublistId:'item', fieldId:'custcol1', value:resultRange[i].getValue({name: 'custcol1'}), ignoreFieldChange: true, forceSyncSourcing: true }); so.setCurrentSublistValue({ sublistId:'item', fieldId:'line.cseg_paactivitycode', value:resultRange[i].getValue({name: 'line.cseg_paactivitycode'}), ignoreFieldChange: true, forceSyncSourcing: true }); so.commitLine({sublistId:'item'}); // so.selectNewLine({sublistId:'item'}); } /*SAVE*/ var idso = so.save({ignoreMandatoryFields: true});
问题原因分析
- 搜索列缺失关键字段:代码中最后给
line.cseg_paactivitycode赋值,但搜索的columns里没有包含这个字段,导致首行该字段值为空或无效,触发系统验证逻辑,履行时被排除。 - 自动计算字段手动赋值冲突:手动设置
amount为0,而amount是NetSuite自动计算的字段(rate*quantity),强制赋值可能干扰系统对行项目的有效性判断。 - 字段同步参数过度使用:所有字段设置都用了
forceSyncSourcing: true,可能导致字段同步逻辑混乱,首行的商品状态、库存可用性等依赖字段没有正确加载。 - 字段设置顺序不合理:设置item后立刻批量设置其他字段,没有给系统足够时间同步item的相关属性(如可履行状态),导致首行数据未被正确初始化。
解决方案
- 补充搜索列缺失字段:在
itSearch的columns数组中添加cseg_paactivitycode字段:search.createColumn({name: "cseg_paactivitycode", label: "Activity Code"}) - 移除自动计算字段的手动赋值:删除设置
amount的代码行,让系统自动计算该字段值。 - 调整字段同步参数与顺序:
- 仅在设置item时使用
forceSyncSourcing: true,其他字段设置改为forceSyncSourcing: false,避免过度同步。 - 调整字段设置顺序:先设置item,等待同步后再设置quantity、rate,最后设置自定义字段和分类字段。
示例调整后的代码片段:
so.selectNewLine({sublistId:'item'}); // 设置item并强制同步 so.setCurrentSublistValue({ sublistId:'item', fieldId:'item', value:resultRange[i].getValue({name: 'item'}), ignoreFieldChange: false, forceSyncSourcing: true }); // 其他字段设置无需强制同步 so.setCurrentSublistValue({ sublistId:'item', fieldId:'quantity', value:resultRange[i].getValue({name: 'quantity'}), ignoreFieldChange: true, forceSyncSourcing: false }); so.setCurrentSublistValue({ sublistId:'item', fieldId:'rate', value:'0', ignoreFieldChange: true, forceSyncSourcing: false }); // 移除amount设置行 so.setCurrentSublistValue({ sublistId:'item', fieldId:'price', value:null, ignoreFieldChange: true, forceSyncSourcing: false }); // 后续其他字段设置同理,forceSyncSourcing改为false - 仅在设置item时使用
- 添加行项目有效性验证:在commitLine前,检查item和quantity是否有效,避免无效行被提交:
var itemId = resultRange[i].getValue({name: 'item'}); var qty = parseInt(resultRange[i].getValue({name: 'quantity'}), 10); if (!itemId || isNaN(qty) || qty <= 0) { so.cancelLine({sublistId:'item'}); continue; } - 检查销售订单表单配置:确认使用的销售订单表单中,首行的必填字段都已被脚本正确赋值,没有遗漏必填项导致行项目未被正确保存。
内容的提问来源于stack exchange,提问作者UE33
相关产品推荐
相关产品推荐

