MPXJ: получите запланированную работу через API - PullRequest
3 голосов
/ 02 августа 2011

Я хочу извлечь запланированную работу со временем из MS Project, используя MPXJ.Кто-нибудь знает, как получить эти цифры через API?Я не могу найти подходящий метод для этого.

(Конкретный сценарий: я хочу нарисовать диаграмму с запланированной работой по оси Y и датой по оси X)

Ответы [ 2 ]

3 голосов
/ 28 февраля 2012

Ответ, который Джон дал выше, был в то время правильным, но начиная с версии 4.2 MPXJ, 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% работы, то у вас будут временные ФАКТИЧЕСКИЕ рабочие значения в течение первых двух дней, а временные ПЛАНИРОВАННЫЕ рабочие значения только в течение последних двух дней.Они не перекрываются и не дублируются.

Поэтому, если вы пытаетесь отобразить запланированные значения работы для всего периода времени назначения (например, то, что вы увидите в представлениях «Использование задачи» в MS Project), вам также необходимо получить временные данные.фактические значения работы и используйте их, как если бы они были запланированной работой тоже.

2 голосов
/ 02 августа 2011

вашей отправной точкой являются следующие методы объекта назначения:

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 теперь содержит одну запись для каждой записи в списке данных, показывающую объем работы за этот период.

Надеждаэто имеет смысл!

Джон

...