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

X++开发:更新字段后刷新过往工人表单显示方法的问题

问题场景

过往工人表单的网格包含两个显示方法字段:系统默认的离职原因、自定义的雇佣状态。操作流程中,在雇佣历史表单修改这两个字段值后,回到过往工人界面时,网格内的显示值无法自动更新——仅刷新表单无效,必须刷新整个浏览器才会生效。已尝试在显示方法中调用Hcmworker_ds.observe()、Hcmemployment_Ds.observe(),以及formcaller.research(true),均未解决问题。

解决方案

针对Dynamics 365 F&O的显示方法缓存机制,可通过以下几种方式解决跨表单数据更新后的显示刷新问题:

1. 在雇佣历史表单的保存事件中主动通知父表单刷新并清除缓存

在雇佣历史表单(如HcmEmploymentHistory)的saveRecord方法中添加代码,数据保存后直接触发父表单的数据源刷新并清除显示方法缓存:

public void saveRecord()
{
    super();

    FormDataSource workerDS;
    Args args = this.args();
    if (args && args.caller())
    {
        workerDS = args.caller().dataSource(HcmWorker_ds.name());
        if (workerDS)
        {
            // 强制重新查询父数据源
            workerDS.research(true);
            // 清除显示方法缓存,确保重新计算值
            workerDS.clearDisplayMethodCache();
        }
    }
}

核心是clearDisplayMethodCache()方法,它会直接清空数据源关联的所有显示方法缓存,比单纯的research()更能确保显示值重新计算。

2. 给自定义显示方法添加ClientCache(false)属性

如果是自定义的显示方法,在方法定义上添加该属性,强制客户端每次渲染都重新计算值,不使用缓存:

[ClientCache(false)]
display HcmEmploymentStatus myEmploymentStatus(HcmWorker _worker)
{
    HcmEmployment employment = HcmEmployment::findByWorker(_worker.RecId, true);
    return employment ? employment.EmploymentStatus : '';
}

注意:该方式会增加客户端计算负载,适合数据量较小的场景。

3. 在过往工人表单的active事件中补充刷新逻辑

在过往工人表单的active方法中添加刷新代码,确保每次切换回该表单时自动更新数据:

public void active()
{
    super();
    HcmWorker_ds.research(true);
    HcmWorker_ds.clearDisplayMethodCache();
}

内容的提问来源于stack exchange,提问作者Menna Ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:07:05