Acumatica中的重写二级图扩展方法

Acumatica中的重写二级图扩展方法,acumatica,Acumatica,我需要为增值税、折扣等使用可重用的业务对象,并且需要覆盖这些图扩展中的一些方法。例如,我从机会图开始。我有一组订单总额,需要计算到产品总金额中,在过去,我们只是覆盖了(我认为)税务类别的税务属性。无论如何,我不知道如何在第二级图形扩展的方法上使用PXOverrideAttribute 以下是我的例子: public class OpportunityMaintExtOne : PXGraphExtension<PX.Objects.CR.OpportunityMaint.SalesTax,

我需要为增值税、折扣等使用可重用的业务对象,并且需要覆盖这些图扩展中的一些方法。例如,我从机会图开始。我有一组订单总额,需要计算到产品总金额中,在过去,我们只是覆盖了(我认为)税务类别的税务属性。无论如何,我不知道如何在第二级图形扩展的方法上使用
PXOverrideAttribute

以下是我的例子:

public class OpportunityMaintExtOne : PXGraphExtension<PX.Objects.CR.OpportunityMaint.SalesTax, PX.Objects.CR.OpportunityMaint>
{ 
    [PXOverride]
    public virtual void CalcDocTotals(object row, decimal CuryTaxTotal, decimal CuryInclTaxTotal, decimal CuryWhTaxTotal,
        Action<object, decimal, decimal, decimal> del)
    {
        del?.Invoke(row, CuryTaxTotal, CuryInclTaxTotal, CuryWhTaxTotal);

        var someOtherTotal = Base1.Documents.Cache.GetValueAsDecimal<CROpportunityExtension.aMCurySomeOtherTotal>(row);
        if (someOtherTotal == 0)
        {
            return;
        }

        var curyDocTotal = someOtherTotal + Base1.Documents.Cache.GetValueAsDecimal<CROpportunity.curyProductsAmount>(row);
        Base1.Documents.Cache.SetValue<CROpportunity.curyProductsAmount>(row, curyDocTotal);
    }
}
公共类机会主义维护:pxgrapherExtension
{ 
[PXOverride]
公共虚拟空CalcDocTotals(对象行、十进制CuryTaxTotal、十进制CuryInclTaxTotal、十进制CuryWhTaxTotal、,
行动(del)
{
del?.Invoke(行、CuryTaxTotal、CuryInclTaxTotal、CuryWhTaxTotal);
var someOtherTotal=Base1.Documents.Cache.GetValueAsDecimal(行);
如果(someOtherTotal==0)
{
返回;
}
var curyDocTotal=someOtherTotal+Base1.Documents.Cache.GetValueAsDecimal(行);
Base1.Documents.Cache.SetValue(行,curyDocTotal);
}
}
在我的图形扩展中,CalcDocTotals内部发生的事情并不是重点。事实上,我无法覆盖
OpportunityMaint.SalesTax CalcDocTotals
方法,因为如果该方法位于一级(基本)图中,我可以覆盖该方法。SalesTax图扩展将该方法作为受保护的方法,但是如果您将方法调用公开(这是我所做的),则可以使用PXOverrideAttribute覆盖受保护的方法(如果它在基本图中)。我还尝试使用声明的委托来代替操作,但结果是一样的(正如我所期望的,但我想确认)

我的问题:是否可以使用PXOverrideAttribute覆盖第二级、第三级等图形扩展方法?

当我编译上面的代码并加载页面时,会出现以下错误:

方法Void CalcDocTotals(System.Object、System.Decimal、, 十进制,十进制,十进制, System.Action`4[System.Object,System.Decimal,System.Decimal,System.Decimal]) 在图中,扩展标记为[PXOverride],但原始方法 在PXGraph中未找到具有此名称的


就我在Acumatica工作的几年中所看到的情况而言,您不能在Extension2等中重写Extension1中的方法。因此,我的解决方案是:使用基本方法创建一个助手图,在您希望在其中使用它的任何图中为它创建一个字段或属性(最好是一个延迟初始化的图),然后在任何项目中,您必须覆盖其上的逻辑,只需引用原始项目,并创建助手图的扩展。

在2018R1更新4(18.104.0023)中添加了覆盖更高级别扩展的扩展方法的功能。这解决了我的问题,并允许我的问题中发布的代码按原样运行

我认为目前系统正试图在
Opportunity Maint
图中找到
CalcDocTotals
。但这只是几个问题之一。第二个问题是,
CalcDocTotals
是抽象类的成员,在
SalesTax
图中它受到保护,只是被覆盖了。作为一个想法,我可以建议尝试实现
TaxGraph
抽象类,并在某个时候用它替换
SalesTax
。问题是Acumatica已经存在申报使用销售税。如果我们再次声明,我想我们会得到双重执行/结果。谢谢。据我从你的帖子上听到的消息,这是不可能的。因为我不能控制“Extension1”,所以我看不出graph helper在这里有什么帮助。我正在使用Acumatica图扩展,它需要可扩展,而这似乎是不可能的。在使用可重用的业务对象时,这似乎是一个限制:我们已经为图形扩展实现了可重用的业务逻辑,在其他人需要扩展任何虚拟方法之前,它工作得很好。我得到了上面使用扩展函数得到的错误,在自定义项目编辑器的“代码”部分的“重写方法”操作中,我没有将其视为可重写函数。有没有关于我做错了什么的提示?嗨,埃里克。如果还没有,我会把它作为一个新问题发布。最好查看您的设置。只需包含图形扩展的类声明,您尝试扩展的一个方法就足够了