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