Acumatica CROpportunity Дополнительные данные не сохраняются - PullRequest
0 голосов
/ 19 июня 2020

Добрый день

У меня есть новое поле в расширении CROpportunity под названием usrGrossProfit. Во время RowSelected CROpportunity он вычисляет значения по мере необходимости. Проблема, с которой я столкнулся, заключается в том, что пользователи используют кнопку создания цитаты в форме и из-за этого никогда не сохраняет с помощью кнопки сохранения. Система делает это за них. Я обнаружил, что из-за этого значение usrGrossProfit не сохраняется.

Есть ли способ принудительно сохранить / сохранить внутри функции 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);

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

Я также организовал бизнес-мероприятие, чтобы открыть и сохранить возможность, тоже безуспешно.

1 Ответ

1 голос
/ 20 июня 2020

Нет, вы не должны сохранять в выбранной строке, даже если это было разрешено. Это связано с тем, что событие выбранной строки запускается несколько раз, и вы не хотите сохранять каждый раз.

Если вы хотите сохранить переопределение CreateQuote, попробуйте следующее:

Base.Save.PressButton(adapter)

Возможно, лучшим вариантом может быть принудительное использование пользователя так, чтобы пользователь сам сохранял. Например, вы можете проверить состояние и выдать ошибку при переопределении вместо сохранения.

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