Acumatica 如何解决;无法将更改从事件处理程序保存到数据库";?

Acumatica 如何解决;无法将更改从事件处理程序保存到数据库";?,acumatica,Acumatica,在POOrderEntry中,当创建或删除POLine时,我需要将引用推回到发起PO行的自定义DAC。例如,如果采购订单行被删除,我的自定义DAC将通过以下方式删除Events.RowDeleted中的引用: using (PXTransactionScope ts = new PXTransactionScope()) { Base.Caches[typeof(MyDAC)].SetValueExt<MyDAC.pOType>(row, null); Base.Ca

在POOrderEntry中,当创建或删除POLine时,我需要将引用推回到发起PO行的自定义DAC。例如,如果采购订单行被删除,我的自定义DAC将通过以下方式删除Events.RowDeleted中的引用:

using (PXTransactionScope ts = new PXTransactionScope())
{
    Base.Caches[typeof(MyDAC)].SetValueExt<MyDAC.pOType>(row, null);
    Base.Caches[typeof(MyDAC)].SetValueExt<MyDAC.pONbr>(row, null);
    Base.Caches[typeof(MyDAC)].SetValueExt<MyDAC.pOLineNbr>(row, null);
    Base.Caches[typeof(MyDAC)].Update(row);
    Base.Caches[typeof(MyDAC)].Persist(PXDBOperation.Update);
    ts.Complete(Base);
}
使用(PXTransactionScope ts=new PXTransactionScope())
{
Base.Caches[typeof(MyDAC)].SetValueExt(行,空);
Base.Caches[typeof(MyDAC)].SetValueExt(行,空);
Base.Caches[typeof(MyDAC)].SetValueExt(行,空);
基本缓存[类型(MyDAC)]。更新(行);
Base.Caches[typeof(MyDAC)].Persist(PXDBOperation.Update);
ts.Complete(基本);
}
我曾尝试允许普通Persist保存值,但除非调用Persist(上面示例的最后一行),否则它不会保存值。结果是通过Acuminator出现错误“无法从事件处理程序将更改保存到数据库”。当我看到这一点时,我想知道它是否应该在一个长操作中,而不是在一个事务范围中,但是Acuminator的错误告诉我我做得不对。对于每个采购订单行,我更新回“MyDAC”的正确方法是什么

我还尝试为MyDAC的graph初始化一个graph实例,但是我收到了一条关于在事件处理程序中创建PXGraph的警告,因此我不能“合法”调用维护MyDAC的graph


我的代码可以根据需要编译和运行,但是Acuminator的错误告诉我必须有一种更合适的方法来实现这一点。

您可以向图形扩展添加视图

然后在删除的行中,您将使用view.Update(行)更新自定义dac

在基本图持久化期间,只要在其他事件中没有发现其他错误,您的记录就会提交

您现在使用的提交更改的方式可能永远不会删除被删除的行

此外,通过此更改,不需要使用PXTransactionScope

一个例子可能看起来像这样

public class POOrderEntryExtension : PXGraphExtension<POOrderEntry>
{
    public PXSelect<MyDac> MyView;

    protected virtual void _(Events.RowDeleted<POLine> e)
    {
        //get your row to update from e.Row
        var myRow = PXSelect...

        myRow.pOType = null;
        myRow.pONbr = null;
        myRow.pOLineNbr = null;

        MyView.Update(myRow);
    }
}
public类POOrderEntryExtension:PXGraphExtension
{
公众选择MyView;
受保护的虚拟空间(Events.rowe)
{
//从e.row获取要更新的行
var myRow=PXSelect。。。
myRow.pOType=null;
myRow.pONbr=null;
myRow.pOLineNbr=null;
MyView.Update(myRow);
}
}

您应该将视图添加到dac并在缓存中更新。避免对单个DAC或行执行持久化操作。您的问题是,如果基础持久化失败。。。您保留了一个dac,但删除的原始行没有被删除。我想说的是,为dac的图形扩展添加一个视图。然后您只需在rowdeleted事件中使用MyView.Update(行)。在此之后,如果所有其他事件都没有错误,则持久化将持久化。现在您将使用视图,也请删除transactionscope