首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决“无法从事件处理程序将更改保存到数据库”?

如何解决“无法从事件处理程序将更改保存到数据库”?
EN

Stack Overflow用户
提问于 2019-10-17 02:45:42
回答 1查看 236关注 0票数 0

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

代码语言:javascript
复制
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);
}

我尝试过让普通的Persist来保存值,但除非我调用Persist (上面示例的最后一行),否则它不会这样做。结果是通过Acuminator生成了一个错误,即“无法从事件处理程序将更改保存到数据库”。当我看到这一点时,我想知道它是否应该在Long Operation而不是Transaction作用域中,但是来自Acuminator的错误告诉我这样做是错误的。怎样才能使我的更新返回到每个PO行的"MyDAC“?

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

我的代码可以按预期编译和运行,但Acuminator的错误告诉我,必须有更合适的方法来实现这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-17 04:04:23

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

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

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

您现在拥有的方式提交您的更改,有可能正在被删除的行永远不会被删除。

而且,通过此更改,不需要使用PXTransactionScope。

示例可能如下所示……

代码语言:javascript
复制
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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58419847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档