NetSuite SuiteTalk SOAP API如何仅更新记录指定字段避免只读字段报错
问题根因
你通过拉取全量SalesOrder实例再调用update的操作,会把实例包含的所有字段(含subtotal这类系统只读字段)都序列化到更新请求中,哪怕你没有修改这些字段,也会触发NetSuite的只读字段校验。
可行解决方案
方案1:构造最小更新对象(最高效,推荐)
不需要先拉取全量SalesOrder实例,直接创建空的SalesOrder对象,仅赋值必须的定位字段和需要修改的字段即可,NetSuite的update接口只会更新请求中携带的字段,未携带的字段不会做任何改动。
Java代码示例:
// 初始化空销售订单对象 SalesOrder order = new SalesOrder(); // 传入要更新的订单internalID,用于NetSuite定位记录 order.setInternalId("目标销售订单的internalID"); // 仅构造需要更新的自定义字段 StringCustomFieldRef targetCustomField = new StringCustomFieldRef(); targetCustomField.setScriptId("custbody_你的自定义字段ID"); targetCustomField.setValue("需要更新的字段值"); CustomFieldRef[] fieldArray = new CustomFieldRef[]{targetCustomField}; order.setCustomFieldList(new CustomFieldList(fieldArray)); // 执行更新,请求仅会携带internalID和自定义字段,不会触发只读字段校验 WriteResponse rc = this.nsPort.update(order);
方案2:拉取全量记录后构造增量更新对象
如果你的业务逻辑必须先拉取全量SalesOrder做校验或逻辑判断,再执行更新,不要直接用拉取到的原实例调用update,而是新构造一个仅包含更新字段的实例:
// 先拉取全量订单做业务逻辑处理 RecordRef recordRef = new RecordRef(); recordRef.setInternalId("目标销售订单的internalID"); recordRef.setType(RecordType.salesOrder); SalesOrder fullOrder = (SalesOrder) nsPort.get(recordRef).getRecord(); // --- 这里执行你的业务逻辑判断 --- // 新构造更新用的最小对象,仅传递需要更新的字段 SalesOrder updateOrder = new SalesOrder(); updateOrder.setInternalId(fullOrder.getInternalId()); // 仅放入你修改后的自定义字段列表 updateOrder.setCustomFieldList(modifiedCustomFieldList); // 执行更新 WriteResponse rc = nsPort.update(updateOrder);
内容的提问来源于stack exchange,提问作者LRE
相关产品推荐
相关产品推荐

