【问题标题】:Update a custom field in Acumatica in the Row Persisted Event在行持久事件中更新 Acumatica 中的自定义字段
【发布时间】:2020-09-01 10:12:15
【问题描述】:

请多多包涵,因为我对 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);
   }

提前致谢。

【问题讨论】:

  • Rateres 的声明在哪里?
  • 抱歉。我已经更新了代码。 Rateres 是我们创建的类,它调用 API 并返回我们要保存的内容 ID。

标签: c# acumatica


【解决方案1】:

当数据写入数据库时​​触发 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 在What is the proper way to update values of DAC's retrieved via PXResultset? 的回答中很好地解释了这一点。

【讨论】:

  • 非常感谢布赖恩。这非常有帮助,这肯定会批准我们前进的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多