Dynamics 365 Finance:ClearAll按钮点击后数据源方法未遍历所有记录
问题分析与解决方案
原代码的核心问题是:循环遍历BankAccountTrans记录时,未将表单数据源的游标切换到当前循环的记录,导致后续的write()操作始终只作用于数据源的第一条记录,无法触发每条记录对应的数据源方法。
修改后的代码
[ExtensionOf(formControlStr(BankReconciliation, ClearALL))] final class ClearAll_Extension { void clicked() { next clicked(); FormRun formrunn = this.formRun(); FormDataSource bankAccountTrans_ds = formrunn.dataSource(formDataSourceStr(BankReconciliation, BankAccountTrans)); BankAccountTrans bankacc; // 遍历数据源所有记录 bankacc = bankAccountTrans_ds.getFirst(); while (bankacc) { // 将数据源游标定位到当前循环的记录 bankAccountTrans_ds.record(bankacc); // 修改Included字段(切换选中状态) bankacc.Included = (bankacc.Included == NoYes::No) ? NoYes::Yes : NoYes::No; // 触发数据源的write逻辑(包含数据源级别的方法) bankAccountTrans_ds.write(); bankacc = bankAccountTrans_ds.getNext(); } // 刷新数据源,确保界面与后台数据同步 bankAccountTrans_ds.executeQuery(); } }
关键改动说明
- 定位数据源游标:通过
bankAccountTrans_ds.record(bankacc);将数据源的当前记录切换到循环中的bankacc,确保后续的write()操作作用于当前遍历的记录。 - 直接修改表缓冲区:放弃
FormDataObject.setValue()的方式,直接修改表缓冲区字段,再通过数据源的write()方法触发数据源级别的业务逻辑(比如数据源的write、validateWrite方法)。 - 刷新数据源:最后调用
executeQuery()确保界面显示与后台数据状态一致。
简化优化(如果需求是统一选中所有记录)
若仅需要将所有记录设为选中状态(而非切换原有状态),可简化字段修改逻辑:
// 统一设置所有记录的Included为Yes bankacc.Included = NoYes::Yes;
内容的提问来源于stack exchange,提问作者Menna Ahmed
相关产品推荐
相关产品推荐

