Acumatica CROpportunityExt 数据未保存

Acumatica CROpportunityExt data not saving

美好的一天

我在 CROpportunity Extenstion 中有一个名为 usrGrossProfit 的新字段。 在 CROpportunity 的 RowSelected 期间,它会根据需要计算出值。我遇到的问题是用户正在使用表单上的创建报价按钮,因为这从不使用保存按钮保存,系统会为他们做这件事。我发现 usrGrossProfit 值因此没有保存。

有没有办法在 RowSelected 函数中强制使用 save/Persist?

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);

        int total = 0;
        decimal TotalSales = 0;
        decimal TotalCost = 0;
        foreach (CROpportunityProducts item in this.Base.Products.Select())
        {
            total++;
            CROpportunityProductsExt2 itemExt = PXCache<CROpportunityProducts>.GetExtension<CROpportunityProductsExt2>(item);

            TotalCost += (decimal)itemExt.UsrCostPrice.Value * item.Qty.Value;
            TotalSales += (decimal)itemExt.UsrSellingprice * item.Qty.Value;

        }
        SOE.UsrGrossProfit = TotalSales - TotalCost;

        // I added this just to try and see if it helps
        cache.SetValueExt<CROpportunityExt.usrGrossProfit>(row, (decimal)(TotalSales - TotalCost));
        // we are not allowed to press the save button in the event Handler
        //this.Base.Save.Press();

    }
    catch (Exception ex)
    {
        PXTrace.WriteError(ex);
    }
}

我也尝试过覆盖 CreateQuote 函数,但这不起作用

public delegate IEnumerable CreateQuoteDelegate(PXAdapter adapter);
        [PXOverride]
        public IEnumerable CreateQuote(PXAdapter adapter, CreateQuoteDelegate baseMethod)
        {
            this.Base.Persist();
            return baseMethod(adapter);
        }

我也做了一个商业活动来打开和保存机会,但运气不好。

不,即使允许,您也不应该保存在选定的行上。这是因为行选择事件被多次触发,您不希望每次都保存。

如果您想节省您的 CreateQuote 覆盖,试试这个:

Base.Save.PressButton(adapter)

也许更好的选择是强制用户自己保存。例如,您可以检查状态并在覆盖中抛出错误而不是保存。

if (Opportunity.Current != null && Opportunity.Cache.GetStatus(Opportunity.Current) == PXEntryStatus.Inserted)
{
     throw new PXException("Please save before proceeding");
}