在通用图形扩展中声明的覆盖操作

abu*_*ger 3 acumatica

我有一个自定义,通过覆盖该操作来调整 SO Order Entry 上的 ShopRates 操作。 

在 2018 R2 中,ShopRates 操作直接在 SOOrderEntry 图上声明,因此要覆盖该操作,我们只需执行以下操作。 

    public class SOOrderEntry_Extension : PXGraphExtension<SOOrderEntry>
    {
       public PXAction<SOOrder> shopRates;
       [PXUIField(DisplayName = "Shop for Rates", MapViewRights = PXCacheRights.Select, MapEnableRights = PXCacheRights.Update)]
       [PXButton(ImageKey = PX.Web.UI.Sprite.Main.DataEntryF)]
       protected virtual IEnumerable ShopRates(PXAdapter adapter)
       {
          Base.shopRates.Press(adapter);
          // custom code
          return adapter.Get();
       }
    }
Run Code Online (Sandbox Code Playgroud)

但是,在 2019 R1 中,ShopRates 操作已移至 CarrierRatesExtension,这是 SOOrderEntry 图上使用的通用图扩展,由  

public CarrierRates CarrierRatesExt => FindImplementation<CarrierRates>();
public class CarrierRates : CarrierRatesExtension<SOOrderEntry, SOOrder>
{
    . . .     
}
Run Code Online (Sandbox Code Playgroud)

现在 ShopRates 操作不再直接在 SOOrderEntry 图上定义,我如何在我的 SOOrderEntry 扩展中覆盖它?

Sam*_*sov 5

ShopRates方法定义在CarrierRatesExtension类 which is 中PXGraphExtension,但问题是该类是抽象的并且具有抽象GetCarrierRequest方法。因此,如果您创建它的扩展,则还必须实现GetCarrierRequest方法。但是,如果您查看 的来源,SOOrderEntry您会发现CarrierRatesCarrierRatesExtension类继承的嵌套并已经实现了您需要的一切。所以,你需要创建一个PXGraphExtensionSOOrderEntrySOOrderEntry.CarrierRates,因为SOOrderEntry.CarrierRates仍然是PXGraphExtension

下面是如何覆盖 ShopRates 方法的示例:

using PX.Data;
using PX.Objects.SO;
using System;
using System.Collections;
namespace Test
{
    public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry.CarrierRates, SOOrderEntry>
    {
        [PXOverride()]
        public virtual IEnumerable ShopRates(PXAdapter adapter,Func<PXAdapter,IEnumerable> baseMethod)
        {
            throw new NotImplementedException("This code overrides shop rates method and is not implemented yet!!");
            var retVal = baseMethod?.Invoke(adapter);
            return retVal;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)