我正在研究OnPublished事件处理程序,它将根据另一个字段的更改更新项目的一个自定义字段。
我收到错误
Event Handler for event \ProjectPublished\ of type \PS.UpdateProjectStatusChangeDate.EventHandlerUpdateField\ threw an exception: ProjectServerError(s) LastError=CICOCheckedOutToOtherUser Instructions: Pass this into PSClientError constructor to access all error information
这是代码
//loading project data from server
//Every change on this dataset will be updated on the server!
ProjectDataSet projectDs = projectClient.ReadProject(projectId, projectSvc.DataStoreEnum.WorkingStore);
foreach (projectSvc.ProjectDataSet.ProjectRow row in projectDs.Project)
{
if (row.PROJ_SESSION_UID != null)
{
sessionId = row.PROJ_SESSION_UID;
break;
}
}
//send the dataset to the server to update the database
bool validateOnly = false;
Guid jobId = Guid.NewGuid();
projectClient.QueueUpdateProject(jobId, sessionId, projectDs, validateOnly);
与我们在项目处于签入状态时运行代码的其他答案不同,我们正在签出并分配新的SessionID。 但是当事件处理程序触发时,项目已经签出。那么我该如何获得SessionID。我认为这就是代码破解的地方。
答案 0 :(得分:0)
逻辑上这是有道理的。检查项目时,意味着有人可以随时以任何方式更改它。
因此,即使您的想法有效,您也可以通过Project Pro的下一次保存来覆盖您的更新。因为Project Pro对你的操作一无所知。
我对您的系统一无所知,所以让我猜你的用户主要使用Project Pro。在这种情况下,您可以将事件处理程序添加到Application.ProjectBeforePublish
msdn link事件,并从Project Pro更新字段。但请记住,在发布之前,系统会要求您的用户保存项目。
如果Project Pro的解决方案不适合您 - 您可以以某种方式标记已发布的项目,并在项目签入后立即 - 签出,更新字段,再次保存和发布项目。