Пользовательские поля MPXJ, связанные с задачами?

Доброе утро всем,

Кто-нибудь знает, как использовать MPXJ v5.1.5 для эффективного чтения MPP. файл проекта, чтобы получить значения Outline Code Values, связанные с назначенными им задачами.

Я уже нашел способ получить задачи и данные о шкале времени для них, но как мне узнать, какой код структуры или настраиваемое поле связано с какой-либо задачей? Это поможет создавать отчеты о том, как работают эти настраиваемые поля.

Вот мой основной фрагмент кода, используемый для извлечения задач с данными их шкалы времени. Этот фрагмент кода выполняется в фоновом рабочем процессе и сообщает о ходе выполнения.

    void Work_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                Document_Details_To_Open Document_Selected_Details = e.Argument as Document_Details_To_Open;
                ProjectReader reader = ProjectReaderUtility.getProjectReader(Document_Selected_Details.FileName);

                MPXJ.ProjectFile mpx = reader.read(Document_Selected_Details.FileName);

                int count = mpx.AllTasks.Size();
                int stepsize = 100002 / count;
                int pos = 1;

                foreach (MPXJ.Task task in mpx.AllTasks.ToIEnumerable())
                {
                    Task_Type task_ = new Task_Type()
                    {
                        Name = task.Name,
                        Total_Days = task.Duration.toString(),
                        ID = task.ID.toString()
                    };

                    //Task.getFieldByAlias()

                    //can add task above to MVVM connection
                    foreach (MPXJ.ResourceAssignment Resource in task.ResourceAssignments.ToIEnumerable())//this will only run once per task , I use the ResourceAssignment variable to get the duration data
                    {

                        //use the selected document details given
                        Dictionary<string, java.util.List> worklist = new Dictionary<string, java.util.List>();
                        foreach (string Work_type in Document_Selected_Details.Data_To_Import)
                        {
                            worklist.Add(Work_type, Get_Some_work(Resource, Work_type));
                        }

                        int Length_of_data_to_retrieve = Get_Time_Scale_int(Document_Selected_Details.Time_Scale_Units, task.Duration.Duration);

                        TimescaleUtility TimeScale = new TimescaleUtility();
                        java.util.ArrayList datelist = TimeScale.CreateTimescale(task.Start, Get_Scale_Type(Document_Selected_Details.Time_Scale_Units), Length_of_data_to_retrieve);
                        MPXJ.ProjectCalendar calendar = Resource.Calendar;
                        TimephasedUtility utility = new TimephasedUtility();

                        Dictionary<string, java.util.ArrayList> durationlist = new Dictionary<string, java.util.ArrayList>();
                        foreach (KeyValuePair<string, java.util.List> item in worklist)
                        {
                            java.util.ArrayList duration = utility.SegmentWork(calendar, item.Value, Get_Scale_Type(Document_Selected_Details.Time_Scale_Units), datelist);
                            durationlist.Add(item.Key, duration);
                        }

                        Dictionary<string, List<string>> ssss = new Dictionary<string, List<string>>();
                        foreach (var s in durationlist)
                        {
                            string key = s.Key;
                            List<string> Hours = new List<string>();
                            foreach (var hours in s.Value.toArray().ToList())
                            {
                                Hours.Add(hours.ToString());
                            }
                            ssss.Add(key, Hours);
                        }

                        Task_With_All all = new Models.Task_With_All()
                        {
                            Task_Name = task.Name,
                            Time_Step_Type = Document_Selected_Details.Time_Scale_Units,
                            Duration_List = ssss,
                            StartDate = task.Start.ToDateTime().ToString(),
                            Total_duration = Length_of_data_to_retrieve.ToString()
                        };
                        Task_With_All_list.Add(all);
                        //I have now every task and their Time scale data but I still need to know if the tasks could have custom fields connected or not

                    }
                    pos += stepsize;
                    Work.ReportProgress(pos);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

Любая помощь будет принята с благодарностью.


person TommyB    schedule 27.07.2015    source источник
comment
Вы хотите получить значение настраиваемого поля (например, Text1), которое имеет псевдоним в Microsoft Project, поэтому, например, пользователь видит его как Fred, а не Text1?   -  person Jon Iles    schedule 02.09.2015
comment
Да, я ищу именно значения кода структуры, я хочу использовать коды структуры для группировки задач вместе, например, в фильтре. Пример кода структуры 1 имеет псевдоним «Электротехника», поэтому все задачи с этим кодом структуры можно фильтровать и группировать вместе.   -  person TommyB    schedule 07.09.2015
comment
Task.getOutlineCode(n) дает вам то, что вы хотите? (где n находится в диапазоне от 1 до 10 для десяти пользовательских кодов структуры, связанных с каждой задачей)   -  person Jon Iles    schedule 07.09.2015
comment
Да, это сработало. Большое спасибо, я тестировал этот метод раньше, но никогда не знал, какой результат я должен был получить. Я вижу, когда вы используете Task.getOutlineCode(n) и используете значения int от 1 до 10, коды схемы, назначенные задаче, будут отображаться в виде текста, а другие будут отображаться null. Я всегда использовал неправильные значения индекса int в своих тестах. Еще раз спасибо, это очень помогло.   -  person TommyB    schedule 07.09.2015


Ответы (1)


Благодаря Джону Айлсу ответ о том, как получить коды схемы для задачи, стал очень простым. В MS Project существует ограничение в 10 кодов структуры, которые пользователи могут назначать задачам. Чтобы получить эти коды структуры, которые были назначены задаче с использованием MPXJ v5.1.5, вы можете использовать это для их получения:

//this code comes from my code block in the question.
...
foreach (MPXJ.Task task in mpx.AllTasks.ToIEnumerable())
{
    //if the string values retrieved from these has a valid value that's returned, that value is the Outline Code assigned to the task 
    string Outline_code_1  = task.GetOutlineCode(1);
    string Outline_code_2  = task.GetOutlineCode(2);
    string Outline_code_3  = task.GetOutlineCode(3);
    string Outline_code_4  = task.GetOutlineCode(4);
    string Outline_code_5  = task.GetOutlineCode(5);
    string Outline_code_6  = task.GetOutlineCode(6);
    string Outline_code_7  = task.GetOutlineCode(7);
    string Outline_code_8  = task.GetOutlineCode(8);
    string Outline_code_9  = task.GetOutlineCode(9);
    string Outline_code_10 = task.GetOutlineCode(10);
}
...
person TommyB    schedule 07.09.2015