Переопределяющее действие, объявленное в расширении родового графа - PullRequest
2 голосов
/ 17 октября 2019

У меня есть настройка, которая настраивает действие ShopRates для SO Order Entry, переопределяя это действие.

В 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();
       }
    }

Однако в 2019 году R1 действие ShopRates было перемещено в CarrierRatesExtension, которое является общим расширением графа, используемым в графе SOOrderEntry, с помощью

public CarrierRates CarrierRatesExt => FindImplementation<CarrierRates>();
public class CarrierRates : CarrierRatesExtension<SOOrderEntry, SOOrder>
{
    . . .     
}

Теперь, когда действие ShopRatesбольше не определяется непосредственно на графике SOOrderEntry, как я могу переопределить его в моем расширении SOOrderEntry?

Ответы [ 2 ]

2 голосов
/ 22 октября 2019

Метод ShopRates определен в классе CarrierRatesExtension, который равен PXGraphExtension, но проблема в том, что этот класс является abstract и имеет абстрактный метод GetCarrierRequest. Поэтому, если вы создадите его расширение, вам придется реализовать также метод GetCarrierRequest. Но если вы просмотрите источники SOOrderEntry, вы найдете вложенный CarrierRates, унаследованный от класса CarrierRatesExtension и уже реализующий все, что вам нужно. Поэтому вам нужно создать PXGraphExtension из SOOrderEntry и SOOrderEntry.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;
        }
    }
}
0 голосов
/ 20 октября 2019

Вы должны создать дочерний класс из CarrierRates класса.

public class SOOrderEntryEx : PXGraphExtension<SOOrderEntry>
{
    public class CarrierRatesExt : SOOrderEntry.CarrierRates
    {
        protected override IEnumerable ShopRates(PXAdapter adapter)
        {
            return base.ShopRates(adapter); 
        }
    }
}
...