MPXJを使用してMSProjectから時間の経過とともに計画された作業を抽出したいと思います。APIを介してこれらの数値を取得する方法を知っている人はいますか?これを行うための適切な方法が見つかりません。
(具体的なシナリオ:計画された作業をy軸に、日付をx軸にグラフを作成したい)
MPXJを使用してMSProjectから時間の経過とともに計画された作業を抽出したいと思います。APIを介してこれらの数値を取得する方法を知っている人はいますか?これを行うための適切な方法が見つかりません。
(具体的なシナリオ:計画された作業をy軸に、日付をx軸にグラフを作成したい)
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%を完了した場合、最初の2日間は実際の作業値が時系列になり、最後の2日間は計画された作業値が時系列になります。それらは重複したり重複したりしません。
したがって、割り当ての全期間の計画された作業値を表示しようとしている場合(MS Projectの[タスクの使用状況]ビューに表示されるもののように)、時系列の実際の作業値も取得して使用する必要があります。彼らも計画された仕事のように。
開始点は、割り当てオブジェクトの次のメソッドです。
List<TimephasedResourceAssignment> complete = assignment.getTimephasedComplete();
List<TimephasedResourceAssignment> planned= assignment.getTimephasedComplete();
それらの名前が示すように、これらは、計画された作業または完全な作業のいずれかを取得し、一定期間にわたって実行された作業として表されます。
ここでの「落とし穴」は、このデータがコンパクトな形式で表され(MS Projectによって内部的にどのように保存されるかを反映している)、これは作業の期間ごとの内訳を示すのに適していません。
必要なものを取得するために、このコンパクトな表現を作業値のリストに変換するのに役立つ2つのユーティリティクラスがあります。たとえば、開始日を期間タイプ(日、週、月など)と期間の数を指定して、これらの期間に分割する作業を要求できます。
最初のステップは、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のエントリごとに1つのエントリが含まれ、その期間の作業量が示されます。
それが理にかなっていることを願っています!
ジョン