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

Update a custom field in Acumatica in the Row Persisted Event

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

在 Acumatica (2020.4) 中,我们将在创建项目后调用外部 REST Web 服务。 API returns 我们要存储在自定义字段中的 ID。但是我们不能在行持久化上执行此操作,因为我们有查询 运行 需要 table.

中的数据

一旦 Row Persisted 事件被触发,我们如何更新字段并保存该值,或者是否有替代方法来调用 Row Persisting 事件中的数据?

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

   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 和 Contract 时,我必须相信您的样本的其余部分是正确的。本质上,按照定义,e.Row 中的数据是 PMProject。

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

有多种方法可以更新该值,如果此处提供的示例无法解决您的问题,Hugues Beauséjour 在他对 的回答中对此进行了很好的解释。