You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 08:27:46