C# 在Acumatica中的行持久化事件中更新自定义字段
请容忍我,因为我对Acumatica很陌生 在Acumatica(2020.4)中,我们在创建项目后调用外部REST Web服务。API返回一个我们希望存储在自定义字段中的ID。但是,我们不能对持久化行执行此操作,因为我们有需要表中数据才能运行的查询 一旦触发行持久化事件,我们如何更新字段并保存该值,或者在行持久化事件中是否存在调用数据的替代方法 这是我们目前为止所拥有的,但它只在字段中设置值C# 在Acumatica中的行持久化事件中更新自定义字段,c#,acumatica,C#,Acumatica,请容忍我,因为我对Acumatica很陌生 在Acumatica(2020.4)中,我们在创建项目后调用外部REST Web服务。API返回一个我们希望存储在自定义字段中的ID。但是,我们不能对持久化行执行此操作,因为我们有需要表中数据才能运行的查询 一旦触发行持久化事件,我们如何更新字段并保存该值,或者在行持久化事件中是否存在调用数据的替代方法 这是我们目前为止所拥有的,但它只在字段中设置值 protected void PMProject_RowPersisted(PXCache ca
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);
}
受保护的void PMProject\u行持久化(PXCache缓存,pxrowspersistedeventargs e)
{
var行=(PMProject)e.row;
//我们调用的API类
APICall.APIROULT Rateres=新的APICall.APIROULT();
合同ctr=作为合同的e行;
ContractExt Ctext=ctr.GetExtension();
Rateres.RateCalc(行RateTableID);
SetValue(ctr、Rateres.contentid);
}
提前感谢。数据写入数据库后,将触发RowPersisted事件。在执行cache.SetValue时,您将返回刚刚保存的缓存并再次修改数据。您需要在修改的缓存上执行持久化,以将该数据刷新到数据库中 您可以设置该值并使用以下命令将其持久化
Caches[typeof(Contract)].SetValue<ContractExt.usrAPIRateID>(ctr, Rateres.contentid);
Caches[typeof(Contract)].Persist(ctr, PXDBOperation.Update);
缓存[typeof(Contract)].SetValue(ctr,Rateres.contentid);
缓存[typeof(Contract)].Persist(ctr,PXDBOperation.Update);
我不使用PMProject和Contract,因此我必须相信,当您将e.Row同时作为PMProject和Contract时,您的其余示例是正确的。根据定义,e行中的数据本质上是PMProject
此外,您应该考虑将代码放在ROWSTROPED中,即使每次保存的数据与您的自定义字段无关,也会导致它在每次保存该图时被激发。
有几种方法可以更新该值,Hugues Beauséjour在其关于此处提供的样本是否不能解决您的问题的回答中对此进行了很好的解释。Rateres的声明在哪里?抱歉。我已经更新了代码。Rateres是我们创建的类,它调用API并返回我们要保存的内容ID。非常感谢Brian。这是非常有帮助的,这将明确批准我们的方法。