在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
方法中完成