在RowPersisted事件中。有没有办法知道哪些字段已更新?我的RowPersisted事件中有一个自定义项。但是我只想在某些字段实际被修改的情况下执行它。目前,事件在每次保存时都会做出反应,因此会不必要地触发。
TIA
更新
只需添加。我的自定义与字段值无关,也没有覆盖保存本身。我只是使用RowPersisted事件来启动我的自定义。
答案 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
事件处理程序。 Persist
方法。