如何用Apex更新Salesforce修订报价中的报价行数量?
在Salesforce中更新修订报价的报价行数量
在Salesforce中,我希望能够更新修订报价中的报价行数量。当前已通过Contract Amender API编写Apex代码生成修订机会与报价,成功获取到修订报价的quoteId,但不清楚后续如何利用该ID更新报价行的数量字段,特此咨询是否可行及实现方式。附现有代码:
public with sharing class AmendedContract{ public QuoteModel load(String contractId, String context) { String quoteJSON = SBQQ.ServiceRouter.load('SBQQ.ContractManipulationAPI.ContractAmender', contractId, context); return (QuoteModel) JSON.deserialize(quoteJSON, QuoteModel.class); } } public with sharing class AmendContext { public Boolean returnOnlyQuoteId; } public String createAmendment(String cID) { system.debug('-----AMENDMENT CREATION STARTED-----'); AmendContext con1 = new AmendContext(); con1.returnOnlyQuoteId = false; String contextJson = JSON.serialize(con1); AmendedContract amender = new AmendedContract(); QuoteModel quote = amender.load(cID, contextJson); SBQQ__Quote__c quoteRec = quote.record; String quoteId = (String) quoteRec.Id; system.debug('Amended quote ID: ' + quoteId); return quoteId; }
可行性说明
完全可行。拿到修订报价的Quote ID后,可通过SOQL查询关联的报价行记录(SBQQ__QuoteLine__c),直接更新数量字段再通过DML操作保存。
实现步骤及代码示例
1. 确认报价行数量字段API名
默认Salesforce CPQ的报价行数量字段API名为SBQQ__Quantity__c,若你的Org使用自定义字段,请替换为实际字段名。
2. 添加更新逻辑
方式一:在createAmendment中直接更新
在生成修订报价后,批量更新该报价下所有报价行的数量:
public String createAmendment(String cID) { system.debug('-----AMENDMENT CREATION STARTED-----'); AmendContext con1 = new AmendContext(); con1.returnOnlyQuoteId = false; String contextJson = JSON.serialize(con1); AmendedContract amender = new AmendedContract(); QuoteModel quote = amender.load(cID, contextJson); SBQQ__Quote__c quoteRec = quote.record; String quoteId = (String) quoteRec.Id; system.debug('Amended quote ID: ' + quoteId); // --- 新增更新报价行数量的逻辑 --- // 查询该报价下所有报价行 List<SBQQ__QuoteLine__c> quoteLines = [ SELECT Id, SBQQ__Quantity__c FROM SBQQ__QuoteLine__c WHERE SBQQ__Quote__c = :quoteId ]; // 更新数量(示例:将所有报价行数量改为5,可根据业务逻辑调整) Integer targetQuantity = 5; for(SBQQ__QuoteLine__c line : quoteLines){ line.SBQQ__Quantity__c = targetQuantity; } // 批量保存更新 if(!quoteLines.isEmpty()){ update quoteLines; system.debug('更新了 ' + quoteLines.size() + ' 条报价行'); } // --- 新增逻辑结束 --- return quoteId; }
方式二:封装独立更新方法
如果需要灵活调用(比如后续单独更新),可封装独立方法:
// 新增方法:根据Quote ID更新报价行数量,支持指定特定行 public void updateQuoteLineQuantity(String quoteId, Integer targetQuantity, List<Id> specificQuoteLineIds = null){ // 构建查询条件:传入特定行ID则只更新这些行,否则更新所有行 String soql = 'SELECT Id, SBQQ__Quantity__c FROM SBQQ__QuoteLine__c WHERE SBQQ__Quote__c = :quoteId'; if(specificQuoteLineIds != null && !specificQuoteLineIds.isEmpty()){ soql += ' AND Id IN :specificQuoteLineIds'; } List<SBQQ__QuoteLine__c> quoteLines = Database.query(soql); for(SBQQ__QuoteLine__c line : quoteLines){ line.SBQQ__Quantity__c = targetQuantity; } if(!quoteLines.isEmpty()){ update quoteLines; } } // 在createAmendment中调用 public String createAmendment(String cID) { // 原有逻辑不变... String quoteId = (String) quoteRec.Id; system.debug('Amended quote ID: ' + quoteId); // 调用更新方法:更新该报价下所有行数量为5 updateQuoteLineQuantity(quoteId, 5); return quoteId; }
3. (可选)触发CPQ重新计算
更新数量后若需自动重新计算总价、折扣等字段,可调用CPQ计算API:
// 在更新报价行后执行 SBQQ.ServiceRouter.call('SBQQ.QuoteCalculatorAPI.Calculate', quoteId);
注意事项
- 权限控制:类使用
with sharing,需确保执行用户对目标报价和报价行有读写权限。 - 批量操作:使用批量DML避免触发 governor limits。
- 异常处理:可添加try-catch块捕获DML异常,增强代码稳定性。
内容的提问来源于stack exchange,提问作者A Person
相关产品推荐
相关产品推荐

