Acumatica选项目模板后自动勾选PMTask的IsDefault字段求助
问题分析与修正方案
现有代码的问题
第一段代码
CacheAttached 里加 PXDefault(true) 只对手动新建的PMTask记录有用,从模板加载任务时,系统是直接复制模板里任务的字段值,不会触发默认值逻辑,所以没法自动勾选IsDefault。
第二段代码
FieldDefaulting 事件只会在字段首次初始化且没有原始值的时候触发。模板加载的任务会带着模板里IsDefault的原始值(一般是false),所以这个事件根本不会触发,代码跑不起来。
第三段代码
- 只改了
Base.Tasks.Current这一条记录,但模板加载的任务可能有多条,覆盖不到所有任务; - 直接给
pmtask.IsDefault赋值后没调用Cache.Update()通知Acumatica缓存更新,界面上也不会同步刷新这个复选框的状态。
修正方案
在PMProject的TemplateID字段更新后,遍历当前项目下所有PMTask记录,统一把IsDefault设为true并更新缓存:
protected virtual void PMProject_TemplateID_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e) { PMProject project = e.Row as PMProject; if (project == null) return; // 遍历当前项目下的所有任务 foreach (PMTask task in Base.Tasks.Select()) { if (task.ProjectID == project.ProjectID) { // 设置IsDefault为true cache.SetValueExt<PMTask.isDefault>(task, true); // 更新缓存,触发界面刷新 Base.Tasks.Cache.Update(task); } } }
补充情况
如果模板加载任务是异步或者延迟加载的,上面的代码可能抓不到所有新加载的任务。这时候可以改用PMTask的RowInserted事件,保证每条从模板插入的任务都自动勾选IsDefault:
protected virtual void PMTask_RowInserted(PXCache cache, PXRowInsertedEventArgs e) { PMTask task = e.Row as PMTask; if (task == null) return; // 仅在任务从模板加载时触发(可根据实际场景调整判断条件) PMProject project = Base.Project.Current; if (project != null && project.TemplateID != null) { cache.SetValueExt<PMTask.isDefault>(task, true); } }
内容的提问来源于stack exchange,提问作者Tibu
相关产品推荐
相关产品推荐

