NetSuite Estimate记录beforeLoad脚本需二次加载赋值问题排查
NetSuite User Event脚本:Estimate页面加载后立即填充合同状态字段
问题描述
我在运行一个NetSuite User Event脚本,逻辑是在Estimate记录的VIEW页面加载时,读取custbody_f5_insp_contract_num字段作为参数调用外部API,获取合同状态后赋值给custbody_contract_status字段。但现在需要加载两次页面,该字段才会显示数据,希望实现页面加载完成后立即填充并显示该字段。
原脚本代码:
/** * @NApiVersion 2.x * @NScriptType UserEventScript */ define(["N/https", "N/record", "N/log", "N/url"], function ( https, record, log, url ) { function beforeLoad(scriptContext) { if (scriptContext.type === scriptContext.UserEventType.VIEW) { var estimate = scriptContext.newRecord; var estimateRecord = record.load({ type: "estimate", id: estimate.id, }); var insphireContractNumber = estimateRecord.getValue({ fieldId: "custbody_f5_insp_contract_num", }); // log.debug("estimateRecord", estimateRecord); var insphireContractStatusUrl = url.format({ domain: "https://ag-dev-dock.accessgroup.net.au/aps/Public/ProductionContractStatus?", params: { contractNo: insphireContractNumber, }, }); var insphireContractStatusResponse = https.get({ method: https.Method.GET, url: insphireContractStatusUrl, }); log.debug( "insphireContractStatusResponse", insphireContractStatusResponse ); var insphireContractStatusParsed = JSON.parse( insphireContractStatusResponse.body ); if (insphireContractStatusParsed.hasOwnProperty("resultFlag")) { log.debug( "Insphire Contract Status Error", insphireContractStatusParsed.message ); } else { var contractStatusValue = insphireContractStatusParsed.contractStatus; log.debug("contractStatusValue1", contractStatusValue); switch (contractStatusValue) { case "0": contractStatusValue = 1; break; case "1": contractStatusValue = 2; break; case "2": contractStatusValue = 3; break; case "4": contractStatusValue = 4; break; default: contractStatusValue = 5; break; } log.debug("contractStatusValue2", contractStatusValue); log.debug("typeof", typeof contractStatusValue); estimateRecord.setValue({ fieldId: "custbody_contract_status", value: contractStatusValue }); estimateRecord.save(); } } } return { beforeLoad: beforeLoad }; });
问题根源
原脚本在beforeLoad事件中重新加载记录、修改后调用save(),但此时页面已经基于初始的记录数据开始渲染,所以第一次打开页面时显示的是旧值;第二次加载时才会读取到数据库中已更新的新值。
解决方案
修改脚本逻辑,直接使用scriptContext.newRecord获取字段值,通过record.submitFields()批量更新数据库,同时修改newRecord的字段值让当前页面立即显示结果,无需刷新:
/** * @NApiVersion 2.x * @NScriptType UserEventScript */ define(["N/https", "N/record", "N/log", "N/url"], function ( https, record, log, url ) { function beforeLoad(scriptContext) { if (scriptContext.type === scriptContext.UserEventType.VIEW) { var estimate = scriptContext.newRecord; // 直接从newRecord获取合同编号,无需重新加载记录 var insphireContractNumber = estimate.getValue({ fieldId: "custbody_f5_insp_contract_num", }); // 若合同编号为空,直接退出 if (!insphireContractNumber) { log.debug("No Contract Number", "custbody_f5_insp_contract_num is empty"); return; } var insphireContractStatusUrl = url.format({ domain: "https://ag-dev-dock.accessgroup.net.au/aps/Public/ProductionContractStatus?", params: { contractNo: insphireContractNumber, }, }); try { var insphireContractStatusResponse = https.get({ url: insphireContractStatusUrl, }); log.debug("insphireContractStatusResponse", insphireContractStatusResponse); var insphireContractStatusParsed = JSON.parse( insphireContractStatusResponse.body ); if (insphireContractStatusParsed.hasOwnProperty("resultFlag")) { log.debug( "Insphire Contract Status Error", insphireContractStatusParsed.message ); return; } var contractStatusValue = insphireContractStatusParsed.contractStatus; log.debug("contractStatusValue1", contractStatusValue); // 转换状态值 switch (contractStatusValue) { case "0": contractStatusValue = 1; break; case "1": contractStatusValue = 2; break; case "2": contractStatusValue = 3; break; case "4": contractStatusValue = 4; break; default: contractStatusValue = 5; break; } log.debug("contractStatusValue2", contractStatusValue); // 1. 直接更新数据库字段,无需加载整条记录 record.submitFields({ type: record.Type.ESTIMATE, id: estimate.id, values: { custbody_contract_status: contractStatusValue }, options: { enableSourcing: false, ignoreMandatoryFields: true } }); // 2. 修改newRecord的字段值,让当前页面立即显示更新后的数据 estimate.setValue({ fieldId: "custbody_contract_status", value: contractStatusValue }); } catch (e) { log.error("API Call Error", e.message); } } } return { beforeLoad: beforeLoad }; });
关键优化点
- 避免重复加载记录:直接使用
scriptContext.newRecord读取字段,提升脚本性能 - 使用
record.submitFields():高效更新单个字段,比加载整条记录再save()更轻量 - 修改
newRecord字段值:确保当前页面渲染时直接显示最新的合同状态,无需二次加载 - 增加异常捕获:处理API调用失败的情况,避免脚本中断
内容的提问来源于stack exchange,提问作者cristian cabacaba
相关产品推荐
相关产品推荐

