문제

I'm using mpxj 4.5 to export ms project. When i open mpx file by ms project, I'm getting incorrect start date and finish date, but it's calculating duration correctly. What am i doing wrong, please tell.

To create mpx task I use following parametrs of mpxj:

public ProjectFile exportToMSProject(Integer projectID){
    file.setAutoTaskID(true);
     ...........
}
private void createMSProjectTask(ProjectFile file, EUser user, ETask eTask)        
    Task task = file.addTask();
    task.setUniqueID(eTask.getObjectID());
    task.setName(eTask.getName());
    task.setNotes(eTask.getDescription());
    task.setType(TaskType.FIXED_DURATION);
    long workTime = 0;
    if(eTask.getDueDate() != null && eTask.getStartDate() != null){
        workTime = (eTask.getDueDate().getTime() - eTask.getStartDate().getTime()) / (1000 * 60 * 60);
    }
    if(eTask.isAllDay()){
        task.setDuration(Duration.getInstance(workTime / 24, TimeUnit.DAYS));
    }else {
        task.setDuration(Duration.getInstance(workTime, TimeUnit.HOURS));
    }
    if(eTask.getStartDate() != null)
        task.setStart(user.getUserDate(eTask.getStartDate())); //get time from user time zone
    if(eTask.getDueDate() != null)
        task.setFinish(user.getUserDate(eTask.getDueDate()));
    task.setPercentageComplete(eTask.getPercent() != null ? eTask.getPercent() : new Float(0.0));
    if(eTask.getActualStartDate() != null)
        task.setActualStart(eTask.getActualStartDate());
}

I'm getting repeatedly startdate and incorrect enddate. What is the problem here? Any suggestion will be appreciated.

도움이 되었습니까?

해결책

I had the same issue. From my point of view, if you not have any predecessor or actual start date of your tasks, mpxj sets startdate automatically, I mean, it gets startdate from your project header or first task's start date of your project. That's why you got repeated startdate.

Here is the simple example (I'm using mpxj 4,5 and creating .mpx file):

    SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
    ProjectFile file = new ProjectFile();
    ProjectHeader header = file.getProjectHeader();
    header.setStartDate(df.parse("01/05/2014"));

    Task task1 = file.addTask();
    task1.setName("Summary Task");

    Task task2 = task1.addTask();
    task2.setName("First Sub Task");
    task2.setDuration(Duration.getInstance(10.5, TimeUnit.HOURS));
    task2.setStart(df.parse("01/05/2014"));
    task2.setPercentageComplete(NumberUtility.getDouble(50.0));

    Task task3 = task1.addTask();
    task3.setName("Second Sub Task");
    task3.setStart(df.parse("11/05/2014"));
    task3.setDuration(Duration.getInstance(10, TimeUnit.HOURS));

    Task milestone1 = task1.addTask();
    milestone1.setName("Milestone");
    milestone1.setStart(df.parse("21/05/2014"));
    milestone1.setDuration(Duration.getInstance(0, TimeUnit.HOURS));

    Task task4 = file.addTask();
    task4.setName("Last Task");
    task4.setDuration(Duration.getInstance(8, TimeUnit.HOURS));
    task4.setStart(df.parse("02/05/2014"));
    task4.setPercentageComplete(NumberUtility.getDouble(70.0));

    ProjectWriter writer = getWriter(filename);
    writer.write(file, filename); 

As you have seen, I'm not giving any predecessor or actual start date. If you run this you will get following result.

enter image description here

In order to get start date correctly, i gave an actual startdate not a startdate, and it worked. In addition if you have predecessor, you will get parent task's due date as a startdate.

 task.setActualStart(df.parse("02/05/2014"));

By the way, ms project sets due date based on your duration.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top