Обновление состояния задачи Progress Project Server 2013

Я пытаюсь обновить ход выполнения задачи (присвоение статуса) с помощью CSOM Project Server 2013, но у меня возникло исключение «Неизвестная ошибка» и следующий StackTrace:

в Microsoft.SharePoint.Client.ClientRequest.ProcessResponseStream (Stream responseStream) в Microsoft.SharePoint.Client.ClientRequest.ProcessResponse () в Limitless.Components.Project2013.ProjectComponent.UpdateTask (соединение ProjectServerConnection, Guid1 ProjectUID), List

ProjectContext context = GetProjectContext(connection);
// Get the user name  and their assignments
EnterpriseResource self = EnterpriseResource.GetSelf(context);
context.Load(self, r => r.Name, r => r.Assignments
    .IncludeWithDefaultProperties(a => a.Project, a=>a.Comments));
context.ExecuteQuery();
foreach(var item in self.Assignments)
{
    Entities.Task task = data.Where(t => t.ID == item.Id).SingleOrDefault();
    if(task!= null)
    {
        item.PercentComplete = (short)task.PercentComplete;
        item.Comments = "comment";
    }
}

// Update the assignments and submit the status updates.
self.Assignments.Update();
self.Assignments.SubmitAllStatusUpdates("By PS Web App");
context.ExecuteQuery();

Я не нашел ошибок в журналах sharepoint. это новая установка Project Server 2013, и он успешно извлекает задачи (StatusAssignments), но после self.Assignments.Update(); и self.Assignments.SubmitAllStatusUpdates("By PS Web App"); исключение выдается на context.ExecuteQuery();.

кто-нибудь сталкивался с таким сценарием?


person Mr.H    schedule 11.08.2017    source источник


Ответы (1)


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

вместо обновления TaskAssignment текущим пользовательским контекстом я получаю его, используя повышенный контекст (например, контекст администратора), получаю назначения ресурсов и обновляю их.

//private function to get admin context
ProjectContext elevatedContext = GetProjectElevatedContext(connection);
//private function to get current user context
ProjectContext context = GetProjectContext(connection);

// Get the user name  and their assignments
EnterpriseResource self = EnterpriseResource.GetSelf(context);
context.Load(self, r => r.Id, r => r.Assignments.IncludeWithDefaultProperties(a => a.ActualFinish));
context.ExecuteQuery();

var resource = elevatedContext.EnterpriseResources.GetById(self.Id.ToString());
elevatedContext.Load(resource, r => r.Assignments
    .IncludeWithDefaultProperties(a => a.Project, a => a.Comments, a => a.PercentComplete));
elevatedContext.ExecuteQuery();

int count = 0;

foreach (var item in resource.Assignments)
{
    Entities.Task task = data.Where(t => t.ID == item.Id).SingleOrDefault();
    if (task != null)
    {
        item.PercentComplete = (short)task.PercentComplete;
        item.Comments = "comment";
        count++;
    }
}

resource.Assignments.Update();
resource.Assignments.SubmitAllStatusUpdates($"comment");
elevatedContext.ExecuteQuery();

Мне не удалось найти разрешение, предоставленное для такой функции от CSOM.

Если у кого-то есть лучшее протестированное решение, пожалуйста, внесите свой вклад :)

person Mr.H    schedule 09.08.2018
comment
Где вы нашли метод Assignments.Update()? У меня его нет ни в одной Assignment коллекции. - person Kamerton; 04.04.2019
comment
@Kamerton, вы можете найти его в классе Microsoft.ProjectServer.Client.StatusAssignmentCollection после члена EnterpriseResource.Assignments docs.microsoft.com/en-us/previous-versions/office/project-class/ - person Mr.H; 11.04.2019