Невозможно настроить цену за единицу, обновляя процент валовой прибыли и обратно.
Я успешно создал новое поле для строки заказа на продажу, чтобы отобразить процент валовой прибыли, но теперь пользователь хочет настроить проценти обновить цену за единицу.Все мои попытки до сих пор вызывали бесконечный цикл.
Атрибут добавлен в поле [UnitPrice] в ЦАП:
[PXFormula(typeof(Switch<Case<Where<SOLineExt.usrGPPercent, Equal<decimal0>>, decimal0>, Mult<SOLineExt.usrGPPercent, SOLine.curyUnitCost>>))]
[UsrGPPercent] атрибуты поля:
[PXDBDecimal]
[PXUIField(DisplayName="GPPercent", Visible = false)]
[PXFormula(typeof(Switch<Case<Where<SOLine.curyLineAmt, Equal<decimal0>>, decimal0>, Div<SOLineExt.usrTotalProfit, SOLine.curyLineAmt>>))]
[PXDefault(TypeCode.Decimal, "0.0")]
[UsrGPPct] Атрибуты поля:
[PXUIField(DisplayName = "GP %", Enabled = true)]
[PXFormula(typeof(Mult<SOLineExt.usrGPPercent, decimal100>))]
[PXDefault(TypeCode.Decimal, "0.0")]
Все вышеперечисленное отлично работает и обновляет GP%, как и ожидалось.
Попытка # 1 , добавила следующий атрибут в [UsrGCP] (я понимаю, что математика неполная, просто пытаюсь проверить концепцию на этом этапе).
[PXFormula(typeof(Switch<Case<Where<SOLine.curyLineAmt, Equal<decimal0>>, decimal0>, Div<SOLineExt.usrTotalProfit, SOLine.curyLineAmt>>))]
Попытка # 2 : обработчик FieldUpdated:
protected void SOLine_UsrGPPct_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e, PXFieldUpdated InvokeBaseHandler)
{
if(InvokeBaseHandler != null)
InvokeBaseHandler(cache, e);
var row = (SOLine)e.Row;
PX.Objects.SO.SOLineExt soLineExt = PXCache<SOLine>.GetExtension<PX.Objects.SO.SOLineExt>(row);
if (row.OrderType == "SO")
{
if (soLineExt.UsrGPPct > 0)
{
row.CuryUnitPrice = row.CuryUnitCost + (soLineExt.UsrGPPct * row.CuryUnitCost);
}
}
}
Оба метода, очевидно, привели к бесконечному циклу (угадывание, поскольку отладчик был запущен и IIS пришлось сбросить).Цель состоит в том, чтобы обновлять только один раз, когда пользователь обновляет любое из полей, и игнорировать обновления, сделанные системой.Есть идеи?
Основываясь на ответе HB_Acumatica, я обновил код выше:
protected void SOLine_UsrGPPct_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e, PXFieldUpdated InvokeBaseHandler)
{
if(InvokeBaseHandler != null)
InvokeBaseHandler(cache, e);
var row = (SOLine)e.Row;
PX.Objects.SO.SOLineExt soLineExt = PXCache<SOLine>.GetExtension<PX.Objects.SO.SOLineExt>(row);
if (e.ExternalCall)
{
if (soLineExt.UsrGPPct > 0)
{
if (row.OrderType == "SO")
{
decimal NewUnitPrice;
decimal GPPercent = soLineExt.UsrGPPct ?? 0;
decimal UnitCost = row.CuryUnitCost ?? 0;
NewUnitPrice = UnitCost + ((GPPercent / (decimal)100) * UnitCost);
row.CuryUnitPrice = NewUnitPrice;
row.UnitPrice = NewUnitPrice;
}
}
}
}
Это почти работает.На экране ничего не происходит, но при сохранении цена за единицу действительно обновляется и сохраняется правильно.Почти там, есть какой-то шаг обновления, который я пропускаю?