【问题标题】:Acumatica Override Calculate Action for ARFinChargesApplyMaint graphAcumatica 覆盖 ARFinChargesApplyMaint 图的计算操作
【发布时间】:2020-03-30 23:47:34
【问题描述】:

需要覆盖计算逾期费用 (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.
            }
        // }
    }

【问题讨论】:

  • “不起作用”的范围太广。尝试将问题缩小到一个不起作用的可操作项并完整描述问题,例如:未调用方法覆盖。
  • 如果我运行计算,我会得到 2 行显示使用内置逻辑的逾期费用。我收到两次询问的提示(所以几乎就像 Base.calculate 是递归的)但是当我进入这个时我从来没有看到任何行。 row1 = row 永远不会被击中。但同样,我什至不确定 A) 计算操作是否可以被覆盖,B) 如果可以,我显然不明白该怎么做。我正在尝试参考 T300 中的实验室,但找不到任何看起来接近我需要做的示例。 (在基本操作之后运行逻辑)

标签: overriding action acumatica


【解决方案1】:

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) 之前,在使用过滤器视图 (ARFinChargesApplyMaint.ARFinChargesApplyParameters) 的 DAC 的隐藏自定义字段中添加确认并存储确认值(是/否)。
  2. 覆盖虚拟方法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

【讨论】:

  • 感谢您提供代码示例和参考。事情开始在我的大脑中点击需要一点时间。在过去的几年里,我一直在使用 XAF(DevExpress)做很多工作,但花了 1-2 年的时间才真正适应了这些事情,而不是与框架抗争。
  • 我有自定义计算与您的逻辑一起使用,但是,我得到“无法请求对话框”。在 Ask 方法上尝试了一些不同的重载,但没有运气。我最后只是设置了 result = WebDialogResult.Yes;确认其余的逻辑工作。我将尝试找出对话框错误。可能需要创建另一个帖子 :) 再次感谢。
  • 实际上,看到参数上的自定义布尔值让我意识到,我只需将其添加到参数屏幕并默认为 true,而不是消息框。
  • @rjean99,我很高兴示例和参考资料很有用。您可以选择适合您需要的任何一种方法。
猜你喜欢
  • 1970-01-01
  • 2017-08-31
  • 2015-06-09
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多