Acumatica 重写在泛型图扩展中声明的操作

Acumatica 重写在泛型图扩展中声明的操作,acumatica,Acumatica,我有一个定制,通过覆盖该操作来调整订单条目上的ShopRates操作 在2018 R2中,ShopRates操作直接在SOOrderEntry图上声明,因此要覆盖该操作,我们只需执行以下操作 public class SOOrderEntry_Extension : PXGraphExtension<SOOrderEntry> {    public PXAction<SOOrder> shopRates;    [PXUIField(Di

我有一个定制,通过覆盖该操作来调整订单条目上的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();
       }
    }
public类SOOrderEntry\u扩展名:PXGraphExtension
{
公共服务价格;
[PXUIField(DisplayName=“按价格购买”,MapViewRights=PXCacheRights.Select,MapEnableRights=PXCacheRights.Update)]
[PXButton(ImageKey=PX.Web.UI.Sprite.Main.DataEntryF)]
受保护的虚拟IEnumerable ShopRates(PXAdapter)
   {
基本。购物价格。按(适配器);
//自定义代码
返回适配器Get();
}
}
然而,在2019年R1,ShopRates操作已移至CarrierRateExtension,这是一个通用的图形扩展,由

public carrierates carrieratesext=>FindImplementation();
公共类CarrierRates:CarrierRates扩展
{
    . . .     
}

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

您应该从
CarrierRates
类创建子类

public class SOOrderEntryEx : PXGraphExtension<SOOrderEntry>
{
    public class CarrierRatesExt : SOOrderEntry.CarrierRates
    {
        protected override IEnumerable ShopRates(PXAdapter adapter)
        {
            return base.ShopRates(adapter); 
        }
    }
}
公共类SOOrderEntryEx:pxgrapherExtension
{
公共类CarrierRatesExt:SOOrderEntry.CarrierRates
{
受保护的覆盖IEnumerable ShopRates(PXAdapter)
{
返回基数。购物价格(适配器);
}
}
}

ShopRates方法是在
CarrierRatesExtension
类中定义的,该类是
PXGraphExtension
,但问题是该类是抽象的并且具有抽象的
GetCarrierRequest
方法。因此,如果您创建它的扩展,您还必须实现
GetCarrierRequest
方法。 但是如果您查看
SOOrderEntry
的源代码,您将发现嵌套的
CarrierRates
,它继承自
CarrierRatesExtension
类,并且已经实现了您需要的所有功能。 因此,您需要创建
SOOrderEntry
SOOrderEntry.CarrierRates
PXGraphExtension
,因为
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;
        }
    }
}
使用PX.Data;
使用PX.Objects.SO;
使用制度;
使用系统集合;
名称空间测试
{
公共类SOOrderEntryExt:PXGraphExtension
{
[PXOverride()]
公共虚拟IEnumerable商店费率(PXAdapter、Func baseMethod)
{
抛出新的NotImplementedException(“此代码覆盖ShopRates方法,尚未实现!!”;
var retVal=baseMethod?.Invoke(适配器);
返回返回;
}
}
}

我尝试用子类重写,但没有成功help@vardan不幸的是,这对我也不起作用。我用一个断点将这段代码添加到我的扩展中,当我在SO输入屏幕上单击Shop for Rates按钮时,断点不会被击中。有什么建议吗?
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;
        }
    }
}