如何将项目模板中PMTask自定义用户字段值同步至新项目?
解决方案:同步PMTask自定义字段从项目模板到新项目
要实现自定义PMTask字段从项目模板同步到新项目,你可以通过重写项目模板应用的核心方法扩展Acumatica的默认逻辑,以下是两种可行方案:
方案一:重写PMProjectEntry的ApplyTemplate方法
这是最直接的方式,在标准模板应用逻辑执行完成后,手动复制模板任务的自定义字段到新项目任务中。
public class PMProjectEntryExt : PXGraphExtension<PMProjectEntry> { public delegate void ApplyTemplateDelegate(PMProject templateProject); [PXOverride] public void ApplyTemplate(PMProject templateProject, ApplyTemplateDelegate baseMethod) { // 执行Acumatica默认的模板同步逻辑 baseMethod(templateProject); // 获取模板项目下的所有任务 var templateTasks = PXSelect<PMTask, Where<PMTask.projectID, Equal<Required<PMTask.projectID>>>> .Select(Base, templateProject.ProjectID); PMProject newProject = Base.Project.Current; if (newProject == null) return; // 遍历模板任务,匹配新项目任务并同步自定义字段 foreach (PMTask templateTask in templateTasks) { PMTask newTask = PXSelect<PMTask, Where<PMTask.projectID, Equal<Required<PMTask.projectID>>, And<PMTask.taskCD, Equal<Required<PMTask.taskCD>>>>> .Select(Base, newProject.ProjectID, templateTask.TaskCD); if (newTask != null) { // 替换为你的自定义字段名称,这里假设字段是UsrAssignedUser newTask.SetExt<PMTaskExt>(ext => { ext.UsrAssignedUser = templateTask.GetExtension<PMTaskExt>().UsrAssignedUser; }); Base.Tasks.Update(newTask); } } Base.Actions.PressSave(); } }
方案二:通过PMTask的RowInserting事件同步
在新项目任务插入时,从模板任务中读取自定义字段值并赋值,适合需要实时同步的场景:
public class PMTaskExt : PXCacheExtension<PMTask> { public void _(Events.RowInserting<PMTask> e) { PMTask newTask = e.Row as PMTask; if (newTask == null) return; // 获取当前项目,确认是否来自模板创建 PMProjectEntry projectGraph = PXGraph.CreateInstance<PMProjectEntry>(); PMProject currentProject = projectGraph.Project.Search<PMProject.projectID>(newTask.ProjectID); if (currentProject?.TemplateID == null) return; // 根据任务编号匹配模板中的对应任务 PMTask templateTask = PXSelect<PMTask, Where<PMTask.projectID, Equal<Required<PMTask.projectID>>, And<PMTask.taskCD, Equal<Required<PMTask.taskCD>>>>> .Select(projectGraph, currentProject.TemplateID, newTask.TaskCD); if (templateTask != null) { // 同步自定义字段 newTask.SetExt<PMTaskExt>(ext => { ext.UsrAssignedUser = templateTask.GetExtension<PMTaskExt>().UsrAssignedUser; }); } } }
关键注意事项
- 确保自定义字段已在
PMTask的DAC扩展(如PMTaskExt)中正确定义,且在项目模板和项目的任务界面均配置了可见性。 - 方案一更推荐,因为它在模板同步完成后批量处理任务,避免了
RowInserting事件中可能出现的上下文依赖问题。 - 测试时,先创建并保存带有自定义字段值的项目模板,再通过该模板创建新项目,验证任务的自定义字段是否同步成功。
内容的提问来源于stack exchange,提问作者pmfith
相关产品推荐
相关产品推荐

