获取行持久化事件中的已修改字段



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

TIA-

更新

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

如果您想将当前行与值不变的行的任何更改进行比较(就像上次持久化时一样),您可以使用缓存实例并调用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的旧版本上,不能使用这个电话。

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

公共委托无效PXRowPersisted(PXCache发送方,PXRowPersitedEventArgs e)

参数
发件人(必需)。引发事件的缓存对象
e(必需)。保存>RowPersisted事件数据的PXRowPersistedEventArgs类型的实例

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

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

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

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

最新更新