如何确定更新 DAC 字段的正确方法?

Slo*_*aje 3 c# acumatica

在更新记录的值时,我在确定何时使用 e.Row 属性或 cache.SetValue/SetValueExt 时遇到了一些麻烦。在 T200 课程中,pdf 中有一部分内容是这样说的,

要更新数据访问类中在当前字段之后定义的字段,请使用 e.Row 数据记录的属性,如下所示。

ShipmentLine line = e.Row as ShipmentLine;
...
line.Description
Run Code Online (Sandbox Code Playgroud)

要更新数据访问类中在当前字段之前定义的字段,请使用 SetValueExt<>() 方法:

sender.SetValueExt<ShipmentLine.ProductID>(e.Row, GiftCardID);
Run Code Online (Sandbox Code Playgroud)

在这些情况下,当他们说“之前”和“之后”时,他们指的是什么?如果我的 DAC 字段声明按以下顺序排列:

Field1 {get;set;}
Field2 {get;set;}
Field3 {get;set;}
Run Code Online (Sandbox Code Playgroud)

他们的字面意思是,如果我在“Field2.FieldUpdated()”中,我必须像这样更新 Field1 和 Field3?

sender.SetValueExt<ShipmentLine.Field1>(e.Row, "X");
line.Field3 = "X";
Run Code Online (Sandbox Code Playgroud)

另外,对于何时使用哪种方法有一些硬性规定吗?即如果在 RowUpdated 事件中,使用“X”,如果在 FieldUpdated 事件中,使用“Y”。

HB_*_*ICA 5

您将主要遇到三种类型的分配:

 1. record.Field = "value"
 2. cache.SetValue<T>
 3. cache.SetValueExt<T>
Run Code Online (Sandbox Code Playgroud)

方法一和方法二本质上是一样的。他们在不引发事件的情况下分配值。实际区别在于,使用方法 2 可以避免强制转换。

// 1. With cast
ShipmentLine line = e.Row as ShipmentLine;

if (line != null)
{
    line.Description = "value";
}

// 2. Without cast
sender.SetValue<ShipmentLine.description>(e.Row, "value");
Run Code Online (Sandbox Code Playgroud)

当您希望赋值引发 FieldUpdated 事件时,应使用 SetValueExt。当用户更改其值时,UI 上的许多字段都会引发事件。如果用户更改了销售订单的数量字段,它将引发 FieldUpdated 事件,从而重新计算总价。

如果您要通过代码以编程方式更改数量,则应使用 SetValueExt,因为它将确保使用事件系统重新计算总成本。当您尝试复制用户将在屏幕上执行的操作时,它特别有用,因为默认情况下 UI 控制所有引发事件。