对item_fulfillment执行removeLine操作时报SSS_INVALID_SUBLIST_OPERATION错误
问题根因
- 正序遍历删除子列表行导致索引错位:循环初始获取的行计数是转换后的初始子列表行数,删除行后实际子列表行数会同步减少,后续循环操作的行号超出当前实际最大行号时,就会访问不存在的行,触发
SSS_INVALID_SUBLIST_OPERATION报错。 - 未处理关联子记录:待删除的行如果关联了
inventorydetail库存分配子记录,直接删除行不会自动清除关联子记录,系统会判定行被占用无法执行删除操作。 - 频繁操作触发重计算:动态模式下连续删除行会触发子列表自动重计算,易导致临时行索引失效,触发操作错误。
解决方案
方案1:修正遍历逻辑(需保留删除逻辑场景适用)
采用逆序遍历+预清关联子记录的方式处理,代码示例如下:
// 转换记录使用标准模式,子列表操作稳定性更高 var objRecord = record.transform({ fromType: record.Type.SALES_ORDER, fromId: soid, toType: record.Type.ITEM_FULFILLMENT, isDynamic: false, }); // 从最后一行开始逆序遍历,避免删除行后索引错位 var linecount = objRecord.getLineCount({sublistId: 'item'}); for (var i = linecount - 1; i >= 0; i--) { var locationid = objRecord.getSublistValue({ sublistId: 'item', fieldId: 'location', line: i }); if (locationid !== 15) { // 提前清空该行关联的库存分配子记录 var hasInvDetail = objRecord.hasSublistSubrecord({ sublistId: 'item', fieldId: 'inventorydetail', line: i }); if (hasInvDetail) { objRecord.removeSublistSubrecord({ sublistId: 'item', fieldId: 'inventorydetail', line: i }); } // 删除行时添加ignoreRecalc参数避免频繁重计算 objRecord.removeLine({ sublistId: 'item', line: i, ignoreRecalc: true }); } } // 保存发货单 var fulfillId = objRecord.save({ enableSourcing: true, ignoreMandatoryFields: false });
方案2:转换时直接过滤行(更高效,无需后续删除操作)
在调用record.transform时通过defaultValues参数指定过滤规则,系统会自动仅加载符合条件的可履行行,代码示例如下:
var objRecord = record.transform({ fromType: record.Type.SALES_ORDER, fromId: soid, toType: record.Type.ITEM_FULFILLMENT, isDynamic: true, defaultValues: { fulfilllocation: 15, // 仅加载对应位置的行 ignoreunfulfilled: true // 自动忽略无库存分配的不可履行行 } }); // 无需执行删除行操作,直接修改后保存即可 var fulfillId = objRecord.save();
内容的提问来源于stack exchange,提问作者Millet Antoine
相关产品推荐
相关产品推荐

