Acumatica 如何重写属性中的事件处理程序?
我需要在采购订单接收期间验证正确位置的选择,这可能意味着临时更改物料仓库屏幕上定义的“默认”位置。我的挑战是字段默认事件处理程序是在POLocationAvailAttribute属性中定义的,而不是在PoreceipEntry图中定义的Acumatica 如何重写属性中的事件处理程序?,acumatica,Acumatica,我需要在采购订单接收期间验证正确位置的选择,这可能意味着临时更改物料仓库屏幕上定义的“默认”位置。我的挑战是字段默认事件处理程序是在POLocationAvailAttribute属性中定义的,而不是在PoreceipEntry图中定义的 public class POLocationAvailAttribute : LocationAvailAttribute { public POLocationAvailAttribute(Type InventoryType, Type SubI
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对象的所有屏幕上应用更改
现在应该可以工作了;)