Acumatica 获取RowPersisted事件中的修改字段
在这一事件中。有没有办法知道哪些字段已更新?我的RowPersisted事件中有一个自定义项。但我只想在某些字段被实际修改时执行它。目前,事件正在不必要地触发,因为它每次保存事件时都会做出反应 短暂性脑缺血发作 更新Acumatica 获取RowPersisted事件中的修改字段,acumatica,Acumatica,在这一事件中。有没有办法知道哪些字段已更新?我的RowPersisted事件中有一个自定义项。但我只想在某些字段被实际修改时执行它。目前,事件正在不必要地触发,因为它每次保存事件时都会做出反应 短暂性脑缺血发作 更新 只是补充一下。我的自定义与字段值无关,也与重写保存本身无关。我只是使用RowPersisted事件来启动我的定制。下面是来自的RowPersisted事件的描述 公共委托无效pxrowpersistend(PXCache发送方,pxrowpersistenedeventargs e
只是补充一下。我的自定义与字段值无关,也与重写保存本身无关。我只是使用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
- 当数据记录已提交到数据库且事务作用域的状态(在e.TranStatus字段中指示)打开时李>
- 事务作用域的状态更改为“已完成”,表示已成功提交,或已中止,表示已发生数据库错误并已删除对数据库的更改
- 下面是对来自的RowPersisted事件的描述
公共委托无效pxrowpersistend(PXCache发送方,pxrowpersistenedeventargs e)
参数
发送方(必需)。引发事件的缓存对象
e(必需)。PXRowPersistedEventArgs类型的实例,用于保存>RowPersisted事件的数据 RowPersisted事件是在将状态为Insert、Update或Delete的每个数据记录的更改提交到数据库的过程中触发的。RowPersisted事件被触发两次:
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
[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