Как обновить и сохранить запись сразу после того, как запись была сохранена в первый раз? - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть поле OpportunityID, которое представляет собой последовательность нумерации, и когда оно будет сохранено в первый раз, я хочу, чтобы поле UsrEBDR обновлялось значением optionID.

Итак, при ВСТАВКЕ в базу данных,Я хочу скопировать поле 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();
                }
            }
        }

И все же я чувствую, что это неправильное использование фреймворка, и оно не совсем "чистое", еслиу кого-то есть идеи, как сделать его чистым.

1 Ответ

0 голосов
/ 29 ноября 2018

Поместите вашу логику в RowPersisting и позвольте системе сохранить себя.Вызов Persist from 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
}
...