Исключение CICONotCheckedOut при удалении элементов из LookupTable с помощью API Project Server CSOM

У меня есть решение 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();

person Mattias Lindberg    schedule 12.11.2014    source источник


Ответы (4)


У меня недостаточно репутации, чтобы сделать это комментарием, но вы можете получить некоторую помощь от этого:

У меня была та же проблема, и, наконец, я смог обойти ее, убедившись, что каждое удаление происходит в том же обновлении, что и добавление. По-видимому, «Lookuptable.entries.add()» автоматически проверяет таблицу поиска, а Lookuptable.entries.Remove() — нет.

Таким образом, получив их оба в одном обновлении, вы можете использовать проверку из добавления для удаления других записей.

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

person Jogeukens    schedule 03.12.2014

Вы можете использовать код PSI для удаления записи поиска. lutDs.LookupTableTrees.Rows[i].Delete();

                lookupTableWS.CheckOutLookupTables(lutList);
                bool validateOnly = false;
                lookupTableWS.UpdateLookupTables(lutDs, validateOnly, autoCheckOut, 1033);
                bool forceCheckIn = false;
                lookupTableWS.CheckInLookupTables(lutList, forceCheckIn);

для справки Удалить существующую запись поиска из таблицы поиска с помощью PSI

person Nitesh Mehta    schedule 20.05.2017

Просто хотел добавить, что у меня была такая же проблема, и я подтвердил, что CSOM не может удалять элементы, если что-то не добавлено с тем же запросом. Даже добавление и удаление одного и того же элемента перед отправкой запроса вызывает ошибку. Запрос должен в конечном итоге добавить элемент, чтобы удаление работало.

Но PSI работает нормально. Не уверен, что Маттиас имел в виду, что ему не разрешено использовать PSI из-за требований проекта, но я дополняю CSOM с помощью PSI в своих разработках Project Online, поскольку CSOM все еще имеет много недостатков.

person Serital    schedule 30.07.2016

Другое решение — открыть таблицу поиска из PWA, а затем запустить код. Я делаю это для огромных изменений значений в таблицах поиска. В этом сценарии нет необходимости в добавлении.

person Timothy Atwood    schedule 05.08.2016
comment
рассмотрите возможность добавления некоторых образцов кода/запроса при ответе - person Ulises; 05.08.2016