在POOrderEntry中,当创建或删除POLine时,我需要将一个引用推回到发起PO行的自定义DAC。例如,如果删除PO行,则我的自定义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);
}我尝试过让普通的Persist来保存值,但除非我调用Persist (上面示例的最后一行),否则它不会这样做。结果是通过Acuminator生成了一个错误,即“无法从事件处理程序将更改保存到数据库”。当我看到这一点时,我想知道它是否应该在Long Operation而不是Transaction作用域中,但是来自Acuminator的错误告诉我这样做是错误的。怎样才能使我的更新返回到每个PO行的"MyDAC“?
我还尝试过为MyDAC的图初始化一个图实例,但是我收到了一个关于在事件处理程序中创建PXGraph的警告,因此我不能“合法”地调用维护MyDAC的图。
我的代码可以按预期编译和运行,但Acuminator的错误告诉我,必须有更合适的方法来实现这一点。
发布于 2019-10-17 04:04:23
您可以向图形扩展添加视图。
然后,在删除的行中,您将使用您的view.Update( row )来更新您的自定义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);
}
}https://stackoverflow.com/questions/58419847
复制相似问题