PSI новые задачи пользовательских полей не пишутся

Я разрабатываю процесс с помощью PSI, который добавляет новую задачу в существующий проект. Для этого, во-первых, с помощью PWA я создал 4 новых настраиваемых поля задачи (одно числовое, две даты и один текст), которые мне нужно сообщить при создании задачи. Я также должен написать 2 пользовательских поля числовых задач, которые уже существовали.

Задача создается правильно, и два пользовательских поля, которые существовали ранее, также пишутся правильно. Но, любое из 4 новых настраиваемых полей пишется. Как я могу решить это?

Это код:

WSProject.Project project = InitProject();

project.CheckOutProject(projectGuid, sessionId, "Check out");

WSProject.ProjectDataSet dsProject = new WSProject.ProjectDataSet();

Guid taskGuid = CreateTaskRow(dsProject, projectGuid, taskname, duration, startdate);
Guid assignmentGuid = CreateAssignmentRow(dsProject, projectGuid, taskGuid, resGuid);

//Custom Fields
Guid idNCF1 = GetGuidUsingFieldName("NCF1"); //OLD
Guid idNCF2 = GetGuidUsingFieldName("NCF2"); //OLD
Guid idNCF3 = GetGuidUsingFieldName("NCF3"); //NEW
Guid idDCF1 = GetGuidUsingFieldName("DCF1"); //NEW
Guid idDCF2 = GetGuidUsingFieldName("DCF2"); //NEW
Guid idTCF1 = GetGuidUsingFieldName("TCF1"); //NEW

SetNumberCustomField(dsProject, projectGuid, taskGuid, idNCF3, 4); //Not Works
SetDateCustomField(dsProject, projectGuid, taskGuid, idDCF1, DateTime.Today); //Not Works
SetTextCustomField(dsProject, projectGuid, taskGuid, idTCF1, "A"); //Not Works
SetDateCustomField(dsProject, projectGuid, taskGuid, idDCF2, DateTime.Today); //Not Works
SetNumberCustomField(dsProject, projectGuid, taskGuid, idNCF1, 1); //Works
SetNumberCustomField(dsProject, projectGuid, taskGuid, idNCF2, 2); //Works

//Using debug, here I can see that all custom fields are properly set in dsProject TaskCustomFields table
Guid jobId = Guid.NewGuid();
project.QueueAddToProject(jobId, sessionId, dsProject, false);
WaitForQueue(jobId);

jobGuid = Guid.NewGuid();
project.QueueCheckInProject(jobGuid, projectGuid, true, sessionId, "Checked in");

jobGuid = Guid.NewGuid();
project.QueuePublish(jobGuid, projectGuid, true, "");
WaitForQueue(jobGuid);

SetNumberCustomField (я опускал данные и текстовые функции, потому что по сути это то же самое)

private static void SetNumberCustomField(WSProject.ProjectDataSet dsProject,
                                   Guid projectId,
                                   Guid taskId,
                                   Guid customFieldId,
                                   int CFValue)
        {
            WSProject.ProjectDataSet.TaskCustomFieldsRow tCustomField = dsProject.TaskCustomFields.NewTaskCustomFieldsRow();

            tCustomField.CUSTOM_FIELD_UID = Guid.NewGuid();
            tCustomField.PROJ_UID = projectId;
            tCustomField.TASK_UID = taskId;
            tCustomField.FIELD_TYPE_ENUM = (byte)PSLibrary.CustomField.Type.NUMBER;
            tCustomField.NUM_VALUE = CFValue;
            tCustomField.MD_PROP_UID = customFieldId;

            dsProject.TaskCustomFields.AddTaskCustomFieldsRow(tCustomField);
        }

1 ответ

Я заметил пару проблем с вашим кодом. PSI чрезвычайно сложен, поэтому я не даю гарантий... но здесь все.:)

1) Ваш ProjectDataSet не инициализируется правильно.

Вам нужно будет использовать Project.ReadProjectEntities, чтобы получить начальный ProjectDataSet для работы. Вы захотите использовать логическое ИЛИ (|) чтобы получить несколько таблиц. Тебе понадобиться Project | TaskCustomFields,

Я уверен, что вам нужно сделать это, если вы делаете обновления.

2) Зафиксируйте изменения

Перед фиксацией вы можете получить только изменения из ProjectDataSet.

ProjectDataSet updates = dsProject.GetChanges() as ProjectDataSet;

Затем вы можете вызвать QueueUpdateProject и передать ему только набор данных обновлений. Затем продолжайте и QueuePublish.

Другие вопросы по тегам