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

Acumatica 获取RowPersisted事件中的修改字段,acumatica,Acumatica,在这一事件中。有没有办法知道哪些字段已更新?我的RowPersisted事件中有一个自定义项。但我只想在某些字段被实际修改时执行它。目前,事件正在不必要地触发,因为它每次保存事件时都会做出反应 短暂性脑缺血发作 更新 只是补充一下。我的自定义与字段值无关,也与重写保存本身无关。我只是使用RowPersisted事件来启动我的定制。下面是来自的RowPersisted事件的描述 公共委托无效pxrowpersistend(PXCache发送方,pxrowpersistenedeventargs e

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

短暂性脑缺血发作

更新


只是补充一下。我的自定义与字段值无关,也与重写保存本身无关。我只是使用RowPersisted事件来启动我的定制。

下面是来自的RowPersisted事件的描述

公共委托无效pxrowpersistend(PXCache发送方,pxrowpersistenedeventargs e)

参数
发送方必需)。引发事件的缓存对象
e必需)。PXRowPersistedEventArgs类型的实例,用于保存>RowPersisted事件的数据

RowPersisted事件是在将状态为Insert、Update或Delete的每个数据记录的更改提交到数据库的过程中触发的。RowPersisted事件被触发两次:

  • 当数据记录已提交到数据库且事务作用域的状态(在e.TranStatus字段中指示)打开时
  • 事务作用域的状态更改为“已完成”,表示已成功提交,或已中止,表示已发生数据库错误并已删除对数据库的更改
e
参数只有
属性是当前修改的记录。 您可以在
e.Row
上检查您的条件并执行代码

不应使用
PXRowPersisted
事件修改已完成事务的值。如果需要在保存之前/之后修改值,最佳做法是覆盖
持久化
,并使用
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
    方法

    • 下面是对来自的RowPersisted事件的描述

      公共委托无效pxrowpersistend(PXCache发送方,pxrowpersistenedeventargs e)

      参数
      发送方必需)。引发事件的缓存对象
      e必需)。PXRowPersistedEventArgs类型的实例,用于保存>RowPersisted事件的数据

      RowPersisted事件是在将状态为Insert、Update或Delete的每个数据记录的更改提交到数据库的过程中触发的。RowPersisted事件被触发两次:

      • 当数据记录已提交到数据库且事务作用域的状态(在e.TranStatus字段中指示)打开时
      • 事务作用域的状态更改为“已完成”,表示已成功提交,或已中止,表示已发生数据库错误并已删除对数据库的更改
      e
      参数只有
      属性是当前修改的记录。 您可以在
      e.Row
      上检查您的条件并执行代码

      不应使用
      PXRowPersisted
      事件修改已完成事务的值。如果需要在保存之前/之后修改值,最佳做法是覆盖
      持久化
      ,并使用
      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
        方法

      如果要将当前行与对具有未更改值的行所做的任何更改进行比较(与上次persist中的更改相同),可以使用缓存实例并调用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();
      }
      
      [PXOverride]
      公共虚拟无效持久化(操作del)
      {
      //具有任何更改值的当前对象
      var salesOrder=Base.Document.Current;
      //未更改的对象,因为它是上次保存/持久化时设置的
      var unchangedSalesOrder=Base.Document.Cache.GetOriginal(salesOrder);
      if(!Base.Document.Cache.ObjectsEqual(salesOrder,unchangedSalesOrder))
      {
      PXTrace.WriteInformation(“我的值已更改”);
      }
      del?.Invoke();
      }
      

      编辑:我认为在某个时候,GetOriginal无法公开访问。不确定是哪个版本,但如果找不到此调用,则可能是因为您使用的是旧版本的Acumatica,无法使用此调用。

      如果要将当前行与具有未更改值的行的任何更改进行比较(与上次持久化时一样),可以使用缓存实例并调用G