2011-05-03 73 views
1

在Dynamics Axe 2009中,我们需要一个基于同一个表中的另一个字段进行计算的字段。尽管使用显示方法或某些东西可能会很好,但实际上我们必须存储这个值(管理层害怕动态计算,因为之前的产品使用它们并且速度很慢(就像AX中的任何东西都很快!)) 。可以根据其他字段计算字段吗?

提上锦上添花,他们希望它的工作双向的:

如果我们有FIELDA,计算和存储FieldB。 如果我们有FieldB,计算并存储FieldA。 如果我们有或没有,就什么都不做。

Dynamics AX中内置了什么可以帮助我吗?

回答

3

首先,覆盖表的方法insert(),如:

public void insert() 
{ 
    ; 

    this.FieldB = this.FieldA * 2; 

    super(); 
} 

然后覆盖update(),如:

public void update() 
{ 
    if (this.FieldA == this.orig().FieldA && this.FieldB != this.orig().FieldB) 
    { 
     this.FieldA = this.FieldB/2; 
    } 
    else 
    { 
     this.FieldB = this.FieldA * 2; 
    } 

    super(); 
} 

这些仅仅是例子,使用你自己的判断方法应该被忽略。最后,覆盖modifiedField(),当字段在形式手动修改将被仅用于:

public void modifiedField(fieldId _fieldId) 
{ 
    ; 

    super(_fieldId); 

    switch (_fieldId) 
    { 
     case fieldnum(MyTable, FieldA) : 
      this.FieldB = this.FieldA * 2; 
      break; 

     case fieldnum(MyTable, FieldB) : 
      this.FieldA = this.FieldB/2; 
      break; 
    } 

    if (this.isFormDataSource()) 
     this.dataSource().refresh(); 
} 

P.S.请注意,当您使用doinsert()doupdate()skipDataMethods()时,不会调用insert()update()

+0

是否真的有必要重写modifiedField?不要插入,更新方法覆盖用户通过表单编辑? 另外,感谢您的答案。 – 2011-05-03 11:07:55

+1

如果'modifiedField()'被覆盖并且用户更改了FieldA,则FieldB将立即更改。否则,只有在保存记录时才会更改。数据一致性并不重要,只是为了用户便利而添加。 – 10p 2011-05-03 11:34:51

+0

@ 10p:何时调用insert()和update()?你能再解释一下吗? – piku 2011-05-03 13:07:40

相关问题