Acumatica中CROpportunityExt的usrGrossProfit字段创建报价时未保存求助
解决Acumatica中CROpportunity自定义字段在“创建报价”时未保存的问题
你遇到的核心问题是:自定义usrGrossProfit字段在通过“创建报价”按钮自动保存时没有被持久化。这主要是因为RowSelected事件的修改未被缓存正确标记,或是调用CreateQuote基础方法前,缓存变更没有被提交。下面是针对性的修正方案:
1. 修正RowSelected事件:确保缓存识别字段变更
在RowSelected中设置字段值后,需要明确标记缓存行已修改,让Acumatica的缓存系统知道要持久化这个变更。调整你的RowSelected代码:
protected void CROpportunity_RowSelected(PXCache cache, PXRowSelectedEventArgs e) { try { var row = (CROpportunity)e.Row; if (row == null) return; CROpportunityExt SOE = PXCache<CROpportunity>.GetExtension<CROpportunityExt>(row); decimal TotalSales = 0; decimal TotalCost = 0; foreach (CROpportunityProducts item in this.Base.Products.Select()) { CROpportunityProductsExt2 itemExt = PXCache<CROpportunityProducts>.GetExtension<CROpportunityProductsExt2>(item); TotalCost += (decimal)itemExt.UsrCostPrice.Value * item.Qty.Value; TotalSales += (decimal)itemExt.UsrSellingprice * item.Qty.Value; } decimal grossProfit = TotalSales - TotalCost; SOE.UsrGrossProfit = grossProfit; // 标记缓存行已修改,确保变更被系统识别 cache.Update(row); } catch (Exception ex) { PXTrace.WriteError(ex); } }
2. 优化CreateQuote的Override方法:精准控制持久化时机
之前的Override方法直接调用this.Base.Persist()不够精准,需要先确保当前机会的缓存变更被提交,再执行原始的创建报价逻辑:
public delegate IEnumerable CreateQuoteDelegate(PXAdapter adapter); [PXOverride] public IEnumerable CreateQuote(PXAdapter adapter, CreateQuoteDelegate baseMethod) { CROpportunity opportunity = this.Base.Opportunity.Current; if (opportunity != null) { // 手动触发RowSelected,确保字段值已最新计算(可选但更保险) this.Base.Opportunity.Cache.RaiseRowSelected(opportunity); // 精准持久化当前机会的缓存变更 this.Base.Opportunity.Cache.Persist(PXDBOperation.Update); } // 执行原始的创建报价流程 return baseMethod(adapter); }
为什么之前的方法无效?
- 在RowSelected中调用
Save.Press()是违规操作:事件处理器内不能直接触发动作按钮,会导致状态异常或循环调用。 - 单纯调用
this.Base.Persist()没有针对当前机会的缓存做精准处理,而直接使用缓存的Persist方法能确保当前行的变更被提交。 - 业务事件的“打开并保存”时机不对:CreateQuote的自动保存是在特定上下文执行的,业务事件无法覆盖这个流程的上下文。
额外建议
如果上述方案仍不生效,可以尝试在CROpportunityProducts的FieldUpdated事件中重新计算usrGrossProfit。这样当产品的成本、售价或数量变化时,字段值会实时更新,缓存也会自动标记变更,避免依赖RowSelected的触发时机。
内容的提问来源于stack exchange,提问作者JvD
相关产品推荐
相关产品推荐

