首页 > 解决方案 > 在行持久事件中更新 Acumatica 中的自定义字段

问题描述

请耐心等待,因为我对 Acumatica 还很陌生。

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

一旦触发了 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);
   }

提前致谢。

标签: c#acumatica

解决方案


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 在他的回答中很好地解释了这一点:更新通过 PXResultset 检索到的 DAC 的值的正确方法是什么?如果此处提供的示例不能解决您的问题。


推荐阅读