【问题标题】:MPXJ: get planned work via APIMPXJ:通过 API 获得计划的工作
【发布时间】:2011-10-18 06:17:27
【问题描述】:

我想使用 MPXJ 从 MS Project 中提取一段时间内的计划工作。 有谁知道如何通过 API 获取这些数字? 我找不到任何合适的方法来做到这一点。

(具体场景:我想画一张图表,y轴为计划工作,x轴为日期)

【问题讨论】:

    标签: ms-project mpxj


    【解决方案1】:

    Jon 上面给出的答案在当时是正确的,但是从 MPXJ 的 4.2 版开始,处理时间分段工作(和成本)的 api 已经发生了很大变化。这是你现在要做的:

    这部分是一样的:

    TimescaleUtility timescale = new TimescaleUtility();
    ArrayList<DateRange> dateList = timescale.createTimescale(startDate, TimescaleUnits.DAYS, length);
    

    这已经改变(注意不同的返回类型和获取计划工作的方法,以及 TimephasedUtility 类的新方法):

    List<TimephasedWork> plannedWork = assignment.getTimephasedWork();
    
    ProjectCalendar calendar = assignment.getCalendar();
    TimephasedUtility util = new TimephasedUtility();
    ArrayList<Duration> durationList = util.segmentWork(calendar, plannedWork, TimescaleUnits.DAYS, dateList);
    

    您还必须知道的一件事是,计划的工作数据只包含尚未完成的工作的值(即,没有记录当时的实际值)。例如,如果您的任务持续 4 天,并且您已经完成了 50% 的工作,那么您将获得前两天的时间分段 ACTUAL 工作值,以及仅最后两天的时间分段计划工作值。它们不重叠或重复。

    因此,如果您尝试显示分配的整个时间段的计划工时值(就像您在 MS Project 中的“任务使用情况”视图中看到的那样),您还需要检索时间分段的实际工时值并像使用它们一样使用它们。

    【讨论】:

      【解决方案2】:

      您的出发点是分配对象上的以下方法:

      List<TimephasedResourceAssignment> complete = assignment.getTimephasedComplete();
      List<TimephasedResourceAssignment> planned= assignment.getTimephasedComplete();
      

      正如他们的名字所暗示的那样,这些将为您提供计划的工作或完整的工作,表示为在一段时间内执行的工作。

      这里的“陷阱”是这些数据以紧凑的格式表示(反映了 MS Project 内部如何存储它),这不利于显示工作的逐期细分。

      为了得到您想要的,有两个实用程序类可以帮助您将这种紧凑的表示形式转换为工作值列表。例如,您可以给他们一个开始日期、一个时期类型(日、周、月等)和多个时期,并要求在这些时期内分解工作。

      第一步是创建 TimescaleUtility 类的实例,并让它为您生成一系列日期。你给它开始日期、你需要的时间单位和你想要的周期数。

      TimescaleUtility timescale = new TimescaleUtility();
      ArrayList<DateRange> dateList = timescale.createTimescale(startDate, TimescaleUnits.DAYS, length);
      

      dateList 变量现在包含您要拆分工作的日期范围列表。这种拆分是使用 TimephasedUtility 类进行的:

      ProjectCalendar calendar = assignment.getCalendar();
      TimephasedUtility timephased = new TimephasedUtility();
      ArrayList<Duration> durationList = timephased.segmentResourceAssignment(calendar, planned, TimescaleUnits.DAYS, dateList);
      

      就是这样,您的 durationList 现在为 datList 中的每个条目包含一个条目,显示该期间的工作量。

      希望这是有道理的!

      乔恩

      【讨论】:

      • 很好的解决方案描述!非常感谢!
      猜你喜欢
      • 1970-01-01
      • 2019-07-29
      • 2013-03-04
      • 1970-01-01
      • 2020-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多