Acumatica 从SO屏幕填充到PO屏幕的字段
当用户将PO和PO来源的特定项目标记为Dropship时,我需要在SO屏幕和PO屏幕之间填充自定义字段。当用户从销售订单屏幕上的操作菜单创建采购订单时 我已经在PO屏幕POOrderEntryExtension上的custom field Update事件中编写了代码,但是当我尝试使用BQL从SO屏幕获取自定义字段值时,它没有显示SO OrderNbr,如下所示- 受保护的虚拟无效POOrder\u CustomField\u FieldUpdatedPXCache缓存,PXFieldUpdatedEventArgs e { var row=poorder.row; 如果行!=null&&!string.IsNullOrEmptyrow.SOOrderNbr&&row.OrderType==POOrderType.DropShip { SOOrder order=PXSelectJoin.Selectnew PXGraph,row.SOOrderType,row.SOOrderNbr,D; 如果订单!=null { e、 NewValue=order.CustomFieldFromSO; } }Acumatica 从SO屏幕填充到PO屏幕的字段,acumatica,Acumatica,当用户将PO和PO来源的特定项目标记为Dropship时,我需要在SO屏幕和PO屏幕之间填充自定义字段。当用户从销售订单屏幕上的操作菜单创建采购订单时 我已经在PO屏幕POOrderEntryExtension上的custom field Update事件中编写了代码,但是当我尝试使用BQL从SO屏幕获取自定义字段值时,它没有显示SO OrderNbr,如下所示- 受保护的虚拟无效POOrder\u CustomField\u FieldUpdatedPXCache缓存,PXFieldUpda
} 我发现,如果操作是在POOrder_row persistening事件中插入的,我们可以检查它,这不会覆盖值。下面是代码示例- 受保护的虚拟无效POOrder\u行PersistingPXCache发送方,PXRowPersistingEventArgs e { 如果e.Operation&PXDBOperation.Command==PXDBOperation.Insert { var row=poorder.row; 如果行!=null&&!string.IsNullOrEmptyrow.SOOrderNbr&&row.OrderType==POOrderType.DropShip { SOOrder order=PXSelectJoin.Selectnew PXGraph,row.SOOrderType,row.SOOrderNbr; 如果订单!=null { row.CustomField=order.CustomFieldFromSO; } } }
} 由于您尝试将默认值设置为来自SOOrder的值,并且SOOrderNbr字段仅在创建采购订单时更新一次,而不是在每次持久化时检查分配,因此您可以通过POOrder\u SOOrderNbr\u FIELDVATED事件实现相同的目标。下面是“创建采购订单”操作中从SOOrder到POOrder的单个自定义字段的示例代码,您可以根据需要向SOOrder select添加其他筛选
public class SOOrderExtension : PXCacheExtension<SOOrder>
{
#region CustomField
public abstract class usrCustomField
{ }
[PXDBString(60)]
[PXUIField(DisplayName = "Custom Field")]
public virtual string UsrCustomField { get; set; }
#endregion
}
public class POOrderExtension : PXCacheExtension<POOrder>
{
#region CustomField
public abstract class usrCustomField
{ }
[PXDBString(60)]
[PXUIField(DisplayName = "Custom Field")]
public virtual string UsrCustomField { get; set; }
#endregion
}
public class POOrderEntryExtension : PXGraphExtension<POOrderEntry>
{
public virtual void POOrder_SOOrderNbr_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e)
{
POOrder row = e.Row as POOrder;
if (row != null)
{
POOrderExtension rowExt = PXCache<POOrder>.GetExtension<POOrderExtension>(row);
SOOrder order = PXSelectReadonly<SOOrder, Where<SOOrder.orderType, Equal<Required<SOOrder.orderType>>, And<SOOrder.orderNbr, Equal<Required<SOOrder.orderNbr>>>>>.Select(this.Base, new object[] { row.SOOrderType, row.SOOrderNbr });
if(order != null)
{
SOOrderExtension orderExt = PXCache<SOOrder>.GetExtension<SOOrderExtension>(order);
rowExt.UsrCustomField = orderExt.UsrCustomField;
}
}
}
}
原始销售订单
创建的采购订单
谢谢Joshua,我相信这也行得通。这个答案打破了Acumatica开发人员关于哪些逻辑在哪个事件中的指导原则,避免在行持久化事件处理程序中执行额外的BQL语句。引发RowPersisting事件时,关联的事务作用域正忙于保存更改,在此事务作用域内执行的任何其他操作都可能导致性能下降和死锁~Acumatica开发者维基感谢Joshua。我已经测试过了,看起来你的解决方案比在划船比赛中写东西更完美。