c# - 在行持久事件中更新 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);
}
提前致谢。
解决方案
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 的值的正确方法是什么?如果此处提供的示例不能解决您的问题。
推荐阅读
- reactjs - 我应该更新特定组件的减速器状态还是在组件状态下管理?
- javascript - 基于现有对象/数组创建一个空对象/数组
- performance - 臃肿的 CacheStorage 会减慢 Service Worker 的响应速度吗?
- r - 将跨行列标题添加到 knitr kable 表
- git - 使用 Git 的“交叉分支”
- c# - 如何在 .Net Core API 中禁用静态文件功能?
- google-apps-script - 可以使用 GAS 创建交互式 Web 应用程序吗?
- visual-studio-code - VSCode 中的自动前缀 - TypeError:无法读取 null 的属性“警告”?
- windows - 将 docker 容器推送到 Azure 容器注册表时,它显示“没有基本身份验证凭据”错误并停止
- java - 在两个节点(圆)之间绘制一条边(线)