Acumatica 从SO屏幕填充到PO屏幕的字段

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

当用户将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; } }
} 我发现,如果操作是在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。我已经测试过了,看起来你的解决方案比在划船比赛中写东西更完美。