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
方法(生成在网格中显示的行)
根据以上观察,满足您的要求的可能方法是:
- 在调用
Base.calculate.Press(adapter)
. 之前,在使用过滤器视图 (ARFinChargesApplyMaint.ARFinChargesApplyParameters
) 的 DAC 隐藏自定义字段中添加确认和存储确认值 (Yes/No)
- 覆盖虚拟方法
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自定义指南
需要覆盖计算逾期费用 (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
方法(生成在网格中显示的行)
根据以上观察,满足您的要求的可能方法是:
- 在调用
Base.calculate.Press(adapter)
. 之前,在使用过滤器视图 ( - 覆盖虚拟方法
CalculateFinancialCharges
,并为ARFinChargesApplyMaint.ARFinChargesDetails
DAC 添加RowInserted
事件处理程序以更改FinChargeAmt
字段的逻辑。
ARFinChargesApplyMaint.ARFinChargesApplyParameters
) 的 DAC 隐藏自定义字段中添加确认和存储确认值 (Yes/No)
以下代码供您参考
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自定义指南