在RowPersisted事件中获取修改的字段

时间:2019-02-08 03:28:04

标签: acumatica

在RowPersisted事件中。有没有办法知道哪些字段已更新?我的RowPersisted事件中有一个自定义项。但是我只想在某些字段实际被修改的情况下执行它。目前,事件在每次保存时都会做出反应,因此会不必要地触发。

TIA

更新

只需添加。我的自定义与字段值无关,也没有覆盖保存本身。我只是使用RowPersisted事件来启动我的自定义。

2 个答案:

答案 0 :(得分:2)

如果您想比较当前行和该行的任何更改(其值保持不变)(如上次持久保存的那样),则可以使用缓存实例并调用GetOriginal。

例如,使用销售订单的扩展名来检查订单数量或订单总数是否已更改...

[PXOverride]
public virtual void Persist(Action del)
{
    // Current object with any changed values
    var salesOrder = Base.Document.Current;

    // Unchanged object as it was set from the last save/persist
    var unchangedSalesOrder = Base.Document.Cache.GetOriginal(salesOrder);

    if (!Base.Document.Cache.ObjectsEqual<SOOrder.orderQty, SOOrder.curyOrderTotal>(salesOrder, unchangedSalesOrder))
    {
        PXTrace.WriteInformation("My values changed");
    }

    del?.Invoke();
}

编辑:我认为GetOriginal有时无法公开访问。不知道哪个版本,但是如果找不到此调用,则可能是您使用的Acumatica版本较旧,无法使用此调用。

答案 1 :(得分:1)

下面是https://help-2018r2.acumatica.com

中对RowPersisted事件的描述
  

公共委托无效PXRowPersisted(PXCache sender,PXRowPersistedEventArgs e)

     

参数
  发件人必需)。引发事件的缓存对象
   e 必需)。 PXRowPersistedEventArgs类型的实例,其中包含> RowPersisted事件的数据

     

在为状态为“插入”,“更新”或“已删除”的每个数据记录提交对数据库的更改的过程中,将触发RowPersisted事件。 RowPersisted事件被触发两次:

     
      
  • 当数据记录已提交到数据库并且事务范围的状态(在e.TranStatus字段中指示)为“打开”时。
  •   
  • 当事务范围的状态更改为“已完成”(表示已成功提交)或“已中止”(表示已发生数据库错误且已删除对数据库的更改)时。
  •   

e参数具有唯一的Row属性,它是当前修改的记录。 您可以在e.Row上检查条件并执行代码。

不应使用PXRowPersisted事件来修改已完成交易中的值。如果需要在保存之前/之后修改值,最佳做法是覆盖Persist并使用PXTransactionScope并调用baseMethod,请参见以下示例:

[PXOverride]
public void Persist(Action baseMethod)
{
    using(PXTransactionScope sc = new PXTransactionScope())
    {
        //... do your code here
        baseMethod?.Invoke();
        //... or here 
        sc.Complete();
    }
} 

已更新

理想情况下,您应遵循以下规则:

  • 如果要在更新某些字段期间更新记录的其他字段的值,则应使用相应的PXFieldUpdated事件处理程序。
  • 如果要根据记录的字段值的某些条件来防止保存记录,则应该PXRowPersisting事件处理程序。
  • 如果要更新其他维护/条目的DAC /表,则应使用Persist方法。