Acumatica 更新自定义字段将进入无限循环

Acumatica 更新自定义字段将进入无限循环,acumatica,Acumatica,我在AR发票和备忘录(屏幕ID AR301000)中有一个自定义字段,用于对应的AP参考编号Nbr。在类似的管理器中,应收账款账单和调整(屏幕ID AP301000)中的另一个自定义字段用于对应的应收账款参考编号Nbr 我正在尝试更新AP参考编号Nbr。当用户更新AR参考编号时,在AR屏幕上。在AP屏幕中 比如说- 我在AR屏幕上显示发票0001,我正在更新AP参考编号Nbr。到abc01。系统将自动用相应的应收账款参考编号更新应收账款账单abc01。与0001 我写了下面的代码来实现这一点,但

我在AR发票和备忘录(屏幕ID AR301000)中有一个自定义字段,用于对应的AP参考编号Nbr。在类似的管理器中,应收账款账单和调整(屏幕ID AP301000)中的另一个自定义字段用于对应的应收账款参考编号Nbr

我正在尝试更新AP参考编号Nbr。当用户更新AR参考编号时,在AR屏幕上。在AP屏幕中

比如说-

我在AR屏幕上显示发票0001,我正在更新AP参考编号Nbr。到abc01。系统将自动用相应的应收账款参考编号更新应收账款账单abc01。与0001

我写了下面的代码来实现这一点,但它运行到无限循环中,因为它都试图更新其他屏幕中的相应字段。如果我遗漏了什么,请告诉我,或者有更好的方法

关于AR图扩展

公共类ARInvoiceEntryExtension:pxGrapherExtension
{
受保护的虚拟磁盘已更新(PXCache发送方,PXRowUpdatedEventArgs e)
{
var row=(ARInvoice)e.row;
if(行!=null&&sender.IsDirty)
{
ARRegisterExtension ext=PXCache.GetExtension(行);
if(ext!=null&!string.IsNullOrEmpty(ext.UsrAPRefNbr))
{
APInvoiceEntry graph=PXGraph.CreateInstance();
APInvoice apRow=PXSelect.Select(图形,ext.UsrAPRefNbr);
if(apRow!=null)
{
APRegisterExtension ext1=PXCache.GetExtension(apRow);
if(ext1!=null&&string.IsNullOrEmpty(ext1.UsrARRefNbr))//仅当它为空时更新
{
ext1.UsrARRefNbr=row.RefNbr;
graph.Document.Current=apRow;
图.Caches[typeof(APRegister)].SetValue(apRow,row.RefNbr);
图.缓存[类型(APRegister)].Update(apRow);
graph.Actions.PressSave();
}
}
}
}
}

}
保存时,APInvoice\u RowUpdated修改ARInvoice,ARInvoice反过来修改触发APInvoice\u RowUpdated的APInvoice,从而产生无限循环的事件调用。更新APInvoice的ARInvoice_RowUpdated中的逆运算将导致类似的无限循环

为了避免这种情况,可以在实例化图形后在运行时删除图形事件处理程序。首先,将事件处理程序访问修饰符设置为公共,以便可以引用它们:

public virtual void APInvoice_RowUpdated(PXCache sender, PXRowUpdatedEventArgs e) 
创建图形后,获取扩展并删除导致无限循环的处理程序:

APInvoiceEntry graph = PXGraph.CreateInstance<APInvoiceEntry>();
APInvoiceEntryExtension graphExt = graph.GetExtension<APInvoiceEntryExtension>();
graphExt.RowUpdated.RemoveHandler<APInvoice>(graphExt.APInvoice_RowUpdated);
APInvoiceEntry graph=PXGraph.CreateInstance();
APInvoiceEntryExtension graphExt=graph.GetExtension();
graphExt.RowUpdated.RemoveHandler(graphExt.APInvoice_RowUpdated);

必须对ARInvoice进行相同的修改,因为无限循环是双向的,从AP到AR,从AR到AP。

您是否尝试调用Persist()而不是调用pressave()?我调试了,它甚至没有到达那一行。它的just from Update(上面的一行)正在调用另一个方法并以循环结束。我认为HB_ACUMATICA在下面的回复中提供了解决此问题的方法。删除RowUpdated处理程序已起作用并打破了循环。谢谢你,针灸师