Acumatica 如何重写属性中的事件处理程序?

Acumatica 如何重写属性中的事件处理程序?,acumatica,Acumatica,我需要在采购订单接收期间验证正确位置的选择,这可能意味着临时更改物料仓库屏幕上定义的“默认”位置。我的挑战是字段默认事件处理程序是在POLocationAvailAttribute属性中定义的,而不是在PoreceipEntry图中定义的 public class POLocationAvailAttribute : LocationAvailAttribute { public POLocationAvailAttribute(Type InventoryType, Type SubI

我需要在采购订单接收期间验证正确位置的选择,这可能意味着临时更改物料仓库屏幕上定义的“默认”位置。我的挑战是字段默认事件处理程序是在POLocationAvailAttribute属性中定义的,而不是在PoreceipEntry图中定义的

public class POLocationAvailAttribute : LocationAvailAttribute
{
    public POLocationAvailAttribute(Type InventoryType, Type SubItemType, Type SiteIDType, Type TranType, Type InvtMultType)
        : base(InventoryType, SubItemType, SiteIDType, TranType, InvtMultType)
    {
    }

    public override void FieldDefaulting(PXCache sender, PXFieldDefaultingEventArgs e)
    {
        POReceiptLine row = e.Row as POReceiptLine;
        if (row == null) return;

        if (POLineType.IsStock(row.LineType) && row.POType != null && row.PONbr != null && row.POLineNbr != null)
        {
            POLine poLine = PXSelect<POLine, Where<POLine.orderType, Equal<Required<POLine.orderType>>,
                    And<POLine.orderNbr, Equal<Required<POLine.orderNbr>>,
                    And<POLine.lineNbr, Equal<Required<POLine.lineNbr>>>>>>.Select(sender.Graph, row.POType, row.PONbr, row.POLineNbr);

            if (poLine != null && poLine.TaskID != null)
            {
                INLocation selectedLocation = PXSelect<INLocation, Where<INLocation.siteID, Equal<Required<INLocation.siteID>>,
                    And<INLocation.taskID, Equal<Required<INLocation.taskID>>>>>.Select(sender.Graph, row.SiteID, poLine.TaskID);

                if (selectedLocation != null )
                {
                    e.NewValue = selectedLocation.LocationID;
                    return;
                }
                else
                {
                    e.NewValue = null;
                    return;
                }
            }
        }

        base.FieldDefaulting(sender, e);
    }
}
公共类POLocationAvailAttribute:LocationAvailAttribute
{
公共POLocationAvailAttribute(类型InventoryType、类型SubItemType、类型SiteIDType、类型TranType、类型InvtMultType)
:base(InventoryType、SubItemType、SiteIDType、TranType、InvtMultType)
{
}
公共覆盖无效FieldDefaulting(PXCache发送方,PXFieldDefaultingEventArgs e)
{
POReceiptLine行=e.行作为POReceiptLine;
if(row==null)返回;
if(POLineType.IsStock(row.LineType)&&row.POType!=null&&row.PONbr!=null&&row.POLineNbr!=null)
{
POLine POLine=PXSelect.Select(sender.Graph,row.POType,row.PONbr,row.POLineNbr);
if(poLine!=null&&poLine.TaskID!=null)
{
INLocation selectedLocation=PXSelect.Select(sender.Graph,row.SiteID,poLine.TaskID);
如果(selectedLocation!=null)
{
e、 NewValue=selectedLocation.LocationID;
返回;
}
其他的
{
e、 NewValue=null;
返回;
}
}
}
base.FieldDefaulting(发送方,e);
}
}
如何覆盖图形扩展中的字段默认事件,以便调用Base方法来设置默认位置,然后我可以检查是否需要在满足特定条件时将其切换到我的“备用默认位置”?

Easy

首先:使用您自己的属性和覆盖FieldDefaulting方法从POLocationAvailAttribute中派生

public class CustomPOLocationAvailAttribute : POLocationAvailAttribute
{
    public CustomPOLocationAvailAttribute(Type InventoryType, Type SubItemType, Type SiteIDType, Type TranType, Type InvtMultType)
        : base(InventoryType, SubItemType, SiteIDType, TranType, InvtMultType)
    {
    }

    public override void FieldDefaulting(PXCache sender, PXFieldDefaultingEventArgs e)
    {
        base.FieldDefaulting(sender, e);
        //code you may wanna implement          
    }
}
第二:扩展POReceiptLine DAC并用自定义属性替换现有属性

public class POReceiptLineExt : PXCacheExtension<POReceiptLine>
{
        #region LocationID
        public abstract class locationID : PX.Data.IBqlField        {       }
        [PXMergeAttributes(Method = MergeMethod.Append)]
        [PXRemoveBaseAttribute(typeof(POLocationAvailAttribute))]
        [CustomPOLocationAvail(typeof(POReceiptLine.inventoryID), typeof(POReceiptLine.subItemID), typeof(POReceiptLine.siteID), typeof(POReceiptLine.tranType), typeof(POReceiptLine.invtMult), KeepEntry = false)]
        public virtual Int32? LocationID {get; set;}
        #endregion
}
公共类POReceiptLineExt:PXCacheExtension
{
#区域位置ID
公共抽象类locationID:PX.Data.IBqlField{}
[PXMergeAttributes(Method=MergeMethod.Append)]
[PXRemoveBaseAttribute(typeof(POLocationAvailAttribute))]
[CustomPOLocationAvail(typeof(POReceiptLine.inventoryID)、typeof(POReceiptLine.subItemID)、typeof(POReceiptLine.siteID)、typeof(POReceiptLine.transtype)、typeof(POReceiptLine.invtMult)、KeepEntry=false]
公共虚拟Int32?LocationID{get;set;}
#端区
}
注意: 您可以覆盖该属性: -在带有CacheAttached事件的图形级别,仅在该屏幕上应用更改。 -或在DAC级别,在使用POReceiptLine DAC对象的所有屏幕上应用更改

现在应该可以工作了;)