2015-02-04 2 views
1

Я пытаюсь установить значение настраиваемого поля уровня задачи с помощью CSOM, и я столкнулся с проблемой, когда нет существующего значения и, следовательно, нет настраиваемого объекта поля.Настройка пользовательских полей уровня задачи проекта 2013 2013

Я создал три пользовательских поля задачи, выбрав «Настройки сервера» -> «Пользовательские поля и таблицы поиска».

Если я добавляю значения в пользовательские поля при редактировании проекта в браузере, для этих задач существуют настраиваемые объекты полей; все с тем же идентификатором, что и оригинальные, которые я создал, и я могу их модифицировать с помощью кода.

Если я попытаюсь установить значение поля в коде для задачи в первый раз, это не сработает, и я получаю «неизвестную ошибку» (подробнее см. Ниже).

В моем коде я пытаюсь обновить эти поля для задач, как, например:

private static DraftTask UpdateTaskCustomFields(DraftTask task, string taskDescription, string resourceId, double estRunHours, double actRunHours) 
{ 
    if (task == null) return null; 

    projectContext.Load(task.CustomFields); 
    projectContext.ExecuteQuery(); 

    task["Custom_0000740fd5a8e41180e0005056823bd3"] = taskDescription; 
    task["Custom_85e91d7fd5a8e41180e0005056823bd3"] = estRunHours; 
    task["Custom_a178dc8bd5a8e41180e0005056823bd3"] = actRunHours; 

    task.CustomFields.Update(); 

    return task; 
} 

Я называю этот метод из другого в следующем блоке:

foreach (DataRow parentTask in parentTasks.Tables[0].Rows) 
{ 
    var parentTaskName = ""; 
    var taskName = string.Format("{0}.{1}", parentTask["LOT_ID"], parentTask["SPLIT_ID"]); 

    var taskDescription = parentTask["WO_DESCRIPTION"].ToString(); 
    var estRunHours = Convert.ToDouble(parentTask["RUN_HRS"]); 
    var actRunHours = Convert.ToDouble(parentTask["ACT_RUN_HRS"]); 
    var resourceId = ""; 

    var task = GetTask(tasks, taskName); 

    if (task != null) 
    { 
     UpdateTaskCustomFields(task, taskDescription, resourceId, estRunHours, actRunHours); 

     itemCount += 3; 
    } 

    if (itemCount++ < batch) continue; 

    itemCount = 0; 

    if (!UpdateDraft(projectDraft)) ExitApp(); 
} 

На самой первой задачи , он вызывает метод UpdateTaskCustomFields без каких-либо ошибок, но во второй задаче при вызове projectContext.executeQuery() возникает следующая ошибка:

Microsoft.SharePoint.Client.ServerException was unhandled 
HResult=-2146233088 
Message=Unknown Error 
Source=Microsoft.SharePoint.Client.Runtime 
ServerErrorCode=-1 
ServerErrorTraceCorrelationId=b58ee69c-a7fb-40f8-19b2-171646b3a6c8 
ServerErrorTypeName=Microsoft.SharePoint.Client.UnknownError 
ServerStackTrace="" 
StackTrace: 
    at Microsoft.SharePoint.Client.ClientRequest.ProcessResponseStream(Stream responseStream) 
    at Microsoft.SharePoint.Client.ClientRequest.ProcessResponse() 
    at Microsoft.SharePoint.Client.ClientRequest.ExecuteQueryToServer(ChunkStringBuilder sb) 
    at Microsoft.SharePoint.Client.ClientRequest.ExecuteQuery() 
    at Microsoft.SharePoint.Client.ClientRuntimeContext.ExecuteQuery() 
    at Microsoft.SharePoint.Client.ClientContext.ExecuteQuery() 
    at QueueCreateProject.Program.UpdateTaskCustomFields(DraftTask task, String taskDescription, String resourceId, Double estRunHours, Double actRunHours) in c:\Projects\ProjectServerApp\ProjectServerApp\Program.cs:line 617 
    at QueueCreateProject.Program.ImportTasksFromVisual() in c:\Projects\ProjectServerApp\ProjectServerApp\Program.cs:line 208 
    at QueueCreateProject.Program.Main(String[] args) in c:\Projects\ProjectServerApp\ProjectServerApp\Program.cs:line 41 
    at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
    at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 
InnerException: 

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

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

Любая помощь будет оценена по достоинству.

Спасибо!

Wg

ответ

3

Питер Holpar, MVP был в состоянии разобраться в моей проблеме here.

Он предоставил мне пример, и я использовал его, чтобы выяснить, что я делаю неправильно.

Внутреннее имя настраиваемого поля недействительно, поэтому сначала я получил собственный объект поля по имени (из коллекции projectContext.CustomFields, а не коллекции CustomFields задачи), а затем установите значение.

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

using (projectContext = new ProjectContext(pwaPath)) 
 
{ 
 
\t projectContext.Load(projectContext.Projects, ps => ps.Include(p => p.Name)); 
 
\t projectContext.Load(projectContext.CustomFields); 
 
\t projectContext.ExecuteQuery(); 
 

 
\t var proj = projectContext.Projects.FirstOrDefault(p => p.Name == projectName); 
 
\t var cfInternalName = projectContext.CustomFields.FirstOrDefault(q => q.Name == "Task Description").InternalName; 
 

 
\t var draftProj = proj.CheckOut(); 
 
\t projectContext.Load(draftProj, p => p.Tasks.Include(t => t.Id, t => t.Name, t => t.Parent)); 
 
\t projectContext.ExecuteQuery(); 
 

 
\t var tasks = draftProj.Tasks; 
 
\t var draftTask = tasks.FirstOrDefault(q => q.Name == "1.0"); 
 
\t draftTask[cfInternalName] = "My Description"; 
 

 
\t draftProj.Publish(true); 
 

 
\t projectContext.ExecuteQuery(); 
 
}

Wg

 Смежные вопросы

  • Нет связанных вопросов^_^