如何在Microsoft Project的VSTO插件中为任务添加员工多时段工时
解决Microsoft Project VSTO插件添加多时段工时的问题
你的代码问题在于:循环中反复修改同一个Assignment对象的Start、Finish和Work属性,每次修改都会覆盖之前的设置,最终只有最后一条日期的工时生效。要给任务-资源分配添加多日期分段的工时,需要使用TimeScaleData方法来逐段设置单日工时,而非修改分配的整体属性。
修正后的代码示例
Project project = Globals.ThisAddIn.Application.ActiveProject; project.DefaultTaskType = PjTaskFixedType.pjFixedWork; // 创建任务和资源 Task testTask = project.Tasks.Add("Test Task"); Resource resource = project.Resources.Add("Sridhar Netha"); // 仅添加一次资源分配(同一个资源对应同一个任务只需要一个Assignment) Assignment newAssignment = testTask.Assignments.Add(ResourceID: resource.ID); var entryDates = new List<EntryDate>() { new EntryDate{ DateEntered=DateTime.Parse("2023-09-05"), Hours=(decimal)2 }, new EntryDate{ DateEntered=DateTime.Parse("2023-09-12"), Hours=(decimal)5 }, new EntryDate{ DateEntered=DateTime.Parse("2023-09-19"), Hours=(decimal)4 } }; foreach (EntryDate entryDate in entryDates) { // 获取对应日期的时间刻度数据对象 TimeScaleValues timeScaleValues = newAssignment.TimeScaleData( StartDate: entryDate.DateEntered, EndDate: entryDate.DateEntered, TimeScaleUnit: PjTimescaleUnit.pjTimescaleDays, Type: PjAssignmentTimescaleData.pjAssignmentTimescaleWork ); // 设置当日工时:将小时转换为分钟(Project内部以分钟为单位存储工时) if (timeScaleValues.Count > 0) { timeScaleValues[1].Value = (double)entryDate.Hours * 60; } }
关键说明
TimeScaleData方法用于获取分配在指定时间范围内的时间刻度数据,这里按天获取单日内的工时记录- Project内部工时以分钟为单位存储,所以需要将小时数乘以60转换为分钟后赋值
- 同一个任务-资源分配只需要创建一次
Assignment对象,通过TimeScaleData可以给这个分配添加多个日期的分段工时
内容的提问来源于stack exchange,提问作者sridharnetha
相关产品推荐
相关产品推荐

