У меня есть решение Project Online, и мне нужно удалить элементы из LookupTable (Microsoft.ProjectServer.Client.LookupTable), потому что мне нужно очистить его перед добавлением новых элементов. Основное использование для этого — выполнение модульного тестирования, когда я создаю элементы, а затем очищаю все, когда тест завершен.
Каждый раз, когда я запускаю это, я получаю исключение с кодом 0x80131500 (-2146233088) с сообщением об ошибке «PJClientCallableException: CICONotCheckedOut\r\nCICONotCheckedOut», исключение возникает при выполнении ExecuteQuery.
Я могу добавлять новые элементы и изменять существующие элементы в LookupTable, ничего не проверяя. И в LookupTable нет метода CheckOut. Так что я не знаю, что делать...
Единственный вариант с Project Online — использовать API Project Server CSOM, PSI использовать нельзя.
Исключение:
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 <mynamespace>.LookupTableHelper.DeleteAllItems(Guid tableGuid)
Код:
// Create password
SecureString securePassword = new SecureString();
foreach (char c in "qwerty") securePassword.AppendChar(c);
Microsoft.SharePoint.Client.SharePointOnlineCredentials cred = new Microsoft.SharePoint.Client.SharePointOnlineCredentials("[email protected]", securePassword);
// Connect
ProjectContext context = new ProjectContext(urlToProjectOnlineWeb);
context.Credentials = cred;
// Get entries in lookup table
LookupTable lookupTable = context.LookupTables.GetByGuid(tableGuid);
context.Load(lookupTable.Entries);
context.ExecuteQuery();
if (lookupTable.Entries.Count > 0)
{
// If there are items in the collection, then remove the first item
LookupEntry e = lookupTable.Entries[0];
lookupTable.Entries.Remove(e);
}
// Upload the change to cloud
context.LookupTables.Update();
context.ExecuteQuery(); // Always throw PJClientCallableException: CICONotCheckedOut\r\nCICONotCheckedOut
Решение (по крайней мере, лучшее на данный момент) состоит в том, чтобы сначала сделать «Добавить», чтобы проверить таблицу, а затем удалить все существующие элементы. Что оставляет меня с одним элементом, который нельзя удалить. Но это лучше, чем ничего не удалить... Спасибо Jogeukens!
// Create password
SecureString securePassword = new SecureString();
foreach (char c in Configuration.GetConfig().PASSWORD.ToCharArray()) securePassword.AppendChar(c);
Microsoft.SharePoint.Client.SharePointOnlineCredentials cred = new Microsoft.SharePoint.Client.SharePointOnlineCredentials(Configuration.GetConfig().USERNAME, securePassword);
// Connect
ProjectContext context = new ProjectContext(Configuration.GetConfig().PPM_URL);
context.Credentials = cred;
// Get entries in lookup table
LookupTable lookupTable = context.LookupTables.GetByGuid(tableGuid);
context.Load(lookupTable.Entries);
context.ExecuteQuery();
LookupEntryCreationInformation newEntry = new LookupEntryCreationInformation();
newEntry.Id = Guid.NewGuid();
newEntry.Value = new LookupEntryValue();
newEntry.Value.TextValue = "The one that cannot be removed...";
lookupTable.Entries.Add(newEntry);
while(lookupTable.Entries.Count > 1)
{
// If there are items in the collection, then remove the first item
LookupEntry e = lookupTable.Entries[0];
lookupTable.Entries.Remove(e);
}
// Upload the change to cloud
context.LookupTables.Update();
context.ExecuteQuery();