在行持续事件中更新Acumatica中的自定义字段

问题描述

请耐心等待,因为我是Acumatica的新手。

在Acumatica(2020.4)中,创建项目后,我们将调用外部REST Web服务。 API返回我们要存储在自定义字段中的ID。但是,由于我们要运行的查询需要表中的数据,因此我们无法在“行持久”上执行此操作。

一旦触发行持久事件或在行持久事件中有替代数据的调用方法,我们如何更新该字段并保存该值?

到目前为止,这是我们所拥有的,但是它仅在字段中设置值。

   protected void PMProject_RowPersisted(PXCache cache,PXRowPersistedEventArgs e)
   {
      var row = (PMProject)e.Row;
      // API Class that we call
      APICall.APIResult Rateres = new APICall.APIResult(); 
      Contract ctr = e.Row as Contract;
      ContractExt ctrExt = ctr.GetExtension<ContractExt>();
      Rateres.RateCalc(row.RateTableID);
      cache.SetValue<ContractExt.usrAPIRateID>(ctr,Rateres.contentid);
   }

谢谢。

解决方法

将数据写入数据库后,将触发RowPersisted事件。在执行cache.SetValue时,您将返回到刚刚保存的缓存中并再次修改数据。您需要在修改的缓存上执行Persist,以将数据刷新到数据库。

您可以设置该值,并使用以下内容保留该值。

Caches[typeof(Contract)].SetValue<ContractExt.usrAPIRateID>(ctr,Rateres.contentid);
Caches[typeof(Contract)].Persist(ctr,PXDBOperation.Update);

我不使用PMProject和Contract,因此当您将e.Row既作为PMProject AND Contract转换时,我必须相信其余示例是正确的。根据定义,e.Row中的数据本质上是PMProject。

此外,您应该考虑将代码放入RowPersisted会导致每次将记录保存到此图中时都将其触发,即使保存的数据与您的自定义字段无关。

有多种更新值的方法,如果此处提供的示例不能解决您的问题,HuguesBeauséjour会在他对What is the proper way to update values of DAC's retrieved via PXResultset?的回答中很好地解释这一点。