【问题标题】:Overriding second level graph extension method in Acumatica在 Acumatica 中覆盖二级图形扩展方法
【发布时间】:2018-03-30 21:50:23
【问题描述】:

我需要处理销售税、折扣等的可重用业务对象,并且需要覆盖这些图形扩展中的一些方法。例如,我从机会图开始。我有一组订单总额需要计算到总产品金额中,过去我们只是覆盖了(我认为)税收类别的税收属性。无论如何,我看不出如何在二级图形扩展的方法上使用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);
    }
}

我的图形扩展中 CalcDocTotals 内部发生的事情不是重点。事实上,如果该方法位于第一级(基本)图中,我无法覆盖 OpportunityMaint.SalesTax CalcDocTotals 方法。 SalesTax 图形扩展具有受保护的方法,但受保护的方法(如果它在基本图中)可以使用 PXOverrideAttribute 覆盖,如果您将方法调用设为公开,这就是我所做的。我还尝试使用声明的委托代替 Action,但结果相同(正如我预期但想确认的那样)。

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

当我编译上面的代码并加载页面时,我得到了这个错误:

Method Void CalcDocTotals(System.Object, System.Decimal, System.Decimal, System.Decimal, System.Action`4[System.Object,System.Decimal,System.Decimal,System.Decimal]) 在图扩展中标记为[PXOverride],但原来的方法 在 PXGraph 中没有找到这样的名称

【问题讨论】:

  • 我认为目前系统正在尝试在OpportunityMaint 图中找到CalcDocTotals。但这只是几个问题之一。第二个问题是CalcDocTotals 是抽象类的成员,在SalesTax 图中它是受保护的,只是被覆盖了。
  • 作为一个想法,我可以建议尝试实现 TaxGraph 抽象类,并在某些时候用它替换 SalesTax
  • 问题是 Acumatica 已经宣布使用 SalesTax。如果我们再次声明它,我会假设我们会得到双重执行/结果。

标签: acumatica


【解决方案1】:

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

【讨论】:

  • 我正在使用 19R2,但我没有看到此功能。我在使用我的扩展函数时遇到了上述错误,并且我不认为它是自定义项目编辑器代码部分的覆盖方法操作中的可覆盖函数。关于我做错了什么的任何提示?
  • 嗨@EricP。如果还没有,我会将其作为一个新问题发布。最好看看你的设置。只需包含图形扩展的类声明,您尝试扩展的一种方法就足够了
【解决方案2】:

据我在使用 Acumatica 的这些年中所见,您不能在 Extension2 等中覆盖 Extension1 中的方法。因此,我对这个问题的解决方案是:使用您的基本方法创建一个辅助图表,在您希望使用它的任何图表中为其创建一个字段或属性(最好是一个惰性初始化的图表),然后在任何项目中您必须覆盖逻辑打开,只需引用您的原始项目,并创建您的帮助图的扩展。

【讨论】:

  • 谢谢。根据我从您的帖子中听到的消息,其他人是不可能的。因为我无法控制“Extension1”,所以我看不到图形助手如何在这里提供帮助。我正在使用 Acumatica 图形扩展,这些扩展需要可扩展,这似乎是不可能的。在使用可重用业务对象时,这似乎是一个限制:help.acumatica.com/… 我们已经为我们的图形扩展实现了可重用业务逻辑,并且在其他人需要扩展任何虚拟方法之前它工作得很好。
猜你喜欢
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多