AX 2012 R3中Grid行实值字段动态求和及方法放置疑问
AX 2012 R3 动态计算与表方法位置问题解析
一、表头计算值静态、行表动态的原因
AX 2012的Grid导航机制中,切换行时行表对应的数据源会触发Active事件,行表中的计算方法会重新执行,因此值会动态更新;而表头表的数据源仅在页面初始化或表头记录切换时刷新,不会随每行导航重新触发计算,若表头表的计算方法仅在初始化时执行,就会呈现静态值。
若要让表头计算值随Grid行导航动态更新,可在行表数据源的Active方法中主动刷新表头数据源的计算字段,或确保表头表的计算方法始终执行实时查询(而非依赖缓存值)。
你提供的计算方法如下:
Public real getTotalConsumptionCost(ProdId _prodId) { ProdJournalBOM prodJournlBOM; real totalCost = 0; select sum(ConsCost) from prodJournlBOM where prodJournlBOM.ProdId == _prodId; totalCost = prodJournlBOM.ConsCost; return totalCost; }
该方法本身是实时查询逻辑,若放在表头表中出现静态值,大概率是因为表头字段未在行导航时重新调用此方法,可通过在行数据源Active事件中触发表头字段刷新解决。
二、从表头取数更新/插入行表的方法位置
建议将方法放在表头表中,原因如下:
- 匹配业务逻辑层级:表头是行数据的父级载体,批量生成、更新行的操作通常由表头触发,放在表头表更符合“父级控制子级”的业务逻辑
- 代码复用性高:表头表的方法可一次性处理所有关联行记录,无需在行表中重复编写获取表头数据的逻辑
- 维护便捷:相关操作逻辑集中在父表,避免分散在行表中导致逻辑混乱,后续修改时更易定位
实现示例思路
在表头表(如ProdTable)中编写方法:
public void updateOrInsertLines() { ProdJournalBOM prodJournalBOM; // 获取当前表头数据 ProdId currentProdId = this.ProdId; // 更新已有行记录 while select forupdate prodJournalBOM where prodJournalBOM.ProdId == currentProdId { prodJournalBOM.SomeField = this.HeaderField; // 从表头取数赋值 prodJournalBOM.update(); } // 插入新行记录 prodJournalBOM.clear(); prodJournalBOM.ProdId = currentProdId; prodJournalBOM.SomeField = this.HeaderField; prodJournalBOM.insert(); }
如果是行表新增时需要自动带入表头数据,可在行表的initValue方法中调用表头表的逻辑:
public void initValue() { super(); if (ProdTable::exist(this.ProdId)) { ProdTable prodTable = ProdTable::find(this.ProdId); this.SomeField = prodTable.HeaderField; } }
内容的提问来源于stack exchange,提问作者Fawad Ahmad
相关产品推荐
相关产品推荐

