You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:50:23