ARFinChargesApplyMaint 图的 Acumatica 覆盖计算操作

Acumatica Override Calculate Action for ARFinChargesApplyMaint graph

需要覆盖计算逾期费用 (AR507000) 计算操作。打算尝试覆盖整个 CalculateFinancialCharges 但这似乎令人生畏(甚至不确定是否可能)。在我的扩展 class 中,我只想做一些 post 处理: 如果在 运行 基础计算逻辑之后在 ARFinChargeRecords 上找到行,则提示用户。如果他们回答是,遍历 ARFinChargeRecords 并更新 FinChargeAmt:当前发票余额 * .02

我对 Acumatica 开发还很陌生,并且已经完成了所有 T 课程。这是我要解决的第一个现实世界问题,但我运气不佳。似乎 Base.calculate 调用自己?我尝试使用发票发布操作覆盖的示例,但这似乎有所不同。

这是我目前在我的扩展 class 中所拥有的,但目前还没有真正发挥作用。 var row1 = row 仅用于 breakpoint/debugging 目的:

    public PXAction<ARFinChargesApplyMaint.ARFinChargesApplyParameters> Calculate;
    [PXButton]
    [PXUIField(DisplayName = "Calculate")]
    protected void calculate()
    {
        Base.calculate.Press();

        //int iCachedData = 0;
        //foreach (var row in Base.ARFinChargeRecords.Cache.Cached)
        //{
        //    iCachedData++;
        //    yield return row;
        //}

        //if (iCachedData > 0)
        //{
            if (Base.ARSetup.Ask("Apply Special Calculation (Percent Of Open Balance)", MessageButtons.YesNo) == WebDialogResult.Yes)
            {
                foreach (var row in Base.ARFinChargeRecords.Cache.Cached) {

                  var row1 = row;

                }

                // update FinChargeAmount with Balance * .02
                // Base.ARFinChargeRecords
                // Base.ARInvoices.
            }
        // }
    }

Calculate 操作可以被覆盖。下面是开箱即用的 Calculate 操作

它应该被覆盖如下(没有任何自定义逻辑):

public class ARFinChargesApplyMaintPXExt : PXGraphExtension<ARFinChargesApplyMaint>
{
    [PXOverride]
    public virtual IEnumerable Calculate(PXAdapter adapter)
    {
        Base.calculate.Press(adapter);

        return adapter.Get();
    }
} 

开箱即用的 Calculate 操作开始异步操作(通过 PXLongOperation.StartOperation),为 ARFinChargesApplyMaint 创建新的 Graph 实例并调用 CalculateFinancialCharges 方法(生成在网格中显示的行)

根据以上观察,满足您的要求的可能方法是:

  1. 在调用 Base.calculate.Press(adapter).
  2. 之前,在使用过滤器视图 (ARFinChargesApplyMaint.ARFinChargesApplyParameters) 的 DAC 隐藏自定义字段中添加确认和存储确认值 (Yes/No)
  3. 覆盖虚拟方法 CalculateFinancialCharges,并为 ARFinChargesApplyMaint.ARFinChargesDetails DAC 添加 RowInserted 事件处理程序以更改 FinChargeAmt 字段的逻辑。

以下代码供您参考

using System;
using PX.Data;
using System.Collections;
using PX.Objects.AR;

namespace DemoPkg
{
    public class ARFinChargesApplyMaintPXExt : PXGraphExtension<ARFinChargesApplyMaint>
    {
        [PXOverride]
        public virtual IEnumerable Calculate(PXAdapter adapter)
        {
            WebDialogResult result = adapter.View.Ask(Base.Filter.Current, "Confirmation",
                                                      "Apply Special Calculation (Percent Of Open Balance)?",
                                                      MessageButtons.YesNo, MessageIcon.Question);
            ARFinChargesApplyMaint.ARFinChargesApplyParameters filterData = Base.Filter.Current;
            ARFinChargesApplyParametersPXExt filterDataExt = PXCache<ARFinChargesApplyMaint.ARFinChargesApplyParameters>.GetExtension<ARFinChargesApplyParametersPXExt>(filterData);
            filterDataExt.UsrReCalcFinChargeAmt = (result == WebDialogResult.Yes);
            Base.Filter.Update(filterData);

            Base.calculate.Press(adapter);

            return adapter.Get();
        }

        [PXOverride]
        public virtual void CalculateFinancialCharges(ARFinChargesApplyMaint.ARFinChargesApplyParameters filter, Action<ARFinChargesApplyMaint.ARFinChargesApplyParameters> BaseInvoke)
        {
            ARFinChargesApplyParametersPXExt filterDataExt = PXCache<ARFinChargesApplyMaint.ARFinChargesApplyParameters>.GetExtension<ARFinChargesApplyParametersPXExt>(filter);
            if (filterDataExt.UsrReCalcFinChargeAmt.GetValueOrDefault(false))
            {
                Base.RowInserted.AddHandler<ARFinChargesApplyMaint.ARFinChargesDetails>((sender, e) =>
                {
                    ARFinChargesApplyMaint.ARFinChargesDetails data = (ARFinChargesApplyMaint.ARFinChargesDetails)e.Row;
                    data.FinChargeAmt = 600.00m; // your custom calculated value
                });
            }
            BaseInvoke(filter);
        }
    }

    public sealed class ARFinChargesApplyParametersPXExt : PXCacheExtension<ARFinChargesApplyMaint.ARFinChargesApplyParameters>
    {
        #region UsrReCalcFinChargeAmt
        public abstract class usrReCalcFinChargeAmt : PX.Data.BQL.BqlBool.Field<usrReCalcFinChargeAmt> { }

        [PXDBBool]
        [PXDefault(false, PersistingCheck = PXPersistingCheck.Nothing)]
        [PXUIField(DisplayName = "Recalc Amount", Visibility = PXUIVisibility.Invisible)]
        public bool? UsrReCalcFinChargeAmt { get; set; }
        #endregion
    }
}

以下帮助文章可参考Acumatica自定义指南

To Override an Action Delegate Method

Altering BLC Virtual Methods