Acumatica несвязанные пользовательские поля на SOOrder - PullRequest
0 голосов
/ 26 октября 2018

У меня есть пользовательское поле в расширении SOOrder DAC, которое представляет собой сумму некоторых строк в документе (на основе поля в расширении SOLine).Когда я добавляю новую строку, итог обновляется правильно.Однако, когда я загружаю документ в первый раз, на экране отображается 0,00.Я создал расширение SOOrderEntry и поместил код в обработчик событий SOLine_RowSelecting.Когда я загружаю документ, он входит в код и выглядит так, как будто он правильно устанавливает поля, но они не отображаются на экране.Тот же метод вызывается из SOLine_CuryLineAmt_FieldUpdated, и это прекрасно работает.Вот код, который я использую:

public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry>
{
    //Used to prevent recursive calls in RowSelecting
    bool _isCalculating = false;

    protected virtual void SOLine_RowSelecting(PXCache cache, PXRowSelectingEventArgs e)
    {
        var row = e.Row as SOLine;
        if (row == null) return;

        using (new PXConnectionScope())
        {
            if (!_isCalculating)
                CalcTotals();
        }
    }

    protected virtual void SOLine_CuryLineAmt_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e)
    {
        if (!_isCalculating)
            CalcTotals();
    }

    public void CalcTotals()
    {
        SOOrder order = Base.CurrentDocument.Select();
        if (order == null) return;

        _isCalculating = true;

        var orderExt = order.GetExtension<SOOrderExt>();

        orderExt.UsrMyCustomField = 0m;

        //Get totals
        foreach (SOLine lineSum in Base.Transactions.Select())
        {
            var lineSumExt = lineSum.GetExtension<SOLineExt>();
            if (lineSumExt.UsrMyCondition)
                orderExt.UsrMyCustomField += lineSum.CuryLineAmt;
        }

        _isCalculating = false;
    }
}

1 Ответ

0 голосов
/ 26 октября 2018
  • RowSelected вызывается при каждом обратном вызове для выбора данных.Также нет необходимости пересчитывать событие FieldUpdated, поскольку при обновлении записей будет вызываться RowSelected.Поэтому рассмотрите возможность удаления SOLine_CuryLineAmt_FieldUpdated

  • У вас объявлено событие RowSelected для SOLine DAC.Событие затем выбирает все SOLine для вычисления итогов.Эта сумма, при выборе одного из Деталей, вычисляет общее количество всех Деталей, для которых не хватает рекурсивного шаблона.Поэтому рассмотрите возможность объявления RowSelected в главном документе, который в этом случае является SOOrder, и удалите все обходные пути, которые необходимо использовать для прерывания рекурсии.

  • В вычислениях нет нулевой проверки.Поля ЦАП Acumatica обнуляются.С вашим кодом вы можете оказаться в ситуации, когда вы добавляете null к числу, что приведет к нарушению типа во время выполнения.Поэтому рассмотрите возможность проверки того, имеет ли значение CuryLineAmt значение NULL, прежде чем использовать его значение для вычисления суммы.

  • Вы накапливаете сумму в поле ЦАП UsrMyCustomField с помощью оператора добавления дополнения + =.Это работает, но я бы посоветовал против этого.Поля ЦАП не предназначены для регистрации или для вычисления временных значений.Поэтому рассмотрите возможность накопления суммы в локальной переменной и присвойте только окончательное вычисленное значение полю ЦАП.


Код для вычисления суммы со всеми рассмотренными точками:

public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry>
{
    public void SOOrder_RowSelected(PXCache cache, PXRowSelectedEventArgs e)
    {
        SOOrder order = e.Row as SOOrder;

        if (order != null)
        {
            SOOrderExt orderExt = order.GetExtension<SOOrderExt>();

            if (orderExt != null)
            {
                decimal total = 0M;

                foreach (SOLine line in Base.Transactions.Select())
                {
                    total += line.CuryLineAmt.HasValue ? line.CuryLineAmt.Value : 0M;
                }

                orderExt.UsrMyCustomField = total;
            }
        }
    }
}
...