如何在用户事件脚本抛出错误后保留发票行项目值?
问题描述
我开发了行级金额校验的用户事件脚本,当金额无效时抛出错误。但用户输入无效金额并看到错误后返回,发票上的对应行项目会消失。请问是否可以保留这些行项目?
附上原脚本:
function beforeSubmit(context) { // Loop through each line item for (var i = 0; i < lineCount; i++) { var lineAmount = invoiceRecord.getSublistValue({ sublistId: "item", fieldId: "amount", line: i, }); if(lineAmount==0) { throw("invalid amount"); } } }
解决方案
问题根源在于你用了服务器端beforeSubmit事件抛错——NetSuite的服务器端事件抛出错误会触发整个提交事务回滚,用户当前未保存的行项目会被重置,自然就消失了。要保留行项目,得换校验方式:
方案1:改用客户端脚本做实时校验
客户端脚本在浏览器端运行,校验不通过时只阻止保存,不会重置页面内容,完美保留用户输入的行项目。示例代码如下:
// 客户端脚本的saveRecord事件 function saveRecord(context) { var currentRecord = context.currentRecord; var lineCount = currentRecord.getLineCount({ sublistId: "item" }); for (var i = 0; i < lineCount; i++) { var lineAmount = currentRecord.getSublistValue({ sublistId: "item", fieldId: "amount", line: i }); // 校验金额,可根据需求调整判断逻辑 if (lineAmount === 0 || isNaN(lineAmount)) { alert(`第${i+1}行金额无效,不能为0或非数字`); return false; // 返回false阻止保存,页面内容完全保留 } } return true; // 校验通过,允许提交 }
配置这个客户端脚本时,记得绑定到发票记录的saveRecord事件,同时设置适用的表单。
方案2:服务器端脚本不抛错,改用页面错误提示(备选)
如果必须依赖服务器端数据做校验(比如需要查询其他系统数据),可以在beforeSubmit事件里不抛出错误,而是用context.form.setError()给对应行的金额字段标记错误,这样不会触发回滚,用户输入的行项目会保留。示例:
function beforeSubmit(context) { var invoiceRecord = context.newRecord; var lineCount = invoiceRecord.getLineCount({ sublistId: "item" }); var form = context.form; for (var i = 0; i < lineCount; i++) { var lineAmount = invoiceRecord.getSublistValue({ sublistId: "item", fieldId: "amount", line: i, }); if(lineAmount == 0) { // 给对应行的金额字段设置错误提示 form.setSublistError({ sublistId: "item", fieldId: "amount", line: i, message: "金额无效,不能为0" }); // 可继续校验其他行,NetSuite会自动阻止提交并显示所有错误 } } }
注意:这种方式需要确保脚本运行在beforeSubmit的create或edit上下文,且form对象可用(批量提交等场景可能无法获取form),所以优先推荐方案1。
内容的提问来源于stack exchange,提问作者Maira S
相关产品推荐
相关产品推荐

