首页 > 解决方案 > Acumatica 覆盖 ARFinChargesApplyMaint 图的计算操作

问题描述

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

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

这是我迄今为止在我的扩展课程中所拥有的,但到目前为止还没有真正起作用。var row1 = row 仅用于断点/调试目的:

    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.
            }
        // }
    }

标签: overridingactionacumatica

解决方案


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

开箱即用的计算操作

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

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

        return adapter.Get();
    }
} 

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

根据上述观察,解决您的要求的可能方法是:

  1. ARFinChargesApplyMaint.ARFinChargesApplyParameters在调用之前添加确认并在 DAC 的隐藏自定义字段中存储确认值(是/否)与过滤器视图 ( ) 一起使用Base.calculate.Press(adapter)
  2. 覆盖虚拟方法CalculateFinancialCharges,并为 DAC 添加RowInserted事件处理程序ARFinChargesApplyMaint.ARFinChargesDetails以更改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 定制指南

覆盖操作委托方法

更改 BLC 虚拟方法


推荐阅读