Acumatica 第一次保存记录后,如何更新和保存记录?

Acumatica 第一次保存记录后,如何更新和保存记录?,acumatica,Acumatica,我有一个OpportunityID字段,它是一个编号序列,当它第一次保存时,我希望UsrEBDR字段用OpportunityID值更新 因此,在插入数据库时,我想将OpportunityID字段复制到UsrEBDR字段 OpportunityID字段是一个自动编号序列,因此在RowPersistingEvent中,框架尚未计算它 因此,我尝试重写RowPersisted事件,但在MoveNext上出现异常,它无法保存我的记录 你有什么想法吗 protected virtual void CROp

我有一个OpportunityID字段,它是一个编号序列,当它第一次保存时,我希望UsrEBDR字段用OpportunityID值更新

因此,在插入数据库时,我想将OpportunityID字段复制到UsrEBDR字段

OpportunityID字段是一个自动编号序列,因此在RowPersistingEvent中,框架尚未计算它

因此,我尝试重写RowPersisted事件,但在MoveNext上出现异常,它无法保存我的记录

你有什么想法吗

protected virtual void CROpportunity_RowPersisted(PXCache sender, PXRowPersistedEventArgs e, PXRowPersisted del)
        {
            if (del != null) del(sender, e);
            CROpportunity row = e.Row as CROpportunity;
            if(row == null) return;
            if(e.Operation == PXDBOperation.Insert && string.IsNullOrWhiteSpace(row.GetExtension<CROpportunityExt>().UsrEBDR) && e.TranStatus == PXTranStatus.Open)
            {
                Base.Opportunity.Current.GetExtension<CROpportunityExt>().UsrEBDR = row.OpportunityID;
                Base.Persist();
            }
        }
编辑: 到目前为止,我通过这样做实现了:

 protected virtual void CROpportunity_RowPersisted(PXCache sender, PXRowPersistedEventArgs e, PXRowPersisted del)
        {
            if (del != null) del(sender, e);
            CROpportunity row = e.Row as CROpportunity;
            if(row == null) return;
            if(e.Operation == PXDBOperation.Insert && string.IsNullOrWhiteSpace(row.GetExtension<CROpportunityExt>().UsrEBDR) && e.TranStatus == PXTranStatus.Completed)
            {
                row.GetExtension<CROpportunityExt>().UsrEBDR = row.OpportunityID;
                using(PXTransactionScope ts = new PXTransactionScope())
                {
                    var restrictOpportunityId = new PXDataFieldRestrict<CROpportunity.opportunityID>(row.OpportunityID);
                    var assignEBDR = new PXDataFieldAssign<CROpportunityExt.usrEBDR>(row.OpportunityID);
                    PXDatabase.Update<CROpportunity>(assignEBDR, restrictOpportunityId);
                    ts.Complete();
                }
            }
        }
然而,我觉得这是对框架的不当使用,如果有人知道如何使它干净,那么它就不是真正干净的。

将您的逻辑放在持久化中,让系统自己保存。从Persist调用Persist会导致许多问题,如果您只需在记录持久化之前修改它,这些问题很容易避免

void CROpportunity_RowPersisting(PXCache sender, PXRowPersistingEventArgs e, PXRowPersisting del)
{
   // Don't call save action or persist
   // Just modify data and let the system save
}

我的问题是,当我使用RowPersisting方法中的断点进行调试时,OpportunityID尚未设置,因此我无法将UsrEBDR默认为OpportunityID的值。数据库生成的字段在持久化后会得到它们的值。您试图实现的似乎是在自定义字段中复制ID字段。这可能可以通过公式来实现。您可以重写Persist方法,但我仍然建议您不惜一切代价避免Persist-in-Persist反模式。正确的模式是使用属性设置字段值或创建自定义DAC,并让PXParent引用子项的ID。也许最简单的方法是确定自动编号生成的下一个数字是什么排序并将其放入rowpersisting事件中?我对此有点失望,因为在6.10版本中,在行中使用persistend可以很好地工作,而在2018R1版本中,它打破了我的定制。两者都是反模式,为了可靠,密钥必须由系统自动管理。手动设置关键点也会导致问题。我认为您需要设计您的解决方案以遵守这些约束。想到的另一个选项是通过使用PXDatabase对象保存来绕过框架,这也不推荐使用。